From efa91f005b221da4c366202280aa97ee2a8a7493 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 4 Sep 2012 16:59:27 +0200 Subject: [PATCH 01/73] Squish: Fix for renaming Targets to Kits Change-Id: Ia3faec39499bc7e65d5d0a0fb7963fcb4016c6d5 Reviewed-by: Robert Loehning --- tests/system/objects.map | 4 +- tests/system/shared/project_explorer.py | 29 +++++++-------- tests/system/shared/utils.py | 14 +++---- .../tst_create_proj_wizard/test.py | 37 ++++++++++--------- 4 files changed, 42 insertions(+), 42 deletions(-) diff --git a/tests/system/objects.map b/tests/system/objects.map index 538e4e00d0b..930bde9318a 100644 --- a/tests/system/objects.map +++ b/tests/system/objects.map @@ -23,6 +23,8 @@ :Edit Environment_ProjectExplorer::EnvironmentItemsDialog {type='ProjectExplorer::EnvironmentItemsDialog' unnamed='1' visible='1' windowTitle='Edit Environment'} :Failed to start application_QMessageBox {type='QMessageBox' unnamed='1' visible='1' windowTitle='Failed to start application'} :Generator:_QComboBox {buddy=':CMake Wizard.Generator:_QLabel' type='QComboBox' unnamed='1' visible='1'} +:Kits_QTreeView {container=':qt_tabwidget_stackedwidget_QWidget' type='QTreeView' unnamed='1' visible='1'} +:Kits_QtVersion_QComboBox {container=':qt_tabwidget_stackedwidget_QWidget' occurrence='4' type='QComboBox' unnamed='1' visible='1'} :New.frame_QFrame {name='frame' type='QFrame' visible='1' window=':New_Core::Internal::NewDialog'} :New.templateCategoryView_QTreeView {name='templateCategoryView' type='QTreeView' visible='1' window=':New_Core::Internal::NewDialog'} :New_Core::Internal::NewDialog {name='Core__Internal__NewDialog' type='Core::Internal::NewDialog' visible='1' windowTitle='New'} @@ -57,8 +59,6 @@ :QtSupport__Internal__QtVersionManager.qmake_QLabel {container=':qt_tabwidget_stackedwidget.QtSupport__Internal__QtVersionManager_QtSupport::Internal::QtOptionsPageWidget' name='qmakePath' type='QLabel' visible='1'} :QtSupport__Internal__QtVersionManager.qtdirList_QTreeWidget {container=':qt_tabwidget_stackedwidget.QtSupport__Internal__QtVersionManager_QtSupport::Internal::QtOptionsPageWidget' name='qtdirList' type='QTreeWidget' visible='1'} :Symbol Server_Utils::CheckableMessageBox {type='Utils::CheckableMessageBox' unnamed='1' visible='1' windowTitle='Symbol Server'} -:Targets_QTreeView {container=':qt_tabwidget_stackedwidget_QWidget' type='QTreeView' unnamed='1' visible='1'} -:Targets_QtVersion_QComboBox {container=':qt_tabwidget_stackedwidget_QWidget' occurrence='4' type='QComboBox' unnamed='1' visible='1'} :addToVersionControlComboBox_QComboBox {name='addToVersionControlComboBox' type='QComboBox' visible='1'} :formFileLineEdit_Utils::FileNameValidatingLineEdit {buddy=':Qt Gui Application.Form file:_QLabel' name='formFileLineEdit' type='Utils::FileNameValidatingLineEdit' visible='1'} :frame.templateDescription_QTextBrowser {container=':New.frame_QFrame' name='templateDescription' type='QTextBrowser' visible='1'} diff --git a/tests/system/shared/project_explorer.py b/tests/system/shared/project_explorer.py index aa33d160d12..b15cc868e5d 100644 --- a/tests/system/shared/project_explorer.py +++ b/tests/system/shared/project_explorer.py @@ -146,26 +146,26 @@ def getQtInformationForBuildSettings(alreadyOnProjectsBuildSettings=False, after def getQtInformationForQmlProject(): fancyToolButton = waitForObject(":*Qt Creator_Core::Internal::FancyToolButton") - target = __getTargetFromToolTip__(str(fancyToolButton.toolTip)) - if not target: - test.fatal("Could not figure out which target you're using...") + kit = __getTargetFromToolTip__(str(fancyToolButton.toolTip)) + if not kit: + test.fatal("Could not figure out which kit you're using...") return None, None, None, None - test.log("Searching for Qt information for target '%s'" % target) + test.log("Searching for Qt information for kit '%s'" % kit) invokeMenuItem("Tools", "Options...") waitForObjectItem(":Options_QListView", "Build & Run") clickItem(":Options_QListView", "Build & Run", 14, 15, 0, Qt.LeftButton) - clickTab(waitForObject(":Options.qt_tabwidget_tabbar_QTabBar"), "Targets") - targetsTreeView = waitForObject(":Targets_QTreeView") - if not __selectTreeItemOnBuildAndRun__(targetsTreeView, "%s(\s\(default\))?" % target, True): - test.fatal("Found no matching target - this shouldn't happen.") + clickTab(waitForObject(":Options.qt_tabwidget_tabbar_QTabBar"), "Kits") + targetsTreeView = waitForObject(":Kits_QTreeView") + if not __selectTreeItemOnBuildAndRun__(targetsTreeView, "%s(\s\(default\))?" % kit, True): + test.fatal("Found no matching kit - this shouldn't happen.") clickButton(waitForObject(":Options.Cancel_QPushButton")) return None, None, None, None - qtVersionStr = str(waitForObject(":Targets_QtVersion_QComboBox").currentText) - test.log("Target '%s' uses Qt Version '%s'" % (target, qtVersionStr)) + qtVersionStr = str(waitForObject(":Kits_QtVersion_QComboBox").currentText) + test.log("Kit '%s' uses Qt Version '%s'" % (kit, qtVersionStr)) clickTab(waitForObject(":Options.qt_tabwidget_tabbar_QTabBar"), "Qt Versions") treeWidget = waitForObject(":QtSupport__Internal__QtVersionManager.qtdirList_QTreeWidget") if not __selectTreeItemOnBuildAndRun__(treeWidget, qtVersionStr): - test.fatal("Found no matching Qt Version for target - this shouldn't happen.") + test.fatal("Found no matching Qt Version for kit - this shouldn't happen.") clickButton(waitForObject(":Options.Cancel_QPushButton")) return None, None, None, None qmake = str(waitForObject(":QtSupport__Internal__QtVersionManager.qmake_QLabel").text) @@ -179,12 +179,11 @@ def getQtInformationForQmlProject(): def __selectTreeItemOnBuildAndRun__(treeViewOrWidget, itemText, isRegex=False): model = treeViewOrWidget.model() - test.compare(model.rowCount(), 2, "Verifying expected target section count") + test.compare(model.rowCount(), 2, "Verifying expected section count") autoDetected = model.index(0, 0) - test.compare(autoDetected.data().toString(), "Auto-detected", - "Verifying label for target section") + test.compare(autoDetected.data().toString(), "Auto-detected", "Verifying label for section") manual = model.index(1, 0) - test.compare(manual.data().toString(), "Manual", "Verifying label for target section") + test.compare(manual.data().toString(), "Manual", "Verifying label for section") if isRegex: pattern = re.compile(itemText) found = False diff --git a/tests/system/shared/utils.py b/tests/system/shared/utils.py index 70e45f9f794..0fbcf83b393 100644 --- a/tests/system/shared/utils.py +++ b/tests/system/shared/utils.py @@ -283,17 +283,17 @@ def __checkParentAccess__(filePath): test.fail("No execute permission on '%s'" % tmp) # this function checks for all configured Qt versions inside -# options dialog and returns a dict holding the targets as keys -# and a list of supported versions as value -def getCorrectlyConfiguredTargets(): +# options dialog and returns a dict holding the kits as keys +# and a list of information of its configured Qt +def getConfiguredKits(): def __retrieveQtVersionName__(target, version): treeWidget = waitForObject(":QtSupport__Internal__QtVersionManager.qtdirList_QTreeWidget") return treeWidget.currentItem().text(0) targetQtVersionNames = {} result = {} targetsQtVersions, qtVersionNames = iterateQtVersions(True, __retrieveQtVersionName__) - clickTab(waitForObject(":Options.qt_tabwidget_tabbar_QTabBar"), "Targets") - treeView = waitForObject(":Targets_QTreeView") + clickTab(waitForObject(":Options.qt_tabwidget_tabbar_QTabBar"), "Kits") + treeView = waitForObject(":Kits_QTreeView") model = treeView.model() test.compare(model.rowCount(), 2, "Verifying expected target section count") autoDetected = model.index(0, 0) @@ -309,7 +309,7 @@ def getCorrectlyConfiguredTargets(): item = ".".join([str(section.data().toString()), str(index.data().toString()).replace(".", "\\.")]) clickItem(treeView, item, 5, 5, 0, Qt.LeftButton) - qtVersionStr = str(waitForObject(":Targets_QtVersion_QComboBox").currentText) + qtVersionStr = str(waitForObject(":Kits_QtVersion_QComboBox").currentText) targetQtVersionNames[targetName] = qtVersionStr # merge defined target names with their configured Qt versions and devices for target,qtVersion in targetQtVersionNames.iteritems(): @@ -321,7 +321,7 @@ def getCorrectlyConfiguredTargets(): if targetInfo[0] == "Maemo": result.update({targetName: (QtQuickConstants.getStringForTarget(QtQuickConstants.Targets.MAEMO5), targetInfo[1])}) - test.log("Correctly configured targets: %s" % str(result)) + test.log("Configured kits: %s" % str(result)) return result def visibleCheckBoxExists(text): diff --git a/tests/system/suite_general/tst_create_proj_wizard/test.py b/tests/system/suite_general/tst_create_proj_wizard/test.py index 85fe151d3fa..1caf8a4c477 100644 --- a/tests/system/suite_general/tst_create_proj_wizard/test.py +++ b/tests/system/suite_general/tst_create_proj_wizard/test.py @@ -12,7 +12,7 @@ def main(): overrideInstallLazySignalHandler() installLazySignalHandler(":frame.templateDescription_QTextBrowser", "textChanged()","__handleTextChanged__") - targets = getCorrectlyConfiguredTargets() + kits = getConfiguredKits() test.log("Collecting potential project types...") availableProjectTypes = [] invokeMenuItem("File", "New File or Project...") @@ -69,38 +69,39 @@ def main(): clickButton(waitForObject(":Next_QPushButton")) except LookupError: pass - waitForObject("{type='QLabel' unnamed='1' visible='1' text='Target Setup'}") - availableCheckboxes = filter(visibleCheckBoxExists, targets.keys()) + waitForObject("{type='QLabel' unnamed='1' visible='1' text='Kit Selection'}") + availableCheckboxes = filter(visibleCheckBoxExists, kits.keys()) JIRA.performWorkaroundIfStillOpen(6994, JIRA.Bug.CREATOR, template, displayedPlatforms) # verification whether expected, found and configured match - for t in targets: + for t in kits: if requiredVersion: - if targets[t][1] < requiredVersion: + if kits[t][1] < requiredVersion: if t in availableCheckboxes: - test.fail("Target '%s' found as checkbox, but required version (%s) is higher " - "than configured version (%s)!" % (t, requiredVersion, - str(targets[t][1]))) + test.fail("Kit '%s' found as checkbox, but required Qt version (%s) is " + "higher than configured Qt version (%s)!" % (t, requiredVersion, + str(kits[t][1]))) availableCheckboxes.remove(t) else: - test.passes("Irrelevant target '%s' not found on 'Target setup' page - " - "required version is '%s', current version is '%s'." % - (t, requiredVersion, str(targets[t][1]))) + test.passes("Irrelevant kit '%s' not found on 'Kit Selection' page - " + "required Qt version is '%s', current Qt version is '%s'." % + (t, requiredVersion, str(kits[t][1]))) continue found = False - if targets[t][0] in displayedPlatforms: + if kits[t][0] in displayedPlatforms: if t in availableCheckboxes: - test.passes("Found expected target '%s' on 'Target setup' page." % t) + test.passes("Found expected kit '%s' on 'Kit Selection' page." % t) availableCheckboxes.remove(t) else: - test.fail("Expected target '%s' missing on 'Target setup' page." % t) + test.fail("Expected kit '%s' missing on 'Kit Selection' page." % t) else: if t in availableCheckboxes: - test.fail("Target '%s' found on 'Target setup' page - but has not been expected!" % t) + test.fail("Kit '%s' found on 'Kit Selection' page - but was not expected!" % t) else: - test.passes("Irrelevant target '%s' not found on 'Target setup' page." % t) + test.passes("Irrelevant kit '%s' not found on 'Kit Selection' page." % t) if len(availableCheckboxes) != 0: - test.fail("Found unexpected additional target(s) %s on 'Target setup' page." % str(availableCheckboxes)) - clickButton(waitForObject("{text='Cancel' type='QPushButton' unnamed='1' visible='1'}", 20000)) + test.fail("Found unexpected additional kit(s) %s on 'Kit Selection' page." + % str(availableCheckboxes)) + clickButton(waitForObject("{text='Cancel' type='QPushButton' unnamed='1' visible='1'}")) invokeMenuItem("File", "Exit") def cleanup(): From c5097ed18389e357c1333ca7713f701d9751dce3 Mon Sep 17 00:00:00 2001 From: Leandro Melo Date: Wed, 5 Sep 2012 14:26:11 +0200 Subject: [PATCH 02/73] C++: Fix crash in auto deducing mechanism There was an inconsistency, since the AST used in ResolveExpression was not really the same previously computed. In the particular issue below a crash could occur, for example, when using auto in a for range loop. Task-number: QTCREATORBUG-7828 Change-Id: I02958f434c3cf3b50609546003fc141674ee78d5 Reviewed-by: Eike Ziller --- src/libs/cplusplus/ResolveExpression.cpp | 55 +++++++++++++++++++++--- src/libs/cplusplus/ResolveExpression.h | 7 --- 2 files changed, 48 insertions(+), 14 deletions(-) diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp index a64a61a0bc1..0309c3bcf91 100644 --- a/src/libs/cplusplus/ResolveExpression.cpp +++ b/src/libs/cplusplus/ResolveExpression.cpp @@ -460,6 +460,48 @@ bool ResolveExpression::visit(QualifiedNameAST *ast) return false; } +namespace { + +class DeduceAutoCheck : public ASTVisitor +{ +public: + DeduceAutoCheck(const Identifier *id, TranslationUnit *tu) + : ASTVisitor(tu), _id(id), _block(false) + { + accept(tu->ast()); + } + + virtual bool preVisit(AST *) + { + if (_block) + return false; + + return true; + } + + virtual bool visit(SimpleNameAST *ast) + { + if (ast->name + && ast->name->identifier() + && strcmp(ast->name->identifier()->chars(), _id->chars()) == 0) { + _block = true; + } + + return false; + } + + virtual bool visit(MemberAccessAST *ast) + { + accept(ast->base_expression); + return false; + } + + const Identifier *_id; + bool _block; +}; + +} // namespace anonymous + bool ResolveExpression::visit(SimpleNameAST *ast) { QList candidates = _context.lookup(ast->name, _scope); @@ -473,8 +515,7 @@ bool ResolveExpression::visit(SimpleNameAST *ast) if (item.declaration() == 0) continue; - if (item.type().isAuto() - && _blockedIds.find(ast->name->identifier()) == _blockedIds.end()) { + if (item.type().isAuto()) { const Declaration *decl = item.declaration()->asDeclaration(); if (!decl) continue; @@ -498,13 +539,13 @@ bool ResolveExpression::visit(SimpleNameAST *ast) Document::Ptr exprDoc = documentForExpression(exprTyper.preprocessedExpression(initializer)); exprDoc->check(); - ExpressionAST *exprAST = extractExpressionAST(exprDoc); - if (!exprAST) + + DeduceAutoCheck deduceAuto(ast->name->identifier(), exprDoc->translationUnit()); + if (deduceAuto._block) continue; - _blockedIds.insert(ast->name->identifier()); - const QList &typeItems = resolve(exprAST, decl->enclosingScope()); - _blockedIds.erase(ast->name->identifier()); + const QList &typeItems = + exprTyper(extractExpressionAST(exprDoc), exprDoc, decl->enclosingScope()); if (typeItems.empty()) continue; diff --git a/src/libs/cplusplus/ResolveExpression.h b/src/libs/cplusplus/ResolveExpression.h index 3809f04afc0..6c3a47524fa 100644 --- a/src/libs/cplusplus/ResolveExpression.h +++ b/src/libs/cplusplus/ResolveExpression.h @@ -121,18 +121,11 @@ protected: private: - struct IdentifierComp - { - bool operator()(const Identifier *a, const Identifier *b) const - { return strcmp(a->chars(), b->chars()) < 0; } - }; - Scope *_scope; LookupContext _context; Bind bind; QList _results; bool _reference; - std::set _blockedIds; // Replace by a hash impl. }; } // namespace CPlusPlus From 7657dd3a47bb86dd66e88d43ec58e6f32a5f6029 Mon Sep 17 00:00:00 2001 From: Daniel Teske Date: Wed, 5 Sep 2012 12:42:41 +0200 Subject: [PATCH 03/73] Add error string to IRunControlFactory::createRunControl And add a few helpful error messages Task-number: QTCREATORBUG-7826 Change-Id: Ia9f9fa476cecf2cff198bc460408bc062e119338 Reviewed-by: Friedemann Kleint --- .../analyzerruncontrolfactory.cpp | 7 +++++-- .../analyzerbase/analyzerruncontrolfactory.h | 3 ++- src/plugins/android/androiddebugsupport.cpp | 4 ++-- src/plugins/android/androiddebugsupport.h | 3 ++- src/plugins/android/androidrunfactories.cpp | 4 ++-- src/plugins/android/androidrunfactories.h | 3 ++- src/plugins/debugger/debuggerplugin.cpp | 4 ++-- src/plugins/debugger/debuggerplugin.h | 3 ++- .../debugger/debuggerruncontrolfactory.h | 5 +++-- src/plugins/debugger/debuggerrunner.cpp | 18 +++++++++++------ src/plugins/madde/maemorunfactories.cpp | 4 ++-- src/plugins/madde/maemorunfactories.h | 4 +++- .../localapplicationruncontrol.cpp | 7 +++++-- .../localapplicationruncontrol.h | 2 +- .../projectexplorer/projectexplorer.cpp | 20 +++++++++++++++++-- src/plugins/projectexplorer/projectexplorer.h | 1 + .../projectexplorer/runconfiguration.h | 2 +- .../qmlprojectruncontrol.cpp | 9 +++++---- .../qmlprojectmanager/qmlprojectruncontrol.h | 5 +++-- .../qnx/blackberryruncontrolfactory.cpp | 12 ++++++----- src/plugins/qnx/blackberryruncontrolfactory.h | 3 ++- src/plugins/qnx/qnxruncontrolfactory.cpp | 4 ++-- src/plugins/qnx/qnxruncontrolfactory.h | 2 +- .../remotelinuxruncontrolfactory.cpp | 4 ++-- .../remotelinuxruncontrolfactory.h | 2 +- 25 files changed, 88 insertions(+), 47 deletions(-) diff --git a/src/plugins/analyzerbase/analyzerruncontrolfactory.cpp b/src/plugins/analyzerbase/analyzerruncontrolfactory.cpp index 87392ae802f..30eaaee0b00 100644 --- a/src/plugins/analyzerbase/analyzerruncontrolfactory.cpp +++ b/src/plugins/analyzerbase/analyzerruncontrolfactory.cpp @@ -68,11 +68,14 @@ bool AnalyzerRunControlFactory::canRun(RunConfiguration *runConfiguration, RunMo return false; } -RunControl *AnalyzerRunControlFactory::create(RunConfiguration *runConfiguration, RunMode mode) +RunControl *AnalyzerRunControlFactory::create(RunConfiguration *runConfiguration, RunMode mode, QString *errorMessage) { IAnalyzerTool *tool = AnalyzerManager::toolFromRunMode(mode); - if (!tool) + if (!tool) { + if (errorMessage) + *errorMessage = tr("No analyzer tool selected"); // never happens return 0; + } QTC_ASSERT(canRun(runConfiguration, mode), return 0); diff --git a/src/plugins/analyzerbase/analyzerruncontrolfactory.h b/src/plugins/analyzerbase/analyzerruncontrolfactory.h index 49514b0144d..081b00443fd 100644 --- a/src/plugins/analyzerbase/analyzerruncontrolfactory.h +++ b/src/plugins/analyzerbase/analyzerruncontrolfactory.h @@ -51,7 +51,8 @@ public: QString displayName() const; bool canRun(RunConfiguration *runConfiguration, ProjectExplorer::RunMode mode) const; ProjectExplorer::RunControl *create(RunConfiguration *runConfiguration, - ProjectExplorer::RunMode mode); + ProjectExplorer::RunMode mode, + QString *errorMessage); ProjectExplorer::IRunConfigurationAspect *createRunConfigurationAspect(); ProjectExplorer::RunConfigWidget *createConfigurationWidget(RunConfiguration *runConfiguration); diff --git a/src/plugins/android/androiddebugsupport.cpp b/src/plugins/android/androiddebugsupport.cpp index 72f71004655..9c9cf467f16 100644 --- a/src/plugins/android/androiddebugsupport.cpp +++ b/src/plugins/android/androiddebugsupport.cpp @@ -81,7 +81,7 @@ static QStringList qtSoPaths(QtSupport::BaseQtVersion *qtVersion) return paths.toList(); } -RunControl *AndroidDebugSupport::createDebugRunControl(AndroidRunConfiguration *runConfig) +RunControl *AndroidDebugSupport::createDebugRunControl(AndroidRunConfiguration *runConfig, QString *errorMessage) { Target *target = runConfig->target(); Qt4Project *project = static_cast(target->project()); @@ -119,7 +119,7 @@ RunControl *AndroidDebugSupport::createDebugRunControl(AndroidRunConfiguration * } DebuggerRunControl * const debuggerRunControl - = DebuggerPlugin::createDebugger(params, runConfig); + = DebuggerPlugin::createDebugger(params, runConfig, errorMessage); new AndroidDebugSupport(runConfig, debuggerRunControl); return debuggerRunControl; } diff --git a/src/plugins/android/androiddebugsupport.h b/src/plugins/android/androiddebugsupport.h index 7278272f124..96354c96bf3 100644 --- a/src/plugins/android/androiddebugsupport.h +++ b/src/plugins/android/androiddebugsupport.h @@ -47,7 +47,8 @@ class AndroidDebugSupport : public QObject Q_OBJECT public: - static ProjectExplorer::RunControl *createDebugRunControl(AndroidRunConfiguration *runConfig); + static ProjectExplorer::RunControl *createDebugRunControl(AndroidRunConfiguration *runConfig, + QString *errorMessage); AndroidDebugSupport(AndroidRunConfiguration *runConfig, Debugger::DebuggerRunControl *runControl); diff --git a/src/plugins/android/androidrunfactories.cpp b/src/plugins/android/androidrunfactories.cpp index 193354c8bbe..206e44d4aaf 100644 --- a/src/plugins/android/androidrunfactories.cpp +++ b/src/plugins/android/androidrunfactories.cpp @@ -171,7 +171,7 @@ bool AndroidRunControlFactory::canRun(RunConfiguration *runConfiguration, } RunControl *AndroidRunControlFactory::create(RunConfiguration *runConfig, - ProjectExplorer::RunMode mode) + ProjectExplorer::RunMode mode, QString *errorMessage) { Q_ASSERT(canRun(runConfig, mode)); AndroidRunConfiguration *rc = qobject_cast(runConfig); @@ -179,7 +179,7 @@ RunControl *AndroidRunControlFactory::create(RunConfiguration *runConfig, if (mode == NormalRunMode) return new AndroidRunControl(rc); else - return AndroidDebugSupport::createDebugRunControl(rc); + return AndroidDebugSupport::createDebugRunControl(rc, errorMessage); } QString AndroidRunControlFactory::displayName() const diff --git a/src/plugins/android/androidrunfactories.h b/src/plugins/android/androidrunfactories.h index 6c16456ad5d..bbf5048dbcc 100644 --- a/src/plugins/android/androidrunfactories.h +++ b/src/plugins/android/androidrunfactories.h @@ -80,7 +80,8 @@ public: bool canRun(ProjectExplorer::RunConfiguration *runConfiguration, ProjectExplorer::RunMode mode) const; ProjectExplorer::RunControl *create(ProjectExplorer::RunConfiguration *runConfiguration, - ProjectExplorer::RunMode mode); + ProjectExplorer::RunMode mode, + QString *errorMessage); }; } // namespace Internal diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 9ebe9948588..27ece76ae16 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -3387,9 +3387,9 @@ void DebuggerPlugin::remoteCommand(const QStringList &options, } DebuggerRunControl *DebuggerPlugin::createDebugger - (const DebuggerStartParameters &sp, RunConfiguration *rc) + (const DebuggerStartParameters &sp, RunConfiguration *rc, QString *errorMessage) { - return DebuggerRunControlFactory::doCreate(sp, rc); + return DebuggerRunControlFactory::doCreate(sp, rc, errorMessage); } void DebuggerPlugin::extensionsInitialized() diff --git a/src/plugins/debugger/debuggerplugin.h b/src/plugins/debugger/debuggerplugin.h index 6ef932add41..43710d25c42 100644 --- a/src/plugins/debugger/debuggerplugin.h +++ b/src/plugins/debugger/debuggerplugin.h @@ -66,7 +66,8 @@ public: static QAction *visibleDebugAction(); static DebuggerRunControl *createDebugger(const DebuggerStartParameters &sp, - ProjectExplorer::RunConfiguration *rc); + ProjectExplorer::RunConfiguration *rc, + QString *errorMessage); private: // IPlugin implementation. diff --git a/src/plugins/debugger/debuggerruncontrolfactory.h b/src/plugins/debugger/debuggerruncontrolfactory.h index 9f0b2c230ab..b6b167277d4 100644 --- a/src/plugins/debugger/debuggerruncontrolfactory.h +++ b/src/plugins/debugger/debuggerruncontrolfactory.h @@ -50,7 +50,8 @@ public: // FIXME: Used by qmljsinspector.cpp:469 ProjectExplorer::RunControl *create( ProjectExplorer::RunConfiguration *runConfiguration, - ProjectExplorer::RunMode mode); + ProjectExplorer::RunMode mode, + QString *errorMessage); bool canRun(ProjectExplorer::RunConfiguration *runConfiguration, ProjectExplorer::RunMode mode) const; @@ -64,7 +65,7 @@ public: ProjectExplorer::RunConfiguration *runConfiguration = 0); static DebuggerRunControl *doCreate(const DebuggerStartParameters &sp, - ProjectExplorer::RunConfiguration *rc); + ProjectExplorer::RunConfiguration *rc, QString *errorMessage); private: QString displayName() const; diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp index 85d96b9f50a..476d23e3acc 100644 --- a/src/plugins/debugger/debuggerrunner.cpp +++ b/src/plugins/debugger/debuggerrunner.cpp @@ -543,8 +543,9 @@ static DebuggerStartParameters localStartParameters(RunConfiguration *runConfigu } RunControl *DebuggerRunControlFactory::create - (RunConfiguration *runConfiguration, RunMode mode) + (RunConfiguration *runConfiguration, RunMode mode, QString *errorMessage) { + Q_UNUSED(errorMessage) QTC_ASSERT(mode == DebugRunMode || mode == DebugRunModeWithBreakOnMain, return 0); DebuggerStartParameters sp = localStartParameters(runConfiguration); if (sp.startMode == NoStartMode) @@ -552,7 +553,7 @@ RunControl *DebuggerRunControlFactory::create if (mode == DebugRunModeWithBreakOnMain) sp.breakOnMain = true; - return doCreate(sp, runConfiguration); + return doCreate(sp, runConfiguration, errorMessage); } static DebuggerEngineType guessUnixCppEngineType(const DebuggerStartParameters &sp) @@ -644,8 +645,9 @@ static void fixupEngineTypes(DebuggerStartParameters &sp, RunConfiguration *rc) } DebuggerRunControl *DebuggerRunControlFactory::doCreate - (const DebuggerStartParameters &sp0, RunConfiguration *rc) + (const DebuggerStartParameters &sp0, RunConfiguration *rc, QString *errorMessage) { + Q_UNUSED(errorMessage); DebuggerStartParameters sp = sp0; if (!debuggerCore()->boolSetting(AutoEnrichParameters)) { const QString sysroot = sp.sysRoot; @@ -663,8 +665,9 @@ DebuggerRunControl *DebuggerRunControlFactory::doCreate } fixupEngineTypes(sp, rc); - if (!sp.masterEngineType) + if (!sp.masterEngineType) { return 0; + } return new DebuggerRunControl(rc, sp); } @@ -672,9 +675,12 @@ DebuggerRunControl *DebuggerRunControlFactory::doCreate DebuggerRunControl *DebuggerRunControlFactory::createAndScheduleRun (const DebuggerStartParameters &sp, RunConfiguration *runConfiguration) { - DebuggerRunControl *rc = doCreate(sp, runConfiguration); - if (!rc) + QString errorMessage; + DebuggerRunControl *rc = doCreate(sp, runConfiguration, &errorMessage); + if (!rc) { + ProjectExplorer::ProjectExplorerPlugin::showRunErrorMessage(errorMessage); return 0; + } debuggerCore()->showMessage(sp.startMessage, 0); ProjectExplorerPlugin::instance()->startRunControl(rc, DebugRunMode); return rc; diff --git a/src/plugins/madde/maemorunfactories.cpp b/src/plugins/madde/maemorunfactories.cpp index da19923d871..2bb5e0f1243 100644 --- a/src/plugins/madde/maemorunfactories.cpp +++ b/src/plugins/madde/maemorunfactories.cpp @@ -202,7 +202,7 @@ bool MaemoRunControlFactory::canRun(RunConfiguration *runConfiguration, RunMode return maemoRunConfig->hasEnoughFreePorts(mode); } -RunControl* MaemoRunControlFactory::create(RunConfiguration *runConfig, RunMode mode) +RunControl* MaemoRunControlFactory::create(RunConfiguration *runConfig, RunMode mode, QString *errorMessage) { Q_ASSERT(canRun(runConfig, mode)); @@ -216,7 +216,7 @@ RunControl* MaemoRunControlFactory::create(RunConfiguration *runConfig, RunMode } const DebuggerStartParameters params = LinuxDeviceDebugSupport::startParameters(rc); - DebuggerRunControl * const runControl = DebuggerPlugin::createDebugger(params, rc); + DebuggerRunControl * const runControl = DebuggerPlugin::createDebugger(params, rc, errorMessage); if (!runControl) return 0; LinuxDeviceDebugSupport * const debugSupport diff --git a/src/plugins/madde/maemorunfactories.h b/src/plugins/madde/maemorunfactories.h index 8a54b6cd396..817cf39b9db 100644 --- a/src/plugins/madde/maemorunfactories.h +++ b/src/plugins/madde/maemorunfactories.h @@ -82,7 +82,9 @@ public: QString displayName() const; bool canRun(ProjectExplorer::RunConfiguration *runConfiguration, ProjectExplorer::RunMode mode) const; - RunControl *create(ProjectExplorer::RunConfiguration *runConfiguration, ProjectExplorer::RunMode mode); + RunControl *create(ProjectExplorer::RunConfiguration *runConfiguration, + ProjectExplorer::RunMode mode, + QString *errorMessage); }; } // namespace Internal diff --git a/src/plugins/projectexplorer/localapplicationruncontrol.cpp b/src/plugins/projectexplorer/localapplicationruncontrol.cpp index 4742403e040..0f9ef7d1ebe 100644 --- a/src/plugins/projectexplorer/localapplicationruncontrol.cpp +++ b/src/plugins/projectexplorer/localapplicationruncontrol.cpp @@ -61,13 +61,16 @@ QString LocalApplicationRunControlFactory::displayName() const return tr("Run"); } -RunControl *LocalApplicationRunControlFactory::create(RunConfiguration *runConfiguration, RunMode mode) +RunControl *LocalApplicationRunControlFactory::create(RunConfiguration *runConfiguration, RunMode mode, QString *errorMessage) { QTC_ASSERT(canRun(runConfiguration, mode), return 0); LocalApplicationRunConfiguration *localRunConfiguration = qobject_cast(runConfiguration); // Force the dialog about executables at this point and fail if there is none - if (localRunConfiguration->executable().isEmpty()) + if (localRunConfiguration->executable().isEmpty()) { + if (errorMessage) + *errorMessage = tr("No executable"); return 0; + } return new LocalApplicationRunControl(localRunConfiguration, mode); } diff --git a/src/plugins/projectexplorer/localapplicationruncontrol.h b/src/plugins/projectexplorer/localapplicationruncontrol.h index 3e9cdd0c030..59e8dcc2302 100644 --- a/src/plugins/projectexplorer/localapplicationruncontrol.h +++ b/src/plugins/projectexplorer/localapplicationruncontrol.h @@ -48,7 +48,7 @@ public: virtual ~LocalApplicationRunControlFactory(); virtual bool canRun(RunConfiguration *runConfiguration, RunMode mode) const; virtual QString displayName() const; - virtual RunControl* create(RunConfiguration *runConfiguration, RunMode mode); + virtual RunControl* create(RunConfiguration *runConfiguration, RunMode mode, QString *errorMessage); }; class LocalApplicationRunControl : public RunControl diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index bfffc7b536c..725f0bd8fc2 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -1576,13 +1576,29 @@ void ProjectExplorerPlugin::executeRunConfiguration(RunConfiguration *runConfigu if (IRunControlFactory *runControlFactory = findRunControlFactory(runConfiguration, runMode)) { emit aboutToExecuteProject(runConfiguration->target()->project(), runMode); - RunControl *control = runControlFactory->create(runConfiguration, runMode); - if (!control) + QString errorMessage; + RunControl *control = runControlFactory->create(runConfiguration, runMode, &errorMessage); + if (!control) { + showRunErrorMessage(errorMessage); return; + } startRunControl(control, runMode); } } +void ProjectExplorerPlugin::showRunErrorMessage(const QString &errorMessage) +{ + if (errorMessage.isNull()) { + // a error occured, but message was not set + QMessageBox::critical(Core::ICore::mainWindow(), tr("Unknown error"), errorMessage); + } else if (errorMessage.isEmpty()) { + // a error, but the message was set to empty + // hack for qml observer warning, show nothing at all + } else { + QMessageBox::critical(Core::ICore::mainWindow(), tr("Could Not Run"), errorMessage); + } +} + void ProjectExplorerPlugin::startRunControl(RunControl *runControl, RunMode runMode) { d->m_outputPane->createNewOutputWindow(runControl); diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h index 1ec882c1dab..5f247235524 100644 --- a/src/plugins/projectexplorer/projectexplorer.h +++ b/src/plugins/projectexplorer/projectexplorer.h @@ -109,6 +109,7 @@ public: Internal::ProjectExplorerSettings projectExplorerSettings() const; void startRunControl(RunControl *runControl, RunMode runMode); + static void showRunErrorMessage(const QString &errorMessage); // internal public for FlatModel void renameFile(Node *node, const QString &to); diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h index 99817ba23fa..b476024668b 100644 --- a/src/plugins/projectexplorer/runconfiguration.h +++ b/src/plugins/projectexplorer/runconfiguration.h @@ -228,7 +228,7 @@ public: virtual ~IRunControlFactory(); virtual bool canRun(RunConfiguration *runConfiguration, RunMode mode) const = 0; - virtual RunControl *create(RunConfiguration *runConfiguration, RunMode mode) = 0; + virtual RunControl *create(RunConfiguration *runConfiguration, RunMode mode, QString *errorMessage) = 0; virtual QString displayName() const = 0; diff --git a/src/plugins/qmlprojectmanager/qmlprojectruncontrol.cpp b/src/plugins/qmlprojectmanager/qmlprojectruncontrol.cpp index 5aa72661d81..2667e7dd5ff 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectruncontrol.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectruncontrol.cpp @@ -167,7 +167,7 @@ bool QmlProjectRunControlFactory::canRun(RunConfiguration *runConfiguration, } RunControl *QmlProjectRunControlFactory::create(RunConfiguration *runConfiguration, - RunMode mode) + RunMode mode, QString *errorMessage) { QTC_ASSERT(canRun(runConfiguration, mode), return 0); QmlProjectRunConfiguration *config = qobject_cast(runConfiguration); @@ -187,7 +187,7 @@ RunControl *QmlProjectRunControlFactory::create(RunConfiguration *runConfigurati if (mode == NormalRunMode) runControl = new QmlProjectRunControl(config, mode); else if (mode == DebugRunMode) - runControl = createDebugRunControl(config); + runControl = createDebugRunControl(config, errorMessage); return runControl; } @@ -196,7 +196,7 @@ QString QmlProjectRunControlFactory::displayName() const return tr("Run"); } -RunControl *QmlProjectRunControlFactory::createDebugRunControl(QmlProjectRunConfiguration *runConfig) +RunControl *QmlProjectRunControlFactory::createDebugRunControl(QmlProjectRunConfiguration *runConfig, QString *errorMessage) { Debugger::DebuggerStartParameters params; params.startMode = Debugger::StartInternal; @@ -224,10 +224,11 @@ RunControl *QmlProjectRunControlFactory::createDebugRunControl(QmlProjectRunConf if (params.executable.isEmpty()) { QmlProjectPlugin::showQmlObserverToolWarning(); + *errorMessage = QString(""); // hack, we already showed a error message return 0; } - return Debugger::DebuggerPlugin::createDebugger(params, runConfig); + return Debugger::DebuggerPlugin::createDebugger(params, runConfig, errorMessage); } } // namespace Internal diff --git a/src/plugins/qmlprojectmanager/qmlprojectruncontrol.h b/src/plugins/qmlprojectmanager/qmlprojectruncontrol.h index 918213f3c68..554e1d247f3 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectruncontrol.h +++ b/src/plugins/qmlprojectmanager/qmlprojectruncontrol.h @@ -77,11 +77,12 @@ public: // IRunControlFactory virtual bool canRun(ProjectExplorer::RunConfiguration *runConfiguration, ProjectExplorer::RunMode mode) const; - virtual ProjectExplorer::RunControl *create(ProjectExplorer::RunConfiguration *runConfiguration, ProjectExplorer::RunMode mode); + virtual ProjectExplorer::RunControl *create(ProjectExplorer::RunConfiguration *runConfiguration, + ProjectExplorer::RunMode mode, QString *errorMessage); virtual QString displayName() const; private: - ProjectExplorer::RunControl *createDebugRunControl(QmlProjectRunConfiguration *runConfig); + ProjectExplorer::RunControl *createDebugRunControl(QmlProjectRunConfiguration *runConfig, QString *errorMessage); }; } // namespace Internal diff --git a/src/plugins/qnx/blackberryruncontrolfactory.cpp b/src/plugins/qnx/blackberryruncontrolfactory.cpp index af31f90166b..bac096dbdbe 100644 --- a/src/plugins/qnx/blackberryruncontrolfactory.cpp +++ b/src/plugins/qnx/blackberryruncontrolfactory.cpp @@ -82,9 +82,8 @@ bool BlackBerryRunControlFactory::canRun(ProjectExplorer::RunConfiguration *runC return activeDeployConf != 0; } -ProjectExplorer::RunControl *BlackBerryRunControlFactory::create( - ProjectExplorer::RunConfiguration *runConfiguration, - ProjectExplorer::RunMode mode) +ProjectExplorer::RunControl *BlackBerryRunControlFactory::create(ProjectExplorer::RunConfiguration *runConfiguration, + ProjectExplorer::RunMode mode, QString *errorMessage) { BlackBerryRunConfiguration *rc = qobject_cast(runConfiguration); if (!rc) @@ -92,8 +91,11 @@ ProjectExplorer::RunControl *BlackBerryRunControlFactory::create( BlackBerryDeployConfiguration *activeDeployConf = qobject_cast( rc->target()->activeDeployConfiguration()); - if (!activeDeployConf) + if (!activeDeployConf) { + if (errorMessage) + *errorMessage = tr("No active deploy configuration"); return 0; + } if (mode == ProjectExplorer::NormalRunMode) { BlackBerryRunControl *runControl = new BlackBerryRunControl(rc); @@ -102,7 +104,7 @@ ProjectExplorer::RunControl *BlackBerryRunControlFactory::create( } Debugger::DebuggerRunControl * const runControl = - Debugger::DebuggerPlugin::createDebugger(startParameters(rc), runConfiguration); + Debugger::DebuggerPlugin::createDebugger(startParameters(rc), runConfiguration, errorMessage); if (!runControl) return 0; diff --git a/src/plugins/qnx/blackberryruncontrolfactory.h b/src/plugins/qnx/blackberryruncontrolfactory.h index 78ad4729ce6..e6794e40d28 100644 --- a/src/plugins/qnx/blackberryruncontrolfactory.h +++ b/src/plugins/qnx/blackberryruncontrolfactory.h @@ -57,7 +57,8 @@ public: bool canRun(ProjectExplorer::RunConfiguration *runConfiguration, ProjectExplorer::RunMode mode) const; ProjectExplorer::RunControl *create(ProjectExplorer::RunConfiguration *runConfiguration, - ProjectExplorer::RunMode mode); + ProjectExplorer::RunMode mode, + QString *errorMessage); QString displayName() const; diff --git a/src/plugins/qnx/qnxruncontrolfactory.cpp b/src/plugins/qnx/qnxruncontrolfactory.cpp index b9803bbb16d..90e8325ebfd 100644 --- a/src/plugins/qnx/qnxruncontrolfactory.cpp +++ b/src/plugins/qnx/qnxruncontrolfactory.cpp @@ -116,7 +116,7 @@ bool QnxRunControlFactory::canRun(RunConfiguration *runConfiguration, RunMode mo return true; } -RunControl *QnxRunControlFactory::create(RunConfiguration *runConfig, RunMode mode) +RunControl *QnxRunControlFactory::create(RunConfiguration *runConfig, RunMode mode, QString *errorMessage) { Q_ASSERT(canRun(runConfig, mode)); @@ -126,7 +126,7 @@ RunControl *QnxRunControlFactory::create(RunConfiguration *runConfig, RunMode mo return new QnxRunControl(rc); const DebuggerStartParameters params = createStartParameters(rc); - DebuggerRunControl * const runControl = DebuggerPlugin::createDebugger(params, rc); + DebuggerRunControl * const runControl = DebuggerPlugin::createDebugger(params, rc, errorMessage); if (!runControl) return 0; diff --git a/src/plugins/qnx/qnxruncontrolfactory.h b/src/plugins/qnx/qnxruncontrolfactory.h index fcdd0706212..89b3d3646a9 100644 --- a/src/plugins/qnx/qnxruncontrolfactory.h +++ b/src/plugins/qnx/qnxruncontrolfactory.h @@ -52,7 +52,7 @@ public: bool canRun(ProjectExplorer::RunConfiguration *runConfiguration, ProjectExplorer::RunMode mode) const; ProjectExplorer::RunControl *create(ProjectExplorer::RunConfiguration *runConfiguration, - ProjectExplorer::RunMode mode); + ProjectExplorer::RunMode mode, QString *errorMessage); }; } // namespace Internal diff --git a/src/plugins/remotelinux/remotelinuxruncontrolfactory.cpp b/src/plugins/remotelinux/remotelinuxruncontrolfactory.cpp index 1132bf24e97..5741fb47011 100644 --- a/src/plugins/remotelinux/remotelinuxruncontrolfactory.cpp +++ b/src/plugins/remotelinux/remotelinuxruncontrolfactory.cpp @@ -80,7 +80,7 @@ bool RemoteLinuxRunControlFactory::canRun(RunConfiguration *runConfiguration, Ru return true; } -RunControl *RemoteLinuxRunControlFactory::create(RunConfiguration *runConfig, RunMode mode) +RunControl *RemoteLinuxRunControlFactory::create(RunConfiguration *runConfig, RunMode mode, QString *errorMessage) { Q_ASSERT(canRun(runConfig, mode)); @@ -92,7 +92,7 @@ RunControl *RemoteLinuxRunControlFactory::create(RunConfiguration *runConfig, Ru DebuggerStartParameters params = LinuxDeviceDebugSupport::startParameters(rc); if (mode == ProjectExplorer::DebugRunModeWithBreakOnMain) params.breakOnMain = true; - DebuggerRunControl * const runControl = DebuggerPlugin::createDebugger(params, rc); + DebuggerRunControl * const runControl = DebuggerPlugin::createDebugger(params, rc, errorMessage); if (!runControl) return 0; LinuxDeviceDebugSupport * const debugSupport = diff --git a/src/plugins/remotelinux/remotelinuxruncontrolfactory.h b/src/plugins/remotelinux/remotelinuxruncontrolfactory.h index c96053278d1..9f26125ca66 100644 --- a/src/plugins/remotelinux/remotelinuxruncontrolfactory.h +++ b/src/plugins/remotelinux/remotelinuxruncontrolfactory.h @@ -46,7 +46,7 @@ public: bool canRun(ProjectExplorer::RunConfiguration *runConfiguration, ProjectExplorer::RunMode mode) const; ProjectExplorer::RunControl *create(ProjectExplorer::RunConfiguration *runConfiguration, - ProjectExplorer::RunMode mode); + ProjectExplorer::RunMode mode, QString *errorMessage); }; } // namespace Internal From a792576a099236752f174469ac1ff4fd841caab1 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 5 Sep 2012 11:01:29 +0200 Subject: [PATCH 04/73] Squish: Fix for modified and new project template Change-Id: I352a7164391531b6cb48facfb83e56bfadf3c21c Reviewed-by: Robert Loehning --- tests/system/shared/project.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/system/shared/project.py b/tests/system/shared/project.py index 9bce4e75633..5ecee1ca2e2 100644 --- a/tests/system/shared/project.py +++ b/tests/system/shared/project.py @@ -199,11 +199,12 @@ def createProject_Qt_Console(path, projectName, checks = True): waitForSignal("{type='CppTools::Internal::CppModelManager' unnamed='1'}", "sourceFilesRefreshed(QStringList)", 10000) __verifyFileCreation__(path, expectedFiles) -def createNewQtQuickApplication(workingDir, projectName = None, templateFile = None, targets = QtQuickConstants.Targets.DESKTOP): +def createNewQtQuickApplication(workingDir, projectName = None, templateFile = None, targets = QtQuickConstants.Targets.DESKTOP, qtQuickVersion=1): if templateFile: available = __createProjectSelectType__(" Applications", "Qt Quick Application (from Existing QML File)") else: - available = __createProjectSelectType__(" Applications", "Qt Quick Application (Built-in Elements)") + available = __createProjectSelectType__(" Applications", "Qt Quick %d Application (Built-in Elements)" + % qtQuickVersion) projectName = __createProjectSetNameAndPath__(workingDir, projectName) if templateFile: baseLineEd = waitForObject("{type='Utils::BaseValidatingLineEdit' unnamed='1' visible='1'}", 20000) From 6e1ac1aafa9857e47d14ebc70d014e06405a42ba Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 5 Sep 2012 11:30:04 +0200 Subject: [PATCH 05/73] Squish: Use global objects.map from inside APTW Change-Id: Ica05af5652a3666277723e6ef9e96ecd5dc0c9f5 Reviewed-by: Robert Loehning --- tests/system/objects.map | 2 ++ tests/system/suite_APTW/objects.map | 25 ------------------------- tests/system/suite_APTW/suite.conf | 2 ++ 3 files changed, 4 insertions(+), 25 deletions(-) delete mode 100644 tests/system/suite_APTW/objects.map diff --git a/tests/system/objects.map b/tests/system/objects.map index 930bde9318a..45e3b8628c7 100644 --- a/tests/system/objects.map +++ b/tests/system/objects.map @@ -1,3 +1,4 @@ +:*Qt Creator.Clear_QToolButton {text='Clear' type='QToolButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :*Qt Creator.Continue_Core::Internal::FancyToolButton {text='Continue' type='Core::Internal::FancyToolButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :*Qt Creator.DoubleTabWidget_ProjectExplorer::Internal::DoubleTabWidget {name='ProjectExplorer__Internal__DoubleTabWidget' type='ProjectExplorer::Internal::DoubleTabWidget' visible='1' window=':Qt Creator_Core::Internal::MainWindow' windowTitle='DoubleTabWidget'} :*Qt Creator.Interrupt_Core::Internal::FancyToolButton {text='Interrupt' type='Core::Internal::FancyToolButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} @@ -37,6 +38,7 @@ :Options_QListView {type='QListView' unnamed='1' visible='1' window=':Options_Core::Internal::SettingsDialog'} :QML Debugging.No_QPushButton {text='No' type='QPushButton' unnamed='1' visible='1' window=':QML Debugging_QMessageBox'} :QML Debugging_QMessageBox {type='QMessageBox' unnamed='1' visible='1' windowTitle='QML Debugging'} +:Qt Creator.Compile Output_Core::OutputWindow {type='Core::OutputWindow' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow' windowTitle='Compile Output'} :Qt Creator.DebugModeWidget_QSplitter {name='DebugModeWidget' type='QSplitter' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator.QtCreator.MenuBar_QMenuBar {name='QtCreator.MenuBar' type='QMenuBar' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator.ReRun_QToolButton {toolTip='Re-run this run-configuration' type='QToolButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} diff --git a/tests/system/suite_APTW/objects.map b/tests/system/suite_APTW/objects.map deleted file mode 100644 index be982b486c6..00000000000 --- a/tests/system/suite_APTW/objects.map +++ /dev/null @@ -1,25 +0,0 @@ -:*Qt Creator.Clear_QToolButton {text='Clear' type='QToolButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} -:*Qt Creator.DoubleTabWidget_ProjectExplorer::Internal::DoubleTabWidget {name='ProjectExplorer__Internal__DoubleTabWidget' type='ProjectExplorer::Internal::DoubleTabWidget' visible='1' window=':Qt Creator_Core::Internal::MainWindow' windowTitle='DoubleTabWidget'} -:Next_QPushButton {text~='(Next.*|Continue)' type='QPushButton' visible='1'} -:Options.OK_QPushButton {text='OK' type='QPushButton' unnamed='1' visible='1' window=':Options_Core::Internal::SettingsDialog'} -:Qt Creator.Compile Output_Core::OutputWindow {type='Core::OutputWindow' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow' windowTitle='Compile Output'} -:Qt Creator.QtCreator.MenuBar_QMenuBar {name='QtCreator.MenuBar' type='QMenuBar' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} -:Qt Creator.ReRun_QToolButton {toolTip='Re-run this run-configuration' type='QToolButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} -:Qt Creator.Stop_QToolButton {text='Stop' type='QToolButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} -:Qt Creator.scrollArea_QScrollArea {name='scrollArea' type='QScrollArea' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} -:Qt Creator_AppOutput_Core::Internal::OutputPaneToggleButton {occurrence='3' type='Core::Internal::OutputPaneToggleButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} -:Qt Creator_Core::Internal::MainWindow {type='Core::Internal::MainWindow' unnamed='1' visible='1' windowTitle?='*Qt Creator'} -:Qt Gui Application.Form file:_QLabel {name='formLabel' text='Form file:' type='QLabel' visible='1' window=':Qt Gui Application_Qt4ProjectManager::Internal::GuiAppWizardDialog'} -:Qt Gui Application.Header file:_QLabel {name='headerLabel' text='Header file:' type='QLabel' visible='1' window=':Qt Gui Application_Qt4ProjectManager::Internal::GuiAppWizardDialog'} -:Qt Gui Application.Source file:_QLabel {name='sourceLabel' text='Source file:' type='QLabel' visible='1' window=':Qt Gui Application_Qt4ProjectManager::Internal::GuiAppWizardDialog'} -:Qt Gui Application.scrollArea_QScrollArea {name='scrollArea' type='QScrollArea' visible='1'} -:Qt Gui Application_Qt4ProjectManager::Internal::GuiAppWizardDialog {type='Qt4ProjectManager::Internal::GuiAppWizardDialog' unnamed='1' visible='1' windowTitle='Qt Gui Application'} -:addToVersionControlComboBox_QComboBox {name='addToVersionControlComboBox' type='QComboBox' visible='1'} -:formFileLineEdit_Utils::FileNameValidatingLineEdit {buddy=':Qt Gui Application.Form file:_QLabel' name='formFileLineEdit' type='Utils::FileNameValidatingLineEdit' visible='1'} -:headerFileLineEdit_Utils::FileNameValidatingLineEdit {buddy=':Qt Gui Application.Header file:_QLabel' name='headerFileLineEdit' type='Utils::FileNameValidatingLineEdit' visible='1'} -:scrollArea.Create Build Configurations:_QComboBox_2 {container=':Qt Gui Application.scrollArea_QScrollArea' leftWidget=':scrollArea.Create Build Configurations:_QLabel_2' type='QComboBox' unnamed='1' visible='1'} -:scrollArea.Create Build Configurations:_QLabel_2 {container=':Qt Gui Application.scrollArea_QScrollArea' text='Create build configurations:' type='QLabel' unnamed='1' visible='1'} -:scrollArea.Edit build configuration:_QComboBox {leftWidget=':scrollArea.Edit build configuration:_QLabel' type='QComboBox' unnamed='1' visible='1'} -:scrollArea.Edit build configuration:_QLabel {text='Edit build configuration:' type='QLabel' unnamed='1' visible='1'} -:scrollArea.Use Shadow Building_QCheckBox {container=':Qt Gui Application.scrollArea_QScrollArea' text='Shadow build' type='QCheckBox' unnamed='1' visible='1'} -:sourceFileLineEdit_Utils::FileNameValidatingLineEdit {buddy=':Qt Gui Application.Source file:_QLabel' name='sourceFileLineEdit' type='Utils::FileNameValidatingLineEdit' visible='1'} diff --git a/tests/system/suite_APTW/suite.conf b/tests/system/suite_APTW/suite.conf index 961a3700f63..225c687e235 100644 --- a/tests/system/suite_APTW/suite.conf +++ b/tests/system/suite_APTW/suite.conf @@ -1,10 +1,12 @@ AUT=qtcreator CLASS= CLASSPATH= +CWD= ENVVARS=envvars HOOK_SUB_PROCESSES=false IMPLICITAUTSTART=0 LANGUAGE=Python +OBJECTMAP=../objects.map TEST_CASES=tst_APTW01 tst_APTW02 VERSION=2 WRAPPERS=Qt From 2c3fe560b9679ace5ee4ec35fb2f7dc633238fd1 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 5 Sep 2012 14:33:13 +0200 Subject: [PATCH 06/73] tr()-Fixes: Fix spelling errors in text editor settings. "Occurrences", "parentheses", "applied to". Change-Id: I48d3d4e6c10e29888f4f2ee6dfbe02b0b0c5646b Reviewed-by: David Schulz Reviewed-by: Leandro Melo --- src/plugins/texteditor/basetexteditor.cpp | 2 +- src/plugins/texteditor/texteditorsettings.cpp | 20 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp index 6d95e71107b..e734f87f278 100644 --- a/src/plugins/texteditor/basetexteditor.cpp +++ b/src/plugins/texteditor/basetexteditor.cpp @@ -4070,7 +4070,7 @@ void BaseTextEditorWidget::updateHighlights() d->m_parenthesesMatchingTimer->start(50); } else { // use 0-timer, not direct call, to give the syntax highlighter a chance - // to update the parantheses information + // to update the parentheses information d->m_parenthesesMatchingTimer->start(0); } } diff --git a/src/plugins/texteditor/texteditorsettings.cpp b/src/plugins/texteditor/texteditorsettings.cpp index 02afdf49068..3d31cd24e3a 100644 --- a/src/plugins/texteditor/texteditorsettings.cpp +++ b/src/plugins/texteditor/texteditorsettings.cpp @@ -113,7 +113,7 @@ TextEditorSettings::TextEditorSettings(QObject *parent) // Add font preference page FormatDescriptions formatDescr; - formatDescr.append(FormatDescription(C_TEXT, tr("Text"), tr("Generic text.\nApplied for " + formatDescr.append(FormatDescription(C_TEXT, tr("Text"), tr("Generic text.\nApplied to " "text, if no other " "rules matching."))); @@ -131,7 +131,7 @@ TextEditorSettings::TextEditorSettings(QObject *parent) formatDescr.append(FormatDescription(C_SEARCH_SCOPE, tr("Search Scope"), tr("Section where the pattern is searched in."))); formatDescr.append(FormatDescription(C_PARENTHESES, tr("Parentheses"), - tr("Displayed when matching parantheses, square brackets " + tr("Displayed when matching parentheses, square brackets " "or curly brackets are found."))); formatDescr.append(FormatDescription(C_CURRENT_LINE, tr("Current Line"), tr("Line where the cursor is placed in."))); @@ -145,12 +145,12 @@ TextEditorSettings::TextEditorSettings(QObject *parent) formatDescr.append(FormatDescription(C_OCCURRENCES, tr("Occurrences"), - tr("Occurences of the symbol under the cursor.\n" - "(Only the backgroud will be applied.)"))); + tr("Occurrences of the symbol under the cursor.\n" + "(Only the background will be applied.)"))); formatDescr.append(FormatDescription(C_OCCURRENCES_UNUSED, tr("Unused Occurrence"), - tr("Occurences of unused variables."))); + tr("Occurrences of unused variables."))); formatDescr.append(FormatDescription(C_OCCURRENCES_RENAME, tr("Renaming Occurrence"), - tr("Occurences of a symbol that will be renamed."))); + tr("Occurrences of a symbol that will be renamed."))); // Standard categories formatDescr.append(FormatDescription(C_NUMBER, tr("Number"), tr("Number literal."), @@ -163,7 +163,7 @@ TextEditorSettings::TextEditorSettings(QObject *parent) formatDescr.append(FormatDescription(C_FIELD, tr("Field"), tr("Class' data members."), Qt::darkRed)); formatDescr.append(FormatDescription(C_ENUMERATION, tr("Enumeration"), - tr("Applied for Enumeration Items."), Qt::darkMagenta)); + tr("Applied to Enumeration Items."), Qt::darkMagenta)); Format functionFormat; formatDescr.append(FormatDescription(C_FUNCTION, tr("Function"), tr("Name of a function."), @@ -238,17 +238,17 @@ TextEditorSettings::TextEditorSettings(QObject *parent) formatDescr.append(FormatDescription(C_DOXYGEN_TAG, tr("Doxygen Tag"), tr("Doxygen tags"), Qt::blue)); formatDescr.append(FormatDescription(C_VISUAL_WHITESPACE, tr("Visual Whitespace"), - tr("Whitespace\nWill not be applied for whitespace " + tr("Whitespace\nWill not be applied to whitespace " "in comments and strings."), Qt::lightGray)); formatDescr.append(FormatDescription(C_DISABLED_CODE, tr("Disabled Code"), tr("Code disabled by preprocessor directives."))); // Diff categories formatDescr.append(FormatDescription(C_ADDED_LINE, tr("Added Line"), - tr("Applied for added lines in differences " + tr("Applied to added lines in differences " "(in diff editor)."), QColor(0, 170, 0))); formatDescr.append(FormatDescription(C_REMOVED_LINE, tr("Removed Line"), - tr("Applied for removed lines " + tr("Applied to removed lines " "in differences (in diff editor)."), Qt::red)); formatDescr.append(FormatDescription(C_DIFF_FILE, tr("Diff File"), tr("Compared files (in diff editor)."), Qt::darkBlue)); From 824d04252e1c2d461dadc09c657d2c896b0c74ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20N=C3=A4tterlund?= Date: Wed, 5 Sep 2012 13:46:50 +0200 Subject: [PATCH 07/73] QNX: Fixed crashes when no BlackBerry device is selected in the kit used Change-Id: Ic3059a0dd128bc66495f3288bbf1982f81d023d6 Reviewed-by: Tobias Hunger --- src/plugins/qnx/blackberrycreatepackagestep.cpp | 3 +++ src/plugins/qnx/blackberrydeployconfiguration.cpp | 6 ++++++ src/plugins/qnx/blackberryruncontrolfactory.cpp | 4 ++++ 3 files changed, 13 insertions(+) diff --git a/src/plugins/qnx/blackberrycreatepackagestep.cpp b/src/plugins/qnx/blackberrycreatepackagestep.cpp index d0c63858788..e8d03ee72a5 100644 --- a/src/plugins/qnx/blackberrycreatepackagestep.cpp +++ b/src/plugins/qnx/blackberrycreatepackagestep.cpp @@ -157,6 +157,9 @@ ProjectExplorer::BuildStepConfigWidget *BlackBerryCreatePackageStep::createConfi QString BlackBerryCreatePackageStep::debugToken() const { BlackBerryDeviceConfiguration::ConstPtr device = BlackBerryDeviceConfiguration::device(target()->kit()); + if (!device) + return QString(); + return device->debugToken(); } diff --git a/src/plugins/qnx/blackberrydeployconfiguration.cpp b/src/plugins/qnx/blackberrydeployconfiguration.cpp index 0db9788d6b2..cbf93f40d25 100644 --- a/src/plugins/qnx/blackberrydeployconfiguration.cpp +++ b/src/plugins/qnx/blackberrydeployconfiguration.cpp @@ -90,6 +90,9 @@ BlackBerryDeployInformation *BlackBerryDeployConfiguration::deploymentInfo() con QString BlackBerryDeployConfiguration::deviceHost() const { BlackBerryDeviceConfiguration::ConstPtr device = BlackBerryDeviceConfiguration::device(target()->kit()); + if (!device) + return QString(); + return device->sshParameters().host; } @@ -102,6 +105,9 @@ QString BlackBerryDeployConfiguration::password() const QString BlackBerryDeployConfiguration::deviceName() const { BlackBerryDeviceConfiguration::ConstPtr device = BlackBerryDeviceConfiguration::device(target()->kit()); + if (!device) + return QString(); + return device->displayName(); } diff --git a/src/plugins/qnx/blackberryruncontrolfactory.cpp b/src/plugins/qnx/blackberryruncontrolfactory.cpp index bac096dbdbe..592972a6cca 100644 --- a/src/plugins/qnx/blackberryruncontrolfactory.cpp +++ b/src/plugins/qnx/blackberryruncontrolfactory.cpp @@ -66,6 +66,10 @@ bool BlackBerryRunControlFactory::canRun(ProjectExplorer::RunConfiguration *runC if (!rc) return false; + BlackBerryDeviceConfiguration::ConstPtr device = BlackBerryDeviceConfiguration::device(rc->target()->kit()); + if (!device) + return false; + // The device can only run the same application once, any subsequent runs will // not launch a second instance. Disable the Run button if the application is already // running on the device. From af6bbc442ecb60d2ddcb37752215f6a2e3e5bea4 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 5 Sep 2012 14:56:08 +0200 Subject: [PATCH 08/73] Add debugger engine type to configuration. Introduce a struct DebuggerItem as a debugger configuration item, containing debugger engine type and binary. Store information as a variant map. Add a combo box. Remove engine guessing logic. Parts of it are still required when checking the suggested debugger from the SDK. Split error checking to be able to do a quick error check and find only valid profiles in the matchers. Pass on errors up to RunControl::create(). Change-Id: I08653e2a76ca2c371701082f8173b0b8f8ed462e Reviewed-by: Tobias Hunger --- src/plugins/debugger/debuggerdialogs.cpp | 3 +- .../debugger/debuggerkitconfigwidget.cpp | 109 +++++--- .../debugger/debuggerkitconfigwidget.h | 20 +- .../debugger/debuggerkitinformation.cpp | 233 +++++++++++++----- src/plugins/debugger/debuggerkitinformation.h | 41 ++- src/plugins/debugger/debuggerplugin.cpp | 68 +++-- src/plugins/debugger/debuggerrunner.cpp | 87 ++----- .../debugger/debuggerstartparameters.h | 4 +- .../debugger/gdb/startgdbserverdialog.cpp | 2 +- src/plugins/debugger/lldb/lldbenginehost.cpp | 1 + 10 files changed, 379 insertions(+), 189 deletions(-) diff --git a/src/plugins/debugger/debuggerdialogs.cpp b/src/plugins/debugger/debuggerdialogs.cpp index 893cbb13f09..504dcd338ee 100644 --- a/src/plugins/debugger/debuggerdialogs.cpp +++ b/src/plugins/debugger/debuggerdialogs.cpp @@ -374,8 +374,7 @@ bool StartApplicationDialog::run(QWidget *parent, QSettings *settings, DebuggerS } Kit *kit = dialog.d->kitChooser->currentKit(); - QTC_ASSERT(kit, return false); - fillParameters(sp, kit); + QTC_ASSERT(kit && fillParameters(sp, kit), return false); sp->executable = newParameters.localExecutable; sp->displayName = newParameters.displayName(); diff --git a/src/plugins/debugger/debuggerkitconfigwidget.cpp b/src/plugins/debugger/debuggerkitconfigwidget.cpp index 96cf2b04a75..6ceb478fb2d 100644 --- a/src/plugins/debugger/debuggerkitconfigwidget.cpp +++ b/src/plugins/debugger/debuggerkitconfigwidget.cpp @@ -29,7 +29,6 @@ **************************************************************************/ #include "debuggerkitconfigwidget.h" - #include "debuggerkitinformation.h" #include @@ -48,6 +47,8 @@ #include #include #include +#include +#include namespace Debugger { namespace Internal { @@ -55,6 +56,7 @@ namespace Internal { static const char dgbToolsDownloadLink32C[] = "http://www.microsoft.com/whdc/devtools/debugging/installx86.Mspx"; static const char dgbToolsDownloadLink64C[] = "http://www.microsoft.com/whdc/devtools/debugging/install64bit.Mspx"; + // ----------------------------------------------------------------------- // DebuggerKitConfigWidget: // ----------------------------------------------------------------------- @@ -65,34 +67,26 @@ DebuggerKitConfigWidget::DebuggerKitConfigWidget(ProjectExplorer::Kit *k, ProjectExplorer::KitConfigWidget(parent), m_kit(k), m_info(ki), - m_chooser(new Utils::PathChooser) + m_comboBox(new QComboBox(this)), + m_label(new QLabel(this)), + m_chooser(new Utils::PathChooser(this)) { setToolTip(tr("The debugger to use for this kit.")); QVBoxLayout *layout = new QVBoxLayout(this); layout->setMargin(0); - ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainKitInformation::toolChain(k); - if (tc && tc->targetAbi().os() == ProjectExplorer::Abi::WindowsOS - && tc->targetAbi().osFlavor() != ProjectExplorer::Abi::WindowsMSysFlavor) { - QLabel *msvcDebuggerConfigLabel = new QLabel; -#ifdef Q_OS_WIN - const bool is64bit = Utils::winIs64BitSystem(); -#else - const bool is64bit = false; -#endif - const QString link = is64bit ? QLatin1String(dgbToolsDownloadLink64C) : QLatin1String(dgbToolsDownloadLink32C); - //: Label text for path configuration. %2 is "x-bit version". - msvcDebuggerConfigLabel->setText(tr("

Specify the path to the " - "Windows Console Debugger executable" - " (%2) here.

" - "").arg(link, (is64bit ? tr("64-bit version") - : tr("32-bit version")))); - msvcDebuggerConfigLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); - msvcDebuggerConfigLabel->setOpenExternalLinks(true); - layout->addWidget(msvcDebuggerConfigLabel); - + m_comboBox->addItem(DebuggerKitInformation::debuggerEngineName(GdbEngineType), QVariant(int(GdbEngineType))); + if (ProjectExplorer::Abi::hostAbi().os() == ProjectExplorer::Abi::WindowsOS) { + m_comboBox->addItem(DebuggerKitInformation::debuggerEngineName(CdbEngineType), QVariant(int(CdbEngineType))); + } else { + m_comboBox->addItem(DebuggerKitInformation::debuggerEngineName(LldbEngineType), QVariant(int(LldbEngineType))); } + layout->addWidget(m_comboBox); + + m_label->setTextInteractionFlags(Qt::TextBrowserInteraction); + m_label->setOpenExternalLinks(true); + layout->addWidget(m_label); m_chooser->setContentsMargins(0, 0, 0, 0); m_chooser->setExpectedKind(Utils::PathChooser::ExistingCommand); @@ -102,6 +96,8 @@ DebuggerKitConfigWidget::DebuggerKitConfigWidget(ProjectExplorer::Kit *k, discard(); connect(m_chooser, SIGNAL(changed(QString)), this, SIGNAL(dirty())); + connect(m_comboBox, SIGNAL(currentIndexChanged(int)), this, SIGNAL(dirty())); + connect(m_comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(refreshLabel())); } QString DebuggerKitConfigWidget::displayName() const @@ -111,23 +107,26 @@ QString DebuggerKitConfigWidget::displayName() const void DebuggerKitConfigWidget::makeReadOnly() { + m_comboBox->setEnabled(false); m_chooser->setEnabled(false); } void DebuggerKitConfigWidget::apply() { - Utils::FileName fn = m_chooser->fileName(); - DebuggerKitInformation::setDebuggerCommand(m_kit, fn); + DebuggerKitInformation::setDebuggerItem(m_kit, DebuggerKitInformation::DebuggerItem(engineType(), fileName())); } void DebuggerKitConfigWidget::discard() { - m_chooser->setFileName(DebuggerKitInformation::debuggerCommand(m_kit)); + const DebuggerKitInformation::DebuggerItem item = DebuggerKitInformation::debuggerItem(m_kit); + setEngineType(item.engineType); + setFileName(item.binary); } bool DebuggerKitConfigWidget::isDirty() const { - return m_chooser->fileName() != DebuggerKitInformation::debuggerCommand(m_kit); + const DebuggerKitInformation::DebuggerItem item = DebuggerKitInformation::debuggerItem(m_kit); + return item.engineType != engineType() || item.binary != fileName(); } QWidget *DebuggerKitConfigWidget::buttonWidget() const @@ -137,8 +136,62 @@ QWidget *DebuggerKitConfigWidget::buttonWidget() const void DebuggerKitConfigWidget::autoDetectDebugger() { - QVariant v = m_info->defaultValue(m_kit); - m_chooser->setFileName(Utils::FileName::fromString(v.toString())); + const DebuggerKitInformation::DebuggerItem item = DebuggerKitInformation::autoDetectItem(m_kit); + setEngineType(item.engineType); + setFileName(item.binary); +} + +DebuggerEngineType DebuggerKitConfigWidget::engineType() const +{ + const int index = m_comboBox->currentIndex(); + return static_cast(m_comboBox->itemData(index).toInt()); +} + +void DebuggerKitConfigWidget::setEngineType(DebuggerEngineType et) +{ + const int size = m_comboBox->count(); + for (int i = 0; i < size; ++i) { + if (m_comboBox->itemData(i).toInt() == et) { + m_comboBox->setCurrentIndex(i); + refreshLabel(); + break; + } + } +} + +Utils::FileName DebuggerKitConfigWidget::fileName() const +{ + return m_chooser->fileName(); +} + +void DebuggerKitConfigWidget::setFileName(const Utils::FileName &fn) +{ + m_chooser->setFileName(fn); +} + +void DebuggerKitConfigWidget::refreshLabel() +{ + QString text; + switch (engineType()) { + case CdbEngineType: { +#ifdef Q_OS_WIN + const bool is64bit = Utils::winIs64BitSystem(); +#else + const bool is64bit = false; +#endif + const QString link = is64bit ? QLatin1String(dgbToolsDownloadLink64C) : QLatin1String(dgbToolsDownloadLink32C); + const QString versionString = is64bit ? tr("64-bit version") : tr("32-bit version"); + //: Label text for path configuration. %2 is "x-bit version". + text = tr("

Specify the path to the " + "Windows Console Debugger executable" + " (%2) here.

""").arg(link, versionString); + } + break; + default: + break; + } + m_label->setText(text); + m_label->setVisible(!text.isEmpty()); } } // namespace Internal diff --git a/src/plugins/debugger/debuggerkitconfigwidget.h b/src/plugins/debugger/debuggerkitconfigwidget.h index b818f3817f4..a54ee648b8c 100644 --- a/src/plugins/debugger/debuggerkitconfigwidget.h +++ b/src/plugins/debugger/debuggerkitconfigwidget.h @@ -33,11 +33,16 @@ #include -#include -#include +#include "debuggerconstants.h" + +QT_FORWARD_DECLARE_CLASS(QLabel) +QT_FORWARD_DECLARE_CLASS(QComboBox) namespace ProjectExplorer { class Kit; } -namespace Utils { class PathChooser; } +namespace Utils { +class PathChooser; +class FileName; +} namespace Debugger { class DebuggerKitInformation; @@ -65,12 +70,21 @@ public: bool isDirty() const; QWidget *buttonWidget() const; + DebuggerEngineType engineType() const; + void setEngineType(DebuggerEngineType et); + + Utils::FileName fileName() const; + void setFileName(const Utils::FileName &fn); + private slots: void autoDetectDebugger(); + void refreshLabel(); private: ProjectExplorer::Kit *m_kit; const DebuggerKitInformation *m_info; + QComboBox *m_comboBox; + QLabel *m_label; Utils::PathChooser *m_chooser; }; diff --git a/src/plugins/debugger/debuggerkitinformation.cpp b/src/plugins/debugger/debuggerkitinformation.cpp index 8d7db74f57f..75012379838 100644 --- a/src/plugins/debugger/debuggerkitinformation.cpp +++ b/src/plugins/debugger/debuggerkitinformation.cpp @@ -114,12 +114,32 @@ static QPair autoDetectCdbDebugger() namespace Debugger { +static DebuggerEngineType engineTypeFromBinary(const QString &binary) +{ + if (binary.contains(QLatin1String("cdb"), Qt::CaseInsensitive)) + return CdbEngineType; + if (binary.contains(QLatin1String("lldb"), Qt::CaseInsensitive)) + return LldbEngineType; + return GdbEngineType; +} + // -------------------------------------------------------------------------- // DebuggerKitInformation: // -------------------------------------------------------------------------- static const char DEBUGGER_INFORMATION[] = "Debugger.Information"; +DebuggerKitInformation::DebuggerItem::DebuggerItem() + : engineType(NoEngineType) +{ +} + +DebuggerKitInformation::DebuggerItem::DebuggerItem(DebuggerEngineType et, const Utils::FileName &fn) + : engineType(et) + , binary(fn) +{ +} + DebuggerKitInformation::DebuggerKitInformation() { setObjectName(QLatin1String("DebuggerKitInformation")); @@ -136,9 +156,10 @@ unsigned int DebuggerKitInformation::priority() const return 28000; } -QVariant DebuggerKitInformation::defaultValue(Kit *k) const +DebuggerKitInformation::DebuggerItem DebuggerKitInformation::autoDetectItem(const Kit *k) { - ToolChain *tc = ToolChainKitInformation::toolChain(k); + DebuggerItem result; + const ToolChain *tc = ToolChainKitInformation::toolChain(k); Abi abi = Abi::hostAbi(); if (tc) abi = tc->targetAbi(); @@ -146,59 +167,100 @@ QVariant DebuggerKitInformation::defaultValue(Kit *k) const // CDB for windows: if (abi.os() == Abi::WindowsOS && abi.osFlavor() != Abi::WindowsMSysFlavor) { QPair cdbs = autoDetectCdbDebugger(); - return (abi.wordWidth() == 32) ? cdbs.first : cdbs.second; - } - - // fall back to system GDB: - QString debugger = QLatin1String("gdb"); - if (tc) { - // Check suggestions from the SDK: - const QString path = tc->suggestedDebugger().toString(); - if (!path.isEmpty()) { - QFileInfo fi(path); - if (fi.isAbsolute()) - return path; - debugger = path; - } - } - - Environment env = Environment::systemEnvironment(); - return env.searchInPath(debugger); -} - -QList DebuggerKitInformation::validate(Kit *k) const -{ - const Core::Id id(Constants::TASK_CATEGORY_BUILDSYSTEM); - QList result; - FileName dbg = debuggerCommand(k); - if (dbg.isEmpty()) { - result << Task(Task::Warning, tr("No debugger set up."), FileName(), -1, id); + result.binary = Utils::FileName::fromString(abi.wordWidth() == 32 ? cdbs.first : cdbs.second); + result.engineType = CdbEngineType; return result; } - QFileInfo fi = dbg.toFileInfo(); - if (!fi.exists() || fi.isDir()) - result << Task(Task::Error, tr("Debugger not found."), FileName(), -1, id); - else if (!fi.isExecutable()) - result << Task(Task::Error, tr("Debugger not exectutable."), FileName(), -1, id); - - if (ToolChain *tc = ToolChainKitInformation::toolChain(k)) { - // We need an absolute path to be able to locate Python on Windows. - const Abi abi = tc->targetAbi(); - if (abi.os() == Abi::WindowsOS && !fi.isAbsolute()) { - result << Task(Task::Error, tr("The debugger location must be given as an " - "absolute path (%1).").arg(dbg.toString()), FileName(), -1, id); + // Check suggestions from the SDK. + const Environment env = Environment::systemEnvironment(); + if (tc) { + QString path = tc->suggestedDebugger().toString(); + if (!path.isEmpty()) { + const QFileInfo fi(path); + if (!fi.isAbsolute()) + path = env.searchInPath(path); + result.binary = Utils::FileName::fromString(path); + result.engineType = engineTypeFromBinary(path); + return result; } - // FIXME: Make sure debugger matches toolchain. - // if (isCdb()) { - // if (abi.binaryFormat() != Abi::PEFormat || abi.os() != Abi::WindowsOS) { - // result << Task(Tas->errorDetails.push_back(CdbEngine::tr("The CDB debug engine does not support the %1 ABI."). - // arg(abi.toString())); - // return false; - // } - // } } + // Default to GDB, system GDB + result.engineType = GdbEngineType; + QString gdb; + const QString systemGdb = QLatin1String("gdb"); + // MinGW: Search for the python-enabled gdb first. + if (abi.os() == Abi::WindowsOS && abi.osFlavor() == Abi::WindowsMSysFlavor) + gdb = env.searchInPath(QLatin1String("gdb-i686-pc-mingw32")); + if (gdb.isEmpty()) + gdb = env.searchInPath(systemGdb); + result.binary = Utils::FileName::fromString(env.searchInPath(gdb.isEmpty() ? systemGdb : gdb)); + return result; +} + +// Check the configuration errors and return a flag mask. Provide a quick check and +// a verbose one with a list of errors. + +enum DebuggerConfigurationErrors { + NoDebugger = 0x1, + DebuggerNotFound = 0x2, + DebuggerNotExecutable = 0x4, + DebuggerNeedsAbsolutePath = 0x8 +}; + +static unsigned debuggerConfigurationErrors(const ProjectExplorer::Kit *p) +{ + unsigned result = 0; + const DebuggerKitInformation::DebuggerItem item = DebuggerKitInformation::debuggerItem(p); + if (item.engineType == NoEngineType || item.binary.isEmpty()) + return NoDebugger; + + const QFileInfo fi = item.binary.toFileInfo(); + if (!fi.exists() || fi.isDir()) { + result |= DebuggerNotFound; + } else if (!fi.isExecutable()) { + result |= DebuggerNotExecutable; + } + + if (!fi.exists() || fi.isDir()) + // We need an absolute path to be able to locate Python on Windows. + if (item.engineType == GdbEngineType) + if (const ToolChain *tc = ToolChainKitInformation::toolChain(p)) + if (tc->targetAbi().os() == Abi::WindowsOS && !fi.isAbsolute()) + result |= DebuggerNeedsAbsolutePath; + return result; +} + +bool DebuggerKitInformation::isValidDebugger(const ProjectExplorer::Kit *p) +{ + return debuggerConfigurationErrors(p) == 0; +} + +QList DebuggerKitInformation::validateDebugger(const ProjectExplorer::Kit *p) +{ + const unsigned errors = debuggerConfigurationErrors(p); + const Core::Id id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM); + QList result; + if (errors & NoDebugger) + result << Task(Task::Warning, tr("No debugger set up."), FileName(), -1, id); + + if (errors & DebuggerNotFound) { + const QString path = DebuggerKitInformation::debuggerCommand(p).toUserOutput(); + result << Task(Task::Error, tr("Debugger '%1' not found.").arg(path), + FileName(), -1, id); + } + if (errors & DebuggerNotExecutable) { + const QString path = DebuggerKitInformation::debuggerCommand(p).toUserOutput(); + result << Task(Task::Error, tr("Debugger '%1' not executable.").arg(path), FileName(), -1, id); + } + if (errors & DebuggerNeedsAbsolutePath) { + const QString path = DebuggerKitInformation::debuggerCommand(p).toUserOutput(); + const QString message = + tr("The debugger location must be given as an " + "absolute path (%1).").arg(path); + result << Task(Task::Error, message, FileName(), -1, id); + } return result; } @@ -207,20 +269,81 @@ KitConfigWidget *DebuggerKitInformation::createConfigWidget(Kit *k) const return new Internal::DebuggerKitConfigWidget(k, this); } +QString DebuggerKitInformation::userOutput(const ProjectExplorer::Kit *k) +{ + const DebuggerItem item = DebuggerKitInformation::debuggerItem(k); + return tr("%1 using '%2'").arg(debuggerEngineName(item.engineType), + item.binary.toUserOutput()); +} + KitInformation::ItemList DebuggerKitInformation::toUserOutput(Kit *k) const { - return ItemList() << qMakePair(tr("Debugger"), debuggerCommand(k).toUserOutput()); + return ItemList() << qMakePair(tr("Debugger"), DebuggerKitInformation::userOutput(k)); } -FileName DebuggerKitInformation::debuggerCommand(const Kit *k) +static const char engineTypeKeyC[] = "EngineType"; +static const char binaryKeyC[] = "Binary"; + +DebuggerKitInformation::DebuggerItem DebuggerKitInformation::variantToItem(const QVariant &v) { - return FileName::fromString(k ? k->value(Core::Id(DEBUGGER_INFORMATION)).toString() : QString()); + DebuggerItem result; + if (v.type() == QVariant::String) { // Convert legacy config items, remove later. + const QString binary = v.toString(); + result.binary = Utils::FileName::fromString(binary); + result.engineType = engineTypeFromBinary(binary); + return result; + } + QTC_ASSERT(v.type() == QVariant::Map, return result); + const QVariantMap vmap = v.toMap(); + result.binary = Utils::FileName::fromString(vmap.value(QLatin1String(binaryKeyC)).toString()); + result.engineType = static_cast(vmap.value(QLatin1String(engineTypeKeyC)).toInt()); + return result; } -void DebuggerKitInformation::setDebuggerCommand(Kit *k, const FileName &command) +QVariant DebuggerKitInformation::itemToVariant(const DebuggerItem &i) { - QTC_ASSERT(k, return); - k->setValue(Core::Id(DEBUGGER_INFORMATION), command.toString()); + QVariantMap vmap; + vmap.insert(QLatin1String(binaryKeyC), QVariant(i.binary.toUserOutput())); + vmap.insert(QLatin1String(engineTypeKeyC), QVariant(int(i.engineType))); + return QVariant(vmap); +} + +DebuggerKitInformation::DebuggerItem DebuggerKitInformation::debuggerItem(const ProjectExplorer::Kit *p) +{ + return p ? + DebuggerKitInformation::variantToItem(p->value(Core::Id(DEBUGGER_INFORMATION))) : + DebuggerItem(); +} + +void DebuggerKitInformation::setDebuggerItem(ProjectExplorer::Kit *p, const DebuggerItem &item) +{ + QTC_ASSERT(p, return); + p->setValue(Core::Id(DEBUGGER_INFORMATION), itemToVariant(item)); +} + +void DebuggerKitInformation::setDebuggerCommand(ProjectExplorer::Kit *k, const FileName &command) +{ + setDebuggerItem(k, DebuggerItem(engineType(k), command)); +} + +void DebuggerKitInformation::setEngineType(ProjectExplorer::Kit *p, DebuggerEngineType type) +{ + setDebuggerItem(p, DebuggerItem(type, debuggerCommand(p))); +} + +QString DebuggerKitInformation::debuggerEngineName(DebuggerEngineType t) +{ + switch (t) { + case Debugger::GdbEngineType: + return tr("GDB Engine"); + case Debugger::CdbEngineType: + return tr("CDB Engine"); + case Debugger::LldbEngineType: + return tr("LLDB Engine"); + default: + break; + } + return QString(); } } // namespace Debugger diff --git a/src/plugins/debugger/debuggerkitinformation.h b/src/plugins/debugger/debuggerkitinformation.h index e6d9dab6c81..ceb119d08d5 100644 --- a/src/plugins/debugger/debuggerkitinformation.h +++ b/src/plugins/debugger/debuggerkitinformation.h @@ -32,6 +32,7 @@ #define DEBUGGER_DEBUGGERKITINFORMATION_H #include "debugger_global.h" +#include "debuggerconstants.h" #include @@ -42,22 +43,54 @@ class DEBUGGER_EXPORT DebuggerKitInformation : public ProjectExplorer::KitInform Q_OBJECT public: + class DEBUGGER_EXPORT DebuggerItem { + public: + DebuggerItem(); + DebuggerItem(DebuggerEngineType engineType, const Utils::FileName &fn); + + DebuggerEngineType engineType; + Utils::FileName binary; + }; + DebuggerKitInformation(); Core::Id dataId() const; unsigned int priority() const; // the higher the closer to the top. - QVariant defaultValue(ProjectExplorer::Kit *k) const; + static DebuggerItem autoDetectItem(const ProjectExplorer::Kit *k); + QVariant defaultValue(ProjectExplorer::Kit *k) const + { return DebuggerKitInformation::itemToVariant(DebuggerKitInformation::autoDetectItem(k)); } - QList validate(ProjectExplorer::Kit *k) const; + QList validate(ProjectExplorer::Kit *k) const + { return DebuggerKitInformation::validateDebugger(k); } + + static QList validateDebugger(const ProjectExplorer::Kit *p); + static bool isValidDebugger(const ProjectExplorer::Kit *p); ProjectExplorer::KitConfigWidget *createConfigWidget(ProjectExplorer::Kit *k) const; ItemList toUserOutput(ProjectExplorer::Kit *k) const; + static QString userOutput(const ProjectExplorer::Kit *k); - static Utils::FileName debuggerCommand(const ProjectExplorer::Kit *k); - static void setDebuggerCommand(ProjectExplorer::Kit *k, const Utils::FileName &command); + static DebuggerItem debuggerItem(const ProjectExplorer::Kit *p); + static void setDebuggerItem(ProjectExplorer::Kit *p, const DebuggerItem &item); + + static Utils::FileName debuggerCommand(const ProjectExplorer::Kit *p) + { return debuggerItem(p).binary; } + + static void setDebuggerCommand(ProjectExplorer::Kit *p, const Utils::FileName &command); + + static DebuggerEngineType engineType(const ProjectExplorer::Kit *p) + { return debuggerItem(p).engineType; } + + static void setEngineType(ProjectExplorer::Kit *p, DebuggerEngineType type); + + static QString debuggerEngineName(DebuggerEngineType t); + +private: + static DebuggerItem variantToItem(const QVariant &v); + static QVariant itemToVariant(const DebuggerItem &i); }; } // namespace Debugger diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 27ece76ae16..0df27ac8198 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -567,8 +567,10 @@ public: explicit AbiKitMatcher(const QList &abis) : m_abis(abis) {} bool matches(const Kit *p) const { - if (const ToolChain *tc = ToolChainKitInformation::toolChain(p)) - return m_abis.contains(tc->targetAbi()); + if (const ToolChain *tc = ToolChainKitInformation::toolChain(p)) { + return m_abis.contains(tc->targetAbi()) + && DebuggerKitInformation::isValidDebugger(p); + } return false; } @@ -584,7 +586,7 @@ public: { if (const ToolChain *tc = ToolChainKitInformation::toolChain(p)) foreach (const Abi &a, m_abis) - if (a.isCompatibleWith(tc->targetAbi())) + if (a.isCompatibleWith(tc->targetAbi()) && DebuggerKitInformation::isValidDebugger(p)) return true; return false; } @@ -600,18 +602,14 @@ public: bool matches(const Kit *k) const { - const ToolChain *tc = ToolChainKitInformation::toolChain(k); - QTC_ASSERT(tc, return false); - const Abi abi = tc->targetAbi(); - if (abi.architecture() != Abi::X86Architecture - || abi.os() != Abi::WindowsOS - || abi.binaryFormat() != Abi::PEFormat) - return false; - if (abi.osFlavor() == Abi::WindowsMSysFlavor - || abi.osFlavor() == Abi::WindowsCEFlavor) - return false; - if (m_wordWidth && abi.wordWidth() != m_wordWidth) + if (DebuggerKitInformation::engineType(k) != CdbEngineType + || !DebuggerKitInformation::isValidDebugger(k)) { return false; + } + if (m_wordWidth) { + const ToolChain *tc = ToolChainKitInformation::toolChain(k); + return tc && m_wordWidth == tc->targetAbi().wordWidth(); + } return true; } @@ -634,7 +632,7 @@ private: const char m_wordWidth; }; -void fillParameters(DebuggerStartParameters *sp, const Kit *kit /* = 0 */) +bool fillParameters(DebuggerStartParameters *sp, const Kit *kit /* = 0 */, QString *errorMessage /* = 0 */) { if (!kit) { // This code can only be reached when starting via the command line @@ -664,6 +662,27 @@ void fillParameters(DebuggerStartParameters *sp, const Kit *kit /* = 0 */) kit = KitManager::instance()->defaultKit(); } + // Verify that debugger and profile are valid + if (!kit) { + sp->startMode = NoStartMode; + if (errorMessage) + *errorMessage = DebuggerKitInformation::tr("No kit found."); + return false; + } + const QList tasks = DebuggerKitInformation::validateDebugger(kit); + if (!tasks.isEmpty()) { + sp->startMode = NoStartMode; + if (errorMessage) { + foreach (const ProjectExplorer::Task &t, tasks) { + if (errorMessage->isEmpty()) + errorMessage->append(QLatin1Char('\n')); + errorMessage->append(t.description); + } + } + return false; + } + + sp->cppEngineType = DebuggerKitInformation::engineType(kit); sp->sysRoot = SysRootKitInformation::sysRoot(kit).toString(); sp->debuggerCommand = DebuggerKitInformation::debuggerCommand(kit).toString(); @@ -676,6 +695,7 @@ void fillParameters(DebuggerStartParameters *sp, const Kit *kit /* = 0 */) sp->connParams = device->sshParameters(); sp->remoteChannel = sp->connParams.host + QLatin1Char(':') + QString::number(sp->connParams.port); } + return true; } static TextEditor::ITextEditor *currentTextEditor() @@ -1438,7 +1458,8 @@ bool DebuggerPluginPrivate::parseArgument(QStringList::const_iterator &it, } } } - fillParameters(&sp, kit); + if (fillParameters(&sp, kit, errorMessage)) + return false; if (sp.startMode == StartExternal) { sp.displayName = tr("Executable file \"%1\"").arg(sp.executable); sp.startMessage = tr("Debugging file %1.").arg(sp.executable); @@ -1458,7 +1479,8 @@ bool DebuggerPluginPrivate::parseArgument(QStringList::const_iterator &it, return false; } DebuggerStartParameters sp; - fillParameters(&sp, CdbMatcher::findUniversalCdbKit()); + if (!fillParameters(&sp, CdbMatcher::findUniversalCdbKit(), errorMessage)) + return false; sp.startMode = AttachCrashedExternal; sp.crashParameter = it->section(QLatin1Char(':'), 0, 0); sp.attachPID = it->section(QLatin1Char(':'), 1, 1).toULongLong(); @@ -1596,7 +1618,7 @@ void DebuggerPluginPrivate::attachCore() DebuggerStartParameters sp; QString display = dlg.isLocal() ? dlg.localCoreFile() : dlg.remoteCoreFile(); - fillParameters(&sp, dlg.kit()); + QTC_ASSERT(fillParameters(&sp, dlg.kit()), return); sp.masterEngineType = GdbEngineType; sp.executable = dlg.localExecutableFile(); sp.coreFile = dlg.localCoreFile(); @@ -1612,8 +1634,7 @@ void DebuggerPluginPrivate::startRemoteCdbSession() const QString connectionKey = _("CdbRemoteConnection"); DebuggerStartParameters sp; Kit *kit = CdbMatcher::findUniversalCdbKit(); - QTC_ASSERT(kit, return); - fillParameters(&sp, kit); + QTC_ASSERT(kit && fillParameters(&sp, kit), return); sp.startMode = AttachToRemoteServer; sp.closeMode = KillAtClose; StartRemoteCdbDialog dlg(mainWindow()); @@ -1683,7 +1704,7 @@ void DebuggerPluginPrivate::attachToProcess(bool startServerOnly) if (device->type() == ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE) { DebuggerStartParameters sp; - fillParameters(&sp, kit); + QTC_ASSERT(fillParameters(&sp, kit), return); sp.attachPID = process.pid; sp.displayName = tr("Process %1").arg(process.pid); sp.executable = process.exe; @@ -1708,7 +1729,7 @@ void DebuggerPluginPrivate::attachExternalApplication(ProjectExplorer::RunContro if (const RunConfiguration *runConfiguration = rc->runConfiguration()) if (const Target *target = runConfiguration->target()) kit = target->kit(); - fillParameters(&sp, kit); + QTC_ASSERT(fillParameters(&sp, kit), return); DebuggerRunControlFactory::createAndScheduleRun(sp); } @@ -1731,11 +1752,10 @@ void DebuggerPluginPrivate::attachToQmlPort() return; Kit *kit = dlg.kit(); - QTC_ASSERT(kit, return); + QTC_ASSERT(kit && fillParameters(&sp, kit), return); setConfigValue(_("LastQmlServerPort"), dlg.port()); setConfigValue(_("LastProfile"), kit->id().toString()); - fillParameters(&sp, kit); sp.qmlServerAddress = sp.connParams.host; sp.qmlServerPort = dlg.port(); sp.startMode = AttachToRemoteProcess; diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp index 476d23e3acc..e0ddc0122a3 100644 --- a/src/plugins/debugger/debuggerrunner.cpp +++ b/src/plugins/debugger/debuggerrunner.cpp @@ -259,11 +259,6 @@ public: explicit DebuggerRunControlPrivate(DebuggerRunControl *parent, RunConfiguration *runConfiguration); - DebuggerEngineType engineForExecutable(unsigned enabledEngineTypes, - const QString &executable); - DebuggerEngineType engineForMode(unsigned enabledEngineTypes, - DebuggerStartMode mode); - public: DebuggerRunControl *q; DebuggerEngine *m_engine; @@ -476,7 +471,7 @@ QString DebuggerRunControlFactory::displayName() const return DebuggerPlugin::tr("Debug"); } -static DebuggerStartParameters localStartParameters(RunConfiguration *runConfiguration) +static DebuggerStartParameters localStartParameters(RunConfiguration *runConfiguration, QString *errorMessage) { DebuggerStartParameters sp; QTC_ASSERT(runConfiguration, return sp); @@ -486,7 +481,8 @@ static DebuggerStartParameters localStartParameters(RunConfiguration *runConfigu Target *target = runConfiguration->target(); Kit *kit = target ? target->kit() : KitManager::instance()->defaultKit(); - fillParameters(&sp, kit); + if (!fillParameters(&sp, kit, errorMessage)) + return sp; sp.environment = rc->environment(); sp.workingDirectory = rc->workingDirectory(); @@ -547,7 +543,7 @@ RunControl *DebuggerRunControlFactory::create { Q_UNUSED(errorMessage) QTC_ASSERT(mode == DebugRunMode || mode == DebugRunModeWithBreakOnMain, return 0); - DebuggerStartParameters sp = localStartParameters(runConfiguration); + DebuggerStartParameters sp = localStartParameters(runConfiguration, errorMessage); if (sp.startMode == NoStartMode) return 0; if (mode == DebugRunModeWithBreakOnMain) @@ -556,92 +552,43 @@ RunControl *DebuggerRunControlFactory::create return doCreate(sp, runConfiguration, errorMessage); } -static DebuggerEngineType guessUnixCppEngineType(const DebuggerStartParameters &sp) -{ - if (sp.debuggerCommand.contains(QLatin1String("lldb"))) - return LldbEngineType; - return GdbEngineType; -} - -static DebuggerEngineType guessCppEngineTypeForAbi(const DebuggerStartParameters &sp, const Abi &abi) -{ - switch (abi.binaryFormat()) { - case Abi::ElfFormat: - case Abi::MachOFormat: - return guessUnixCppEngineType(sp) ; - case Abi::PEFormat: - if (abi.osFlavor() == Abi::WindowsMSysFlavor) - return guessUnixCppEngineType(sp); - return CdbEngineType; - default: - break; - } - return NoEngineType; -} - -static DebuggerEngineType guessCppEngineType(const DebuggerStartParameters &sp) -{ - if (sp.toolChainAbi.isValid()) { - const DebuggerEngineType et = guessCppEngineTypeForAbi(sp, sp.toolChainAbi); - if (et != NoEngineType) - return et; - } - - #ifdef Q_OS_WIN - // If a file has PDB files, it has been compiled by VS. - if (sp.executable.endsWith(_(".exe"), Qt::CaseInsensitive)) { - QStringList pdbFiles; - QString errorMessage; - if (getPDBFiles(sp.executable, &pdbFiles, &errorMessage) && !pdbFiles.isEmpty()) - return CdbEngineType; - } - #endif - - QList abis = Abi::abisOfBinary(FileName::fromString(sp.executable)); - foreach (const Abi &abi, abis) { - DebuggerEngineType et = guessCppEngineTypeForAbi(sp, abi); - if (et != NoEngineType) - return et; - } - - return guessUnixCppEngineType(sp); -} - -static void fixupEngineTypes(DebuggerStartParameters &sp, RunConfiguration *rc) +static bool fixupEngineTypes(DebuggerStartParameters &sp, RunConfiguration *rc, QString *errorMessage) { if (sp.masterEngineType != NoEngineType) - return; + return true; if (sp.executable.endsWith(_(".js"))) { sp.masterEngineType = ScriptEngineType; - return; + return true; } if (sp.executable.endsWith(_(".py"))) { sp.masterEngineType = PdbEngineType; - return; + return true; } if (rc) { DebuggerRunConfigurationAspect *aspect = rc->debuggerAspect(); if (const Target *target = rc->target()) - fillParameters(&sp, target->kit()); + if (!fillParameters(&sp, target->kit(), errorMessage)) + return false; const bool useCppDebugger = aspect->useCppDebugger(); const bool useQmlDebugger = aspect->useQmlDebugger(); if (useQmlDebugger) { if (useCppDebugger) { sp.masterEngineType = QmlCppEngineType; - sp.firstSlaveEngineType = guessCppEngineType(sp); + sp.firstSlaveEngineType = sp.cppEngineType; sp.secondSlaveEngineType = QmlCppEngineType; } else { sp.masterEngineType = QmlEngineType; } } else { - sp.masterEngineType = guessCppEngineType(sp); + sp.masterEngineType = sp.cppEngineType; } - return; + return true; } - sp.masterEngineType = guessCppEngineType(sp); + sp.masterEngineType = sp.cppEngineType; + return true; } DebuggerRunControl *DebuggerRunControlFactory::doCreate @@ -664,10 +611,8 @@ DebuggerRunControl *DebuggerRunControlFactory::doCreate } } - fixupEngineTypes(sp, rc); - if (!sp.masterEngineType) { + if (!fixupEngineTypes(sp, rc, errorMessage)) return 0; - } return new DebuggerRunControl(rc, sp); } diff --git a/src/plugins/debugger/debuggerstartparameters.h b/src/plugins/debugger/debuggerstartparameters.h index 09e0a4f5543..3db9f9b2185 100644 --- a/src/plugins/debugger/debuggerstartparameters.h +++ b/src/plugins/debugger/debuggerstartparameters.h @@ -60,6 +60,7 @@ public: : masterEngineType(NoEngineType), firstSlaveEngineType(NoEngineType), secondSlaveEngineType(NoEngineType), + cppEngineType(NoEngineType), isSnapshot(false), attachPID(-1), useTerminal(false), @@ -81,6 +82,7 @@ public: DebuggerEngineType masterEngineType; DebuggerEngineType firstSlaveEngineType; DebuggerEngineType secondSlaveEngineType; + DebuggerEngineType cppEngineType; QString sysRoot; QString debuggerCommand; ProjectExplorer::Abi toolChainAbi; @@ -140,7 +142,7 @@ public: namespace Internal { -void fillParameters(DebuggerStartParameters *sp, const ProjectExplorer::Kit *kit = 0); +bool fillParameters(DebuggerStartParameters *sp, const ProjectExplorer::Kit *kit = 0, QString *errorMessage = 0); } // namespace Internal } // namespace Debugger diff --git a/src/plugins/debugger/gdb/startgdbserverdialog.cpp b/src/plugins/debugger/gdb/startgdbserverdialog.cpp index 20a08293ced..e32b49282a4 100644 --- a/src/plugins/debugger/gdb/startgdbserverdialog.cpp +++ b/src/plugins/debugger/gdb/startgdbserverdialog.cpp @@ -207,7 +207,7 @@ void GdbServerStarter::attach(int port) } DebuggerStartParameters sp; - fillParameters(&sp, d->kit); + QTC_ASSERT(fillParameters(&sp, d->kit), return); sp.masterEngineType = GdbEngineType; sp.connParams.port = port; sp.displayName = tr("Remote: \"%1:%2\"").arg(sp.connParams.host).arg(port); diff --git a/src/plugins/debugger/lldb/lldbenginehost.cpp b/src/plugins/debugger/lldb/lldbenginehost.cpp index 810ab62de85..486020c66fc 100644 --- a/src/plugins/debugger/lldb/lldbenginehost.cpp +++ b/src/plugins/debugger/lldb/lldbenginehost.cpp @@ -140,6 +140,7 @@ LldbEngineHost::LldbEngineHost(const DebuggerStartParameters &startParameters) :IPCEngineHost(startParameters), m_ssh(0) { showMessage(QLatin1String("setting up coms")); + setObjectName(QLatin1String("LLDBEngine")); if (startParameters.startMode == StartRemoteEngine) { From c3f50e3192cc36a0ddc938565ef5af0c00788146 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 5 Sep 2012 10:55:05 +0200 Subject: [PATCH 09/73] KitChooser: Introduce virtual methods for Debugger. Introduce virtual methods such that it is possible to write derived classes for specific KitInformation classes, allowing for filtering and setting text and tooltip. Remove debugging-specific code of KitChooser from the ProjectExplorer. Move populate() away from the constructor as not to call virtuals from it. Implement DebuggerKitChooser. It should no longer be possible to to choose an invalid kit for debugging from the debugger starter dialogs. Add a protected constructor to DeviceProcessesDialog allowing to pass a KitChooser. Change-Id: I8c683a2da7d69bfbccdc08213cb47d69a0df8b3e Reviewed-by: Tobias Hunger --- .../analyzerbase/startremotedialog.cpp | 2 +- src/plugins/debugger/debuggerdialogs.cpp | 37 ++++++++++++++-- src/plugins/debugger/debuggerdialogs.h | 19 ++++++++ src/plugins/debugger/debuggerplugin.cpp | 14 +++++- src/plugins/debugger/loadcoredialog.cpp | 4 +- .../devicesupport/deviceprocessesdialog.cpp | 22 ++++++---- .../devicesupport/deviceprocessesdialog.h | 3 ++ src/plugins/projectexplorer/kitchooser.cpp | 43 ++++++++++--------- src/plugins/projectexplorer/kitchooser.h | 23 +++++----- 9 files changed, 121 insertions(+), 46 deletions(-) diff --git a/src/plugins/analyzerbase/startremotedialog.cpp b/src/plugins/analyzerbase/startremotedialog.cpp index b6796c4f211..5dfa8d51b74 100644 --- a/src/plugins/analyzerbase/startremotedialog.cpp +++ b/src/plugins/analyzerbase/startremotedialog.cpp @@ -69,7 +69,7 @@ StartRemoteDialog::StartRemoteDialog(QWidget *parent) setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); setWindowTitle(tr("Start Remote Analysis")); - d->kitChooser = new KitChooser(this, KitChooser::RemoteDebugging); + d->kitChooser = new KitChooser(this); d->executable = new QLineEdit(this); d->arguments = new QLineEdit(this); d->workingDirectory = new QLineEdit(this); diff --git a/src/plugins/debugger/debuggerdialogs.cpp b/src/plugins/debugger/debuggerdialogs.cpp index 504dcd338ee..c98e66a05bb 100644 --- a/src/plugins/debugger/debuggerdialogs.cpp +++ b/src/plugins/debugger/debuggerdialogs.cpp @@ -39,7 +39,6 @@ #include #include -#include #include #include #include @@ -109,6 +108,36 @@ Q_DECLARE_METATYPE(Debugger::Internal::StartApplicationParameters) namespace Debugger { namespace Internal { +/////////////////////////////////////////////////////////////////////// +// +// DebuggerKitChooser +// +/////////////////////////////////////////////////////////////////////// + +DebuggerKitChooser::DebuggerKitChooser(Mode mode, QWidget *parent) + : ProjectExplorer::KitChooser(parent) + , m_hostAbi(ProjectExplorer::Abi::hostAbi()) + , m_mode(mode) +{ +} + +// Match valid debuggers and restrict local debugging to compatible toolchains. +bool DebuggerKitChooser::kitMatches(const ProjectExplorer::Kit *k) const +{ + if (!DebuggerKitInformation::isValidDebugger(k)) + return false; + if (m_mode == LocalDebugging) { + const ProjectExplorer::ToolChain *tc = ToolChainKitInformation::toolChain(k); + return tc && tc->targetAbi().os() == m_hostAbi.os(); + } + return true; +} + +QString DebuggerKitChooser::kitToolTip(Kit *k) const +{ + return DebuggerKitInformation::userOutput(k); +} + /////////////////////////////////////////////////////////////////////// // // StartApplicationParameters @@ -225,7 +254,8 @@ StartApplicationDialog::StartApplicationDialog(QWidget *parent) d->runInTerminalCheckBox = new QCheckBox(this); - d->kitChooser = new KitChooser(this, KitChooser::LocalDebugging); + d->kitChooser = new DebuggerKitChooser(DebuggerKitChooser::LocalDebugging, this); + d->kitChooser->populate(); d->breakAtMainCheckBox = new QCheckBox(this); d->breakAtMainCheckBox->setText(QString()); @@ -439,7 +469,8 @@ AttachToQmlPortDialog::AttachToQmlPortDialog(QWidget *parent) setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); setWindowTitle(tr("Start Debugger")); - d->kitChooser = new KitChooser(this); + d->kitChooser = new DebuggerKitChooser(DebuggerKitChooser::RemoteDebugging, this); + d->kitChooser->populate(); d->portSpinBox = new QSpinBox(this); d->portSpinBox->setMaximum(65535); diff --git a/src/plugins/debugger/debuggerdialogs.h b/src/plugins/debugger/debuggerdialogs.h index a8d8274c605..a0e5c251e9f 100644 --- a/src/plugins/debugger/debuggerdialogs.h +++ b/src/plugins/debugger/debuggerdialogs.h @@ -31,6 +31,9 @@ #ifndef DEBUGGER_DIALOGS_H #define DEBUGGER_DIALOGS_H +#include +#include + #include #include #include @@ -58,6 +61,22 @@ class StartApplicationParameters; class StartApplicationDialogPrivate; class StartRemoteEngineDialogPrivate; +class DebuggerKitChooser : public ProjectExplorer::KitChooser { + Q_OBJECT +public: + enum Mode { RemoteDebugging, LocalDebugging }; + + explicit DebuggerKitChooser(Mode mode = RemoteDebugging, QWidget *parent = 0); + +protected: + bool kitMatches(const ProjectExplorer::Kit *k) const; + QString kitToolTip(ProjectExplorer::Kit *k) const; + +private: + const ProjectExplorer::Abi m_hostAbi; + const Mode m_mode; +}; + class StartApplicationDialog : public QDialog { Q_OBJECT diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 0df27ac8198..ec1700bcdba 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -1670,9 +1670,21 @@ void DebuggerPluginPrivate::attachToRunningApplication() attachToProcess(false); } +class DebuggerProcessesDialog : public ProjectExplorer::DeviceProcessesDialog { +public: + DebuggerProcessesDialog(DebuggerKitChooser::Mode m, QWidget *parent) : + ProjectExplorer::DeviceProcessesDialog(new DebuggerKitChooser(m), parent) + { + addAcceptButton(DeviceProcessesDialog::tr("&Attach to Process")); + } +}; + void DebuggerPluginPrivate::attachToProcess(bool startServerOnly) { - DeviceProcessesDialog *dlg = new DeviceProcessesDialog(mainWindow()); + + const DebuggerKitChooser::Mode mode = startServerOnly ? + DebuggerKitChooser::RemoteDebugging : DebuggerKitChooser::LocalDebugging; + DeviceProcessesDialog *dlg = new DebuggerProcessesDialog(mode, mainWindow()); dlg->addAcceptButton(DeviceProcessesDialog::tr("&Attach to Process")); dlg->showAllDevices(); if (dlg->exec() == QDialog::Rejected) { diff --git a/src/plugins/debugger/loadcoredialog.cpp b/src/plugins/debugger/loadcoredialog.cpp index aee1ce75db9..964b985bce5 100644 --- a/src/plugins/debugger/loadcoredialog.cpp +++ b/src/plugins/debugger/loadcoredialog.cpp @@ -33,6 +33,7 @@ #include "debuggerconstants.h" #include "debuggercore.h" #include "debuggerstartparameters.h" +#include "debuggerdialogs.h" #include #include @@ -245,7 +246,8 @@ AttachCoreDialog::AttachCoreDialog(QWidget *parent) d->settings = ICore::settings(); - d->kitChooser = new KitChooser(this); + d->kitChooser = new DebuggerKitChooser(DebuggerKitChooser::RemoteDebugging, this); + d->kitChooser->populate(); d->selectRemoteCoreButton = new QPushButton(tr("Browse..."), this); d->remoteCoreFileName = new QLineEdit(this); diff --git a/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.cpp b/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.cpp index c3d4375c6c8..8512c627857 100644 --- a/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.cpp +++ b/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.cpp @@ -96,7 +96,7 @@ class DeviceProcessesDialogPrivate : public QObject Q_OBJECT public: - DeviceProcessesDialogPrivate(QWidget *parent); + DeviceProcessesDialogPrivate(KitChooser *chooser, QWidget *parent); public slots: void setDevice(const IDevice::ConstPtr &device); @@ -124,16 +124,20 @@ public: QDialogButtonBox *buttonBox; }; -DeviceProcessesDialogPrivate::DeviceProcessesDialogPrivate(QWidget *parent) - : q(parent), acceptButton(0), buttonBox(new QDialogButtonBox(parent)) +DeviceProcessesDialogPrivate::DeviceProcessesDialogPrivate(KitChooser *chooser, QWidget *parent) + : q(parent), kitChooser(chooser), acceptButton(0), buttonBox(new QDialogButtonBox(parent)) { + q->setWindowTitle(DeviceProcessesDialog::tr("List of Processes")); + q->setWindowFlags(q->windowFlags() & ~Qt::WindowContextHelpButtonHint); + q->setMinimumHeight(500); + processList = 0; processFilterLineEdit = new FilterLineEdit(q); processFilterLineEdit->setPlaceholderText(DeviceProcessesDialog::tr("Filter")); processFilterLineEdit->setFocus(Qt::TabFocusReason); - kitChooser = new KitChooser(q); + kitChooser->populate(); procView = new QTreeView(q); procView->setModel(&proxyModel); @@ -295,11 +299,13 @@ DeviceProcess DeviceProcessesDialogPrivate::selectedProcess() const */ DeviceProcessesDialog::DeviceProcessesDialog(QWidget *parent) - : QDialog(parent), d(new Internal::DeviceProcessesDialogPrivate(this)) + : QDialog(parent), d(new Internal::DeviceProcessesDialogPrivate(new KitChooser(this), this)) +{ +} + +DeviceProcessesDialog::DeviceProcessesDialog(KitChooser *chooser, QWidget *parent) + : QDialog(parent), d(new Internal::DeviceProcessesDialogPrivate(chooser, this)) { - setWindowTitle(tr("List of Processes")); - setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); - setMinimumHeight(500); } DeviceProcessesDialog::~DeviceProcessesDialog() diff --git a/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.h b/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.h index 13d65e21006..58b992e11de 100644 --- a/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.h +++ b/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.h @@ -60,6 +60,9 @@ public: KitChooser *kitChooser() const; void logMessage(const QString &line); +protected: + DeviceProcessesDialog(KitChooser *chooser, QWidget *parent); + private: Internal::DeviceProcessesDialogPrivate * const d; }; diff --git a/src/plugins/projectexplorer/kitchooser.cpp b/src/plugins/projectexplorer/kitchooser.cpp index 8273990ed79..3d75c370a7c 100644 --- a/src/plugins/projectexplorer/kitchooser.cpp +++ b/src/plugins/projectexplorer/kitchooser.cpp @@ -38,42 +38,43 @@ namespace ProjectExplorer { -KitChooser::KitChooser(QWidget *parent, unsigned flags) : +KitChooser::KitChooser(QWidget *parent) : QComboBox(parent) { - populate(flags); - onCurrentIndexChanged(currentIndex()); connect(this, SIGNAL(currentIndexChanged(int)), SLOT(onCurrentIndexChanged(int))); } void KitChooser::onCurrentIndexChanged(int index) { if (Kit *kit = kitAt(index)) - setToolTip(kit->toHtml()); + setToolTip(kitToolTip(kit)); else setToolTip(QString()); } -void KitChooser::populate(unsigned flags) +bool KitChooser::kitMatches(const Kit *k) const +{ + return k->isValid(); +} + +QString KitChooser::kitText(const Kit *k) const +{ + return k->displayName(); +} + +QString KitChooser::kitToolTip(Kit *k) const +{ + return k->toHtml(); +} + +void KitChooser::populate() { clear(); - const Abi hostAbi = Abi::hostAbi(); foreach (Kit *kit, KitManager::instance()->kits()) { - if (!kit->isValid() && !(flags & IncludeInvalidKits)) - continue; - ToolChain *tc = ToolChainKitInformation::toolChain(kit); - if (!tc) - continue; - const Abi abi = tc->targetAbi(); - if ((flags & HostAbiOnly) && hostAbi.os() != abi.os()) - continue; - const QString debuggerCommand = kit->value(Core::Id("Debugger.Information")).toString(); - if ((flags & HasDebugger) && debuggerCommand.isEmpty()) - continue; - const QString completeBase = QFileInfo(debuggerCommand).completeBaseName(); - const QString name = tr("%1 (%2)").arg(kit->displayName(), completeBase); - addItem(name, qVariantFromValue(kit->id())); - setItemData(count() - 1, kit->toHtml(), Qt::ToolTipRole); + if (kitMatches(kit)) { + addItem(kitText(kit), qVariantFromValue(kit->id())); + setItemData(count() - 1, kitToolTip(kit), Qt::ToolTipRole); + } } setEnabled(count() > 1); } diff --git a/src/plugins/projectexplorer/kitchooser.h b/src/plugins/projectexplorer/kitchooser.h index c53cfb85750..d47e3dbb304 100644 --- a/src/plugins/projectexplorer/kitchooser.h +++ b/src/plugins/projectexplorer/kitchooser.h @@ -47,24 +47,25 @@ class PROJECTEXPLORER_EXPORT KitChooser : public QComboBox Q_OBJECT public: - enum Flags { - HostAbiOnly = 0x1, - IncludeInvalidKits = 0x2, - HasDebugger = 0x4, - RemoteDebugging = IncludeInvalidKits | HasDebugger, - LocalDebugging = RemoteDebugging | HostAbiOnly - }; - - explicit KitChooser(QWidget *parent, unsigned flags = 0); + explicit KitChooser(QWidget *parent = 0); void setCurrentKitId(Core::Id id); Core::Id currentKitId() const; Kit *currentKit() const; +public slots: + void populate(); + +private slots: + void onCurrentIndexChanged(int index); + +protected: + virtual bool kitMatches(const Kit *k) const; + virtual QString kitText(const Kit *k) const; + virtual QString kitToolTip(Kit *k) const; + private: - Q_SLOT void onCurrentIndexChanged(int index); - void populate(unsigned flags); Kit *kitAt(int index) const; }; From d1b65bbf837cfd4f8b655f55633afdcfe1ebe1e8 Mon Sep 17 00:00:00 2001 From: Leandro Melo Date: Wed, 5 Sep 2012 15:16:47 +0200 Subject: [PATCH 10/73] C++: Discard comments in macro definitions Task-number: QTCREATORBUG-7815 Change-Id: Id3e6b018bfd58b0f0072c637d69721a4bde1603a Reviewed-by: Orgad Shaneh Reviewed-by: Eike Ziller --- src/libs/cplusplus/pp-engine.cpp | 4 +- .../preprocessor/tst_preprocessor.cpp | 41 ++++++++++++++++++- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp index 377e8c8e94e..e14a7e93b8a 100644 --- a/src/libs/cplusplus/pp-engine.cpp +++ b/src/libs/cplusplus/pp-engine.cpp @@ -1542,7 +1542,9 @@ void Preprocessor::handleDefineDirective(PPToken *tk) previousOffset = tk->offset; previousLine = tk->lineno; - bodyTokens.push_back(*tk); + // Discard comments in macro definitions (keep comments flag doesn't apply here). + if (!tk->isComment()) + bodyTokens.push_back(*tk); lex(tk); } diff --git a/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp b/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp index d3777d1998a..a8dd56ea7b6 100644 --- a/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp +++ b/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp @@ -1076,7 +1076,6 @@ void tst_Preprocessor::comments_within() { compare_input_output(); } - void tst_Preprocessor::comments_within_data() { QTest::addColumn("input"); @@ -1219,6 +1218,26 @@ void tst_Preprocessor::comments_within_data() "# expansion end\n" "# 8 \"\"\n"; QTest::newRow("case 6") << original << expected; + + original = + "#define FOO 0 //coment\n" + "#define BAR (1 == FOO)\n" + "void foo() {\n" + " if (BAR) {}\n" + "}\n"; + expected = + "# 1 \"\"\n" + "\n" + "\n" + "void foo() {\n" + " if (\n" + "# expansion begin 67,3 ~5\n" + "(1 == 0)\n" + "# expansion end\n" + "# 4 \"\"\n" + " ) {}\n" + "}\n"; + QTest::newRow("case 7") << original << expected; } void tst_Preprocessor::comments_within2() @@ -1373,6 +1392,26 @@ void tst_Preprocessor::comments_within2_data() "# expansion end\n" "# 8 \"\"\n"; QTest::newRow("case 6") << original << expected; + + original = + "#define FOO 0 //coment\n" + "#define BAR (1 == FOO)\n" + "void foo() {\n" + " if (BAR) {}\n" + "}\n"; + expected = + "# 1 \"\"\n" + "\n" + "\n" + "void foo() {\n" + " if (\n" + "# expansion begin 67,3 ~5\n" + "(1 == 0)\n" + "# expansion end\n" + "# 4 \"\"\n" + " ) {}\n" + "}\n"; + QTest::newRow("case 7") << original << expected; } void tst_Preprocessor::multiline_strings() From c29bf6f6525d435d69936576761b4a29102cd056 Mon Sep 17 00:00:00 2001 From: Daniel Molkentin Date: Mon, 3 Sep 2012 18:24:02 +0200 Subject: [PATCH 11/73] Introduce $$QTC_PREFIX instead of abusing $(INSTALL_ROOT). Reason: $INSTALL_ROOT is only meant to be used by packagers to temporarily put the contents into a different location, which is needed for fakeroot packaging. QTC_PREFIX is not a qmake variable, and defaults to /usr/local. On Windows the default prefix is "QtCreator", since "make install" is expected to be used in a packaging context only where either INSTALL_ROOT should be used or QTC_PREFIX should be set to the absolute destination path where e.g. an installer generator will pick it up. Change-Id: Ifa4950340e58e34726c53f5417adcc7b50828ce1 Reviewed-by: Oswald Buddenhagen --- bin/bin.pro | 2 +- doc/doc.pri | 4 ++-- lib/qtcreator/qtcomponents/qtcomponents.pro | 2 +- qtcreator.pri | 5 ++++ qtcreator.pro | 23 ++++++++++++++----- .../qml/qmlpuppet/qml2puppet/qml2puppet.pro | 2 +- .../qml/qmlpuppet/qmlpuppet/qmlpuppet.pri | 2 +- share/qtcreator/static.pro | 4 ++-- share/qtcreator/translations/translations.pro | 2 +- src/app/app.pro | 4 ++-- src/libs/qtcomponents/styleitem/styleitem.pro | 2 +- src/libs/qtcreatorcdbext/qtcreatorcdbext.pro | 2 +- src/libs/utils/process_ctrlc_stub.pro | 2 +- src/libs/utils/process_stub.pro | 2 +- src/plugins/coreplugin/coreplugin.pro | 2 +- src/plugins/qmldesigner/plugindestdir.pri | 2 +- src/qtcreatorlibrary.pri | 4 ++-- src/qtcreatorplugin.pri | 4 ++-- src/tools/qtcdebugger/qtcdebugger.pro | 2 +- src/tools/qtpromaker/qtpromaker.pro | 2 +- src/tools/win64interrupt/win64interrupt.pro | 2 +- 21 files changed, 46 insertions(+), 30 deletions(-) diff --git a/bin/bin.pro b/bin/bin.pro index 523cc50bd17..d546b053cb7 100644 --- a/bin/bin.pro +++ b/bin/bin.pro @@ -9,7 +9,7 @@ QMAKE_STRIP = QMAKE_CLEAN = qtcreator.sh -target.path = /bin +target.path = $$QTC_PREFIX/bin INSTALLS += target OTHER_FILES = $$PWD/qtcreator.sh diff --git a/doc/doc.pri b/doc/doc.pri index 285951f22c9..c163bce40c8 100644 --- a/doc/doc.pri +++ b/doc/doc.pri @@ -78,12 +78,12 @@ dev_qch_docs.depends += dev_html_docs !macx { inst_qch_docs.files = $$QCH_FILE - inst_qch_docs.path = /share/doc/qtcreator + inst_qch_docs.path = $$QTC_PREFIX/share/doc/qtcreator inst_qch_docs.CONFIG += no_check_exist no_default_install INSTALLS += inst_qch_docs inst_dev_qch_docs.files = $$DEV_QCH_FILE - inst_dev_qch_docs.path = /share/doc/qtcreator + inst_dev_qch_docs.path = $$QTC_PREFIX/share/doc/qtcreator inst_dev_qch_docs.CONFIG += no_check_exist no_default_install INSTALLS += inst_dev_qch_docs diff --git a/lib/qtcreator/qtcomponents/qtcomponents.pro b/lib/qtcreator/qtcomponents/qtcomponents.pro index 5cf2d9adb9c..33268cf3cbd 100644 --- a/lib/qtcreator/qtcomponents/qtcomponents.pro +++ b/lib/qtcreator/qtcomponents/qtcomponents.pro @@ -52,6 +52,6 @@ DATA_FILE_PATTERNS = \ !macx { qmlfiles.files = $$PWD/*.qml $$PWD/qmldir $$PWD/images $$PWD/custom - qmlfiles.path = /$${IDE_LIBRARY_BASENAME}/qtcreator/qtcomponents + qmlfiles.path = $$QTC_PREFIX/$${IDE_LIBRARY_BASENAME}/qtcreator/qtcomponents INSTALLS += qmlfiles } diff --git a/qtcreator.pri b/qtcreator.pri index 9c8dbd59214..1fdd9e4e164 100644 --- a/qtcreator.pri +++ b/qtcreator.pri @@ -3,6 +3,11 @@ QTCREATOR_PRI_INCLUDED = 1 QTCREATOR_VERSION = 2.5.81 +isEmpty(QTC_PREFIX) { + unix: QTC_PREFIX = /usr/local + else: QTC_PREFIX = QtCreator +} + defineReplace(cleanPath) { win32:1 ~= s|\\\\|/|g contains(1, ^/.*):pfx = / diff --git a/qtcreator.pro b/qtcreator.pro index c9b2be0268c..c9801853864 100644 --- a/qtcreator.pro +++ b/qtcreator.pro @@ -26,19 +26,30 @@ macx { dmg.depends = deployqt QMAKE_EXTRA_TARGETS += codesign dmg } else { - deployqt.commands = $$PWD/scripts/deployqt.py -i $(INSTALL_ROOT) + deployqt.commands = $$PWD/scripts/deployqt.py -i \"$(INSTALL_ROOT)$$QTC_PREFIX\" deployqt.depends = install win32 { bindist.commands ~= s,/,\\\\,g deployqt.commands ~= s,/,\\\\,g deployartifacts.depends = install PLATFORM="windows" - deployartifacts.commands = git clone "git://gitorious.org/qt-creator/binary-artifacts.git"&& xcopy /s /q /y /i "binary-artifacts\\win32" $(INSTALL_ROOT)&& rmdir /s /q binary-artifacts + deployartifacts.commands = git clone "git://gitorious.org/qt-creator/binary-artifacts.git"&& xcopy /s /q /y /i "binary-artifacts\\win32" \"$(INSTALL_ROOT)$$QTC_PREFIX\"&& rmdir /s /q binary-artifacts QMAKE_EXTRA_TARGETS += deployartifacts } - else:linux-*:PLATFORM="linux-$${QT_ARCH}" - else:PLATFORM="unknown" - bindist.commands = $$PWD/scripts/bindistHelper.py "$(INSTALL_ROOT)" "$${PLATFORM}$(INSTALL_EDITION)-$${QTCREATOR_VERSION}$(INSTALL_POSTFIX)" + else:linux-*:PLATFORM = "linux-$${QT_ARCH}" + else:PLATFORM = "unknown" + PATTERN = $${PLATFORM}$(INSTALL_EDITION)-$${QTCREATOR_VERSION}$(INSTALL_POSTFIX) + bindist.commands = $$PWD/scripts/bindistHelper.py -i -p $${PATTERN} \"$(INSTALL_ROOT)$$QTC_PREFIX\" + bindist_inst.commands = $$PWD/scripts/bindistHelper.py -p $${PATTERN} \"$(INSTALL_ROOT)$$QTC_PREFIX\" + win32 { + bindist.commands ~= s,/,\\\\,g + bindist_inst.commands ~= s,/,\\\\,g + } + } bindist.depends = deployqt -QMAKE_EXTRA_TARGETS += deployqt bindist +bindist_inst.depends = deployqt +installer.depends = bindist_inst +installer.commands = $$PWD/scripts/packageIfw.py --ifw $(IFW_DIR) -s $${QTCREATOR_VERSION} "qt-creator-$${PATTERN}-installer" +win32:installer.commands ~= s,/,\\\\,g +QMAKE_EXTRA_TARGETS += deployqt bindist bindist_inst installer diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppet.pro b/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppet.pro index 77351d8a9e6..6b2b7097ae8 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppet.pro +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppet.pro @@ -36,6 +36,6 @@ macx { info.output = $$DESTDIR/$${TARGET}.app/Contents/Info.plist QMAKE_SUBSTITUTES += info } else { - target.path = /bin + target.path = $$QTC_PREFIX/bin INSTALLS += target } diff --git a/share/qtcreator/qml/qmlpuppet/qmlpuppet/qmlpuppet.pri b/share/qtcreator/qml/qmlpuppet/qmlpuppet/qmlpuppet.pri index 66aa92e47be..e2d6645077a 100644 --- a/share/qtcreator/qml/qmlpuppet/qmlpuppet/qmlpuppet.pri +++ b/share/qtcreator/qml/qmlpuppet/qmlpuppet/qmlpuppet.pri @@ -21,6 +21,6 @@ macx { info.output = $$DESTDIR/$${TARGET}.app/Contents/Info.plist QMAKE_SUBSTITUTES += info } else { - target.path = /bin + target.path = $$QTC_PREFIX/bin INSTALLS += target } diff --git a/share/qtcreator/static.pro b/share/qtcreator/static.pro index 7d8363dd5c9..b707606bb12 100644 --- a/share/qtcreator/static.pro +++ b/share/qtcreator/static.pro @@ -63,7 +63,7 @@ OTHER_FILES += $$FILES !macx { for(data_dir, DATA_DIRS) { eval($${data_dir}.files = $$quote($$PWD/$$data_dir)) - eval($${data_dir}.path = /share/qtcreator) + eval($${data_dir}.path = $$QTC_PREFIX/share/qtcreator) INSTALLS += $$data_dir } } else { @@ -116,7 +116,7 @@ QMAKE_EXTRA_COMPILERS += unconditionalCopy2build !macx { for(data_dir, DATA_DIRS) { eval($${data_dir}.files = $$IDE_DATA_PATH/$$data_dir) - eval($${data_dir}.path = /share/qtcreator) + eval($${data_dir}.path = $$QTC_PREFIX/share/qtcreator) eval($${data_dir}.CONFIG += no_check_exist) INSTALLS += $$data_dir } diff --git a/share/qtcreator/translations/translations.pro b/share/qtcreator/translations/translations.pro index c791dadb9d1..dfaf7c471bc 100644 --- a/share/qtcreator/translations/translations.pro +++ b/share/qtcreator/translations/translations.pro @@ -120,6 +120,6 @@ isEmpty(vcproj) { } qmfiles.files = $$prependAll(LANGUAGES, $$OUT_PWD/qtcreator_,.qm) -qmfiles.path = /share/qtcreator/translations +qmfiles.path = $$QTC_PREFIX/share/qtcreator/translations qmfiles.CONFIG += no_check_exist INSTALLS += qmfiles diff --git a/src/app/app.pro b/src/app/app.pro index 896b2cc884e..a2a666dd1d5 100644 --- a/src/app/app.pro +++ b/src/app/app.pro @@ -17,7 +17,7 @@ QT_BREAKPAD_ROOT_PATH = $$(QT_BREAKPAD_ROOT_PATH) } win32 { RC_FILE = qtcreator.rc - target.path = /bin + target.path = $$QTC_PREFIX/bin INSTALLS += target } else:macx { LIBS += -framework CoreFoundation @@ -29,7 +29,7 @@ win32 { info.output = $$IDE_BIN_PATH/../Info.plist QMAKE_SUBSTITUTES = info } else { - target.path = /bin + target.path = $$QTC_PREFIX/bin INSTALLS += target } diff --git a/src/libs/qtcomponents/styleitem/styleitem.pro b/src/libs/qtcomponents/styleitem/styleitem.pro index 59f892d6490..d94e7dfa456 100644 --- a/src/libs/qtcomponents/styleitem/styleitem.pro +++ b/src/libs/qtcomponents/styleitem/styleitem.pro @@ -33,6 +33,6 @@ SOURCES += qtmenu.cpp \ qwheelarea.cpp !macx { - target.path = /$${IDE_LIBRARY_BASENAME}/qtcreator/qtcomponents/plugin + target.path = $$QTC_PREFIX/$${IDE_LIBRARY_BASENAME}/qtcreator/qtcomponents/plugin INSTALLS += target } diff --git a/src/libs/qtcreatorcdbext/qtcreatorcdbext.pro b/src/libs/qtcreatorcdbext/qtcreatorcdbext.pro index fa02ca40954..20bdfb23fc2 100644 --- a/src/libs/qtcreatorcdbext/qtcreatorcdbext.pro +++ b/src/libs/qtcreatorcdbext/qtcreatorcdbext.pro @@ -82,6 +82,6 @@ HEADERS += extensioncontext.h \ knowntype.h \ symbolgroupnode.h -target.path = /lib/$${DIRNAME} +target.path = $$QTC_PREFIX/lib/$${DIRNAME} INSTALLS += target diff --git a/src/libs/utils/process_ctrlc_stub.pro b/src/libs/utils/process_ctrlc_stub.pro index 4b99fe33ed1..4fef59a4018 100644 --- a/src/libs/utils/process_ctrlc_stub.pro +++ b/src/libs/utils/process_ctrlc_stub.pro @@ -17,5 +17,5 @@ build_all:!build_pass { CONFIG += release } -target.path = /bin # FIXME: libexec, more or less +target.path = $$QTC_PREFIX/bin # FIXME: libexec, more or less INSTALLS += target diff --git a/src/libs/utils/process_stub.pro b/src/libs/utils/process_stub.pro index 7e498a77818..a3eea0f1318 100644 --- a/src/libs/utils/process_stub.pro +++ b/src/libs/utils/process_stub.pro @@ -20,5 +20,5 @@ unix { LIBS += -lshell32 } -target.path = /bin # FIXME: libexec, more or less +target.path = $$QTC_PREFIX/bin # FIXME: libexec, more or less INSTALLS += target diff --git a/src/plugins/coreplugin/coreplugin.pro b/src/plugins/coreplugin/coreplugin.pro index 14a7450b3c9..1d4dfe998ce 100644 --- a/src/plugins/coreplugin/coreplugin.pro +++ b/src/plugins/coreplugin/coreplugin.pro @@ -237,7 +237,7 @@ else:unix { for(imagesize, IMAGE_SIZE_LIST) { eval(image$${imagesize}.files = images/logo/$${imagesize}/qtcreator.png) - eval(image$${imagesize}.path = /share/icons/hicolor/$${imagesize}x$${imagesize}/apps) + eval(image$${imagesize}.path = $$QTC_PREFIX/share/icons/hicolor/$${imagesize}x$${imagesize}/apps) INSTALLS += image$${imagesize} } } diff --git a/src/plugins/qmldesigner/plugindestdir.pri b/src/plugins/qmldesigner/plugindestdir.pri index d4987e24093..2de740f852f 100644 --- a/src/plugins/qmldesigner/plugindestdir.pri +++ b/src/plugins/qmldesigner/plugindestdir.pri @@ -2,6 +2,6 @@ macx { DESTDIR = $$IDE_LIBRARY_PATH/QmlDesigner } else { DESTDIR = $$IDE_LIBRARY_PATH/qmldesigner - target.path = /$$IDE_LIBRARY_BASENAME/qtcreator/qmldesigner + target.path = $$QTC_PREFIX/$$IDE_LIBRARY_BASENAME/qtcreator/qmldesigner INSTALLS += target } diff --git a/src/qtcreatorlibrary.pri b/src/qtcreatorlibrary.pri index e46e3a2d28d..0dc1a179b23 100644 --- a/src/qtcreatorlibrary.pri +++ b/src/qtcreatorlibrary.pri @@ -19,9 +19,9 @@ contains(QT_CONFIG, reduce_exports):CONFIG += hide_symbols !macx { win32 { - target.path = /bin + target.path = $$QTC_PREFIX/bin } else { - target.path = /$$IDE_LIBRARY_BASENAME/qtcreator + target.path = $$QTC_PREFIX/$$IDE_LIBRARY_BASENAME/qtcreator } INSTALLS += target } diff --git a/src/qtcreatorplugin.pri b/src/qtcreatorplugin.pri index ea0360753be..292b10ad743 100644 --- a/src/qtcreatorplugin.pri +++ b/src/qtcreatorplugin.pri @@ -99,9 +99,9 @@ CONFIG += plugin plugin_with_soname linux*:QMAKE_LFLAGS += $$QMAKE_LFLAGS_NOUNDEF !macx { - target.path = /$$IDE_LIBRARY_BASENAME/qtcreator/plugins/$$PROVIDER + target.path = $$QTC_PREFIX/$$IDE_LIBRARY_BASENAME/qtcreator/plugins/$$PROVIDER pluginspec.files += $${TARGET}.pluginspec - pluginspec.path = /$$IDE_LIBRARY_BASENAME/qtcreator/plugins/$$PROVIDER + pluginspec.path = $$QTC_PREFIX/$$IDE_LIBRARY_BASENAME/qtcreator/plugins/$$PROVIDER INSTALLS += target pluginspec } diff --git a/src/tools/qtcdebugger/qtcdebugger.pro b/src/tools/qtcdebugger/qtcdebugger.pro index ece3eb772ff..9c3220aba0b 100644 --- a/src/tools/qtcdebugger/qtcdebugger.pro +++ b/src/tools/qtcdebugger/qtcdebugger.pro @@ -6,7 +6,7 @@ SOURCES += main.cpp DESTDIR=../../../bin -target.path=/bin +target.path=$$QTC_PREFIX/bin INSTALLS+=target include(../../../qtcreator.pri) diff --git a/src/tools/qtpromaker/qtpromaker.pro b/src/tools/qtpromaker/qtpromaker.pro index 8dacfd5eede..b61d1cee33b 100644 --- a/src/tools/qtpromaker/qtpromaker.pro +++ b/src/tools/qtpromaker/qtpromaker.pro @@ -11,5 +11,5 @@ CONFIG -= app_bundle SOURCES += main.cpp -target.path = /bin # FIXME: libexec, more or less +target.path = $$QTC_PREFIX/bin # FIXME: libexec, more or less INSTALLS += target diff --git a/src/tools/win64interrupt/win64interrupt.pro b/src/tools/win64interrupt/win64interrupt.pro index b8b26bcfd4f..282514c54cd 100644 --- a/src/tools/win64interrupt/win64interrupt.pro +++ b/src/tools/win64interrupt/win64interrupt.pro @@ -26,5 +26,5 @@ build_all:!build_pass { CONFIG += release } -target.path = /bin # FIXME: libexec, more or less +target.path = $$QTC_PREFIX/bin # FIXME: libexec, more or less INSTALLS += target From 5bbc6db28473de4ffb492c9cba1a39d6a8d1cb79 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Wed, 5 Sep 2012 12:38:24 +0200 Subject: [PATCH 12/73] Doc: remove Remote Compiler, as it is no longer supported Change-Id: I98c7a66303a7b6c4a6e6a52a2a7fd85aef647d37 Reviewed-by: Eike Ziller --- .../linux-mobile/creator-madde-emulator.qdoc | 2 +- doc/src/overview/creator-testing.qdoc | 2 +- .../creator-projects-building-running.qdoc | 9 -- doc/src/projects/creator-remote-compiler.qdoc | 84 ------------------- doc/src/qtcreator.qdoc | 1 - 5 files changed, 2 insertions(+), 96 deletions(-) delete mode 100644 doc/src/projects/creator-remote-compiler.qdoc diff --git a/doc/src/linux-mobile/creator-madde-emulator.qdoc b/doc/src/linux-mobile/creator-madde-emulator.qdoc index 692908edd4f..587dda3d5bf 100644 --- a/doc/src/linux-mobile/creator-madde-emulator.qdoc +++ b/doc/src/linux-mobile/creator-madde-emulator.qdoc @@ -27,7 +27,7 @@ \contentspage index.html \previouspage creator-build-process-customizing.html \page creator-maemo-emulator.html - \nextpage creator-remote-compiler.html + \nextpage creator-testing.html \title Using Maemo or MeeGo Harmattan Emulator diff --git a/doc/src/overview/creator-testing.qdoc b/doc/src/overview/creator-testing.qdoc index e482c673ca9..226eaf6e46e 100644 --- a/doc/src/overview/creator-testing.qdoc +++ b/doc/src/overview/creator-testing.qdoc @@ -25,7 +25,7 @@ /*! \contentspage index.html - \previouspage creator-remote-compiler.html + \previouspage creator-maemo-emulator.html \page creator-testing.html \nextpage creator-debugging.html diff --git a/doc/src/projects/creator-projects-building-running.qdoc b/doc/src/projects/creator-projects-building-running.qdoc index 75dc88ca45b..525909bc7df 100644 --- a/doc/src/projects/creator-projects-building-running.qdoc +++ b/doc/src/projects/creator-projects-building-running.qdoc @@ -108,15 +108,6 @@ development PC than to use the emulators. The emulator is installed as part of the \QSDK. - \o \l{Building with Remote Compiler} - - You can use a compilation service at Nokia Developer to build Qt - applications and create installation packages for mobile device - targets when you do not have the necessary tool chains and SDKs - installed or they are not supported on the development PC. You can - choose from a set of supported devices. You can install the Remote - Compiler target as part of the \QSDK. - \endlist */ diff --git a/doc/src/projects/creator-remote-compiler.qdoc b/doc/src/projects/creator-remote-compiler.qdoc deleted file mode 100644 index b31077d9b07..00000000000 --- a/doc/src/projects/creator-remote-compiler.qdoc +++ /dev/null @@ -1,84 +0,0 @@ -/**************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: http://www.qt-project.org/ -** -** -** GNU Free Documentation License -** -** Alternatively, this file may be used under the terms of the GNU Free -** Documentation License version 1.3 as published by the Free Software -** Foundation and appearing in the file included in the packaging of this -** file. -** -** -****************************************************************************/ - -// ********************************************************************** -// NOTE: the sections are not ordered by their logical order to avoid -// reshuffling the file each time the index order changes (i.e., often). -// Run the fixnavi.pl script to adjust the links to the index order. -// ********************************************************************** - -/*! - \contentspage index.html - \previouspage creator-maemo-emulator.html - \page creator-remote-compiler.html - \nextpage creator-testing.html - - \title Building with Remote Compiler - - The \gui {Remote Compiler} target is an interface to a compilation service - at Nokia Developer. It provides a simple, standardized environment for - building Qt applications and creating installation packages for mobile - device targets when you do not have the necessary tool chains and SDKs - installed or they are not supported on the development PC. You can choose - from a set of supported devices. - - You need a Nokia Developer user account to use the Remote Compiler. You can - create an account for free at \l{http://www.developer.nokia.com/} - {Nokia Developer}. - - \note Remote Compiler is an experimental component that is installed as - part of \QSDK. - - \list 1 - - \o Select \gui {Start > \QSDK > Maintain \QSDK} to open the - \gui {Maintain \QSDK} tool. - - \o In the \gui {Package Manager}, select \gui {Experimental > - Remote Compiler} to install Remote Compiler. - - \o In \QC, choose \gui {Tools > Options > Build & Run > Remote Compiler} - to log on to Nokia Developer. - - \image remotecompiler-fn-logon.png "Remote Compiler options" - - \o Choose \gui {Projects}. - - \o Click - \inlineimage qtcreator-qt4-addbutton.png "Add Target button" - and select \gui {Remote Compiler} to add Remote Compiler as a - target. - - \o Click \gui Add to add mobile device platforms as build - configurations. - - \o Click the \gui {Target Selector} and select a build configuration. - - \o Choose \gui {Build > Build All}. - - \endlist - - The installation package is generated in the \gui {Build directory} on - the development PC. - - For more information about Remote Compiler, choose \gui {Help > Contents > - Remote Compiler Manual}. The document is added during the installation of - Remote Compiler. - -*/ diff --git a/doc/src/qtcreator.qdoc b/doc/src/qtcreator.qdoc index 44e6632004b..d1752bcd353 100644 --- a/doc/src/qtcreator.qdoc +++ b/doc/src/qtcreator.qdoc @@ -249,7 +249,6 @@ \endlist \o \l{Customizing the Build Process} \o \l{Using Maemo or MeeGo Harmattan Emulator} - \o \l{Building with Remote Compiler} \endlist \o \l{Debugging and Analyzing} \list From e216d43649a9c7d3199f0c71f19b6d1d1eb08cc9 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Mon, 3 Sep 2012 15:02:46 +0200 Subject: [PATCH 13/73] Squish: Substitute tilde inside toolchains Change-Id: Ibf0ddfa4aecaa669d843d28f83fe6d814faeb219 Reviewed-by: Robert Loehning --- tests/system/shared/qtcreator.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/system/shared/qtcreator.py b/tests/system/shared/qtcreator.py index b2c4e5cabac..1bb7c5d3fcb 100644 --- a/tests/system/shared/qtcreator.py +++ b/tests/system/shared/qtcreator.py @@ -67,6 +67,22 @@ def __removeTmpSettingsDir__(): waitForCleanShutdown() deleteDirIfExists(os.path.dirname(os.path.dirname(tmpSettingsDir))) +def substituteTildeWithinToolchains(settingsDir): + toolchains = os.path.join(settingsDir, "Nokia", 'qtcreator', 'toolchains.xml') + origToolchains = toolchains + "_orig" + home = os.path.expanduser("~") + os.rename(toolchains, origToolchains) + origFile = open(origToolchains, "r") + modifiedFile = open(toolchains, "w") + for line in origFile: + if "~" in line: + line = line.replace("~", home) + modifiedFile.write(line) + origFile.close() + modifiedFile.close() + os.remove(origToolchains) + test.log("Substituted all tildes with '%s' inside toolchains.xml..." % home) + if platform.system() in ('Windows', 'Microsoft'): sdkPath = "C:\\QtSDK" cwd = os.getcwd() # current dir is directory holding qtcreator.py @@ -85,5 +101,7 @@ if os.getenv("SYSTEST_NOSETTINGSPATH") != "1": tmpSettingsDir = tempDir() tmpSettingsDir = os.path.abspath(tmpSettingsDir+"/settings") shutil.copytree(cwd, tmpSettingsDir) + if platform.system() in ('Linux', 'Darwin'): + substituteTildeWithinToolchains(tmpSettingsDir) atexit.register(__removeTmpSettingsDir__) SettingsPath = ' -settingspath "%s"' % tmpSettingsDir From bd43956bbd6ff5fac05f5260d351b0c3ec2a25a0 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 5 Sep 2012 16:49:35 +0200 Subject: [PATCH 14/73] Squish: Use global objects.map from inside CCOM Change-Id: Icc22f595f6c5c9472755e1134b7663dde7bccb86 Reviewed-by: Robert Loehning --- tests/system/objects.map | 4 ++++ tests/system/shared/build_utils.py | 12 ++++------ tests/system/shared/debugger.py | 3 +-- tests/system/shared/editor_utils.py | 3 +-- tests/system/shared/utils.py | 3 +-- tests/system/suite_CCOM/objects.map | 12 ---------- tests/system/suite_CCOM/suite.conf | 2 ++ tests/system/suite_CCOM/tst_CCOM01/test.py | 2 +- tests/system/suite_CCOM/tst_CCOM02/test.py | 2 +- .../suite_debugger/tst_simple_debug/test.py | 3 +-- .../suite_qtquick/tst_qml_editor/test.py | 24 +++++++------------ .../suite_qtquick/tst_qml_indent/test.py | 8 +++---- 12 files changed, 27 insertions(+), 51 deletions(-) delete mode 100644 tests/system/suite_CCOM/objects.map diff --git a/tests/system/objects.map b/tests/system/objects.map index 45e3b8628c7..b9831ab715b 100644 --- a/tests/system/objects.map +++ b/tests/system/objects.map @@ -40,14 +40,18 @@ :QML Debugging_QMessageBox {type='QMessageBox' unnamed='1' visible='1' windowTitle='QML Debugging'} :Qt Creator.Compile Output_Core::OutputWindow {type='Core::OutputWindow' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow' windowTitle='Compile Output'} :Qt Creator.DebugModeWidget_QSplitter {name='DebugModeWidget' type='QSplitter' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} +:Qt Creator.Issues_QListView {type='QListView' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow' windowTitle='Issues'} :Qt Creator.QtCreator.MenuBar_QMenuBar {name='QtCreator.MenuBar' type='QMenuBar' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator.ReRun_QToolButton {toolTip='Re-run this run-configuration' type='QToolButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator.Stop_QToolButton {text='Stop' type='QToolButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator.scrollArea_QScrollArea {name='scrollArea' type='QScrollArea' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_AppOutput_Core::Internal::OutputPaneToggleButton {occurrence='3' type='Core::Internal::OutputPaneToggleButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_CloseButton {type='CloseButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} +:Qt Creator_CompileOutput_Core::Internal::OutputPaneToggleButton {occurrence='4' type='Core::Internal::OutputPaneToggleButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_Core::Internal::MainWindow {type='Core::Internal::MainWindow' visible='1' windowTitle?='*Qt Creator'} :Qt Creator_CppEditor::Internal::CPPEditorWidget {type='CppEditor::Internal::CPPEditorWidget' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} +:Qt Creator_Issues_Core::Internal::OutputPaneToggleButton {occurrence='1' type='Core::Internal::OutputPaneToggleButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} +:Qt Creator_QmlJSEditor::QmlJSTextEditorWidget {type='QmlJSEditor::QmlJSTextEditorWidget' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_QTableView {type='QTableView' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_SearchResult_Core::Internal::OutputPaneToggleButton {occurrence='2' type='Core::Internal::OutputPaneToggleButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_SystemSettings.Details_Utils::DetailsButton {occurrence='4' text='Details' type='Utils::DetailsButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} diff --git a/tests/system/shared/build_utils.py b/tests/system/shared/build_utils.py index 672c7ff4b63..1d72345dc90 100644 --- a/tests/system/shared/build_utils.py +++ b/tests/system/shared/build_utils.py @@ -67,10 +67,8 @@ def checkLastBuild(expectedToFail=False): else: test.fail("Errors: %s | Warnings: %s" % (errors, warnings)) # additional stuff - could be removed... or improved :) - ensureChecked("{type='Core::Internal::OutputPaneToggleButton' unnamed='1' " - "visible='1' window=':Qt Creator_Core::Internal::MainWindow'}") - list=waitForObject("{type='QListView' unnamed='1' visible='1' " - "window=':Qt Creator_Core::Internal::MainWindow' windowTitle='Issues'}", 20000) + ensureChecked(":Qt Creator_Issues_Core::Internal::OutputPaneToggleButton") + list=waitForObject(":Qt Creator.Issues_QListView", 20000) model = list.model() test.log("Rows inside issues: %d" % model.rowCount()) if gotErrors and createTasksFileOnError: @@ -79,10 +77,8 @@ def checkLastBuild(expectedToFail=False): # helper function to check the compilation when build wasn't successful def checkCompile(): - ensureChecked("{type='Core::Internal::OutputPaneToggleButton' unnamed='1' visible='1' " - "window=':Qt Creator_Core::Internal::MainWindow' occurrence='4'}") - output = waitForObject("{type='Core::OutputWindow' unnamed='1' visible='1' windowTitle='Compile Output'" - " window=':Qt Creator_Core::Internal::MainWindow'}", 20000) + ensureChecked(":Qt Creator_CompileOutput_Core::Internal::OutputPaneToggleButton") + output = waitForObject(":Qt Creator.Compile Output_Core::OutputWindow", 20000) waitFor("len(str(output.plainText))>0",5000) success = str(output.plainText).endswith("exited normally.") if success: diff --git a/tests/system/shared/debugger.py b/tests/system/shared/debugger.py index c9480f05778..6432550d94e 100644 --- a/tests/system/shared/debugger.py +++ b/tests/system/shared/debugger.py @@ -180,8 +180,7 @@ def __startDebugger__(config): def __stopDebugger__(): clickButton(waitForObject(":Debugger Toolbar.Exit Debugger_QToolButton")) - ensureChecked("{type='Core::Internal::OutputPaneToggleButton' unnamed='1' visible='1' " - "window=':Qt Creator_Core::Internal::MainWindow' occurrence='3'}") + ensureChecked(":Qt Creator_AppOutput_Core::Internal::OutputPaneToggleButton") output = waitForObject("{type='Core::OutputWindow' visible='1' windowTitle='Application Output Window'}", 20000) waitFor("'Debugging has finished' in str(output.plainText)", 20000) return __logDebugResult__() diff --git a/tests/system/shared/editor_utils.py b/tests/system/shared/editor_utils.py index 2315b3c9111..76bc7eff692 100644 --- a/tests/system/shared/editor_utils.py +++ b/tests/system/shared/editor_utils.py @@ -213,8 +213,7 @@ def getEditorForFileSuffix(curFile): editor = waitForObject("{type='CppEditor::Internal::CPPEditorWidget' unnamed='1' " "visible='1' window=':Qt Creator_Core::Internal::MainWindow'}") elif suffix in qmlEditorSuffixes: - editor = waitForObject("{type='QmlJSEditor::QmlJSTextEditorWidget' unnamed='1' " - "visible='1' window=':Qt Creator_Core::Internal::MainWindow'}") + editor = waitForObject(":Qt Creator_QmlJSEditor::QmlJSTextEditorWidget") elif suffix in proEditorSuffixes: editor = waitForObject("{type='Qt4ProjectManager::Internal::ProFileEditorWidget' unnamed='1' " "visible='1' window=':Qt Creator_Core::Internal::MainWindow'}") diff --git a/tests/system/shared/utils.py b/tests/system/shared/utils.py index 0fbcf83b393..37d6ed37efa 100644 --- a/tests/system/shared/utils.py +++ b/tests/system/shared/utils.py @@ -194,8 +194,7 @@ def invokeMenuItem(menu, item, subItem = None): def logApplicationOutput(): # make sure application output is shown - ensureChecked("{type='Core::Internal::OutputPaneToggleButton' unnamed='1' visible='1' " - "window=':Qt Creator_Core::Internal::MainWindow' occurrence='3'}") + ensureChecked(":Qt Creator_AppOutput_Core::Internal::OutputPaneToggleButton") try: output = waitForObject("{type='Core::OutputWindow' visible='1' windowTitle='Application Output Window'}", 20000) test.log("Application Output:\n%s" % output.plainText) diff --git a/tests/system/suite_CCOM/objects.map b/tests/system/suite_CCOM/objects.map deleted file mode 100644 index d0b75eb58e1..00000000000 --- a/tests/system/suite_CCOM/objects.map +++ /dev/null @@ -1,12 +0,0 @@ -:*Qt Creator.DoubleTabWidget_ProjectExplorer::Internal::DoubleTabWidget {name='ProjectExplorer__Internal__DoubleTabWidget' type='ProjectExplorer::Internal::DoubleTabWidget' visible='1' window=':Qt Creator_Core::Internal::MainWindow' windowTitle='DoubleTabWidget'} -:Compile Output - Qt Creator_Core::Internal::OutputPaneToggleButton {occurrence='4' type='Core::Internal::OutputPaneToggleButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} -:Issues - Qt Creator_Core::Internal::OutputPaneToggleButton {occurrence='1' type='Core::Internal::OutputPaneToggleButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} -:Qt Creator.Compile Output_Core::OutputWindow {type='Core::OutputWindow' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow' windowTitle='Compile Output'} -:Qt Creator.Issues_QListView {type='QListView' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow' windowTitle='Issues'} -:Qt Creator.QtCreator.MenuBar_QMenuBar {name='QtCreator.MenuBar' type='QMenuBar' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} -:Qt Creator.scrollArea_QScrollArea {name='scrollArea' type='QScrollArea' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} -:Qt Creator_Core::Internal::MainWindow {type='Core::Internal::MainWindow' unnamed='1' visible='1' windowTitle?='*Qt Creator'} -:Qt Creator_QmlJSEditor::QmlJSTextEditorWidget {type='QmlJSEditor::QmlJSTextEditorWidget' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} -:Qt Creator_Utils::NavigationTreeView {type='Utils::NavigationTreeView' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} -:scrollArea.Edit build configuration:_QComboBox {leftWidget=':scrollArea.Edit build configuration:_QLabel' type='QComboBox' unnamed='1' visible='1'} -:scrollArea.Edit build configuration:_QLabel {text='Edit build configuration:' type='QLabel' unnamed='1' visible='1'} diff --git a/tests/system/suite_CCOM/suite.conf b/tests/system/suite_CCOM/suite.conf index 09d3aa120fe..51dd282bd84 100755 --- a/tests/system/suite_CCOM/suite.conf +++ b/tests/system/suite_CCOM/suite.conf @@ -1,10 +1,12 @@ AUT=qtcreator CLASS= CLASSPATH= +CWD= ENVVARS=envvars HOOK_SUB_PROCESSES=false IMPLICITAUTSTART=0 LANGUAGE=Python +OBJECTMAP=../objects.map TEST_CASES=tst_CCOM01 tst_CCOM02 VERSION=2 WRAPPERS=Qt diff --git a/tests/system/suite_CCOM/tst_CCOM01/test.py b/tests/system/suite_CCOM/tst_CCOM01/test.py index cf122d145dc..ae2f3199c00 100755 --- a/tests/system/suite_CCOM/tst_CCOM01/test.py +++ b/tests/system/suite_CCOM/tst_CCOM01/test.py @@ -24,7 +24,7 @@ def main(): invokeMenuItem("Build", "Build All") waitForSignal("{type='ProjectExplorer::BuildManager' unnamed='1'}", "buildQueueFinished(bool)") # verify build successful - ensureChecked(waitForObject(":Compile Output - Qt Creator_Core::Internal::OutputPaneToggleButton")) + ensureChecked(waitForObject(":Qt Creator_CompileOutput_Core::Internal::OutputPaneToggleButton")) compileOutput = waitForObject(":Qt Creator.Compile Output_Core::OutputWindow") if not test.verify(str(compileOutput.plainText).endswith("exited normally."), "Verifying building of existing complex qt application."): diff --git a/tests/system/suite_CCOM/tst_CCOM02/test.py b/tests/system/suite_CCOM/tst_CCOM02/test.py index 8050b1f033e..dd0215dcf92 100755 --- a/tests/system/suite_CCOM/tst_CCOM02/test.py +++ b/tests/system/suite_CCOM/tst_CCOM02/test.py @@ -21,7 +21,7 @@ def main(): # save all to invoke qml parsing invokeMenuItem("File", "Save All") # open issues list view - ensureChecked(waitForObject(":Issues - Qt Creator_Core::Internal::OutputPaneToggleButton")) + ensureChecked(waitForObject(":Qt Creator_Issues_Core::Internal::OutputPaneToggleButton")) issuesView = waitForObject(":Qt Creator.Issues_QListView") # verify that error is properly reported test.verify(checkSyntaxError(issuesView, ["Syntax error"], True), diff --git a/tests/system/suite_debugger/tst_simple_debug/test.py b/tests/system/suite_debugger/tst_simple_debug/test.py index dac3c060103..bdcaf7c2d60 100644 --- a/tests/system/suite_debugger/tst_simple_debug/test.py +++ b/tests/system/suite_debugger/tst_simple_debug/test.py @@ -15,8 +15,7 @@ def main(): # wait for parsing to complete waitForSignal("{type='CppTools::Internal::CppModelManager' unnamed='1'}", "sourceFilesRefreshed(QStringList)") - editor = waitForObject("{type='QmlJSEditor::QmlJSTextEditorWidget' unnamed='1' " - "visible='1' window=':Qt Creator_Core::Internal::MainWindow'}") + editor = waitForObject(":Qt Creator_QmlJSEditor::QmlJSTextEditorWidget") if placeCursorToLine(editor, "MouseArea.*", True): type(editor, '') type(editor, '') diff --git a/tests/system/suite_qtquick/tst_qml_editor/test.py b/tests/system/suite_qtquick/tst_qml_editor/test.py index 13a63d7d64e..0fda22aea1e 100644 --- a/tests/system/suite_qtquick/tst_qml_editor/test.py +++ b/tests/system/suite_qtquick/tst_qml_editor/test.py @@ -34,8 +34,7 @@ def testRenameId(): model = navTree.model() files = ["Core.ContextMenu\\.qml", "Core.GridMenu\\.qml", "Core.ListMenu\\.qml", "focus\\.qml"] originalTexts = {} - editor = waitForObject("{type='QmlJSEditor::QmlJSTextEditorWidget' unnamed='1' visible='1' " - "window=':Qt Creator_Core::Internal::MainWindow'}", 20000) + editor = waitForObject(":Qt Creator_QmlJSEditor::QmlJSTextEditorWidget", 20000) # temporarily store editor content for synchronizing purpose # usage of formerTxt is done because I couldn't get waitForSignal() to work # it always stored a different object into the signalObjects map as it looked up afterwards @@ -45,8 +44,7 @@ def testRenameId(): doubleClickFile(navTree, file) # wait until editor content switched to the double-clicked file while formerTxt==editor.plainText: - editor = waitForObject("{type='QmlJSEditor::QmlJSTextEditorWidget' unnamed='1' visible='1' " - "window=':Qt Creator_Core::Internal::MainWindow'}", 20000) + editor = waitForObject(":Qt Creator_QmlJSEditor::QmlJSTextEditorWidget", 20000) # store content for next round formerTxt = editor.plainText originalTexts.setdefault(file, "%s" % formerTxt) @@ -72,8 +70,7 @@ def testRenameId(): doubleClickFile(navTree, file) # wait until editor content switched to double-clicked file while formerTxt==editor.plainText: - editor = waitForObject("{type='QmlJSEditor::QmlJSTextEditorWidget' unnamed='1' visible='1' " - "window=':Qt Creator_Core::Internal::MainWindow'}", 20000) + editor = waitForObject(":Qt Creator_QmlJSEditor::QmlJSTextEditorWidget", 20000) # store content for next round formerTxt = editor.plainText originalText = originalTexts.get(file).replace("mainView", "renamedView") @@ -83,8 +80,7 @@ def testRenameId(): def __invokeFindUsage__(treeView, filename, line, additionalKeyPresses, expectedCount): global searchFinished doubleClickFile(treeView, filename) - editor = waitForObject("{type='QmlJSEditor::QmlJSTextEditorWidget' unnamed='1' visible='1' " - "window=':Qt Creator_Core::Internal::MainWindow'}", 20000) + editor = waitForObject(":Qt Creator_QmlJSEditor::QmlJSTextEditorWidget", 20000) if not placeCursorToLine(editor, line, True): test.fatal("File seems to have changed... Canceling current test") return @@ -113,8 +109,7 @@ def testHovering(): "window=':Qt Creator_Core::Internal::MainWindow'}", 20000) test.log("Testing hovering elements") doubleClickFile(navTree, "focus\\.qml") - editor = waitForObject("{type='QmlJSEditor::QmlJSTextEditorWidget' unnamed='1' visible='1' " - "window=':Qt Creator_Core::Internal::MainWindow'}", 20000) + editor = waitForObject(":Qt Creator_QmlJSEditor::QmlJSTextEditorWidget", 20000) lines=["FocusScope\s*\{", "Rectangle\s*\{"] if platform.system() == "Darwin": home = "" @@ -132,8 +127,7 @@ def testHovering(): verifyHoveringOnEditor(editor, lines, additionalKeyPresses, expectedTypes, expectedValues, alternativeValues) test.log("Testing hovering properties") doubleClickFile(navTree, "focus\\.qml") - editor = waitForObject("{type='QmlJSEditor::QmlJSTextEditorWidget' unnamed='1' visible='1' " - "window=':Qt Creator_Core::Internal::MainWindow'}", 20000) + editor = waitForObject(":Qt Creator_QmlJSEditor::QmlJSTextEditorWidget", 20000) lines = ['focus:\s*true', 'color:\s*"black"', 'states:\s*State\s*\{', 'transitions:\s*Transition\s*\{'] expectedTypes = ["TextTip", "TextTip", "TextTip", "TextTip"] expectedValues = [ @@ -153,16 +147,14 @@ def testHovering(): verifyHoveringOnEditor(editor, lines, additionalKeyPresses, expectedTypes, expectedValues, alternativeValues) test.log("Testing hovering expressions") doubleClickFile(navTree, "focus\\.qml") - editor = waitForObject("{type='QmlJSEditor::QmlJSTextEditorWidget' unnamed='1' visible='1' " - "window=':Qt Creator_Core::Internal::MainWindow'}", 20000) + editor = waitForObject(":Qt Creator_QmlJSEditor::QmlJSTextEditorWidget", 20000) lines=['color:\s*"black"', 'color:\s*"#3E606F"'] additionalKeyPresses = [""] expectedValues = ["black", "#3E606F"] expectedTypes = ["ColorTip", "ColorTip"] verifyHoveringOnEditor(editor, lines, additionalKeyPresses, expectedTypes, expectedValues) doubleClickFile(navTree, "Core.ListMenu\\.qml") - editor = waitForObject("{type='QmlJSEditor::QmlJSTextEditorWidget' unnamed='1' visible='1' " - "window=':Qt Creator_Core::Internal::MainWindow'}", 20000) + editor = waitForObject(":Qt Creator_QmlJSEditor::QmlJSTextEditorWidget", 20000) lines=['Rectangle\s*\{.*color:\s*"#D1DBBD"', 'NumberAnimation\s*\{\s*.*Easing.OutQuint\s*\}'] additionalKeyPresses = ["", "", "", ""] expectedTypes = ["ColorTip", "TextTip"] diff --git a/tests/system/suite_qtquick/tst_qml_indent/test.py b/tests/system/suite_qtquick/tst_qml_indent/test.py index 14faece9296..6efdb3b2fe6 100644 --- a/tests/system/suite_qtquick/tst_qml_indent/test.py +++ b/tests/system/suite_qtquick/tst_qml_indent/test.py @@ -23,8 +23,7 @@ def prepareQmlFile(): model = navTree.model() waitForObjectItem(navTree, "untitled.QML.qml/untitled.main\\.qml") doubleClickItem(navTree, "untitled.QML.qml/untitled.main\\.qml", 5, 5, 0, Qt.LeftButton) - editor = waitForObject("{type='QmlJSEditor::QmlJSTextEditorWidget' unnamed='1' visible='1' " - "window=':Qt Creator_Core::Internal::MainWindow'}", 20000) + editor = waitForObject(":Qt Creator_QmlJSEditor::QmlJSTextEditorWidget", 20000) for i in range(3): content = "%s" % editor.plainText start = content.find("Text {") @@ -53,11 +52,10 @@ def handleTextChanged(object): def testReIndent(): global originalText,textHasChanged - installLazySignalHandler("{type='QmlJSEditor::QmlJSTextEditorWidget' unnamed='1' visible='1'}", + installLazySignalHandler(":Qt Creator_QmlJSEditor::QmlJSTextEditorWidget", "textChanged()", "handleTextChanged") textHasChanged = False - editor = waitForObject("{type='QmlJSEditor::QmlJSTextEditorWidget' unnamed='1' visible='1' " - "window=':Qt Creator_Core::Internal::MainWindow'}") + editor = waitForObject(":Qt Creator_QmlJSEditor::QmlJSTextEditorWidget") type(editor, "") test.log("calling re-indent") starttime = datetime.utcnow() From 7aeac1d5f7563cc21a56b5d86f9ef7323e791e26 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 4 Sep 2012 18:05:59 +0200 Subject: [PATCH 15/73] Make sure newly added kits are visible Task-number: QTCREATORBUG-7803 Change-Id: I4dd190dc336ef6d64a8f3a800438909cdd3f258e Reviewed-by: Robert Loehning --- src/plugins/projectexplorer/kitoptionspage.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/projectexplorer/kitoptionspage.cpp b/src/plugins/projectexplorer/kitoptionspage.cpp index 7a4ea597d6e..ab19469bf26 100644 --- a/src/plugins/projectexplorer/kitoptionspage.cpp +++ b/src/plugins/projectexplorer/kitoptionspage.cpp @@ -182,6 +182,7 @@ void KitOptionsPage::addNewKit() m_model->markForAddition(k); QModelIndex newIdx = m_model->indexOf(k); + m_kitsView->scrollTo(newIdx); m_selectionModel->select(newIdx, QItemSelectionModel::Clear | QItemSelectionModel::SelectCurrent @@ -199,6 +200,7 @@ void KitOptionsPage::cloneKit() m_model->markForAddition(k); QModelIndex newIdx = m_model->indexOf(k); + m_kitsView->scrollTo(newIdx); m_selectionModel->select(newIdx, QItemSelectionModel::Clear | QItemSelectionModel::SelectCurrent From 90357124f1dc2e2f36571584fa951e2cf6565f2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20N=C3=A4tterlund?= Date: Wed, 5 Sep 2012 15:49:52 +0200 Subject: [PATCH 16/73] QNX: Fixed running the application if first attempt failed When the first attempt to run an application on the BlackBerry device failed, e.g. due to not being able to connect to the device, the Play button remained disabled, so any subsequent attempts to run the application was not possible. Change-Id: I2b9778f7b936e06b2594d2485d7e5575cddbba14 Reviewed-by: Daniel Teske --- src/plugins/qnx/blackberryapplicationrunner.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/plugins/qnx/blackberryapplicationrunner.cpp b/src/plugins/qnx/blackberryapplicationrunner.cpp index e22980f6eb1..c946584ddf3 100644 --- a/src/plugins/qnx/blackberryapplicationrunner.cpp +++ b/src/plugins/qnx/blackberryapplicationrunner.cpp @@ -155,6 +155,7 @@ void BlackBerryApplicationRunner::startFinished(int exitCode, QProcess::ExitStat const QString errorString = (m_launchProcess->error() != QProcess::UnknownError) ? m_launchProcess->errorString() : tr("Launching application failed"); emit startFailed(errorString); + reset(); } } @@ -344,9 +345,11 @@ void BlackBerryApplicationRunner::reset() m_stopping = false; m_runningStateTimer->stop(); - m_runningStateProcess->terminate(); - if (!m_runningStateProcess->waitForFinished(1000)) - m_runningStateProcess->kill(); + if (m_runningStateProcess) { + m_runningStateProcess->terminate(); + if (!m_runningStateProcess->waitForFinished(1000)) + m_runningStateProcess->kill(); + } if (m_tailProcess && m_tailProcess->isProcessRunning()) killTailProcess(); From f3d8f967a775c2c864e1802d841cac6bad8a3336 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 5 Sep 2012 14:16:14 +0200 Subject: [PATCH 17/73] Do not make kit names needlessly ugly Change-Id: I18590604c307f0da831aa15efaf113633cd9a014 Reviewed-by: Daniel Teske --- src/plugins/projectexplorer/kit.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/projectexplorer/kit.cpp b/src/plugins/projectexplorer/kit.cpp index cd448b93c60..89a8010e682 100644 --- a/src/plugins/projectexplorer/kit.cpp +++ b/src/plugins/projectexplorer/kit.cpp @@ -150,6 +150,8 @@ void Kit::setDisplayName(const QString &name) QStringList nameList; foreach (Kit *p, pm->kits()) { + if (p == this) + continue; nameList << p->displayName(); foreach (KitInformation *ki, kitInfo) { const QString postfix = ki->displayNamePostfix(p); From a50721ca7a37671a08f73b700e4570fe54b213bc Mon Sep 17 00:00:00 2001 From: Daniel Teske Date: Wed, 5 Sep 2012 15:46:50 +0200 Subject: [PATCH 18/73] Add more possible qmake names Change-Id: I5f8d2a877ce37015bdea999cce805b0fdc910325 Reviewed-by: Tobias Hunger --- src/libs/utils/buildablehelperlibrary.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libs/utils/buildablehelperlibrary.cpp b/src/libs/utils/buildablehelperlibrary.cpp index 485895d8638..0d4266976b2 100644 --- a/src/libs/utils/buildablehelperlibrary.cpp +++ b/src/libs/utils/buildablehelperlibrary.cpp @@ -126,7 +126,8 @@ QStringList BuildableHelperLibrary::possibleQMakeCommands() #else // On unix some distributions renamed qmake to avoid clashes QStringList result; - result << QLatin1String("qmake-qt4") << QLatin1String("qmake4") << QLatin1String("qmake"); + result << QLatin1String("qmake-qt4") << QLatin1String("qmake4") + << QLatin1String("qmake-qt5") << QLatin1String("qmake5") << QLatin1String("qmake"); return result; #endif } From f60a94f75959d9b540eed83217a4f25721c36a1e Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 6 Sep 2012 08:33:46 +0200 Subject: [PATCH 19/73] Re-add version tooltips for debugger command. Change-Id: Ic89c98426796401577abfd2301fc77e7ee8a8f9b Reviewed-by: Tobias Hunger --- src/plugins/debugger/debuggerkitconfigwidget.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/plugins/debugger/debuggerkitconfigwidget.cpp b/src/plugins/debugger/debuggerkitconfigwidget.cpp index 6ceb478fb2d..6060e470937 100644 --- a/src/plugins/debugger/debuggerkitconfigwidget.cpp +++ b/src/plugins/debugger/debuggerkitconfigwidget.cpp @@ -172,7 +172,8 @@ void DebuggerKitConfigWidget::setFileName(const Utils::FileName &fn) void DebuggerKitConfigWidget::refreshLabel() { QString text; - switch (engineType()) { + const DebuggerEngineType type = engineType(); + switch (type) { case CdbEngineType: { #ifdef Q_OS_WIN const bool is64bit = Utils::winIs64BitSystem(); @@ -192,6 +193,9 @@ void DebuggerKitConfigWidget::refreshLabel() } m_label->setText(text); m_label->setVisible(!text.isEmpty()); + m_chooser->setCommandVersionArguments(type == CdbEngineType ? + QStringList(QLatin1String("-version")) : + QStringList(QLatin1String("--version"))); } } // namespace Internal From 8f56db9967aecf43c57f28f8de433e694b17fbbf Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Wed, 5 Sep 2012 20:35:13 +0300 Subject: [PATCH 20/73] Qnx: Add qbs file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I9b9061970c92d8e6911772e3ca408e07ef6ea731 Reviewed-by: Tobias Nätterlund Reviewed-by: Joerg Bornemann --- qtcreator.qbp | 1 + src/plugins/qnx/qnx.qbs | 135 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 src/plugins/qnx/qnx.qbs diff --git a/qtcreator.qbp b/qtcreator.qbp index 9a6fc2870a1..069f2948a2c 100644 --- a/qtcreator.qbp +++ b/qtcreator.qbp @@ -63,6 +63,7 @@ Project { "src/plugins/qmljstools/qmljstools.qbs", "src/plugins/qmlprofiler/qmlprofiler.qbs", "src/plugins/qmlprojectmanager/qmlprojectmanager.qbs", + "src/plugins/qnx/qnx.qbs", "src/plugins/qt4projectmanager/qt4projectmanager.qbs", "src/plugins/qtsupport/qtsupport.qbs", "src/plugins/remotelinux/remotelinux.qbs", diff --git a/src/plugins/qnx/qnx.qbs b/src/plugins/qnx/qnx.qbs new file mode 100644 index 00000000000..27e89f17c9c --- /dev/null +++ b/src/plugins/qnx/qnx.qbs @@ -0,0 +1,135 @@ +import qbs.base 1.0 + +import "../QtcPlugin.qbs" as QtcPlugin + +QtcPlugin { + name: "Qnx" + provider: "RIM" + + Depends { name: "Core" } + Depends { name: "Debugger" } + Depends { name: "ProjectExplorer" } + Depends { name: "QtSupport" } + Depends { name: "Qt4ProjectManager" } + Depends { name: "RemoteLinux" } + Depends { name: "Qt"; submodules: ["widgets", "xml", "network"] } + + property bool enable: false + property var pluginspecreplacements: ({"QNX_EXPERIMENTAL_STR": (enable ? "false" : "true")}) + + cpp.defines: base.concat(["QT_NO_CAST_TO_ASCII", "QT_NO_CAST_FROM_ASCII"]) + cpp.includePaths: [ + "..", + buildDirectory, + "../../libs", + "../../shared" + ] + + files: [ + "bardescriptorfileimagewizardpage.cpp", + "bardescriptorfileimagewizardpage.h", + "bardescriptorfileimagewizardpage.ui", + "blackberryabstractdeploystep.cpp", + "blackberryabstractdeploystep.h", + "blackberryapplicationrunner.cpp", + "blackberryapplicationrunner.h", + "blackberryconnect.cpp", + "blackberryconnect.h", + "blackberrycreatepackagestepconfigwidget.cpp", + "blackberrycreatepackagestepconfigwidget.h", + "blackberrycreatepackagestep.cpp", + "blackberrycreatepackagestepfactory.cpp", + "blackberrycreatepackagestepfactory.h", + "blackberrycreatepackagestep.h", + "blackberrydebugsupport.cpp", + "blackberrydebugsupport.h", + "blackberrydeployconfiguration.cpp", + "blackberrydeployconfigurationfactory.cpp", + "blackberrydeployconfigurationfactory.h", + "blackberrydeployconfiguration.h", + "blackberrydeployconfigurationwidget.cpp", + "blackberrydeployconfigurationwidget.h", + "blackberrydeployconfigurationwidget.ui", + "blackberrydeployinformation.cpp", + "blackberrydeployinformation.h", + "blackberrydeploystepconfigwidget.cpp", + "blackberrydeploystepconfigwidget.h", + "blackberrydeploystep.cpp", + "blackberrydeploystepfactory.cpp", + "blackberrydeploystepfactory.h", + "blackberrydeploystep.h", + "blackberrydeviceconfiguration.cpp", + "blackberrydeviceconfigurationfactory.cpp", + "blackberrydeviceconfigurationfactory.h", + "blackberrydeviceconfiguration.h", + "blackberrydeviceconfigurationwidget.cpp", + "blackberrydeviceconfigurationwidget.h", + "blackberrydeviceconfigurationwidget.ui", + "blackberrydeviceconfigurationwizard.cpp", + "blackberrydeviceconfigurationwizard.h", + "blackberrydeviceconfigurationwizardpages.cpp", + "blackberrydeviceconfigurationwizardpages.h", + "blackberrydeviceconfigurationwizardsetuppage.ui", + "blackberrydeviceconfigurationwizardsshkeypage.ui", + "blackberryqtversion.cpp", + "blackberryqtversionfactory.cpp", + "blackberryqtversionfactory.h", + "blackberryqtversion.h", + "blackberryrunconfiguration.cpp", + "blackberryrunconfigurationfactory.cpp", + "blackberryrunconfigurationfactory.h", + "blackberryrunconfiguration.h", + "blackberryrunconfigurationwidget.cpp", + "blackberryrunconfigurationwidget.h", + "blackberryrunconfigurationwidget.ui", + "blackberryruncontrol.cpp", + "blackberryruncontrolfactory.cpp", + "blackberryruncontrolfactory.h", + "blackberryruncontrol.h", + "blackberrywizardextension.cpp", + "blackberrywizardextension.h", + "images/target.png", + "images/target-small.png", + "pathchooserdelegate.cpp", + "pathchooserdelegate.h", + "qnxabstractqtversion.cpp", + "qnxabstractqtversion.h", + "qnxbaseqtconfigwidget.cpp", + "qnxbaseqtconfigwidget.h", + "qnxbaseqtconfigwidget.ui", + "qnxconstants.h", + "qnxdebugsupport.cpp", + "qnxdebugsupport.h", + "qnxdeployconfiguration.cpp", + "qnxdeployconfigurationfactory.cpp", + "qnxdeployconfigurationfactory.h", + "qnxdeployconfiguration.h", + "qnxdeploystepfactory.cpp", + "qnxdeploystepfactory.h", + "qnxdeviceconfiguration.cpp", + "qnxdeviceconfigurationfactory.cpp", + "qnxdeviceconfigurationfactory.h", + "qnxdeviceconfiguration.h", + "qnxdeviceconfigurationwizard.cpp", + "qnxdeviceconfigurationwizard.h", + "qnxdeviceconfigurationwizardpages.cpp", + "qnxdeviceconfigurationwizardpages.h", + "qnxplugin.cpp", + "qnxplugin.h", + "qnx.qrc", + "qnxqtversion.cpp", + "qnxqtversionfactory.cpp", + "qnxqtversionfactory.h", + "qnxqtversion.h", + "qnxrunconfiguration.cpp", + "qnxrunconfigurationfactory.cpp", + "qnxrunconfigurationfactory.h", + "qnxrunconfiguration.h", + "qnxruncontrol.cpp", + "qnxruncontrolfactory.cpp", + "qnxruncontrolfactory.h", + "qnxruncontrol.h", + "qnxutils.cpp", + "qnxutils.h" + ] +} From 99cfa88b90e0fb911689a6541d17a3e2326816a6 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 6 Sep 2012 11:20:19 +0200 Subject: [PATCH 21/73] fix skipping over TokProperty elements properties now use hashed names as well. Task-number: QTCREATORBUG-7706 Change-Id: I6f941647104152c61f8b86972d24dea6d227cb77 Reviewed-by: Daniel Teske --- src/shared/proparser/prowriter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/proparser/prowriter.cpp b/src/shared/proparser/prowriter.cpp index ac0f4399b4f..6a6b6f0678c 100644 --- a/src/shared/proparser/prowriter.cpp +++ b/src/shared/proparser/prowriter.cpp @@ -105,12 +105,12 @@ static void skipExpression(const ushort *&pTokPtr, int &lineNo) default: switch (tok & TokMask) { case TokLiteral: - case TokProperty: case TokEnvVar: skipStr(tokPtr); break; case TokHashLiteral: case TokVariable: + case TokProperty: skipHashStr(tokPtr); break; case TokFuncName: From 889f16c345f89fdbaa25a083e57615ef103c3b74 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 5 Sep 2012 22:07:39 +0200 Subject: [PATCH 22/73] fix crash when modifiying some project files with scopes TokBranch may hold zero-sized blocks, which must be explicitly handled before trying to enter them. Task-number: QTCREATORBUG-7706 Change-Id: Idaa129e12eb89cbc9572277083765fa6e15e0849 Reviewed-by: Daniel Teske Reviewed-by: Oswald Buddenhagen --- src/shared/proparser/prowriter.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/shared/proparser/prowriter.cpp b/src/shared/proparser/prowriter.cpp index 6a6b6f0678c..e70740efd95 100644 --- a/src/shared/proparser/prowriter.cpp +++ b/src/shared/proparser/prowriter.cpp @@ -325,11 +325,15 @@ static void findProVariables(const ushort *tokPtr, const QStringList &vars, while (ushort tok = *tokPtr++) { if (tok == TokBranch) { uint blockLen = getBlockLen(tokPtr); - findProVariables(tokPtr, vars, proVars, lineNo); - tokPtr += blockLen; + if (blockLen) { + findProVariables(tokPtr, vars, proVars, lineNo); + tokPtr += blockLen; + } blockLen = getBlockLen(tokPtr); - findProVariables(tokPtr, vars, proVars, lineNo); - tokPtr += blockLen; + if (blockLen) { + findProVariables(tokPtr, vars, proVars, lineNo); + tokPtr += blockLen; + } } else if (tok == TokAssign || tok == TokAppend || tok == TokAppendUnique) { if (getLiteral(lastXpr, tokPtr - 1, tmp) && vars.contains(tmp)) *proVars << lineNo; From 87529e30e3dc6ef793bf52ae5c68ddcf187f5a07 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 6 Sep 2012 12:07:29 +0200 Subject: [PATCH 23/73] Android: Do not instantiate the DeviceManager in initialize(). It is not guaranteed that all device creation factories have been set up at that point, meaning that some devices will not be loaded from the settings. Change-Id: Ibce0e6c125980b1807efca4ce97693f9af7ab79a Reviewed-by: Tobias Hunger --- src/plugins/android/androidplugin.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/plugins/android/androidplugin.cpp b/src/plugins/android/androidplugin.cpp index d15c5b6439b..ee07b410944 100644 --- a/src/plugins/android/androidplugin.cpp +++ b/src/plugins/android/androidplugin.cpp @@ -71,14 +71,15 @@ bool AndroidPlugin::initialize(const QStringList &arguments, QString *errorMessa addAutoReleasedObject(new Internal::AndroidToolChainFactory); addAutoReleasedObject(new Internal::AndroidDeployConfigurationFactory); addAutoReleasedObject(new Internal::AndroidDeviceFactory); - ProjectExplorer::DeviceManager *dm = ProjectExplorer::DeviceManager::instance(); - if (dm->find(Core::Id(Constants::ANDROID_DEVICE_ID)).isNull()) - dm->addDevice(ProjectExplorer::IDevice::Ptr(new Internal::AndroidDevice)); return true; } void AndroidPlugin::extensionsInitialized() -{ } +{ + ProjectExplorer::DeviceManager *dm = ProjectExplorer::DeviceManager::instance(); + if (dm->find(Core::Id(Constants::ANDROID_DEVICE_ID)).isNull()) + dm->addDevice(ProjectExplorer::IDevice::Ptr(new Internal::AndroidDevice)); +} } // namespace Android From 1c28c5df027a609de85f47c705822874d3f60a21 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 6 Sep 2012 14:32:42 +0200 Subject: [PATCH 24/73] fix default arguments of ProString::lastIndexOf() Change-Id: If70f4f8e2aa8b68b5c87dbd1b6b95a7601eecce8 Reviewed-by: Daniel Teske --- src/shared/proparser/proitems.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/shared/proparser/proitems.h b/src/shared/proparser/proitems.h index 3a4b69b5b6e..b63af6c48b4 100644 --- a/src/shared/proparser/proitems.h +++ b/src/shared/proparser/proitems.h @@ -117,9 +117,9 @@ public: int indexOf(const QString &s, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringRef().indexOf(s, from, cs); } int indexOf(const char *s, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringRef().indexOf(QLatin1String(s), from, cs); } int indexOf(QChar c, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringRef().indexOf(c, from, cs); } - int lastIndexOf(const QString &s, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringRef().lastIndexOf(s, from, cs); } - int lastIndexOf(const char *s, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringRef().lastIndexOf(QLatin1String(s), from, cs); } - int lastIndexOf(QChar c, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringRef().lastIndexOf(c, from, cs); } + int lastIndexOf(const QString &s, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringRef().lastIndexOf(s, from, cs); } + int lastIndexOf(const char *s, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringRef().lastIndexOf(QLatin1String(s), from, cs); } + int lastIndexOf(QChar c, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return toQStringRef().lastIndexOf(c, from, cs); } bool contains(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return indexOf(s, 0, cs) >= 0; } bool contains(const char *s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return indexOf(QLatin1String(s), 0, cs) >= 0; } bool contains(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const { return indexOf(c, 0, cs) >= 0; } From 550f8218deb6736f40dbd1196fcebd0c9ff486e1 Mon Sep 17 00:00:00 2001 From: Daniel Molkentin Date: Thu, 6 Sep 2012 14:58:39 +0200 Subject: [PATCH 25/73] No QTC_PREFIX default on Windows. Causes too many funny side effects. Change-Id: Ic6448d7ef95f4ff95df8fddd1b78f4071fa5118f Reviewed-by: Oswald Buddenhagen --- qtcreator.pri | 1 - 1 file changed, 1 deletion(-) diff --git a/qtcreator.pri b/qtcreator.pri index 1fdd9e4e164..5a9ea758c02 100644 --- a/qtcreator.pri +++ b/qtcreator.pri @@ -5,7 +5,6 @@ QTCREATOR_VERSION = 2.5.81 isEmpty(QTC_PREFIX) { unix: QTC_PREFIX = /usr/local - else: QTC_PREFIX = QtCreator } defineReplace(cleanPath) { From e6d68320c8019025d83ce25d50ed933ae4628c06 Mon Sep 17 00:00:00 2001 From: Daniel Molkentin Date: Thu, 6 Sep 2012 14:59:47 +0200 Subject: [PATCH 26/73] Libs to link must be lowercase to work with mingw xcompile. Change-Id: I066ea0e0ecb6c0dddc86230b74b1c492bb63e002 Reviewed-by: Friedemann Kleint --- src/libs/utils/utils.pro | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/utils/utils.pro b/src/libs/utils/utils.pro index 7829c45097d..873eb0c437c 100644 --- a/src/libs/utils/utils.pro +++ b/src/libs/utils/utils.pro @@ -18,6 +18,6 @@ HEADERS += \ SOURCES += \ proxyaction.cpp -win32: LIBS += -lUser32 +win32: LIBS += -luser32 # PortsGatherer -win32: LIBS += -liphlpapi -lWs2_32 +win32: LIBS += -liphlpapi -lws2_32 From 8b05f1afafb044b3f3ca7eeead2e106fb9aa3e28 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 6 Sep 2012 16:30:33 +0200 Subject: [PATCH 27/73] DeviceProcessDialog: add method to set visibility of kit row. Change-Id: I42f3b2fd1eea1d958d914de86f7853bf29c2b651 Reviewed-by: Tobias Hunger Reviewed-by: Christian Kandeler Reviewed-by: Friedemann Kleint --- .../devicesupport/deviceprocessesdialog.cpp | 19 +++++++++++++++---- .../devicesupport/deviceprocessesdialog.h | 2 ++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.cpp b/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.cpp index 8512c627857..47c76d414b7 100644 --- a/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.cpp +++ b/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.cpp @@ -113,6 +113,7 @@ public: QWidget *q; DeviceProcessList *processList; ProcessListFilterModel proxyModel; + QLabel *kitLabel; KitChooser *kitChooser; QTreeView *procView; @@ -125,7 +126,11 @@ public: }; DeviceProcessesDialogPrivate::DeviceProcessesDialogPrivate(KitChooser *chooser, QWidget *parent) - : q(parent), kitChooser(chooser), acceptButton(0), buttonBox(new QDialogButtonBox(parent)) + : q(parent) + , kitLabel(new QLabel(DeviceProcessesDialog::tr("Kit:"), parent)) + , kitChooser(chooser) + , acceptButton(0) + , buttonBox(new QDialogButtonBox(parent)) { q->setWindowTitle(DeviceProcessesDialog::tr("List of Processes")); q->setWindowFlags(q->windowFlags() & ~Qt::WindowContextHelpButtonHint); @@ -161,7 +166,7 @@ DeviceProcessesDialogPrivate::DeviceProcessesDialogPrivate(KitChooser *chooser, QFormLayout *leftColumn = new QFormLayout(); leftColumn->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); - leftColumn->addRow(DeviceProcessesDialog::tr("Kit:"), kitChooser); + leftColumn->addRow(kitLabel, kitChooser); leftColumn->addRow(DeviceProcessesDialog::tr("&Filter:"), processFilterLineEdit); // QVBoxLayout *rightColumn = new QVBoxLayout(); @@ -327,15 +332,21 @@ void DeviceProcessesDialog::addCloseButton() d->buttonBox->addButton(QDialogButtonBox::Close); } +void DeviceProcessesDialog::setKitVisible(bool v) +{ + d->kitLabel->setVisible(v); + d->kitChooser->setVisible(v); +} + void DeviceProcessesDialog::setDevice(const IDevice::ConstPtr &device) { - d->kitChooser->hide(); + setKitVisible(false); d->setDevice(device); } void DeviceProcessesDialog::showAllDevices() { - d->kitChooser->show(); + setKitVisible(true); d->updateDevice(); } diff --git a/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.h b/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.h index 58b992e11de..6687a82f1f6 100644 --- a/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.h +++ b/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.h @@ -64,6 +64,8 @@ protected: DeviceProcessesDialog(KitChooser *chooser, QWidget *parent); private: + void setKitVisible(bool); + Internal::DeviceProcessesDialogPrivate * const d; }; From 9d90f8b396e8e42e4181edf6cb87d2ae7deddead Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Thu, 6 Sep 2012 13:13:12 +0200 Subject: [PATCH 28/73] Warn if kit has no tool chain set up Change-Id: I551402c1e3023feeeb127f001a0e908938a07fc2 Reviewed-by: Daniel Teske --- .../autotoolsprojectmanager/makestep.cpp | 25 +++++++++++++++++-- .../autotoolsprojectmanager/makestep.h | 2 ++ src/plugins/cmakeprojectmanager/makestep.cpp | 21 +++++++++++++++- src/plugins/cmakeprojectmanager/makestep.h | 1 + .../genericprojectmanager/genericmakestep.cpp | 21 +++++++++++++++- .../genericprojectmanager/genericmakestep.h | 1 + src/plugins/qt4projectmanager/makestep.cpp | 17 +++---------- 7 files changed, 71 insertions(+), 17 deletions(-) diff --git a/src/plugins/autotoolsprojectmanager/makestep.cpp b/src/plugins/autotoolsprojectmanager/makestep.cpp index 01738224ce6..15da9b64746 100644 --- a/src/plugins/autotoolsprojectmanager/makestep.cpp +++ b/src/plugins/autotoolsprojectmanager/makestep.cpp @@ -168,14 +168,23 @@ void MakeStep::setClean(bool clean) bool MakeStep::init() { AutotoolsBuildConfiguration *bc = autotoolsBuildConfiguration(); + if (!bc) + bc = static_cast(target()->activeBuildConfiguration()); + + m_tasks.clear(); + ToolChain *tc = ToolChainKitInformation::toolChain(target()->kit()); + if (!tc) { + m_tasks.append(Task(Task::Error, tr("Qt Creator needs a compiler set up to build. Configure a compiler in the kit options."), + Utils::FileName(), -1, + Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); + return true; // otherwise the tasks will not get reported + } QString arguments = Utils::QtcProcess::joinArgs(m_buildTargets); Utils::QtcProcess::addArgs(&arguments, additionalArguments()); setIgnoreReturnValue(m_clean); - ToolChain *tc = ProjectExplorer::ToolChainKitInformation::toolChain(target()->kit()); - ProcessParameters *pp = processParameters(); pp->setMacroExpander(bc->macroExpander()); pp->setEnvironment(bc->environment()); @@ -193,6 +202,18 @@ bool MakeStep::init() void MakeStep::run(QFutureInterface &interface) { + // Warn on common error conditions: + bool canContinue = true; + foreach (const Task &t, m_tasks) { + addTask(t); + canContinue = false; + } + if (!canContinue) { + emit addOutput(tr("Configuration is faulty. Check the Issues view for details."), BuildStep::MessageOutput); + interface.reportResult(false); + return; + } + AbstractProcessStep::run(interface); } diff --git a/src/plugins/autotoolsprojectmanager/makestep.h b/src/plugins/autotoolsprojectmanager/makestep.h index 9a1e180d18b..3f8145ef473 100644 --- a/src/plugins/autotoolsprojectmanager/makestep.h +++ b/src/plugins/autotoolsprojectmanager/makestep.h @@ -36,6 +36,7 @@ #define MAKESTEP_H #include +#include QT_BEGIN_NAMESPACE class QLineEdit; @@ -124,6 +125,7 @@ private: QStringList m_buildTargets; QString m_additionalArguments; bool m_clean; + QList m_tasks; }; /////////////////////////////// diff --git a/src/plugins/cmakeprojectmanager/makestep.cpp b/src/plugins/cmakeprojectmanager/makestep.cpp index feda03a96c1..cb54f8a4b93 100644 --- a/src/plugins/cmakeprojectmanager/makestep.cpp +++ b/src/plugins/cmakeprojectmanager/makestep.cpp @@ -132,12 +132,20 @@ bool MakeStep::init() if (!bc) bc = static_cast(target()->activeBuildConfiguration()); + m_tasks.clear(); + ToolChain *tc = ToolChainKitInformation::toolChain(target()->kit()); + if (!tc) { + m_tasks.append(Task(Task::Error, tr("Qt Creator needs a compiler set up to build. Configure a compiler in the kit options."), + Utils::FileName(), -1, + Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); + return true; // otherwise the tasks will not get reported + } + QString arguments = Utils::QtcProcess::joinArgs(m_buildTargets); Utils::QtcProcess::addArgs(&arguments, additionalArguments()); setIgnoreReturnValue(m_clean); - ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainKitInformation::toolChain(target()->kit()); ProcessParameters *pp = processParameters(); pp->setMacroExpander(bc->macroExpander()); pp->setEnvironment(bc->environment()); @@ -158,6 +166,17 @@ bool MakeStep::init() void MakeStep::run(QFutureInterface &fi) { + bool canContinue = true; + foreach (const Task &t, m_tasks) { + addTask(t); + canContinue = false; + } + if (!canContinue) { + emit addOutput(tr("Configuration is faulty. Check the Issues view for details."), BuildStep::MessageOutput); + fi.reportResult(false); + return; + } + m_futureInterface = &fi; m_futureInterface->setProgressRange(0, 100); AbstractProcessStep::run(fi); diff --git a/src/plugins/cmakeprojectmanager/makestep.h b/src/plugins/cmakeprojectmanager/makestep.h index a71d1e0163a..b8342705e1a 100644 --- a/src/plugins/cmakeprojectmanager/makestep.h +++ b/src/plugins/cmakeprojectmanager/makestep.h @@ -94,6 +94,7 @@ private: QFutureInterface *m_futureInterface; QStringList m_buildTargets; QString m_additionalArguments; + QList m_tasks; }; class MakeStepConfigWidget :public ProjectExplorer::BuildStepConfigWidget diff --git a/src/plugins/genericprojectmanager/genericmakestep.cpp b/src/plugins/genericprojectmanager/genericmakestep.cpp index 6100366af41..f66b78f9610 100644 --- a/src/plugins/genericprojectmanager/genericmakestep.cpp +++ b/src/plugins/genericprojectmanager/genericmakestep.cpp @@ -106,6 +106,15 @@ bool GenericMakeStep::init() if (!bc) bc = static_cast(target()->activeBuildConfiguration()); + m_tasks.clear(); + ToolChain *tc = ToolChainKitInformation::toolChain(target()->kit()); + if (!tc) { + m_tasks.append(Task(Task::Error, tr("Qt Creator needs a compiler set up to build. Configure a compiler in the kit options."), + Utils::FileName(), -1, + Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); + return true; // otherwise the tasks will not get reported + } + ProcessParameters *pp = processParameters(); pp->setMacroExpander(bc->macroExpander()); pp->setWorkingDirectory(bc->buildDirectory()); @@ -119,7 +128,6 @@ bool GenericMakeStep::init() setIgnoreReturnValue(m_clean); setOutputParser(new GnuMakeParser()); - ToolChain *tc = ToolChainKitInformation::toolChain(target()->kit()); if (tc) appendOutputParser(tc->outputParser()); outputParser()->setWorkingDirectory(pp->effectiveWorkingDirectory()); @@ -180,6 +188,17 @@ QString GenericMakeStep::makeCommand() const void GenericMakeStep::run(QFutureInterface &fi) { + bool canContinue = true; + foreach (const Task &t, m_tasks) { + addTask(t); + canContinue = false; + } + if (!canContinue) { + emit addOutput(tr("Configuration is faulty. Check the Issues view for details."), BuildStep::MessageOutput); + fi.reportResult(false); + return; + } + AbstractProcessStep::run(fi); } diff --git a/src/plugins/genericprojectmanager/genericmakestep.h b/src/plugins/genericprojectmanager/genericmakestep.h index 769cabcfa60..b524ef3eff8 100644 --- a/src/plugins/genericprojectmanager/genericmakestep.h +++ b/src/plugins/genericprojectmanager/genericmakestep.h @@ -85,6 +85,7 @@ private: QString m_makeArguments; QString m_makeCommand; bool m_clean; + QList m_tasks; }; class GenericMakeStepConfigWidget : public ProjectExplorer::BuildStepConfigWidget diff --git a/src/plugins/qt4projectmanager/makestep.cpp b/src/plugins/qt4projectmanager/makestep.cpp index eb11365323f..39e414f5e7a 100644 --- a/src/plugins/qt4projectmanager/makestep.cpp +++ b/src/plugins/qt4projectmanager/makestep.cpp @@ -144,18 +144,11 @@ bool MakeStep::init() bc = qobject_cast(target()->activeBuildConfiguration()); m_tasks.clear(); - if (!bc) { - m_tasks.append(Task(Task::Error, tr("Qt Creator needs a build configuration set up to build. Configure a target in Project mode."), - Utils::FileName(), -1, - Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); - return true; // otherwise the tasks will not get reported - } - ToolChain *tc = ToolChainKitInformation::toolChain(target()->kit()); if (!tc) { - m_tasks.append(Task(Task::Error, tr("Qt Creator needs a compiler set up to build. Configure a compiler in the target options."), - Utils::FileName(), -1, - Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); + m_tasks.append(Task(Task::Error, tr("Qt Creator needs a compiler set up to build. Configure a compiler in the kit options."), + Utils::FileName(), -1, + Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); return true; // otherwise the tasks will not get reported } @@ -278,12 +271,10 @@ bool MakeStep::init() void MakeStep::run(QFutureInterface & fi) { - // Warn on common error conditions: bool canContinue = true; foreach (const Task &t, m_tasks) { addTask(t); - if (t.type == Task::Error) - canContinue = false; + canContinue = false; } if (!canContinue) { emit addOutput(tr("Configuration is faulty. Check the Issues view for details."), BuildStep::MessageOutput); From 29e8a5c017c5871e78315d9b86317c31ca9c15b1 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 6 Sep 2012 14:46:28 +0200 Subject: [PATCH 29/73] Show tool tip when hovering over project mode kit selector Change-Id: I42871f00cea5ffd61b5f23fba2ffa084c289c051 Reviewed-by: Tobias Hunger --- src/plugins/projectexplorer/targetselector.cpp | 17 +++++++++++++++++ src/plugins/projectexplorer/targetselector.h | 2 ++ .../projectexplorer/targetsettingspanel.cpp | 14 ++++++++++++-- .../projectexplorer/targetsettingspanel.h | 1 + .../projectexplorer/targetsettingswidget.cpp | 3 ++- .../projectexplorer/targetsettingswidget.h | 1 + 6 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/plugins/projectexplorer/targetselector.cpp b/src/plugins/projectexplorer/targetselector.cpp index 1034e4eabad..25288ba1e4c 100644 --- a/src/plugins/projectexplorer/targetselector.cpp +++ b/src/plugins/projectexplorer/targetselector.cpp @@ -276,6 +276,23 @@ void TargetSelector::leaveEvent(QEvent *event) update(); } +bool TargetSelector::event(QEvent *e) +{ + if (e->type() == QEvent::ToolTip) { + const QHelpEvent *helpEvent = static_cast(e); + int targetIndex; + int subTargetIndex; + bool removeButton; + getControlAt(helpEvent->x(), helpEvent->y(), 0, &targetIndex, &subTargetIndex, &removeButton); + if (targetIndex >= 0 && subTargetIndex < 0 && !removeButton) { + emit toolTipRequested(helpEvent->globalPos(), targetIndex); + e->accept(); + return true; + } + } + return QWidget::event(e); +} + void TargetSelector::paintEvent(QPaintEvent *event) { Q_UNUSED(event) diff --git a/src/plugins/projectexplorer/targetselector.h b/src/plugins/projectexplorer/targetselector.h index d20e536a51f..874f8207654 100644 --- a/src/plugins/projectexplorer/targetselector.h +++ b/src/plugins/projectexplorer/targetselector.h @@ -75,12 +75,14 @@ signals: // This signal is emitted whenever the target pointed to by the indices // has changed. void currentChanged(int targetIndex, int subIndex); + void toolTipRequested(const QPoint &globalPosition, int targetIndex); protected: void paintEvent(QPaintEvent *event); void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void leaveEvent(QEvent *event); + bool event(QEvent *e); private: void getControlAt(int x, int y, int *buttonIndex, int *targetIndex, int *targetSubIndex, bool *removeButton); diff --git a/src/plugins/projectexplorer/targetsettingspanel.cpp b/src/plugins/projectexplorer/targetsettingspanel.cpp index 162097f523c..4f1be3653f3 100644 --- a/src/plugins/projectexplorer/targetsettingspanel.cpp +++ b/src/plugins/projectexplorer/targetsettingspanel.cpp @@ -50,9 +50,10 @@ #include #include #include -#include -#include #include +#include +#include +#include using namespace ProjectExplorer; using namespace ProjectExplorer::Internal; @@ -142,6 +143,8 @@ void TargetSettingsPanelWidget::setupUi() this, SLOT(removeTarget(int))); connect(m_selector, SIGNAL(manageButtonClicked()), this, SLOT(openTargetPreferences())); + connect(m_selector, SIGNAL(toolTipRequested(QPoint,int)), + this, SLOT(showTargetToolTip(QPoint,int))); m_selector->setAddButtonMenu(m_addMenu); connect(m_addMenu, SIGNAL(triggered(QAction*)), @@ -253,6 +256,13 @@ void TargetSettingsPanelWidget::removeTarget(int targetIndex) } +void TargetSettingsPanelWidget::showTargetToolTip(const QPoint &globalPos, int targetIndex) +{ + QTC_ASSERT(targetIndex >= 0 && targetIndex < m_targets.count(), return); + Target *target = m_targets.at(targetIndex); + QToolTip::showText(globalPos, target->kit()->toHtml()); +} + void TargetSettingsPanelWidget::targetAdded(ProjectExplorer::Target *target) { Q_ASSERT(m_project == target->project()); diff --git a/src/plugins/projectexplorer/targetsettingspanel.h b/src/plugins/projectexplorer/targetsettingspanel.h index ccbe1991e65..c6127f9080f 100644 --- a/src/plugins/projectexplorer/targetsettingspanel.h +++ b/src/plugins/projectexplorer/targetsettingspanel.h @@ -64,6 +64,7 @@ public: private slots: void currentTargetChanged(int targetIndex, int subIndex); void removeTarget(int targetIndex); + void showTargetToolTip(const QPoint &globalPos, int targetIndex); void addTarget(QAction *); void targetAdded(ProjectExplorer::Target *target); void removedTarget(ProjectExplorer::Target *target); diff --git a/src/plugins/projectexplorer/targetsettingswidget.cpp b/src/plugins/projectexplorer/targetsettingswidget.cpp index 63dd37ca0fb..1b6c8cd5b0e 100644 --- a/src/plugins/projectexplorer/targetsettingswidget.cpp +++ b/src/plugins/projectexplorer/targetsettingswidget.cpp @@ -67,7 +67,8 @@ TargetSettingsWidget::TargetSettingsWidget(QWidget *parent) : this, SIGNAL(removeButtonClicked(int))); connect(m_targetSelector, SIGNAL(currentChanged(int,int)), this, SIGNAL(currentChanged(int,int))); - + connect(m_targetSelector, SIGNAL(toolTipRequested(QPoint,int)), + this, SIGNAL(toolTipRequested(QPoint,int))); QPalette shadowPal = palette(); QLinearGradient grad(0, 0, 0, 2); diff --git a/src/plugins/projectexplorer/targetsettingswidget.h b/src/plugins/projectexplorer/targetsettingswidget.h index 641288f29db..4650b878fdb 100644 --- a/src/plugins/projectexplorer/targetsettingswidget.h +++ b/src/plugins/projectexplorer/targetsettingswidget.h @@ -72,6 +72,7 @@ signals: void removeButtonClicked(int targetIndex); void currentChanged(int targetIndex, int subIndex); void manageButtonClicked(); + void toolTipRequested(const QPoint &globalPosition, int targetIndex); protected: void changeEvent(QEvent *e); From da14147f2c25d19556f483d5bc13515408164ce7 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Thu, 6 Sep 2012 11:58:05 +0200 Subject: [PATCH 30/73] Editor: Set default editor file text encoding to UTF-8 because Qt5 requires it Task-number: QTCREATORBUG-7420 Change-Id: I0823c4701d5f1fef202fb38e423275bb9d3a66fe Reviewed-by: Leandro Melo Reviewed-by: Eike Ziller --- src/plugins/coreplugin/editormanager/editormanager.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index c0d9eeced8a..cb190886973 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -2087,6 +2087,8 @@ QTextCodec *EditorManager::defaultTextCodec() const if (QTextCodec *candidate = QTextCodec::codecForName( settings->value(QLatin1String(Constants::SETTINGS_DEFAULTTEXTENCODING)).toByteArray())) return candidate; + if (QTextCodec *defaultUTF8 = QTextCodec::codecForName("UTF-8")) + return defaultUTF8; return QTextCodec::codecForLocale(); } From 7337152c1e0e626d8ea55beb1b17f1502a4c5683 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 7 Sep 2012 09:49:52 +0200 Subject: [PATCH 31/73] Revert "No QTC_PREFIX default on Windows. Causes too many funny side effects." Because the change depends on reverted commit c29bf6f6525d435d69936576761b4a29102cd056 This reverts commit 550f8218deb6736f40dbd1196fcebd0c9ff486e1. Change-Id: If287c4b126b1ef710c074fd85946da41161c6ba9 Reviewed-by: Eike Ziller --- qtcreator.pri | 1 + 1 file changed, 1 insertion(+) diff --git a/qtcreator.pri b/qtcreator.pri index 5a9ea758c02..1fdd9e4e164 100644 --- a/qtcreator.pri +++ b/qtcreator.pri @@ -5,6 +5,7 @@ QTCREATOR_VERSION = 2.5.81 isEmpty(QTC_PREFIX) { unix: QTC_PREFIX = /usr/local + else: QTC_PREFIX = QtCreator } defineReplace(cleanPath) { From b56b1c7d5917a5b4f72b2e0da01b2c2c71002616 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 7 Sep 2012 09:50:07 +0200 Subject: [PATCH 32/73] Revert "Introduce $$QTC_PREFIX instead of abusing $(INSTALL_ROOT)." It depends on and mixes in changes made in another change on gerrit that is not merged, so it breaks the package build. This reverts commit c29bf6f6525d435d69936576761b4a29102cd056. Change-Id: Ibb251150909271f3e119f05a1691832aae8ac633 Reviewed-by: Eike Ziller --- bin/bin.pro | 2 +- doc/doc.pri | 4 ++-- lib/qtcreator/qtcomponents/qtcomponents.pro | 2 +- qtcreator.pri | 5 ---- qtcreator.pro | 23 +++++-------------- .../qml/qmlpuppet/qml2puppet/qml2puppet.pro | 2 +- .../qml/qmlpuppet/qmlpuppet/qmlpuppet.pri | 2 +- share/qtcreator/static.pro | 4 ++-- share/qtcreator/translations/translations.pro | 2 +- src/app/app.pro | 4 ++-- src/libs/qtcomponents/styleitem/styleitem.pro | 2 +- src/libs/qtcreatorcdbext/qtcreatorcdbext.pro | 2 +- src/libs/utils/process_ctrlc_stub.pro | 2 +- src/libs/utils/process_stub.pro | 2 +- src/plugins/coreplugin/coreplugin.pro | 2 +- src/plugins/qmldesigner/plugindestdir.pri | 2 +- src/qtcreatorlibrary.pri | 4 ++-- src/qtcreatorplugin.pri | 4 ++-- src/tools/qtcdebugger/qtcdebugger.pro | 2 +- src/tools/qtpromaker/qtpromaker.pro | 2 +- src/tools/win64interrupt/win64interrupt.pro | 2 +- 21 files changed, 30 insertions(+), 46 deletions(-) diff --git a/bin/bin.pro b/bin/bin.pro index d546b053cb7..523cc50bd17 100644 --- a/bin/bin.pro +++ b/bin/bin.pro @@ -9,7 +9,7 @@ QMAKE_STRIP = QMAKE_CLEAN = qtcreator.sh -target.path = $$QTC_PREFIX/bin +target.path = /bin INSTALLS += target OTHER_FILES = $$PWD/qtcreator.sh diff --git a/doc/doc.pri b/doc/doc.pri index c163bce40c8..285951f22c9 100644 --- a/doc/doc.pri +++ b/doc/doc.pri @@ -78,12 +78,12 @@ dev_qch_docs.depends += dev_html_docs !macx { inst_qch_docs.files = $$QCH_FILE - inst_qch_docs.path = $$QTC_PREFIX/share/doc/qtcreator + inst_qch_docs.path = /share/doc/qtcreator inst_qch_docs.CONFIG += no_check_exist no_default_install INSTALLS += inst_qch_docs inst_dev_qch_docs.files = $$DEV_QCH_FILE - inst_dev_qch_docs.path = $$QTC_PREFIX/share/doc/qtcreator + inst_dev_qch_docs.path = /share/doc/qtcreator inst_dev_qch_docs.CONFIG += no_check_exist no_default_install INSTALLS += inst_dev_qch_docs diff --git a/lib/qtcreator/qtcomponents/qtcomponents.pro b/lib/qtcreator/qtcomponents/qtcomponents.pro index 33268cf3cbd..5cf2d9adb9c 100644 --- a/lib/qtcreator/qtcomponents/qtcomponents.pro +++ b/lib/qtcreator/qtcomponents/qtcomponents.pro @@ -52,6 +52,6 @@ DATA_FILE_PATTERNS = \ !macx { qmlfiles.files = $$PWD/*.qml $$PWD/qmldir $$PWD/images $$PWD/custom - qmlfiles.path = $$QTC_PREFIX/$${IDE_LIBRARY_BASENAME}/qtcreator/qtcomponents + qmlfiles.path = /$${IDE_LIBRARY_BASENAME}/qtcreator/qtcomponents INSTALLS += qmlfiles } diff --git a/qtcreator.pri b/qtcreator.pri index 1fdd9e4e164..9c8dbd59214 100644 --- a/qtcreator.pri +++ b/qtcreator.pri @@ -3,11 +3,6 @@ QTCREATOR_PRI_INCLUDED = 1 QTCREATOR_VERSION = 2.5.81 -isEmpty(QTC_PREFIX) { - unix: QTC_PREFIX = /usr/local - else: QTC_PREFIX = QtCreator -} - defineReplace(cleanPath) { win32:1 ~= s|\\\\|/|g contains(1, ^/.*):pfx = / diff --git a/qtcreator.pro b/qtcreator.pro index c9801853864..c9b2be0268c 100644 --- a/qtcreator.pro +++ b/qtcreator.pro @@ -26,30 +26,19 @@ macx { dmg.depends = deployqt QMAKE_EXTRA_TARGETS += codesign dmg } else { - deployqt.commands = $$PWD/scripts/deployqt.py -i \"$(INSTALL_ROOT)$$QTC_PREFIX\" + deployqt.commands = $$PWD/scripts/deployqt.py -i $(INSTALL_ROOT) deployqt.depends = install win32 { bindist.commands ~= s,/,\\\\,g deployqt.commands ~= s,/,\\\\,g deployartifacts.depends = install PLATFORM="windows" - deployartifacts.commands = git clone "git://gitorious.org/qt-creator/binary-artifacts.git"&& xcopy /s /q /y /i "binary-artifacts\\win32" \"$(INSTALL_ROOT)$$QTC_PREFIX\"&& rmdir /s /q binary-artifacts + deployartifacts.commands = git clone "git://gitorious.org/qt-creator/binary-artifacts.git"&& xcopy /s /q /y /i "binary-artifacts\\win32" $(INSTALL_ROOT)&& rmdir /s /q binary-artifacts QMAKE_EXTRA_TARGETS += deployartifacts } - else:linux-*:PLATFORM = "linux-$${QT_ARCH}" - else:PLATFORM = "unknown" - PATTERN = $${PLATFORM}$(INSTALL_EDITION)-$${QTCREATOR_VERSION}$(INSTALL_POSTFIX) - bindist.commands = $$PWD/scripts/bindistHelper.py -i -p $${PATTERN} \"$(INSTALL_ROOT)$$QTC_PREFIX\" - bindist_inst.commands = $$PWD/scripts/bindistHelper.py -p $${PATTERN} \"$(INSTALL_ROOT)$$QTC_PREFIX\" - win32 { - bindist.commands ~= s,/,\\\\,g - bindist_inst.commands ~= s,/,\\\\,g - } - + else:linux-*:PLATFORM="linux-$${QT_ARCH}" + else:PLATFORM="unknown" + bindist.commands = $$PWD/scripts/bindistHelper.py "$(INSTALL_ROOT)" "$${PLATFORM}$(INSTALL_EDITION)-$${QTCREATOR_VERSION}$(INSTALL_POSTFIX)" } bindist.depends = deployqt -bindist_inst.depends = deployqt -installer.depends = bindist_inst -installer.commands = $$PWD/scripts/packageIfw.py --ifw $(IFW_DIR) -s $${QTCREATOR_VERSION} "qt-creator-$${PATTERN}-installer" -win32:installer.commands ~= s,/,\\\\,g -QMAKE_EXTRA_TARGETS += deployqt bindist bindist_inst installer +QMAKE_EXTRA_TARGETS += deployqt bindist diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppet.pro b/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppet.pro index 6b2b7097ae8..77351d8a9e6 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppet.pro +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppet.pro @@ -36,6 +36,6 @@ macx { info.output = $$DESTDIR/$${TARGET}.app/Contents/Info.plist QMAKE_SUBSTITUTES += info } else { - target.path = $$QTC_PREFIX/bin + target.path = /bin INSTALLS += target } diff --git a/share/qtcreator/qml/qmlpuppet/qmlpuppet/qmlpuppet.pri b/share/qtcreator/qml/qmlpuppet/qmlpuppet/qmlpuppet.pri index e2d6645077a..66aa92e47be 100644 --- a/share/qtcreator/qml/qmlpuppet/qmlpuppet/qmlpuppet.pri +++ b/share/qtcreator/qml/qmlpuppet/qmlpuppet/qmlpuppet.pri @@ -21,6 +21,6 @@ macx { info.output = $$DESTDIR/$${TARGET}.app/Contents/Info.plist QMAKE_SUBSTITUTES += info } else { - target.path = $$QTC_PREFIX/bin + target.path = /bin INSTALLS += target } diff --git a/share/qtcreator/static.pro b/share/qtcreator/static.pro index b707606bb12..7d8363dd5c9 100644 --- a/share/qtcreator/static.pro +++ b/share/qtcreator/static.pro @@ -63,7 +63,7 @@ OTHER_FILES += $$FILES !macx { for(data_dir, DATA_DIRS) { eval($${data_dir}.files = $$quote($$PWD/$$data_dir)) - eval($${data_dir}.path = $$QTC_PREFIX/share/qtcreator) + eval($${data_dir}.path = /share/qtcreator) INSTALLS += $$data_dir } } else { @@ -116,7 +116,7 @@ QMAKE_EXTRA_COMPILERS += unconditionalCopy2build !macx { for(data_dir, DATA_DIRS) { eval($${data_dir}.files = $$IDE_DATA_PATH/$$data_dir) - eval($${data_dir}.path = $$QTC_PREFIX/share/qtcreator) + eval($${data_dir}.path = /share/qtcreator) eval($${data_dir}.CONFIG += no_check_exist) INSTALLS += $$data_dir } diff --git a/share/qtcreator/translations/translations.pro b/share/qtcreator/translations/translations.pro index dfaf7c471bc..c791dadb9d1 100644 --- a/share/qtcreator/translations/translations.pro +++ b/share/qtcreator/translations/translations.pro @@ -120,6 +120,6 @@ isEmpty(vcproj) { } qmfiles.files = $$prependAll(LANGUAGES, $$OUT_PWD/qtcreator_,.qm) -qmfiles.path = $$QTC_PREFIX/share/qtcreator/translations +qmfiles.path = /share/qtcreator/translations qmfiles.CONFIG += no_check_exist INSTALLS += qmfiles diff --git a/src/app/app.pro b/src/app/app.pro index a2a666dd1d5..896b2cc884e 100644 --- a/src/app/app.pro +++ b/src/app/app.pro @@ -17,7 +17,7 @@ QT_BREAKPAD_ROOT_PATH = $$(QT_BREAKPAD_ROOT_PATH) } win32 { RC_FILE = qtcreator.rc - target.path = $$QTC_PREFIX/bin + target.path = /bin INSTALLS += target } else:macx { LIBS += -framework CoreFoundation @@ -29,7 +29,7 @@ win32 { info.output = $$IDE_BIN_PATH/../Info.plist QMAKE_SUBSTITUTES = info } else { - target.path = $$QTC_PREFIX/bin + target.path = /bin INSTALLS += target } diff --git a/src/libs/qtcomponents/styleitem/styleitem.pro b/src/libs/qtcomponents/styleitem/styleitem.pro index d94e7dfa456..59f892d6490 100644 --- a/src/libs/qtcomponents/styleitem/styleitem.pro +++ b/src/libs/qtcomponents/styleitem/styleitem.pro @@ -33,6 +33,6 @@ SOURCES += qtmenu.cpp \ qwheelarea.cpp !macx { - target.path = $$QTC_PREFIX/$${IDE_LIBRARY_BASENAME}/qtcreator/qtcomponents/plugin + target.path = /$${IDE_LIBRARY_BASENAME}/qtcreator/qtcomponents/plugin INSTALLS += target } diff --git a/src/libs/qtcreatorcdbext/qtcreatorcdbext.pro b/src/libs/qtcreatorcdbext/qtcreatorcdbext.pro index 20bdfb23fc2..fa02ca40954 100644 --- a/src/libs/qtcreatorcdbext/qtcreatorcdbext.pro +++ b/src/libs/qtcreatorcdbext/qtcreatorcdbext.pro @@ -82,6 +82,6 @@ HEADERS += extensioncontext.h \ knowntype.h \ symbolgroupnode.h -target.path = $$QTC_PREFIX/lib/$${DIRNAME} +target.path = /lib/$${DIRNAME} INSTALLS += target diff --git a/src/libs/utils/process_ctrlc_stub.pro b/src/libs/utils/process_ctrlc_stub.pro index 4fef59a4018..4b99fe33ed1 100644 --- a/src/libs/utils/process_ctrlc_stub.pro +++ b/src/libs/utils/process_ctrlc_stub.pro @@ -17,5 +17,5 @@ build_all:!build_pass { CONFIG += release } -target.path = $$QTC_PREFIX/bin # FIXME: libexec, more or less +target.path = /bin # FIXME: libexec, more or less INSTALLS += target diff --git a/src/libs/utils/process_stub.pro b/src/libs/utils/process_stub.pro index a3eea0f1318..7e498a77818 100644 --- a/src/libs/utils/process_stub.pro +++ b/src/libs/utils/process_stub.pro @@ -20,5 +20,5 @@ unix { LIBS += -lshell32 } -target.path = $$QTC_PREFIX/bin # FIXME: libexec, more or less +target.path = /bin # FIXME: libexec, more or less INSTALLS += target diff --git a/src/plugins/coreplugin/coreplugin.pro b/src/plugins/coreplugin/coreplugin.pro index 1d4dfe998ce..14a7450b3c9 100644 --- a/src/plugins/coreplugin/coreplugin.pro +++ b/src/plugins/coreplugin/coreplugin.pro @@ -237,7 +237,7 @@ else:unix { for(imagesize, IMAGE_SIZE_LIST) { eval(image$${imagesize}.files = images/logo/$${imagesize}/qtcreator.png) - eval(image$${imagesize}.path = $$QTC_PREFIX/share/icons/hicolor/$${imagesize}x$${imagesize}/apps) + eval(image$${imagesize}.path = /share/icons/hicolor/$${imagesize}x$${imagesize}/apps) INSTALLS += image$${imagesize} } } diff --git a/src/plugins/qmldesigner/plugindestdir.pri b/src/plugins/qmldesigner/plugindestdir.pri index 2de740f852f..d4987e24093 100644 --- a/src/plugins/qmldesigner/plugindestdir.pri +++ b/src/plugins/qmldesigner/plugindestdir.pri @@ -2,6 +2,6 @@ macx { DESTDIR = $$IDE_LIBRARY_PATH/QmlDesigner } else { DESTDIR = $$IDE_LIBRARY_PATH/qmldesigner - target.path = $$QTC_PREFIX/$$IDE_LIBRARY_BASENAME/qtcreator/qmldesigner + target.path = /$$IDE_LIBRARY_BASENAME/qtcreator/qmldesigner INSTALLS += target } diff --git a/src/qtcreatorlibrary.pri b/src/qtcreatorlibrary.pri index 0dc1a179b23..e46e3a2d28d 100644 --- a/src/qtcreatorlibrary.pri +++ b/src/qtcreatorlibrary.pri @@ -19,9 +19,9 @@ contains(QT_CONFIG, reduce_exports):CONFIG += hide_symbols !macx { win32 { - target.path = $$QTC_PREFIX/bin + target.path = /bin } else { - target.path = $$QTC_PREFIX/$$IDE_LIBRARY_BASENAME/qtcreator + target.path = /$$IDE_LIBRARY_BASENAME/qtcreator } INSTALLS += target } diff --git a/src/qtcreatorplugin.pri b/src/qtcreatorplugin.pri index 292b10ad743..ea0360753be 100644 --- a/src/qtcreatorplugin.pri +++ b/src/qtcreatorplugin.pri @@ -99,9 +99,9 @@ CONFIG += plugin plugin_with_soname linux*:QMAKE_LFLAGS += $$QMAKE_LFLAGS_NOUNDEF !macx { - target.path = $$QTC_PREFIX/$$IDE_LIBRARY_BASENAME/qtcreator/plugins/$$PROVIDER + target.path = /$$IDE_LIBRARY_BASENAME/qtcreator/plugins/$$PROVIDER pluginspec.files += $${TARGET}.pluginspec - pluginspec.path = $$QTC_PREFIX/$$IDE_LIBRARY_BASENAME/qtcreator/plugins/$$PROVIDER + pluginspec.path = /$$IDE_LIBRARY_BASENAME/qtcreator/plugins/$$PROVIDER INSTALLS += target pluginspec } diff --git a/src/tools/qtcdebugger/qtcdebugger.pro b/src/tools/qtcdebugger/qtcdebugger.pro index 9c3220aba0b..ece3eb772ff 100644 --- a/src/tools/qtcdebugger/qtcdebugger.pro +++ b/src/tools/qtcdebugger/qtcdebugger.pro @@ -6,7 +6,7 @@ SOURCES += main.cpp DESTDIR=../../../bin -target.path=$$QTC_PREFIX/bin +target.path=/bin INSTALLS+=target include(../../../qtcreator.pri) diff --git a/src/tools/qtpromaker/qtpromaker.pro b/src/tools/qtpromaker/qtpromaker.pro index b61d1cee33b..8dacfd5eede 100644 --- a/src/tools/qtpromaker/qtpromaker.pro +++ b/src/tools/qtpromaker/qtpromaker.pro @@ -11,5 +11,5 @@ CONFIG -= app_bundle SOURCES += main.cpp -target.path = $$QTC_PREFIX/bin # FIXME: libexec, more or less +target.path = /bin # FIXME: libexec, more or less INSTALLS += target diff --git a/src/tools/win64interrupt/win64interrupt.pro b/src/tools/win64interrupt/win64interrupt.pro index 282514c54cd..b8b26bcfd4f 100644 --- a/src/tools/win64interrupt/win64interrupt.pro +++ b/src/tools/win64interrupt/win64interrupt.pro @@ -26,5 +26,5 @@ build_all:!build_pass { CONFIG += release } -target.path = $$QTC_PREFIX/bin # FIXME: libexec, more or less +target.path = /bin # FIXME: libexec, more or less INSTALLS += target From 8ea4ed6b53a80a3c1a01d24b19263f1991cb4f49 Mon Sep 17 00:00:00 2001 From: Leandro Melo Date: Thu, 6 Sep 2012 17:36:40 +0200 Subject: [PATCH 33/73] C++: Fix add definition test To be consistent with the change 5b847a66dfc762e3a8049860ca036be195faba89 in the InsertionPointLocator. Nevertheless, there are still issues to be addressed in this class so we probably need more test cases when those are handled. Task-number: QTCREATORBUG-7833 Change-Id: Ie9abdd70566063a94350723432215d030c154fab Reviewed-by: Christian Kandeler --- src/plugins/cpptools/cppcodegen_test.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/cpptools/cppcodegen_test.cpp b/src/plugins/cpptools/cppcodegen_test.cpp index a994e0b7b11..67a9e4fe504 100644 --- a/src/plugins/cpptools/cppcodegen_test.cpp +++ b/src/plugins/cpptools/cppcodegen_test.cpp @@ -416,8 +416,8 @@ void CppToolsPlugin::test_codegen_definition_empty_class() QCOMPARE(loc.fileName(), dst->fileName()); QCOMPARE(loc.prefix(), QLatin1String("\n\n")); QCOMPARE(loc.suffix(), QString()); - QCOMPARE(loc.line(), 1U); - QCOMPARE(loc.column(), 7U); + QCOMPARE(loc.line(), 3U); + QCOMPARE(loc.column(), 1U); } void CppToolsPlugin::test_codegen_definition_first_member() From 5efc4cf00b42c72244b7e93d863291c53058d7c2 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 6 Sep 2012 12:54:16 +0200 Subject: [PATCH 34/73] Template project wizards: Add date and time. Task-number: QTCREATORBUG-7827 Initial-patch-by: Christian A. Reiter Change-Id: I241887acf0ff8006de74e0d67f3291b5638a54c8 Reviewed-by: Leena Miettinen Reviewed-by: Eike Ziller --- doc/src/projects/creator-projects-custom-wizards.qdoc | 6 ++++++ .../projectexplorer/customwizard/customwizardpage.cpp | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/doc/src/projects/creator-projects-custom-wizards.qdoc b/doc/src/projects/creator-projects-custom-wizards.qdoc index 8c4e3bc5ab7..90aa8ba8ce3 100644 --- a/doc/src/projects/creator-projects-custom-wizards.qdoc +++ b/doc/src/projects/creator-projects-custom-wizards.qdoc @@ -440,6 +440,12 @@ \o \c {%CppHeaderSuffix%} is replaced by the default header suffix, which is also defined in \gui {File Naming}. + \o \c {%CurrentDate%} is replaced by the current date in the format + \c {yyyy-MM-dd}. + + \o \c {%CurrentTime%} is replaced by the current time in the short + format of the locale. + \endlist \section1 Validating User Input diff --git a/src/plugins/projectexplorer/customwizard/customwizardpage.cpp b/src/plugins/projectexplorer/customwizard/customwizardpage.cpp index a67321ff6f8..ad5911a2579 100644 --- a/src/plugins/projectexplorer/customwizard/customwizardpage.cpp +++ b/src/plugins/projectexplorer/customwizard/customwizardpage.cpp @@ -37,6 +37,8 @@ #include #include #include +#include +#include #include #include @@ -462,6 +464,13 @@ QMap CustomWizardFieldPage::replacementMap(const QWizard *w, // Insert paths for generator scripts. fieldReplacementMap.insert(QLatin1String("Path"), QDir::toNativeSeparators(ctx->path)); fieldReplacementMap.insert(QLatin1String("TargetPath"), QDir::toNativeSeparators(ctx->targetPath)); + + // Insert additional pre-defined variables + fieldReplacementMap.insert(QLatin1String("CurrentDate"), + QDate::currentDate().toString(QLatin1String("yyyy-MM-dd"))); + fieldReplacementMap.insert(QLatin1String("CurrentTime"), + QTime::currentTime().toString(QLocale::system(). + timeFormat(QLocale::ShortFormat))); return fieldReplacementMap; } From db8a20bc574eaec56b904af425578555ab840e2f Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 6 Sep 2012 20:54:31 +0200 Subject: [PATCH 35/73] Select current kit when managing kits from projects mode Change-Id: I65a540ef93d4d3a99829171e7b21138acb2d681e Reviewed-by: Tobias Hunger --- src/plugins/projectexplorer/kitoptionspage.cpp | 7 +++++-- src/plugins/projectexplorer/targetsettingspanel.cpp | 8 ++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/plugins/projectexplorer/kitoptionspage.cpp b/src/plugins/projectexplorer/kitoptionspage.cpp index ab19469bf26..5ea198ef33d 100644 --- a/src/plugins/projectexplorer/kitoptionspage.cpp +++ b/src/plugins/projectexplorer/kitoptionspage.cpp @@ -123,11 +123,14 @@ QWidget *KitOptionsPage::createPage(QWidget *parent) updateState(); - if (m_toShow) - m_selectionModel->select(m_model->indexOf(m_toShow), + if (m_toShow) { + QModelIndex index = m_model->indexOf(m_toShow); + m_selectionModel->select(index, QItemSelectionModel::Clear | QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows); + m_kitsView->scrollTo(index); + } m_toShow = 0; return m_configWidget; diff --git a/src/plugins/projectexplorer/targetsettingspanel.cpp b/src/plugins/projectexplorer/targetsettingspanel.cpp index 4f1be3653f3..f315fbe37ff 100644 --- a/src/plugins/projectexplorer/targetsettingspanel.cpp +++ b/src/plugins/projectexplorer/targetsettingspanel.cpp @@ -31,6 +31,7 @@ #include "targetsettingspanel.h" #include "buildsettingspropertiespage.h" +#include "kitoptionspage.h" #include "project.h" #include "projectwindow.h" #include "runsettingspropertiespage.h" @@ -348,6 +349,13 @@ void TargetSettingsPanelWidget::renameTarget() void TargetSettingsPanelWidget::openTargetPreferences() { + int targetIndex = m_selector->currentIndex(); + if (targetIndex >= 0 && targetIndex < m_targets.size()) { + ProjectExplorer::KitOptionsPage *page = + ExtensionSystem::PluginManager::instance()->getObject(); + if (page) + page->showKit(m_targets.at(targetIndex)->kit()); + } Core::ICore::showOptionsDialog(QLatin1String(Constants::PROJECTEXPLORER_SETTINGS_CATEGORY), QLatin1String(Constants::KITS_SETTINGS_PAGE_ID)); } From 498f4450fefaedf698177242859d20c78aea07d5 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 4 Sep 2012 16:00:32 +0200 Subject: [PATCH 36/73] Editor: update autocompleter list width. The width of the List view showing the autocompleter proposals is now adjusted when scrolling. Task-number: QTCREATORBUG-7185 Change-Id: I5b26ef6195d389b30fdf0964bebd9c2f33056c66 Reviewed-by: Leandro Melo --- .../codeassist/genericproposalwidget.cpp | 17 ++++++++++++----- .../codeassist/genericproposalwidget.h | 4 +++- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/plugins/texteditor/codeassist/genericproposalwidget.cpp b/src/plugins/texteditor/codeassist/genericproposalwidget.cpp index 439efaf5a03..7d5b63b35ed 100644 --- a/src/plugins/texteditor/codeassist/genericproposalwidget.cpp +++ b/src/plugins/texteditor/codeassist/genericproposalwidget.cpp @@ -179,7 +179,7 @@ private: class GenericProposalListView : public QListView { public: - GenericProposalListView(QWidget *parent) : QListView(parent) {} + GenericProposalListView(QWidget *parent); QSize calculateSize() const; QPoint infoFramePos() const; @@ -192,19 +192,24 @@ public: void selectLastRow() { selectRow(model()->rowCount() - 1); } }; +GenericProposalListView::GenericProposalListView(QWidget *parent) + : QListView(parent) +{ + setVerticalScrollMode(QAbstractItemView::ScrollPerItem); +} + QSize GenericProposalListView::calculateSize() const { static const int maxVisibleItems = 10; // Determine size by calculating the space of the visible items - int visibleItems = model()->rowCount(); - if (visibleItems > maxVisibleItems) - visibleItems = maxVisibleItems; + const int visibleItems = qMin(model()->rowCount(), maxVisibleItems); + const int firstVisibleRow = verticalScrollBar()->value(); const QStyleOptionViewItem &option = viewOptions(); QSize shint; for (int i = 0; i < visibleItems; ++i) { - QSize tmp = itemDelegate()->sizeHint(option, model()->index(i, 0)); + QSize tmp = itemDelegate()->sizeHint(option, model()->index(i + firstVisibleRow, 0)); if (shint.width() < tmp.width()) shint = tmp; } @@ -321,6 +326,8 @@ GenericProposalWidget::GenericProposalWidget() d->m_completionListView->setSelectionMode(QAbstractItemView::SingleSelection); d->m_completionListView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); d->m_completionListView->setMinimumSize(1, 1); + connect(d->m_completionListView->verticalScrollBar(), SIGNAL(valueChanged(int)), + this, SLOT(updatePositionAndSize())); QVBoxLayout *layout = new QVBoxLayout(this); layout->setMargin(0); diff --git a/src/plugins/texteditor/codeassist/genericproposalwidget.h b/src/plugins/texteditor/codeassist/genericproposalwidget.h index 6fdcfb6079a..745f7d51bce 100644 --- a/src/plugins/texteditor/codeassist/genericproposalwidget.h +++ b/src/plugins/texteditor/codeassist/genericproposalwidget.h @@ -60,10 +60,12 @@ public: private: bool updateAndCheck(const QString &prefix); - void updatePositionAndSize(); void notifyActivation(int index); void abort(); +private slots: + void updatePositionAndSize(); + protected: virtual bool eventFilter(QObject *o, QEvent *e); From 0d092b051afc2d0cf6eb6976296057658f15ae7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20N=C3=A4tterlund?= Date: Thu, 6 Sep 2012 13:10:54 +0200 Subject: [PATCH 37/73] QNX: Fixed port for gdb server, fixes broken debugging on BlackBerry As fillParameters(..) (debuggerplugin.cpp) now overrides the start parameters for channel, pass the port to use when remote setup is completed instead. Change-Id: Iad4c3e4d092105cde32b52814218b77990549f61 Reviewed-by: hjk --- src/plugins/qnx/blackberrydebugsupport.cpp | 2 +- src/plugins/qnx/blackberryruncontrolfactory.cpp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/plugins/qnx/blackberrydebugsupport.cpp b/src/plugins/qnx/blackberrydebugsupport.cpp index 4cc843a39b1..847329d5c66 100644 --- a/src/plugins/qnx/blackberrydebugsupport.cpp +++ b/src/plugins/qnx/blackberrydebugsupport.cpp @@ -83,7 +83,7 @@ void BlackBerryDebugSupport::launchRemoteApplication() void BlackBerryDebugSupport::handleStarted() { m_engine->startParameters().attachPID = m_runner->pid(); - m_engine->notifyEngineRemoteSetupDone(-1, -1); + m_engine->notifyEngineRemoteSetupDone(8000, -1); } void BlackBerryDebugSupport::handleStartFailed(const QString &message) diff --git a/src/plugins/qnx/blackberryruncontrolfactory.cpp b/src/plugins/qnx/blackberryruncontrolfactory.cpp index 592972a6cca..e689f03711d 100644 --- a/src/plugins/qnx/blackberryruncontrolfactory.cpp +++ b/src/plugins/qnx/blackberryruncontrolfactory.cpp @@ -144,7 +144,6 @@ Debugger::DebuggerStartParameters BlackBerryRunControlFactory::startParameters( params.toolChainAbi = tc->targetAbi(); params.executable = runConfig->localExecutableFilePath(); - params.remoteChannel = runConfig->deployConfiguration()->deviceHost() + QLatin1String(":8000"); params.displayName = runConfig->displayName(); params.remoteSetupNeeded = true; From 5f03803cf82c22cb1bf2be39193ffe00df600eb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20N=C3=A4tterlund?= Date: Wed, 5 Sep 2012 13:13:58 +0200 Subject: [PATCH 38/73] QNX: Fixed launching application when debugging on Windows Change-Id: Ib87c028d071f7cf35ca462fb5bd71db9a6dfe1b8 Reviewed-by: hjk --- src/plugins/debugger/gdb/remotegdbserveradapter.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp index f895ca4dc05..04a15d1d6d3 100644 --- a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp +++ b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp @@ -347,8 +347,9 @@ void GdbRemoteServerEngine::runEngine() const QString remoteExecutable = startParameters().remoteExecutable; if (!remoteExecutable.isEmpty()) { - // Cannot use -exec-run for QNX gdb as it does not support path parameter for the MI call - const QByteArray command = m_isQnxGdb ? "run" : "-exec-run"; + // Cannot use -exec-run for QNX gdb 7.4 as it does not support path parameter for the MI call + const bool useRun = m_isQnxGdb && m_gdbVersion > 70300; + const QByteArray command = useRun ? "run" : "-exec-run"; postCommand(command + " " + remoteExecutable.toLocal8Bit(), GdbEngine::RunRequest, CB(handleExecRun)); } else { notifyEngineRunAndInferiorStopOk(); From fdd4a81542d724d503c73daffa12db3d9fc5977b Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 7 Sep 2012 12:52:54 +0200 Subject: [PATCH 39/73] Doc: update info about Linux-based devices Add info about the kits. Fix changed field names. Change-Id: Ic8d10e17d3cef4082c0a151d15bfe8da14e7ad66 Reviewed-by: Christian Kandeler --- doc/images/qtcreator-dev-conf-maemo.png | Bin 7075 -> 6448 bytes .../qtcreator-linux-device-configurations.png | Bin 14476 -> 14210 bytes .../qtcreator-maemo-device-configurations.png | Bin 14653 -> 14804 bytes .../qtcreator-maemo-emulator-connection.png | Bin 7210 -> 0 bytes .../qtcreator-meego-device-configurations.png | Bin 14588 -> 14804 bytes .../qtcreator-meego-emulator-connection.png | Bin 7307 -> 0 bytes doc/images/qtcreator-screenshot-devconf.png | Bin 7377 -> 6462 bytes doc/src/linux-mobile/linuxdev-keys.qdocinc | 3 +- .../linux-mobile/linuxdev-processes.qdocinc | 7 +- doc/src/linux-mobile/linuxdev.qdoc | 13 ++- doc/src/linux-mobile/maemodev.qdoc | 93 ++++++++++-------- doc/src/linux-mobile/meegodev.qdoc | 86 +++++++++------- 12 files changed, 111 insertions(+), 91 deletions(-) delete mode 100644 doc/images/qtcreator-maemo-emulator-connection.png delete mode 100644 doc/images/qtcreator-meego-emulator-connection.png diff --git a/doc/images/qtcreator-dev-conf-maemo.png b/doc/images/qtcreator-dev-conf-maemo.png index 27330898ec0704388c12bb37e3daa90c80e0ba3e..ded44fecb44f34accccfd93db5a262d8e5b40656 100644 GIT binary patch literal 6448 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

jvzG%!{usOox^#PM->Pz{^2TZI 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 KelF{r5}E)5qrVIQ diff --git a/doc/images/qtcreator-maemo-device-configurations.png b/doc/images/qtcreator-maemo-device-configurations.png index 734f6fae4bace0e39db0b80ca3a5a117b5b5d07e..f3c9372bb81edb05e4676def3bc309f4661162e4 100644 GIT binary patch literal 14804 zcmeAS@N?(olHy`uVBq!ia0y~yU`k|QU{vK`W?*2L&2@Ah0|PTdfKP}k0|SHKnYYis z+^z4cZGZS&-;S}RzG-v&CvBd;@%X7r7u(|t zPCj|}?9Q>NYgg6g&0ROS>+Q!cc|CIvZ=5aWU;N_Cf+X*vFW-Ken;92nWUpVh?$F_r z_n*I>lG~b=(Dvoin~1)HxdSg^h{$?xOGkM(QL zcGQ*MxpnpJ^LGUcj$hx@c=O<#i?^fNWvxZd8mGYZSf zD(ZU9oV|Ge;iJ-qjole>2?-^87dB_+cQ5S8-Lvm-|Duz+s>V<5T-&gFdEM1_^P5WJ zChlBx;KsEx$BPo<|9-k~<>IMZw{ET5baYZ(bBw1|-Mk%%0TEB0-C2;I@bcO+WuJzb zNo5E2E;)1R@b23mHZ9(A`qraQZ(kprQ~rE^S7ycfd6TBTef!o?LEX+KJhGtI%Eso> z<;#=y+;Dey+j;SJa{9c6zW)6OuRnY9amS@+j~_p&pLy)`=`)+wbZnSbv1G~8`P$>_| z1r7c4YK!`36%?i?PhQ(pV&m6*>E6>LtNSN6_aEH2V*Zh*;>pXuF)%Q27I;J!GcfQS z0b$0e+I-Rs3}#iHE{-7;x8Ba>wh8(9|Ns8|zn*TsuY0mi_v&>q?}hVYxMNQ|`K=$M zHNB1NGEZVa?bAykw`#7h65Tx0@QGBmy zM{>Jvi>avH`s0~3=bjgzn|ZkM+s`?lE#IGxU-wqF|5{*yhsWcK@!y(0p6Gq9=5_HR z>&%ZWmKI$BC33qIjOQ6h2hQs;Q{oYHb8J!c?b&cz*QD(zgQuOhyZW1KExzT>vNk<@ zQ@v!@*|@|9uRL|A$tb4ejbNg2?}q;kr`2_?mG5%BmeqW#ng75+C-zkR?b97L7Ca9) zv|>hz%5(G69(K8lzj>-na9nMFH@q)-g}v{hee1qVPE$2(`et2L@UVF8y&El3y&SXe zwJ<(j>b2z9f>r67wpDktPkH_>laO3`Du4H`U%rPPovP90jn_G$7jY}?=8T(jc0@TX zyS!wTp{P;&ROab56JrmUcIxYgR+T+z3;o5bz3OdV>z9r%MT_PvO1!n{iOIXg?u9P9 zUx>20Sl(s|l2FQN6WF$@b(vlL*`1dQP1YWJTVkXxB3ZJsS0>c%pNF>Y9yuJFajEnkjR1M^9Je?%sdqXJ&uHhU9q+YyRsM z{1Z5oq&eeXVf*H?e+#=K*{^tWy<5H7e(u?m_l@cccbvQ>HdI!LjII4=%fD_bdwE`4v9b1Ip?st1Z??>pR$cvweD;)5-03pCifQ{dHR$}dO1xHXvCMn5Uf86sn%lZbDvu8$ZFY$3wLq3Uq75^f7R)~mFKM$26=~Gw7%fIZ4zc9y8DD@{qN`h z{ks1B+}^9Cc&6@3*j&Rui5YQ;(txhz zsjj?74o{9WxO8%feD<+@hh7>~8R}kONSt_T@}epKW!pAPU83{6g>k_arTYp!T9)^N zkCk57pV9H>pP!0mz**}{9ZQxxtZ)6YZi97gOYS`{lOy~xs^}9(%lcj46Ao6?~RraD@;?|G<|o?vn|Ib6u$l8 z=Dnk^Zn|P_@+0#teB}}EJ(oUXi`0}l`Sj4HNq5TkZ}`66GE+<`H0%*~Cg+u{r*Z@9 z6CZ^%#czIkpgZZ-%}VP@DP?oi=loxGcXHOBvy8Ff#!a4Cty@B?c0OEoXOC)Vs_Ktz zJJZsi-!&6iZS!w;k}K!&Rq2*CLBH0AKMenwT2;Mk#@t*!u`QoYdo9T|-lzN1_5;IW zWz7p~Y#omMIX=@jjL|oCZkWLogWrNG!Ggk^^(ycBxA@1eP53XyYwhK9=)k*U>3bzV z|I03X_Cb4IIn#@uQ^Mtx_wDI7nE57sy50*xv68H3Z=<*9R9CCoeQ5pPeftS}q~RK| zufJGlmv-}CICswMcWlkYO*`JYZ7}`#n02o8C$a5+>YgP}KJ(1FVEv9ctQR{S`{Ff1 zlb#+~?cVcDAaAwBviPX!d-qyeMHMZs=x)_oIA@RZ;kUHV+FQMx>3e($Y4ELO`(4(^Sau5+VCwJNRqcTUE6x>w@}TETcIy+Ge_qi?&U60>EUFWE)X$a%W-D6`9`s6 zpN-eu|8m~&(X0)A2Oc}tFaCc_LRh7z_|v71ncrhR=%}Y3Ud|emz1YiXpK;DsGp$~4 z)6U(u6?N)AMJAn-eZJ@0so&xq=AC7Qzl)1IimuK79kgKi z>S&=5XH#z?uj2ote}}yy&Ku5LtzF_cb7NPkfx-Fi7me1nZy!F@csX1A)TezPbnk6d ze!sHiTl5t(ro?P>vEv6OC4CfKwt(OJOiOt(^I{bhpL@Oa8;wl2IW2w4X>v?lXj_!_ zY4eYq^%vdwy$uib6szR4t}Q;ix~Rt@UQ$Rg(emg1Y18I6e=Xrs@wxZ^$k%BBR)6K6 zi7)9bj#+8^E#}_4pq+Pd5BmhIya%V2 zYz^1v;(UGO)LG3BrfZ|`Jo5aWrPJC{YVmOOt0z@9z1!uZeg?`XUJ&g%r*(ki^hu4i ztAqu@SpCZk*DMb{!ylZsW7aGUXU@qLmV5eA?r2Z9lh>Q*TlOtwZC>3^vAJ@68=m)k z3wZGO$Pb-_zkMsdF86yr?ci?%x82VVX#DKY(VLrh`|1AHvc}mroK~k7uMYaW`_twO z#ZR4SCig{MbRV*PD%lZre&5EV`m3L=J>DYlt*G)}(N71r6TEBU=G{wntDeiA&d0*%_1zrK&YY?!oPS$AT6`Q6UG{8C%H z)zwz(1Ec;G@AxrK&QVBMvFH1=?x+{vp0B?)(eK_9fv^>(Y70!W1!9~I-KcGG<@N8` z7j`34I8GwJIVR}MrXb7O?P(8L0QB-;)fcmcYl4O(!l}eZ%IU zYu%^q^=-agI{(uDv@mM@>bI*E)iqel5Lo~B_J5x~wGYpvGu1S*9xppNak-Ha4`*bc zGN_sqNc0G9-LPo>g?R2vA&$q=Mz`wa^G@5|eX-v3t!d@vS33kbcc(CB<#zRW1YWc5 zS?9{deO)H;#itUN8(YNZp4FZs^6^pSVS#0BlHcxd9q(GbZvBDdrB|j*=i>IXc)`<Sy67*OT^tZizNlyRE!S2J8`n2VE^lj9;P<~ z|LM$Lvi^pLpV8jL)LO5NhL7cxcrs;Lcwc{97IDt@(u?S?2K(l0c@b0OG0lthpI>dh zW5k?O(_iNatF+y1@8WQlnzrGgn*UmDz7?-$vB)i$Dlm8U>79BJZmV3c_j*Y${LlBc z{nRzv7bli%SFr+e~y45C6J4 zrTC>@^z_gb(mOSKGtZ-<8 zi{9i?e-0b(bg|V(7R!dyP)@tdENn&(xjz*IF3XVZgKTkY|u^s7cGiWq;;Z zv+^Kzue#H{9tSH3zPF3OoaS&Qw) z^qQr*Ii-s|RM)(J^78c?lc%m`cVfSt627+lz>K4Y2X0t0Xv_Don8n*L#0BwLweB%< zxnZJkrq=j*=#;F*3-cDIFW8dRF*)L1B=_l#jo%WlPCXs1eR%(geV)^P{987$WX|S9 zkE5dd*gE%cySea7CqV>RtCMe{O8yjcq+HyY{_W7TD8Z zu%KmXZEVfVgU=7=O6ThZ@5&Tu;Shei{{4@HNzV@Z6f724rtFy!TbZx-FfFA2x9%pv z?V3udZx*L)y>qK<<%h_lX{x{f`33(^+!&iT!Q$bz-RJV(S&)Gg`NSLny4|&4dMi z{>qepe3!ud;Ijea-S*BO*Zb$%SpQun$a(o1`|H`as=iFi%yiXyCGKjl`Rg>dzT_!K z7+%Fa^j)K^Tc-Ali-Y_8_j3x`a|+FPy!=bwDDxz&&FR_j;hN2&%?$=mCyTGU*ZlR} zgbiz5l*+Gpu31x6c>QTXH1DHb7U_#jlzg_d_{J?#(G5J?el_XxFEcCmr1)FLdy~GV zzPX;wEL~vmO*P@zF}F|iSDxfBW4Q4uQ!-Wd#;V7nzk`mktzOexyD~e0G(DJh68T;wk_kKJIS#r*P&$nmy1N3%%?E7V~B(r4s`op&-$e-7~A}%oP+`ZG& zelMD^{Hptm5QFswPS2)@zMgo6%|+r83&-lKi%!{`y1&5psA%qlqYoph%Ltn4@xwe^;3F{&dv!N{z;p$gy{|pmLP~Gm=J&3! zk<<6dOw}B z&s9ilO<#P?d!NL*qxlziF5Prs&*7hUwyt>i{cB^JXvc={J`!6qCw|Mbls(YDOreeGIO(;i$ek-X$oykC>^qe-4+cH_Elzm<6&sA)Uh zeQswMl=yF4{Zopxv8ai!SYuDcO2oIZ^4thL*<3 zr`P>tWt^XT&Sh^lSF(LX%fa*d5qJOb=U;n!yUH(LGde-$m>GjtMBOj%-DjMC_a0_h z%k+4IsHA!8GHZ#%oQQhn*tatsX1uz2KfiVPoR#Oh8lMS0mQdv_$&b*_pkh9(8LuthNwsqf1)X%V6eS33q z%HGoX6Pat~NPOi=mRBuzdOT;*Qk}zFu5`2+wXF+@INZBv>E=4`#|-<8+*Z6YuD-01 z!`!g;(b7daPg|tDb&qP9Utj66a+)FE;?=fyIS+sNtX7bHX|LWfKdno@6?>$tI~VnP zMNFK@#1~JN z@A!S<_zPdDJbo3I8yqdQn_PZ;=Fgn|d)e`-JMrrqSJhn#pHQ{xK+Vzyz3Wp{drr;M zd3m(Y=f>LAqKvL=3tnWbo7vSFv}{5BBXg;^nWgO-=C3DzQ~%>ONhd&Qn%BASp*d%I zn69#B`d>2VXj<-4A)mHy(gX1~?%_FELd$NNM1D)05||Vie%tfdfqyT<0uG6`+xVC2x&4% zs~(M(=#lw0`Cy>Yp#=v!?(C9Z(YDyTjYGQAAlrFTpnJB3MX~B%!w(ffUj+885v$j! zRy)G+c*U*QKZZP;MA#pv+~b=6ReRdv%9Wd5AJE8TI8&byJ9ooRu3ag?Q#O=OP%c-m zv45Kw?zozpDck+fHW57^gVZtN)OGto^kN6+qm zxb^MbXCty=#A`%V&Yb34G_5{-Lf%c*d?w?kW}DwtecGPfGPT%8<62(fcW-g4v+Ccb zJ_mV3rN^)Q;OXykBElzzxf=-yOsjq5;(oU4vDOAR*Lia7)0aCR>hoAOm*bvY$h>x8Z&kLH z=|lfDQ|pfS&Z~3zJW(vx>+?mYH}UJ!&W6vL73IERQ-ZdO#3hcFg)%!ml+=2RJo6O5 z?Z?N7mqjNpQVSIR#t_-%>w1VGf76=sNA4#lMu&KYbjm!Fnc*IY}mGQ)?-mp^PMI5A=2>m9Anen&^%dOuzK?JwrU=iBQ}->4{l`1xiuuVlM4k7UcA zcc$~BKWx6tb2i`zgNwuxm1Xlc98*8@-2Z^*jQAoxMaQpRR%sz`H`yNGjtV!n-80`S zFU+7e5aCrFyJM1`?9$0 z|Cl*gubS12)CcQq5guCQ&*Y9qr#9ElsvoZUUGE7;p271G3>HYs&O zoKSJW6qdbJ*O?wnbB&79yf&-gL{Ee1hjy`mo~G0^mR*zN%@Rw>9;#^0Q-Ac+V2P&Z z47J)zNr8(kYnLQ)RIATZ02jrRPH;%O8r}Hqw)&rG?i0=?lanoLHG=IA+_#`-o9klB+XL!M|3y8zEH(L}nd|vU z9>NMdv)U{#8v1ik;W4b8u?T^K)!b z>faY6yg(X`;ynf;rz>h^YqmpvVT8LP;;1J+3WVYjbfi&RXOp%mx*>B z@1MT3W;>_f%W!R0ltu-^B@2%3mO~ub3Yus3?tBpwR{PIz?`#8gkA%DLA6&auEE--{ z89Fm7$mh~!?WsBQ=N`_wqU|gArp4sy)&EbfAGth7MwCx@`=a-IRh}LEw)c6|y{reD zbH6c0om6}ApzO%k$43ej_PvOf%Kax})3Y%Dxwy)`yRZ8GHT#KcatjuBFZc0#A*-7Xd7`tvkz`%9eSv9G<7AN`T<%@@N% zGfw`$v-w3+TYmFoW6678k5^_tSbat>qve@Z_5*PdYvJ>p9Lbik6=I$1&Tdh9Gq<8C z;Hm>NQ}dfY zXL*Glt6jVHPkK%7k9h~u4`&;TnO_K( zBL{apSJq|a6nV#p7+C%L(eJfy#T%Ztdg=hx?99-8%V{*R7q} z)527@7r)ebA21`kO_zP`VpU0Tk99p|exjYa*MpC3So}HoY2>}rb0qwq_Dw0?vrpgl z6IXP=F}5WSIiefut;6-N&dNTUGfS4gFU&|ewC3S%H*ddsW1eb0hs4_xf;EjKuFw3x z$k8uIHfzm|o9EZ~hf9CZynbPW#F3wYT)VEkpK8z*_eaHZeSym%rEP6SvGEMDS|!Z? zX1)3@udTJAas9#-H>A??S4iotZdUyvkmInF&zI9^PTj8K>e~;^Ow`fk;Im%kqf(|I zyQ)@D<&BZ!y&o=99-R1aBmQ>7*AE?5AyaIg*b1_(m^{@o`+&_G-$P|m4?k}%lIgx| z#Z)A|^xzS>?!BoG_o`QuOy4Q3|M~U^>%3qo z$yC=W|CUaNe4%5p+GTsCL$VEOOoa}t?cTKADesVp{3=Di%zK}8TV6W-+x&9_H#>{a z|9go)m|w_uQj9;u2M_gT?8 zKTJq`Y@&8X&hE9La>}N!Szof7zh-Ulk>mT{!LU^@qDbJ)DfLsD;lG<4(r3I`tP$b= zPIvJWzZ-8w-yRW5wn@->=^DBH;NC@5Un&Fzvl@0fzmJmsb~2RNS5v`hrl`#NyQ`1q zI!~|pC1l37ww#wio9EbX-)ARU#Rc11IGn+=i2{io1}d;gMh@p$j4cme`1(%ieB+Us zwMbdJ`=!SWzxn_J8DqPI7u#O5nwkCWz40nwg4++KtVEsGOCcILZO1GZ?=Sk3s$e0v zE};9L!nEt@tc%#LEiRvWxotz2>Y@47yVCdmayB_4_x<1vrZeF}%bbM|C%@m&{`O!+ z3A_1P_Kk;b9GR4szwu1qCm9BvY0HaB*Y6QHdq?7#XKczm3tx`irCXI2c<_mwe0r%v zajH~|={~ldYYqIGwLg3QwqpJ;o9%jpvht}JZ^!yPYyD|@3U6kzt1n$)c-T1B*!82xqr@!Xuv~S?X34iKrZH#M zPcT!h+cNw4q$tI+>h4DiSA8gy*;SUi@buJ0$6nt&J!$@q7qi-RblRWAY}fOWh}Ts5 z`lN-mP3G~pG(8THs3h^AJ5Lg?7z-x4PypF}F_d$^81iGg2)1=D{+Yg>>asP?!esx=?<^tqf_;;wPmA4r zm;cE2xd}_2e(7&*of09fbmG*zwZOfwELPCKsuCf{S( z$~8+n1sxO~uZmfB^G`s=G35i&go?>}iTu3dA%+^fmSs)T#NF+CAG ztt5tncb(5|H}LYGRqFDycGiYSDZZx9&)<45O>67vTk=mhyQ@?~cj|QUU27zEH{ZFc z9hD)^TyTl$p+WNV!*zB%f9`c`>Mzb-bU4TIv3*oJV+y{RJ6{y}zxZBwx5hGiE$*Z7x3;lAF3g&b;i?bUXSXFkYngsJV^`MSuhALl%xVrd^yes7i`LIg-)&;S zWhIf&FJbhd^!N2!SqJ8E#aL+8KIisdequt{eY5L5AEV|ReZhWZuHoz?r9~?@b{I?) z5_9ZJw>B4Fp1XC0n78&+n*~BAb*a!CpnLjIW_BKNq~27a{+Ro6~A-4tHpB)r3d+`x~wt zy0LL~kN=W~x!coB@-=UYbojrto@*QUV7vM>PP^U0al83np9h7EVdA-}spr=Ar=Azs zRCH_6#*F7@o-f>LzWB$zmtSkMjyQaJ^dCD2Hj2pVM_j!pK^mG1F&nT)j zT6@kf@vHYOyoVw>KM@+Zb4QF>QFXT;##$rAJ?%pA@oco7ptEGDRhyFDqz2Ndt$FB_$bMNNA`%w3~!7DUQ_TG_|=WaUuQ9AJI{ol0qtM~;jZsq;9_wU!&{Fk;CvcG)H z>tg$+Gyb0arI#H0eB1oC2Uh=$oaAMCP>5r(^h*LO61>Ur5=;d0}OB50KmY>kjW;`?@kIi1ZNuJWHdA8RDr zEaBx7G%HQh-cqO}cD3-#^F=nV3fnjY&00Bx|H`{p7oBt6=egS7Mn;K8P>t!(iobhj zN-OzHX<6HTPT)QPakE?ti&li?fU3fC_B5ytaq_jAO%gq1e zA6Azq%jvdq+ga|OsBd1NcP#UrgVEKO#}hfam$^ttNZ2e05KLV3_AuXtbMv&hegBtd zCT*`5e}7Im!}aayU!^zA{68NSy>yFL{OSDPV%L7GohECYxV4<;h&^k1(0(3`SD*fi zJmKPEdaV#E&$ht7!`&&}a`5^?tK zdb0vOuXlF46Bpz@-t_HyjN_BsMZaa#1QV6sAAS(9W4X_oz5?mK8Ei8|O)KoAkJ-n2 zavhkp%Gj*O_Dbshx&MkTe0aHh_kmTf|FUuh&$z@Uwe?@M__i;i39IjavUi*j7qVz~ zMR{1%+~U{u8$OF3%lLnI=a+<*pKq>BD4SB>Yq0j;3Z@s4pJD}`ZRWjYq`oXESuxG^ zu0?w4p_u{_KJsl=VIu+nRq(UkA1!?XZow~v)Wo4Ry=D^T)bq0!N;eq2l;L9S4_LZ>F${k(fG^Yq7d79 zH^DdVA!jqbzEnSZ%b9U=Q<&0Rp^R^b*Clw|tv_mV=7>&SZ~l}g%c@;G^L|w-+aGZW z*zmZWLnrbtNA5HKABviPS&x3wIN2+#l4HMP&!4C%8+ZTs*Ot3wxlm);=W@yEh8%&@ zqWSnGRj;QP@6+C9V1H(E_@jM=%h#XfG;%mU>3yAD&(Gt3A|KaJJF|B6Z`tYqhVyf6 zAIe(Du^lZJD^YNbEY<3Z*ty<-U!uC-Uh(jbXNP-Uzj6xQ%ei1zpUj76Ij&#gOrk%^ zaU8aB{3nw5KFRLQ`T5;@%KmFByWH5V_U3%XD*?B1X#r3L+qPM}l*i@i#@k^Jj#YVp za;DD{N3-L?BEcaOtpyX`PX@KOA#3_Lq(9zszhbt|qUCsxTF)y1?W{lndE=QI_;pq> zT>7HSqi_h+JYVu%>}^dEN3z|o!?S&#Ef#UPaYofg;_V)@DCrvB$FpyrzH$4s%W6i+ zh-Ie&vLAN39KO2#>M_?D{@3Ln@$TE!#WB0FbP9HVnmh05)T;T#qF0J}LzM&)joUYH^lV6by+i)ll36!QO1N{r?LNQ!)cuRE z=dt$Q`zqHSm~+h3>(?5t4==6$^Y)4@sXDsFL|p8|lWTts>`WpVV`k|_{4H))Q_9H_ ze0E`nUc^ze$$vjgIJTAdXKl;R$u}yWv$PcYKLS@bM&Ya?soV69=e?`HJ$(rmw_R*O zsqxG^&p!W5I+!J`l%sYwY{sUAyWi-)Nn4{J-`L8R?sj5L!u1Qv4GOn@@@>2G!|i0& z#y#Sn{L1IfZ#esq({;mvx04E1?Y2H2@Mhf?DTxm?k!nggZh~ez56x5Mw>rcg%*EPf z-JZQ6A)nuVYwfOCxl?|J2_|-Iuy?-kA!**MC6R_MH_oW>?49n?()q=yHsj*CiOZxR zb3)Lio*dQoErH1sMNL6P@X;U_xwm@+J{m6O6yCX7aGmFc@Jqj2Yx)He7b&b+xgr0| zl^(YpH4j?$>MFNw{m1SpvD8h#%zYoHGEZC1bWXYQE1N~xIyRI$%<%ni&wcSNs|{s! z3tB8KPS`Kt;QYPzUG%vhoU6Avx9nv;wB>L^YRjT$%B^3Q%?jMQxBms-0qsrK+E)J5 zFxvZBBO!Cs;;gN99*3TM)$F@i!kD<5@dKBc(2I{hH z_t(#sR`%eVbbD#ZqBrqB`PW}fP`rKCJZ{Cy&L&>hw{P~Y$>OWm_lk7EKboWZP=j1T=4UwWzUA)oayUKB#wSK&CJrm zI!W);y;bIwHy1zDe0=aEZ{s}O>}{+ouBG2@l(Gx5e^rTY8#q`MBjG05=v zD-^}0rPgSB@SxBK%}v{;?+yQdSVr~blnkA7>lg6fcCxnCx9F0TVN2d}`cRHCui^%y z4-TF?)>!)XOt^7qLwB>{?e8_S3Z5Aln9a85w{sN>ozk)(-P1(=Tl%xZY?GT66c4!= zE}#ETsL@20bMZduLle@p62IKY5bSQ^n0>M3;UZT(tw+gfpfyOa(F2c;4d0z-%-Yu5 zA)0&t{}rpcum1BMsy$P5aBbOJf9Q>7pVGA6-Ur=cn`R&L^$51{ub4J#*5mt@+dPfs z+BvHKw{-sNSGFlE`{J_4<4a4dM77iBLm_6Of@Z}WmuFx2-B5Q(?VFjRoS@msmc4SU zf5YakUj%BSnCTs|I=i5kyT@Z+NrG@%LHxPWXREJIS|7iwT-WeLZj0tR?}ID%c1nFN zYgqMLUSrE~vBaNe0=#wYw%wd5&+1$AeIn;;@5{Q6MWwS{WoNT-E|%+&_4uM|)8kuz zFsi!XX@9lyAvGt79@n>rIzPlqEL_2#BB!y*T;t70wYg@g@<%zkH}R~#yU}ss3C1PP z-q-K^e%&XHrh3lVWo)O%nW@5fuhHrXg?Ne1}vopO1cb!(< z?DuuLyZV{;`)+*n4STHG^Ilg?&9+3}-YGhMp=*@2`3WvTv(6UJNvCT5?*2P}X~=Hv zW7RVE9Wv#a)uuu$2HhkHU_zhg0-a4RMuebVmI`>(?O^ku)fvhBdcT}HoI66CZL z-ju}5H8Eb-H+kQdJI34fT+F6t&ykwHbdv8Bi`1)+eW&r-6kPp!fYqQ>FT zZ-2N{^*+NBpK*9n1R}TXS(wyogSykmvqs zR-Wu}XTSWPA}-Es&1=u3{rS(g6$gALcv%F*b4~S%G08tZhwraNMDVPa^97$Oy*O-E z{^I$%YxfmjU#&JxXfV)nU2%tb%kO=nyW&M3hsVtL{A17eW8vGkPm_zDBY6LW;le%3 z8q-ghrUxyaH%^tY4v zr#92`p5{Wy8xBs)zj9aVvboox^KIwP%dY+OZ`<8RzK1x}wrO`3UF!uc2Tq%qmp

    ztdz5fBl}0`^f-E^iqMwyKauO<&PpdQ4TdT)mFj@B(C%2bPpt#X14bE$ErR-f# zYHI&&yD4+Z(o%9?bTcnuKJxV1(nSk zzHHqkRI-%&dxYpd5icdj_#)4%-}*NgwITR}8yx4)puOTls3Ur_GMf(-_|?!gZHFYTd%NAO1mIkmb>>*)W(AP@&xY7lS1Tf z@%qgw^*Err`p!mokF=-Vrjc8?-_`n0U!}XHcjs|Q#lYs4uaSY$^^5KP|1z|!3XSB9 zv$MW@(Anz$`&VC=iM~?Z*V%u##e4tJ(h~c`i*wsvZCSlUYRB|nmtRL;Ir`z#{4JaN zSKF^$_&NOa<;Nv|qZ2IkzOF91uPi51`LKyY_-@bYRYxn*VlIdC-v74r&57TCmCT)b zHD{l-TV-};^OFTj|J^Y4xWQ7kELb2>{?wd(Uq9qtTWoRkYF2+hvXs2M{m+&_H5ZAh z>@SJ}YM(r7WA0abp8BD=FyI%*<=Fx9V!a%{8910vDNWzt+1R>fkcn@^9<(L{<1zFvGV4A=0gvzs9y4!%27RCu|*NI ookbwg!vj3Bb?J-ZoBz!7ZZFVdQ&MBb@0MbI#E&u=k literal 14653 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 E06QOJD*ylh diff --git a/doc/images/qtcreator-meego-device-configurations.png b/doc/images/qtcreator-meego-device-configurations.png index 85203b4b3597a850ded899985a94772ab6d849ef..aec04dfa3dc1fcd612b9b47b0097a30c1cfdf752 100644 GIT binary patch literal 14804 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 literal 14588 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 HN@xNAgq3;c diff --git a/doc/images/qtcreator-meego-emulator-connection.png b/doc/images/qtcreator-meego-emulator-connection.png deleted file mode 100644 index 10e0b1a76db3b13794e56dfbe5d65c18fb5224ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7307 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 diff --git a/doc/src/linux-mobile/linuxdev-keys.qdocinc b/doc/src/linux-mobile/linuxdev-keys.qdocinc index dafc5d4d232..8bfd0f3379c 100644 --- a/doc/src/linux-mobile/linuxdev-keys.qdocinc +++ b/doc/src/linux-mobile/linuxdev-keys.qdocinc @@ -10,8 +10,7 @@ \list 1 - \o Select \gui {Tools > Options > Linux Devices > Device - Configurations > Generate SSH Key}. + \o Select \gui Tools > \gui Options > \gui Devices > \gui {Create New}. \image qtcreator-ssh-key-configuration.png "SSH Key Configuration dialog" diff --git a/doc/src/linux-mobile/linuxdev-processes.qdocinc b/doc/src/linux-mobile/linuxdev-processes.qdocinc index 856040efd15..a0fb08553a0 100644 --- a/doc/src/linux-mobile/linuxdev-processes.qdocinc +++ b/doc/src/linux-mobile/linuxdev-processes.qdocinc @@ -1,13 +1,12 @@ \section2 Managing Device Processes You can view processes running on devices and kill them. Select - \gui {Tools > Options > Linux Devices > Device Configurations > - Remote Processes}. + \gui Tools > \gui Options > \gui Devices > \gui {Remote Processes}. - You can filter the processes by name in the \gui {List of Remote Processes} + You can filter the processes by name in the \gui {List of Processes} dialog. To update the process list, select \gui {Update List}. To kill a process, select it in the list, and then select \gui {Kill - Selected Process}. + Process}. diff --git a/doc/src/linux-mobile/linuxdev.qdoc b/doc/src/linux-mobile/linuxdev.qdoc index b215ecc7d8b..4849bad31a2 100644 --- a/doc/src/linux-mobile/linuxdev.qdoc +++ b/doc/src/linux-mobile/linuxdev.qdoc @@ -39,7 +39,7 @@ create device configurations and select them in the \QC \l{glossary-buildandrun-kit}{kit} You use a wizard to create the connections. You can edit the settings later - in \gui {Tools > Options > Devices > Devices}. + in \gui Tools > \gui Options > \gui Devices. \image qtcreator-linux-device-configurations.png "Devices dialog" @@ -67,8 +67,8 @@ \list 1 - \o Select \gui {Tools > Options > Linux Devices > Devices > Add - > Generic Linux Device > Start Wizard}. + \o Select \gui Tools > \gui Options > \gui Devices > \gui Add + > \gui {Generic Linux Device} > \gui {Start Wizard}. \image qtcreator-screenshot-devconf-linux.png "Connection Data wizard" @@ -103,13 +103,12 @@ \o Open a project for an application you want to develop for the device. - \o Select \gui {Projects > Build & Run Settings > Add Kit}. - - \o Select the kit that you added above. + \o Select \gui Projects > \gui {Build & Run} > \gui {Add Kit} to + add the kit that you specified above. \endlist - \o To specify run settings, select \gui Run. + \o Select \gui Run to specify run settings. \image qtcreator-run-settings-linux-devices.png "Run settings for embedded Linux devices" diff --git a/doc/src/linux-mobile/maemodev.qdoc b/doc/src/linux-mobile/maemodev.qdoc index e54f58c6d4a..a34a6563e25 100644 --- a/doc/src/linux-mobile/maemodev.qdoc +++ b/doc/src/linux-mobile/maemodev.qdoc @@ -48,7 +48,7 @@ or see \l{http://doc.qt.nokia.com/qt-maemo/platform-notes-maemo5.html}{Platform Notes - Maemo 5}. - \section1 Hardware and Software Requirements for Maemo Target + \section1 Hardware and Software Requirements for Maemo Devices To build and run Qt applications for Maemo 5, you need the following: \list @@ -222,7 +222,7 @@ only need to configure a connection to the device. You use a wizard to create the connections. You can edit the settings later - in \gui {Tools > Options > Linux Devices > Device Configurations}. + in \gui Tools > \gui Options > \gui Devices. \image qtcreator-maemo-device-configurations.png "Maemo Device Configurations dialog" @@ -282,21 +282,15 @@ \note If you experience connection problems due to a USB port issue, switch to a different port or use WLAN to connect to the device. - \o Select \gui {Tools > Options > Linux Devices > Device - Configurations > Add}. + \o Select \gui Tools > \gui Options > \gui Devices > \gui Add. - \o Select \gui {Device with MADDE support (Fremantle, Harmattan, - MeeGo) > Start Wizard}, and add a new configuration for a - hardware device. + \o Select \gui {Maemo5/Fremantle} > \gui {Start Wizard}. \image qtcreator-dev-conf-maemo.png "Maemo device configuration" \o In the \gui {The name to identify this configuration} field, enter a name for the connection. - \o In the \gui {The system running on the device} field, select - the software platform of the device. - \o In the \gui {The kind of device} field, select \gui {Hardware device}. @@ -321,21 +315,11 @@ \list a - \o In \QC, select \gui {Tools > Options > Linux - Devices > Device Configurations > Add} to add a new - configuration. - - \image qtcreator-maemo-emulator-connection.png "Maemo emulator configuration" - - \o In the \gui {The name to identify this configuration} field, - enter a name for - the connection. - - \o In the \gui {The system running on the device} field, select - the software platform to emulate. + \o In \QC, select \gui Tools > \gui Options > \gui Devices > + \gui Add to add a new configuration. \o In the \gui {The kind of device} field, select - \gui {Emulator (Qemu)}. + \gui Emulator. \o Click \gui Next. @@ -345,30 +329,56 @@ \endlist \endif - \o To specify build and run settings: + \o Select \gui Tools > \gui Options > \gui {Build & Run} > + \gui Kits > \gui Add to add a kit for building for the device: \list a - \o Open a project for an application you want to develop for your + \o In the \gui {Device type} field, select + \gui {Maemo5/Fremantle}. + + \o In the \gui Device field, select the device that you added + above. + + \o In the \gui Sysroot field, specify the path to the sysroot. + By default, the \QSDK installer places sysroot in the + following folder: + \c{QtSDK\Maemo\4.6.2\sysroots\fremantle-arm-sysroot-20.2010.36-2-slim}. + + \o In the \gui {Compiler type} field, select GCC. + + \o In the \gui Compiler field, specify the path to the GCC + compiler. By default, the \QSDK installer places the + compiler in the following folder: + \c{QtSDK\Maemo\4.6.2\targets\fremantle-pr13\bin\}. + + \o In the \gui Debugger field, specify the path to GDB. By + default, the \QSDK installer places the debugger + in the following folder: + \c{QtSDK\Maemo\4.6.2\targets\fremantle-pr13\bin\}. + + \o In the \gui {Qt version} field, choose the MADDE Qt version + for Maemo5/Fremantle. By default, the \QSDK installer + places qmake in the following folder: + \c{QtSDK\Maemo\4.6.2\targets\fremantle-pr13\bin\}. + + \endlist + + You can leave the \gui {Qt mkspec} field empty. + + \o Open a project for an application you want to develop for your device. - \o Click \gui Projects to open the projects mode. + \o Select \gui Projects > \gui {Build & Run} > \gui {Add Kit} to + add the kit that you specified above. - \o In the \gui{Build Settings} section, choose the MADDE Qt version - that was registered by the installation program. + \o Select \gui Run to specify run settings for the project. - \image qtcreator-build-settings-maemo.png "Maemo build settings" - - \o In the \gui{Run Settings} section, in the - \gui {Device configuration} field, select the device - connection or the emulator connection. - \image qtcreator-run-settings-maemo.png "Maemo run settings" - - \o Click \gui {} in \gui {Remote Directory} - to specify the folder where the file is installed on the device. - For example, \c {/opt/usr/bin}. - - \endlist + \o The mobile application wizard automatically sets the folder + where the file is installed on the device in the \gui {Remote + Directory} field. For example, \c {/opt/usr/bin}. If the text + \gui {} is displayed, click it to specify a + folder. \endlist @@ -386,8 +396,7 @@ \o To specify the password, enter the following command: \c{/usr/lib/mad-developer/devrootsh passwd user} - \o In \QC, select \gui {Tools > Options Linux Devices > - Device Configurations}. + \o In \QC, select \gui Tools > \gui Options > \gui Devices. \o Specify the username \c user and the password in the device configuration. diff --git a/doc/src/linux-mobile/meegodev.qdoc b/doc/src/linux-mobile/meegodev.qdoc index 9e0d7c3c5af..a1f5995d69e 100644 --- a/doc/src/linux-mobile/meegodev.qdoc +++ b/doc/src/linux-mobile/meegodev.qdoc @@ -235,7 +235,7 @@ device. You use a wizard to create the connections. You can edit the settings later - in \gui {Tools > Options > Linux Devices > Device Configurations}. + in \gui Tools > \gui Options > \gui Devices. \image qtcreator-meego-device-configurations.png "MeeGo Device Configurations dialog" @@ -294,21 +294,16 @@ port issue, switch to a different port or use WLAN to connect to the device. - \o Select \gui {Tools > Options > Linux Devices > Device - Configurations > Add}. + \o Select \gui Tools > \gui Options > \gui Devices > \gui Add. - \o Select \gui {Device with MADDE support (Fremantle, Harmattan, - MeeGo) > Start Wizard}, and add a new configuration for a - hardware device. + \o Select \gui {MeeGo 1.2 Harmattan} > \gui {Start Wizard} to + add a new configuration for a device. \image qtcreator-screenshot-devconf.png \o In the \gui {The name to identify this configuration} field, enter a name for the connection. - \o In the \gui {The system running on the device} field, select - the software platform of the device. - \o In the \gui {The kind of device} field, select \gui {Hardware device}. @@ -322,7 +317,7 @@ \o Click \gui Next. \o Follow the instructions of the wizard to create the - connection. + configuration. \endlist @@ -335,20 +330,16 @@ \list a - \o In \QC, select \gui {Tools > Options > Linux - Devices > Device Configurations > Add} to add a new - configuration. + \o In \QC, select \gui Tools > \gui Options > \gui Devices > + \gui Add to add a new configuration. - \image qtcreator-meego-emulator-connection.png + \o Select \gui {MeeGo 1.2 Harmattan} > \gui {Start Wizard}. \o In the \gui {The name to identify this configuration} field, enter a name for the connection. - \o In the \gui {The system running on the device} field, select - the software platform to emulate. - \o In the \gui {The kind of device} field, select - \gui {Emulator (Qemu)}. + \gui Emulator. \o Click \gui Next. @@ -356,35 +347,59 @@ connection. SDK Connectivity is not needed for emulator connections, and - therefore, you do nt need to authenticate the emulator + therefore, you do not need to authenticate the emulator connection. \endlist \endif - \o To specify build and run settings: + \o Select \gui Tools > \gui Options > \gui {Build & Run} > + \gui Kits > \gui Add to add a kit for building for the device: - \list a + \list a + + \o In the \gui {Device type} field, select + \gui {MeeGo 1.2 Harmattan}. + + \o In the \gui Device field, select the device that you added + above. + + \o In the \gui Sysroot field, specify the path to the sysroot. + By default, the \QSDK installer places sysroot in the + following folder: + \c{QtSDK\Madde\bin\sysroots\harmattan_sysroot_10.2011.34-1_slim}. + + \o In the \gui {Compiler type} field, select GCC. + + \o In the \gui Compiler field, specify the path to the GCC + compiler. By default, the \QSDK installer places the + compiler in the following folder: + \c{QtSDK\Madde\targets\harmattan_10.2011.34-1_rt1.2\bin\}. + + \o In the \gui Debugger field, specify the path to GDB. By + default, the \QSDK installer places the debugger + in the following folder: + \c{QtSDK\Madde\targets\harmattan_10.2011.34-1_rt1.2\bin\}. + + \o In the \gui {Qt version} field, choose the MADDE Qt version + for MeeGo 1.2 Harmattan. By default, the \QSDK installer + places qmake in the following folder: + \c{QtSDK\Madde\targets\harmattan_10.2011.34-1_rt1.2\bin\}. + + \endlist + + You can leave the \gui {Qt mkspec} field empty. \o Open a project for an application you want to develop for your device. - \o Click \gui Projects to open the projects mode. + \o Select \gui Projects > \gui {Build & Run} > \gui {Add Kit} to + add the kit that you specified above. - \o In the \gui{Build Settings} section, choose the MADDE Qt - version that was registered by the installation program. + \o Select \gui Run to specify run settings for the project. - \image qtcreator-screenshot-build-settings.png - - \o In the \gui {Run Settings} section, - \gui {Device configuration} field, select the - device connection or the emulator connection. - \image qtcreator-screenshot-run-settings.png - - \endlist - - \note The new application wizards automatically set the folder + \o The Qt Quick project wizards automatically set the folder where the file is installed on the device in the \gui {Remote Directory} field. For example, \c {/opt/usr/bin}. If the text \gui {} is displayed, click it to specify a @@ -408,8 +423,7 @@ \o To specify the password, enter the following command: \c{/usr/lib/mad-developer/devrootsh passwd user} - \o In \QC, select \gui {Tools > Options Linux Devices > - Device Configurations}. + \o In \QC, select \gui Tools > \gui Options > \gui Devices. \o Specify the username \c user and the password in the device configuration. From aa8a0cf0edca18d1e70da1f403f1ae6af1eb062a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20N=C3=A4tterlund?= Date: Fri, 7 Sep 2012 13:05:04 +0200 Subject: [PATCH 40/73] QNX: Fixed asserts when stopping application on BlackBerry device Change-Id: I0283d2a8c27e51f38c2e0939440bdbbef0063353 Reviewed-by: Daniel Teske --- src/plugins/qnx/blackberryapplicationrunner.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/plugins/qnx/blackberryapplicationrunner.cpp b/src/plugins/qnx/blackberryapplicationrunner.cpp index c946584ddf3..e22e006d158 100644 --- a/src/plugins/qnx/blackberryapplicationrunner.cpp +++ b/src/plugins/qnx/blackberryapplicationrunner.cpp @@ -161,6 +161,9 @@ void BlackBerryApplicationRunner::startFinished(int exitCode, QProcess::ExitStat ProjectExplorer::RunControl::StopResult BlackBerryApplicationRunner::stop() { + if (m_stopping) + return ProjectExplorer::RunControl::AsynchronousStop; + m_stopping = true; QStringList args; @@ -180,14 +183,13 @@ ProjectExplorer::RunControl::StopResult BlackBerryApplicationRunner::stop() m_stopProcess->setEnvironment(m_environment.toStringList()); } - m_stopProcess->start(m_deployCmd, args); return ProjectExplorer::RunControl::AsynchronousStop; } bool BlackBerryApplicationRunner::isRunning() const { - return m_running && !m_stopping; + return m_running; } qint64 BlackBerryApplicationRunner::pid() const @@ -248,7 +250,7 @@ void BlackBerryApplicationRunner::tailApplicationLog() { // TODO: Reading the log using qconn instead? - if (m_tailProcess && m_tailProcess->isProcessRunning()) + if (m_stopping || (m_tailProcess && m_tailProcess->isProcessRunning())) return; QTC_CHECK(!m_appId.isEmpty()); From e77bb8af0489688ec06f2f74a9f963f076c36584 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Thu, 6 Sep 2012 16:19:14 +0200 Subject: [PATCH 41/73] Handle non-qmake projects without kits Make it possible to add kits again after all kits were removed from a non qmake project. Task-number: QTCREATORBUG-7814 Change-Id: I38967cd4c106b95288b7020fe325d8cfe2688a7c Reviewed-by: Daniel Teske --- src/plugins/projectexplorer/project.cpp | 5 +++++ src/plugins/projectexplorer/project.h | 2 ++ src/plugins/projectexplorer/projectwindow.cpp | 2 +- src/plugins/projectexplorer/targetsettingspanel.cpp | 2 +- src/plugins/qt4projectmanager/qt4project.cpp | 5 +++++ src/plugins/qt4projectmanager/qt4project.h | 2 ++ 6 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index 3bc256d9928..b53bb0435b1 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -439,6 +439,11 @@ void Project::configureAsExampleProject(const QStringList &platforms) Q_UNUSED(platforms); } +bool Project::supportsNoTargetPanel() const +{ + return false; +} + void Project::onBuildDirectoryChanged() { Target *target = qobject_cast(sender()); diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h index e0814d3ca13..70d97260c38 100644 --- a/src/plugins/projectexplorer/project.h +++ b/src/plugins/projectexplorer/project.h @@ -124,6 +124,8 @@ public: virtual bool needsConfiguration() const; virtual void configureAsExampleProject(const QStringList &platforms); + virtual bool supportsNoTargetPanel() const; + signals: void displayNameChanged(); void fileListChanged(); diff --git a/src/plugins/projectexplorer/projectwindow.cpp b/src/plugins/projectexplorer/projectwindow.cpp index 8a9f23d540e..e9cf59b3c17 100644 --- a/src/plugins/projectexplorer/projectwindow.cpp +++ b/src/plugins/projectexplorer/projectwindow.cpp @@ -384,7 +384,7 @@ void ProjectWindow::showProperties(int index, int subIndex) m_previousTargetSubIndex = previousPanelWidget->currentSubIndex(); } - if (m_hasTarget.value(project)) { + if (m_hasTarget.value(project) || !project->supportsNoTargetPanel()) { if (subIndex == 0) { // Targets page removeCurrentWidget(); diff --git a/src/plugins/projectexplorer/targetsettingspanel.cpp b/src/plugins/projectexplorer/targetsettingspanel.cpp index f315fbe37ff..1d2b7d36cca 100644 --- a/src/plugins/projectexplorer/targetsettingspanel.cpp +++ b/src/plugins/projectexplorer/targetsettingspanel.cpp @@ -115,7 +115,7 @@ void TargetSettingsPanelWidget::setupUi() QVBoxLayout *noTargetLayout = new QVBoxLayout(m_noTargetLabel); noTargetLayout->setMargin(0); QLabel *label = new QLabel(m_noTargetLabel); - label->setText(tr("No kit defined.")); + label->setText(tr("No kit defined in this project.")); { QFont f = label->font(); f.setPointSizeF(f.pointSizeF() * 1.4); diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp index f62bd9eff52..129eb5a8fc2 100644 --- a/src/plugins/qt4projectmanager/qt4project.cpp +++ b/src/plugins/qt4projectmanager/qt4project.cpp @@ -1367,6 +1367,11 @@ void Qt4Project::configureAsExampleProject(const QStringList &platforms) ProjectExplorer::ProjectExplorerPlugin::instance()->requestProjectModeUpdate(this); } +bool Qt4Project::supportsNoTargetPanel() const +{ + return true; +} + // All the Qt4 run configurations should share code. // This is a rather suboptimal way to do that for disabledReason() // but more pratical then duplicated the code everywhere diff --git a/src/plugins/qt4projectmanager/qt4project.h b/src/plugins/qt4projectmanager/qt4project.h index f711ad2cf69..6d4dff54eb4 100644 --- a/src/plugins/qt4projectmanager/qt4project.h +++ b/src/plugins/qt4projectmanager/qt4project.h @@ -129,6 +129,8 @@ public: void configureAsExampleProject(const QStringList &platforms); + bool supportsNoTargetPanel() const; + /// \internal QString disabledReasonForRunConfiguration(const QString &proFilePath); From 95824dc29859724f902a7af64cde7efab2b1b5e3 Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Fri, 7 Sep 2012 12:35:18 +0200 Subject: [PATCH 42/73] fix usage of removed DEPLOYMENT property in Qt 5 For DEPLOYMENT, foo.sources has been superseded by foo.files in Qt 5. Change-Id: I8a357aca0969b7caa94b9e9ed63613064ba86299 Reviewed-by: Daniel Teske --- src/plugins/qt4projectmanager/qt4nodes.cpp | 12 +++++++++--- src/plugins/qt4projectmanager/qt4nodes.h | 3 ++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp index 860d4685466..ef8e7f7009e 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.cpp +++ b/src/plugins/qt4projectmanager/qt4nodes.cpp @@ -600,9 +600,13 @@ void Qt4PriFileNode::update(ProFile *includeFileExact, QtSupport::ProFileReader InternalNode contents; + ProjectExplorer::Target *t = m_project->activeTarget(); + ProjectExplorer::Kit *k = t ? t->kit() : ProjectExplorer::KitManager::instance()->defaultKit(); + QtSupport::BaseQtVersion *qtVersion = QtSupport::QtKitInformation::qtVersion(k); + // Figure out DEPLOYMENT and INSTALL folders QStringList folders; - QStringList dynamicVariables = dynamicVarNames(readerExact, readerCumulative); + QStringList dynamicVariables = dynamicVarNames(readerExact, readerCumulative, qtVersion); if (includeFileExact) foreach (const QString &dynamicVar, dynamicVariables) { folders += readerExact->values(dynamicVar, includeFileExact); @@ -1253,12 +1257,14 @@ QStringList Qt4PriFileNode::varNames(ProjectExplorer::FileType type) } -QStringList Qt4PriFileNode::dynamicVarNames(QtSupport::ProFileReader *readerExact, QtSupport::ProFileReader *readerCumulative) +QStringList Qt4PriFileNode::dynamicVarNames(QtSupport::ProFileReader *readerExact, QtSupport::ProFileReader *readerCumulative, + QtSupport::BaseQtVersion *qtVersion) { QStringList result; + // Figure out DEPLOYMENT and INSTALLS const QString deployment = QLatin1String("DEPLOYMENT"); - const QString sources = QLatin1String(".sources"); + const QString sources = QLatin1String(qtVersion && qtVersion->qtVersion() < QtSupport::QtVersionNumber(5,0,0) ? ".sources" : ".files"); QStringList listOfVars = readerExact->values(deployment); foreach (const QString &var, listOfVars) { result << (var + sources); diff --git a/src/plugins/qt4projectmanager/qt4nodes.h b/src/plugins/qt4projectmanager/qt4nodes.h index 81519232dff..fe1c1b0fadb 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.h +++ b/src/plugins/qt4projectmanager/qt4nodes.h @@ -53,6 +53,7 @@ class ICore; } namespace QtSupport { +class BaseQtVersion; class ProFileReader; } @@ -169,7 +170,7 @@ public: protected: void setIncludedInExactParse(bool b); static QStringList varNames(FileType type); - static QStringList dynamicVarNames(QtSupport::ProFileReader *readerExact, QtSupport::ProFileReader *readerCumulative); + static QStringList dynamicVarNames(QtSupport::ProFileReader *readerExact, QtSupport::ProFileReader *readerCumulative, QtSupport::BaseQtVersion *qtVersion); static QSet filterFilesProVariables(ProjectExplorer::FileType fileType, const QSet &files); static QSet filterFilesRecursiveEnumerata(ProjectExplorer::FileType fileType, const QSet &files); From 93e3c3f36fbbbcff4df9a98fe3a667a61023af6d Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 7 Sep 2012 13:58:29 +0200 Subject: [PATCH 43/73] SSH: Emit finished() for all running SFTP jobs when the server closes. Otherwise a crashing SFTP server can leave the client hanging. Change-Id: Ie96d7a9797074ddea3b50a1788b8ef7cd4bcd5bf Reviewed-by: Tobias Hunger --- src/libs/ssh/sftpchannel.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libs/ssh/sftpchannel.cpp b/src/libs/ssh/sftpchannel.cpp index c1e0206e09c..152afaa4535 100644 --- a/src/libs/ssh/sftpchannel.cpp +++ b/src/libs/ssh/sftpchannel.cpp @@ -832,6 +832,8 @@ SftpChannelPrivate::JobMap::Iterator SftpChannelPrivate::lookupJob(SftpJobId id) void SftpChannelPrivate::closeHook() { + for (JobMap::ConstIterator it = m_jobs.constBegin(); it != m_jobs.constEnd(); ++it) + emit finished(it.key(), tr("SFTP channel closed unexpectedly.")); m_jobs.clear(); m_incomingData.clear(); m_incomingPacket.clear(); From 0e9568da3ff5a1e2e5f3896a882d93f019dbdf16 Mon Sep 17 00:00:00 2001 From: Leandro Melo Date: Fri, 7 Sep 2012 14:25:50 +0200 Subject: [PATCH 44/73] C++: Completion for catch-clause arguments Task-number: QTCREATORBUG-2822 Change-Id: Ia5a05e1c47c88ef3350b7223578ba800ee464c8c Reviewed-by: Christian Kandeler Reviewed-by: Leandro Melo --- src/libs/3rdparty/cplusplus/Bind.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/libs/3rdparty/cplusplus/Bind.cpp b/src/libs/3rdparty/cplusplus/Bind.cpp index ef0b236fccd..380b0ccaef4 100644 --- a/src/libs/3rdparty/cplusplus/Bind.cpp +++ b/src/libs/3rdparty/cplusplus/Bind.cpp @@ -2098,7 +2098,16 @@ bool Bind::visit(ExceptionDeclarationAST *ast) } DeclaratorIdAST *declaratorId = 0; type = this->declarator(ast->declarator, type, &declaratorId); + + const Name *argName = 0; + if (declaratorId && declaratorId->name) + argName = declaratorId->name->name; + Argument *arg = control()->newArgument(location(declaratorId, ast->firstToken()), argName); + arg->setType(type); + _scope->addMember(arg); + // unsigned dot_dot_dot_token = ast->dot_dot_dot_token; + return false; } From 00f7677fc4bf169c6ff98f7e2c850edc2292a8c5 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 4 Sep 2012 15:02:00 +0200 Subject: [PATCH 45/73] debugger: fix "Display in Separate Window" for QString This is fixing a regression introduced recently during the WatchModel rework. Change-Id: I128368e78d00f1ef1fc96f7319b19873099396fa Reviewed-by: hjk --- src/plugins/debugger/watchhandler.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index 966bf8c8651..d239d40805b 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -1351,8 +1351,11 @@ bool WatchModel::ancestorChanged(const QSet &inames, WatchItem *item void WatchModel::insertBulkData(const QList &list) { #if 1 - for (int i = 0, n = list.size(); i != n; ++i) - insertDataItem(list.at(i)); + for (int i = 0, n = list.size(); i != n; ++i) { + const WatchData &data = list.at(i); + insertDataItem(data); + m_handler->showEditValue(data); + } #else // Destroy unneeded items. QSet inames; From 61291e942174e1f64b119709cf164dcb060fbcfc Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 30 Aug 2012 17:33:42 +0200 Subject: [PATCH 46/73] debugger: fix Qt namespace recognition for Qt 5 The "magic" symbol was QString::fromAscii, which might be fully inlined in Qt 5. Use QString::fromAscii_helper instead, and also make the detection a bit more robust in case the magic symbol is not found. Change-Id: I99e61797356a0d90467d32e54acc2d2a104d609a Reviewed-by: hjk --- src/plugins/debugger/gdb/gdbengine.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index fa6ed8c3d98..8458f3b8def 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -5005,12 +5005,15 @@ void GdbEngine::handleNamespaceExtraction(const GdbResponse &response) QByteArray ba = file.readAll(); file.close(); file.remove(); - int pos = ba.indexOf("7QString9fromAscii"); - int pos1 = pos - 1; - while (pos1 > 0 && ba.at(pos1) != 'N' && ba.at(pos1) > '@') - --pos1; - ++pos1; - const QByteArray ns = ba.mid(pos1, pos - pos1); + QByteArray ns; + int pos = ba.indexOf("7QString16fromAscii_helper"); + if (pos > -1) { + int pos1 = pos - 1; + while (pos1 > 0 && ba.at(pos1) != 'N' && ba.at(pos1) > '@') + --pos1; + ++pos1; + ns = ba.mid(pos1, pos - pos1); + } if (ns.isEmpty()) { showMessage(_("FOUND NON-NAMESPACED QT")); } else { From 15ea29533a00dfbf1c8fb42c147a59631d3e0dea Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 7 Sep 2012 15:13:10 +0200 Subject: [PATCH 47/73] debugger: use DeviceProcessesDialog directly for attaching Change-Id: I916c42bc141f5bfbf5dd163b3d9dfeed3703ed94 Reviewed-by: Friedemann Kleint --- src/plugins/debugger/debuggerplugin.cpp | 14 ++------------ .../devicesupport/deviceprocessesdialog.h | 2 -- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index ec1700bcdba..dda14a769fb 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -1670,21 +1670,12 @@ void DebuggerPluginPrivate::attachToRunningApplication() attachToProcess(false); } -class DebuggerProcessesDialog : public ProjectExplorer::DeviceProcessesDialog { -public: - DebuggerProcessesDialog(DebuggerKitChooser::Mode m, QWidget *parent) : - ProjectExplorer::DeviceProcessesDialog(new DebuggerKitChooser(m), parent) - { - addAcceptButton(DeviceProcessesDialog::tr("&Attach to Process")); - } -}; - void DebuggerPluginPrivate::attachToProcess(bool startServerOnly) { - const DebuggerKitChooser::Mode mode = startServerOnly ? DebuggerKitChooser::RemoteDebugging : DebuggerKitChooser::LocalDebugging; - DeviceProcessesDialog *dlg = new DebuggerProcessesDialog(mode, mainWindow()); + DebuggerKitChooser *kitChooser = new DebuggerKitChooser(mode); + DeviceProcessesDialog *dlg = new DeviceProcessesDialog(kitChooser, mainWindow()); dlg->addAcceptButton(DeviceProcessesDialog::tr("&Attach to Process")); dlg->showAllDevices(); if (dlg->exec() == QDialog::Rejected) { @@ -1693,7 +1684,6 @@ void DebuggerPluginPrivate::attachToProcess(bool startServerOnly) } dlg->setAttribute(Qt::WA_DeleteOnClose); - KitChooser *kitChooser = dlg->kitChooser(); Kit *kit = kitChooser->currentKit(); QTC_ASSERT(kit, return); IDevice::ConstPtr device = DeviceKitInformation::device(kit); diff --git a/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.h b/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.h index 6687a82f1f6..c40de731176 100644 --- a/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.h +++ b/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.h @@ -59,8 +59,6 @@ public: DeviceProcess currentProcess() const; KitChooser *kitChooser() const; void logMessage(const QString &line); - -protected: DeviceProcessesDialog(KitChooser *chooser, QWidget *parent); private: From 394f6d2db64a3c0289ae3c83657a2d78afa9c839 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Fri, 7 Sep 2012 15:59:15 +0200 Subject: [PATCH 48/73] Squish: Updated getConfiguredKits() Change-Id: I3f9dc08ce45eb773366a05de96a685a82266a54b Reviewed-by: Christian Stenger --- tests/system/objects.map | 2 +- tests/system/shared/utils.py | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/system/objects.map b/tests/system/objects.map index b9831ab715b..d0d8ebfbd97 100644 --- a/tests/system/objects.map +++ b/tests/system/objects.map @@ -25,7 +25,7 @@ :Failed to start application_QMessageBox {type='QMessageBox' unnamed='1' visible='1' windowTitle='Failed to start application'} :Generator:_QComboBox {buddy=':CMake Wizard.Generator:_QLabel' type='QComboBox' unnamed='1' visible='1'} :Kits_QTreeView {container=':qt_tabwidget_stackedwidget_QWidget' type='QTreeView' unnamed='1' visible='1'} -:Kits_QtVersion_QComboBox {container=':qt_tabwidget_stackedwidget_QWidget' occurrence='4' type='QComboBox' unnamed='1' visible='1'} +:Kits_QtVersion_QComboBox {container=':qt_tabwidget_stackedwidget_QWidget' occurrence='5' type='QComboBox' unnamed='1' visible='1'} :New.frame_QFrame {name='frame' type='QFrame' visible='1' window=':New_Core::Internal::NewDialog'} :New.templateCategoryView_QTreeView {name='templateCategoryView' type='QTreeView' visible='1' window=':New_Core::Internal::NewDialog'} :New_Core::Internal::NewDialog {name='Core__Internal__NewDialog' type='Core::Internal::NewDialog' visible='1' windowTitle='New'} diff --git a/tests/system/shared/utils.py b/tests/system/shared/utils.py index 37d6ed37efa..2166c7c83d6 100644 --- a/tests/system/shared/utils.py +++ b/tests/system/shared/utils.py @@ -311,8 +311,12 @@ def getConfiguredKits(): qtVersionStr = str(waitForObject(":Kits_QtVersion_QComboBox").currentText) targetQtVersionNames[targetName] = qtVersionStr # merge defined target names with their configured Qt versions and devices - for target,qtVersion in targetQtVersionNames.iteritems(): - result[target] = targetsQtVersions[qtVersionNames.index(qtVersion)].items()[0] + for kit,qtVersion in targetQtVersionNames.iteritems(): + if qtVersion in qtVersionNames: + result[kit] = targetsQtVersions[qtVersionNames.index(qtVersion)].items()[0] + else: + test.fail("Qt version '%s' for kit '%s' can't be found in qtVersionNames." + % (qtVersion, kit)) clickButton(waitForObject(":Options.Cancel_QPushButton")) # adjust device name(s) to match getStringForTarget() - some differ from time to time for targetName in result.keys(): From a09cbc0b1cfe17d109610f169a68bd117c9e96b8 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 7 Sep 2012 15:04:26 +0200 Subject: [PATCH 49/73] Another spelling error in text editor settings. Change-Id: Ifab9dc9b6910c39d4d71b95760b1ad9d5565fc1b Reviewed-by: Leandro Melo --- src/plugins/texteditor/texteditorsettings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/texteditor/texteditorsettings.cpp b/src/plugins/texteditor/texteditorsettings.cpp index 3d31cd24e3a..2cae2f425d2 100644 --- a/src/plugins/texteditor/texteditorsettings.cpp +++ b/src/plugins/texteditor/texteditorsettings.cpp @@ -228,7 +228,7 @@ TextEditorSettings::TextEditorSettings(QObject *parent) tr("Operators. (for example operator++ operator-=)"))); formatDescr.append(FormatDescription(C_PREPROCESSOR, tr("Preprocessor"), tr("Preprocessor directives."), Qt::darkBlue)); - formatDescr.append(FormatDescription(C_LABEL, tr("Label"), tr("Labels for goto steatments."), + formatDescr.append(FormatDescription(C_LABEL, tr("Label"), tr("Labels for goto statements."), Qt::darkRed)); formatDescr.append(FormatDescription(C_COMMENT, tr("Comment"), tr("All style of comments except Doxygen comments."), From 77726ba1a9dfd19673122454a61c7e8756e0523a Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 5 Sep 2012 17:25:47 +0200 Subject: [PATCH 50/73] Update changes file. First run-through Change-Id: Ifba29d76ee5f35d45ffd8770ff8aec66d21afa2b Reviewed-by: Leena Miettinen --- dist/changes-2.6.0 | 163 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 153 insertions(+), 10 deletions(-) diff --git a/dist/changes-2.6.0 b/dist/changes-2.6.0 index c84dc7dda68..18920d8c85d 100644 --- a/dist/changes-2.6.0 +++ b/dist/changes-2.6.0 @@ -5,48 +5,191 @@ list of changes, see the Git log for the Qt Creator sources that you can check out from the public Git repository. For example: git clone git://gitorious.org/qt-creator/qt-creator.git -git log --cherry-pick --pretty=oneline v2.5.0...origin/2.6 +git log --cherry-pick --pretty=oneline v2.5.2..origin/2.6 General + * Added a wizard for creating a temporary text file + * Added a menu for showing and hiding the output pane buttons + * Added a visual hint for canceled searches (QTCREATORBUG-6820) + * Fixed the New dialog for dark themes (QTCREATORBUG-7435) + * Added support for jumping to a line in a specific file to Locator + (with "+" or ":" appended to the file name, for example "myfile.cpp:41") + * Fixed that several settings where saved every few seconds + even without changes (QTCREATORBUG-7718) Editing + * Added a context menu for adding and removing UTF-8 bom + * Added shortcuts for searching for next and previous + occurrence of selected text without opening the find tool bar (QTCREATORBUG-464) + * Made resource files searchable (Ctrl+F) + * Added file type icons to the resource editor + * Added opening of files from the resource editor + * Added highlighting of missing files in the resource editor + * Added support for movies in the image viewer + * Fixed problems when closing documents in a split view (QTCREATORBUG-7361) Managing Projects + * Introduced "Kits" that supersede the previous "Targets". They bundle the settings + for the target device, compiler, debugger, Qt version and more into + a user definable, reusable setting. + * Moved the debugger setting from tool chains to kits + and renamed tool chains to compilers + * Added experimental support for Android (enable the plugin in Help > About Plugins) + * Added experimental support for QNX (enable the plugin in Help > About Plugins) + * Made it possible to disable deploy configurations + * Added double-clicking of file names in compile errors to open the file + * Added a Cancel Build button to the Compile Output pane + * Added CurrentProject::BuildPath variable for external tools (QTCREATORBUG-4885) + +QMake Projects + * Added an action for compiling a single file (QTCREATORBUG-106) + * Added actions for (re)building and cleaning the current subproject + +CMake Projects + * Added CMake specific context menu items to the CMakeLists.txt editor Debugging + * Made all views searchable (Ctrl+F) Debugging QML/JS Analyzing Code C++ Support + * Fixed lambda formatting issues + * Added support for variadic arguments (__VA_ARGS__) + * Added support for raw string literals (QTCREATORBUG-6722) + * Fixed the display of results when searching for macro usages (QTCREATORBUG-7217) + * Added highlighting of macro usages + * Implemented renaming of macro usages (QTCREATORBUG-413) QML/JS Support + * Added support for adding the file to VCS when moving a component into + a separate file (QTCREATORBUG-7246) + +GLSL Support + * Fixed a crash on declaration without type (QTCREATORBUG-7548) + * Fixed a freeze when using the conditional operator (QTCREATORBUG-7517) Qt Quick Designer Help + * Made hiding the navigation side bar in the Help mode possible (QTCREATORBUG-1533) + +Qt Designer + +Version control plugins + * Added experimental support for ClearCase (enable the plugin in + Help > About Plugins) + +Git + * Added a customizable repository browser command + * Fixed commit and amend when not on a branch + * Added partial support for Gerrit (Tools > Git > Gerrit) + +SVN + * Fixed project status command when no document is open + * Fixed completion in the submit editor + +FakeVim + * Fixed :!cmd if there is no selection Platform Specific Mac + * Added support for fullscreen (Lion and later) + * Changed the VCS shortcuts to use the Ctrl modifier instead of the Opt modifier + (the Opt modifier inserts special characters on Mac) + * Made the shortcut modifiers (e.g. Cmd+...) searchable in the Filter + functionality of the keyboard shortcut settings Linux (GNOME and KDE) + * Worked around a problem in the KDE file dialog that prevented selecting + qmake (QTCREATORBUG-7771) Windows Symbian Target + * Removed support for Symbian development because of missing maintainer Remote Linux Support -Qt Designer - -FakeVim - -Version control plugins - Madde - * Remove generic MeeGo support due to complete irrelevance - -Additional credits go to: + * Removed generic MeeGo support due to complete irrelevance +Credits go to: + Aleksey Sidorov + Alessandro Portale + Andreas Holzammer + Andre Hartmann + Aurélien Gâteau + Aurindam Jana + Bill King + BogDan Vatra + Bojan Petrovic + Bradley T. Hughes + Campbell Barton + Casper van Donderen + Christiaan Janssen + Christian Kamm + Christian Kandeler + Christian Stenger + cnavarro + Daniel Molkentin + Daniel Teske + David Schulz + Dmitry Savchenko + Eike Ziller + Erik Verbruggen + Fawzi Mohamed + Flex Ferrum + Francois Ferrand + Friedemann Kleint + hjk + hluk + Hugues Delorme + Jarek Kobus + Jędrzej Nowacki + Joerg Bornemann + Jonathan Liu + Juhapekka Piiroinen + Kaffeine + Kai Koehne + kh1 + Konstantin Ritt + Konstantin Tokarev + Leandro Melo + Leena Miettinen + Lukas Geyer + Lukas Holecek + Marc Mutz + Marco Bubke + Marius Storm-Olsen + Martin Aumüller + Mathias Hasselmann + Montel Laurent + Morten Johan Sorvig + Nicolas Arnaud-Cormos + Nikolai Kosjar + Orgad Shaneh + Oswald Buddenhagen + Oto Magaldadze + Peter Kuemmel + Pierre Rossi + Robert Loehning + Ryan May + Sergey Belyashov + Sergey Shambir + Simjees Abraham + Takumi Asaki + Theo J.A. de Vries + Thiago Macieira + Thomas Hartmann + Thorbjørn Lindeijer + tjenssen + Tobias Hunger + Tobias Nätterlund + Tommi Asp + Tyler Mandry + Vladislav Navrocky + Yuchen Deng From f278a87adb2feb2e907b4004d5f679ea366c4db9 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 7 Sep 2012 16:15:58 +0200 Subject: [PATCH 51/73] Doc: refer to mobile targets in alphabetic order Change-Id: I65b46b79757eea2f96e37c910359e62d4a4d0ba5 Reviewed-by: Leena Miettinen --- doc/src/android/androiddev.qdoc | 4 +- doc/src/android/deploying-android.qdoc | 4 +- .../creator-deployment-madde.qdoc | 2 +- doc/src/linux-mobile/linuxdev.qdoc | 2 +- doc/src/linux-mobile/maemodev.qdoc | 2 +- doc/src/linux-mobile/meegodev.qdoc | 4 +- .../overview/creator-deployment-overview.qdoc | 32 +++++----- doc/src/overview/creator-mobile-targets.qdoc | 64 +++++++++---------- .../creator-projects-builds-customizing.qdoc | 2 +- .../projects/creator-projects-running.qdoc | 2 +- doc/src/qnx/creator-deployment-qnx.qdoc | 2 +- doc/src/qnx/creator-developing-qnx.qdoc | 4 +- doc/src/qtcreator.qdoc | 7 +- 13 files changed, 66 insertions(+), 65 deletions(-) diff --git a/doc/src/android/androiddev.qdoc b/doc/src/android/androiddev.qdoc index ab9d0a91629..0c91d9d25a6 100644 --- a/doc/src/android/androiddev.qdoc +++ b/doc/src/android/androiddev.qdoc @@ -22,9 +22,9 @@ /*! \contentspage index.html - \previouspage creator-developing-qnx.html + \previouspage creator-connecting-mobile.html \page creator-developing-android.html - \nextpage creator-build-process-customizing.html + \nextpage creator-developing-generic-linux.html \title Connecting Android Devices diff --git a/doc/src/android/deploying-android.qdoc b/doc/src/android/deploying-android.qdoc index 1534c792f7b..b079311d9d5 100644 --- a/doc/src/android/deploying-android.qdoc +++ b/doc/src/android/deploying-android.qdoc @@ -22,9 +22,9 @@ /*! \contentspage index.html - \previouspage creator-deployment-qnx.html + \previouspage creator-deployment.html \page creator-deploying-android.html - \nextpage creator-connecting-mobile.html + \nextpage creator-deployment-maemo.html \title Deploying Applications to Android Devices diff --git a/doc/src/linux-mobile/creator-deployment-madde.qdoc b/doc/src/linux-mobile/creator-deployment-madde.qdoc index 5974f111728..bb04dbe1608 100644 --- a/doc/src/linux-mobile/creator-deployment-madde.qdoc +++ b/doc/src/linux-mobile/creator-deployment-madde.qdoc @@ -25,7 +25,7 @@ /*! \contentspage index.html - \previouspage creator-deployment.html + \previouspage creator-deploying-android.html \page creator-deployment-maemo.html \nextpage creator-deployment-qnx.html diff --git a/doc/src/linux-mobile/linuxdev.qdoc b/doc/src/linux-mobile/linuxdev.qdoc index 4849bad31a2..7ab8dc6c564 100644 --- a/doc/src/linux-mobile/linuxdev.qdoc +++ b/doc/src/linux-mobile/linuxdev.qdoc @@ -20,7 +20,7 @@ /*! \contentspage index.html - \previouspage creator-developing-meego.html + \previouspage creator-developing-android.html \page creator-developing-generic-linux.html \nextpage creator-developing-maemo.html diff --git a/doc/src/linux-mobile/maemodev.qdoc b/doc/src/linux-mobile/maemodev.qdoc index a34a6563e25..0faefe9cb52 100644 --- a/doc/src/linux-mobile/maemodev.qdoc +++ b/doc/src/linux-mobile/maemodev.qdoc @@ -26,7 +26,7 @@ \previouspage creator-developing-meego.html \endif \page creator-developing-maemo.html - \nextpage creator-developing-qnx.html + \nextpage creator-developing-meego.html \title Connecting Maemo Devices diff --git a/doc/src/linux-mobile/meegodev.qdoc b/doc/src/linux-mobile/meegodev.qdoc index a1f5995d69e..1e246c89eaa 100644 --- a/doc/src/linux-mobile/meegodev.qdoc +++ b/doc/src/linux-mobile/meegodev.qdoc @@ -20,10 +20,10 @@ /*! \contentspage index.html - \previouspage creator-connecting-mobile.html + \previouspage creator-developing-maemo.html \page creator-developing-meego.html \if defined(qcmanual) - \nextpage creator-developing-generic-linux.html + \nextpage creator-developing-qnx.html \else \nextpage creator-developing-maemo.html \endif diff --git a/doc/src/overview/creator-deployment-overview.qdoc b/doc/src/overview/creator-deployment-overview.qdoc index 2461ba30fae..90d5bdb090d 100644 --- a/doc/src/overview/creator-deployment-overview.qdoc +++ b/doc/src/overview/creator-deployment-overview.qdoc @@ -27,7 +27,7 @@ \contentspage index.html \previouspage creator-running-targets.html \page creator-deployment.html - \nextpage creator-deployment-maemo.html + \nextpage creator-deploying-android.html \title Deploying to Mobile Devices @@ -38,26 +38,26 @@ \list - \o \l{Deploying Applications to Linux-Based Devices} - - When you deploy the application on a Linux-based device, such - as \gui {Embedded Linux}, \gui Harmattan, or \gui{Maemo5}, \QC - copies the application files to the connected device. You - can test and debug the application on the device. - You can create Debian installation packages for MeeGo Harmattan and - Maemo 5 devices. - \o \l{Deploying Applications to QNX Devices} - - When you deploy the application on a \gui{QNX} device, depending - on your target device, \QC either generates a BAR package in the - build directory and deploys it to the connected device, or copies - the application files to the connected device. You can test and - debug the application on the device. \o \l{Deploying Applications to Android Devices} When you deploy the application on an Android device, \QC copies the application files to the device. In addition, you can determine the Qt libraries to use. + \o \l{Deploying Applications to Linux-Based Devices} + + When you deploy the application on a Linux-based device, such + as embedded Linux, MeeGo 1.2 Harmattan, or Maemo 5/Fremantle, \QC + copies the application files to the connected device. You + can test and debug the application on the device. + You can create Debian installation packages for MeeGo Harmattan and + Maemo 5/Fremantle devices. + \o \l{Deploying Applications to QNX Devices} + + When you deploy the application on a QNX device, depending + on your target device, \QC either generates a BAR package in the + build directory and deploys it to the connected device, or copies + the application files to the connected device. You can test and + debug the application on the device. \endlist \section1 Related Topics diff --git a/doc/src/overview/creator-mobile-targets.qdoc b/doc/src/overview/creator-mobile-targets.qdoc index 08e6014bbfe..da86b05dd96 100644 --- a/doc/src/overview/creator-mobile-targets.qdoc +++ b/doc/src/overview/creator-mobile-targets.qdoc @@ -25,9 +25,9 @@ /*! \contentspage index.html - \previouspage creator-deploying-android.html + \previouspage creator-deployment-qnx.html \page creator-connecting-mobile.html - \nextpage creator-developing-meego.html + \nextpage creator-developing-android.html \title Connecting Mobile Targets @@ -44,36 +44,6 @@ \list - \o \l{Connecting Embedded Linux Devices} - - If you have a tool chain for building applications for embedded - Linux devices (with no MADDE support) installed on the development - PC, you can add it to \QC. Create device configurations and select - them in the \QC run settings. - - \o \l{Connecting MeeGo Harmattan Devices} - - MeeGo Harmattan is a Linux-based software platform developed by - Nokia and preinstalled on Nokia N950 and Nokia N9. It enables - developers to create applications using the Qt framework. - Use the SDK Connectivity tool that is preinstalled on the device to - create the device-side end point for USB and WLAN connections. - - \o \l{Connecting Maemo Devices} - - Maemo 5 (Fremantle) is a Linux-based software platform developed by - Nokia and delivered on the Nokia N900. Use a connectivity tool (Mad - Developer) to create the device-side end point for USB and WLAN - connections. - - \o \l{Connecting QNX Devices} - - You can connect QNX devices to the development PC to deploy, run and - debug applications on them from within \QC. This is currently only - supported for BlackBerry Playbook and QNX Neutrino devices, and - requires the BlackBerry NDK or the QNX SDK to be installed on the - development PC. - \o \l{Connecting Android Devices} Qt applications for Android are compiled as \c {shared objects} that @@ -83,6 +53,36 @@ Android version 1.6, or later. You must install the Qt for Android SDK to develop for Android devices. + \o \l{Connecting Embedded Linux Devices} + + If you have a tool chain for building applications for embedded + Linux devices (with no MADDE support) installed on the development + PC, you can add it to \QC. Create device configurations and select + them in the \QC run settings. + + \o \l{Connecting Maemo Devices} + + Maemo 5 (Fremantle) is a Linux-based software platform developed by + Nokia and delivered on the Nokia N900. Use a connectivity tool (Mad + Developer) to create the device-side end point for USB and WLAN + connections. + + \o \l{Connecting MeeGo Harmattan Devices} + + MeeGo Harmattan is a Linux-based software platform developed by + Nokia and preinstalled on Nokia N950 and Nokia N9. It enables + developers to create applications using the Qt framework. + Use the SDK Connectivity tool that is preinstalled on the device to + create the device-side end point for USB and WLAN connections. + + \o \l{Connecting QNX Devices} + + You can connect QNX devices to the development PC to deploy, run and + debug applications on them from within \QC. This is currently only + supported for BlackBerry Playbook and QNX Neutrino devices, and + requires the BlackBerry NDK or the QNX SDK to be installed on the + development PC. + \endlist */ diff --git a/doc/src/projects/creator-projects-builds-customizing.qdoc b/doc/src/projects/creator-projects-builds-customizing.qdoc index 92d75271f0e..004e395e6af 100644 --- a/doc/src/projects/creator-projects-builds-customizing.qdoc +++ b/doc/src/projects/creator-projects-builds-customizing.qdoc @@ -25,7 +25,7 @@ /*! \contentspage index.html - \previouspage creator-developing-android.html + \previouspage creator-developing-qnx.html \page creator-build-process-customizing.html \nextpage creator-maemo-emulator.html diff --git a/doc/src/projects/creator-projects-running.qdoc b/doc/src/projects/creator-projects-running.qdoc index 69c678d4d69..29c9e775318 100644 --- a/doc/src/projects/creator-projects-running.qdoc +++ b/doc/src/projects/creator-projects-running.qdoc @@ -49,8 +49,8 @@ \input projects/creator-projects-running-simulator.qdocinc \if defined(qcmanual) - \input linux-mobile/creator-projects-running-madde.qdocinc \input linux-mobile/creator-projects-running-generic-linux.qdocinc + \input linux-mobile/creator-projects-running-madde.qdocinc \input qnx/creator-projects-running-qnx.qdocinc \endif diff --git a/doc/src/qnx/creator-deployment-qnx.qdoc b/doc/src/qnx/creator-deployment-qnx.qdoc index 47a307d206c..532af374c39 100644 --- a/doc/src/qnx/creator-deployment-qnx.qdoc +++ b/doc/src/qnx/creator-deployment-qnx.qdoc @@ -28,7 +28,7 @@ \contentspage index.html \previouspage creator-deployment-maemo.html \page creator-deployment-qnx.html - \nextpage creator-deploying-android.html + \nextpage creator-connecting-mobile.html \title Deploying Applications to QNX Devices diff --git a/doc/src/qnx/creator-developing-qnx.qdoc b/doc/src/qnx/creator-developing-qnx.qdoc index cae139766ff..60b2fb2ed1c 100644 --- a/doc/src/qnx/creator-developing-qnx.qdoc +++ b/doc/src/qnx/creator-developing-qnx.qdoc @@ -20,9 +20,9 @@ /*! \contentspage index.html - \previouspage creator-developing-maemo.html + \previouspage creator-developing-meego.html \page creator-developing-qnx.html - \nextpage creator-developing-android.html + \nextpage creator-build-process-customizing.html \title Connecting QNX Devices diff --git a/doc/src/qtcreator.qdoc b/doc/src/qtcreator.qdoc index d1752bcd353..c61a209b968 100644 --- a/doc/src/qtcreator.qdoc +++ b/doc/src/qtcreator.qdoc @@ -235,17 +235,18 @@ \o \l{Running on Multiple Targets} \o \l{Deploying to Mobile Devices} \list + \o \l{Deploying Applications to Android Devices} \o \l{Deploying Applications to Linux-Based Devices} \o \l{Deploying Applications to QNX Devices} - \o \l{Deploying Applications to Android Devices} \endlist \o \l{Connecting Mobile Targets} \list - \o \l{Connecting MeeGo Harmattan Devices} + \o \l{Connecting Android Devices} \o \l{Connecting Embedded Linux Devices} \o \l{Connecting Maemo Devices} + \o \l{Connecting MeeGo Harmattan Devices} \o \l{Connecting QNX Devices} - \o \l{Connecting Android Devices} + \endlist \o \l{Customizing the Build Process} \o \l{Using Maemo or MeeGo Harmattan Emulator} From ddb1c96650eb0264f27f32721e69436c1a8de6b6 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 7 Sep 2012 16:30:18 +0200 Subject: [PATCH 52/73] Add addToLayout()-method to KitConfigWidget. Provide default implementation to do a single-line layout and let the DebuggerKitConfigWidget span 3 rows, aligning label and button accordingly. Change-Id: I0fb3a3116a593822da9c4499c142b8a8255c02d0 Reviewed-by: Eike Ziller Reviewed-by: hjk --- .../debugger/debuggerkitconfigwidget.cpp | 7 ++++ .../debugger/debuggerkitconfigwidget.h | 1 + src/plugins/projectexplorer/kitconfigwidget.h | 15 +++++++ .../kitmanagerconfigwidget.cpp | 40 +++++++++++++------ 4 files changed, 50 insertions(+), 13 deletions(-) diff --git a/src/plugins/debugger/debuggerkitconfigwidget.cpp b/src/plugins/debugger/debuggerkitconfigwidget.cpp index 6060e470937..1c69314fa80 100644 --- a/src/plugins/debugger/debuggerkitconfigwidget.cpp +++ b/src/plugins/debugger/debuggerkitconfigwidget.cpp @@ -100,6 +100,13 @@ DebuggerKitConfigWidget::DebuggerKitConfigWidget(ProjectExplorer::Kit *k, connect(m_comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(refreshLabel())); } +void DebuggerKitConfigWidget::addToLayout(QGridLayout *layout, int row) +{ + addLabel(layout, row); + layout->addWidget(this, row, WidgetColumn, 3 , 1); + addButtonWidget(layout, row + 2); +} + QString DebuggerKitConfigWidget::displayName() const { return tr("Debugger:"); diff --git a/src/plugins/debugger/debuggerkitconfigwidget.h b/src/plugins/debugger/debuggerkitconfigwidget.h index a54ee648b8c..4884ff7bd76 100644 --- a/src/plugins/debugger/debuggerkitconfigwidget.h +++ b/src/plugins/debugger/debuggerkitconfigwidget.h @@ -69,6 +69,7 @@ public: void discard(); bool isDirty() const; QWidget *buttonWidget() const; + void addToLayout(QGridLayout *layout, int row); DebuggerEngineType engineType() const; void setEngineType(DebuggerEngineType et); diff --git a/src/plugins/projectexplorer/kitconfigwidget.h b/src/plugins/projectexplorer/kitconfigwidget.h index d48033dbc81..e8e141c8671 100644 --- a/src/plugins/projectexplorer/kitconfigwidget.h +++ b/src/plugins/projectexplorer/kitconfigwidget.h @@ -35,6 +35,8 @@ #include +QT_FORWARD_DECLARE_CLASS(QGridLayout) + namespace ProjectExplorer { // -------------------------------------------------------------------------- @@ -46,6 +48,12 @@ class PROJECTEXPLORER_EXPORT KitConfigWidget : public QWidget Q_OBJECT public: + enum LayoutColumns { + LabelColumn, + WidgetColumn, + ButtonColumn + }; + KitConfigWidget(QWidget *parent = 0) : QWidget(parent) { } @@ -57,8 +65,15 @@ public: virtual bool isDirty() const = 0; virtual QWidget *buttonWidget() const { return 0; } + + virtual void addToLayout(QGridLayout *layout, int row); + signals: void dirty(); + +protected: + void addLabel(QGridLayout *layout, int row); + void addButtonWidget(QGridLayout *layout, int row); }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp b/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp index 452127be962..66dd2845b3a 100644 --- a/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp +++ b/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp @@ -44,6 +44,32 @@ #include namespace ProjectExplorer { + +void KitConfigWidget::addToLayout(QGridLayout *layout, int row) +{ + addLabel(layout, row); + layout->addWidget(this, row, WidgetColumn); + addButtonWidget(layout, row); +} + +void KitConfigWidget::addLabel(QGridLayout *layout, int row) +{ + static const Qt::Alignment alignment + = static_cast(style()->styleHint(QStyle::SH_FormLayoutLabelAlignment)); + QLabel *label = new QLabel(displayName()); + label->setToolTip(toolTip()); + layout->addWidget(label, row, LabelColumn, alignment); +} + +void KitConfigWidget::addButtonWidget(QGridLayout *layout, int row) +{ + if (QWidget *button = buttonWidget()) { + if (button->toolTip().isEmpty()) + button->setToolTip(toolTip()); + layout->addWidget(button, row, ButtonColumn); + } +} + namespace Internal { KitManagerConfigWidget::KitManagerConfigWidget(Kit *k, QWidget *parent) : @@ -122,19 +148,7 @@ void KitManagerConfigWidget::addConfigWidget(ProjectExplorer::KitConfigWidget *w Q_ASSERT(!m_widgets.contains(widget)); connect(widget, SIGNAL(dirty()), this, SIGNAL(dirty())); - int row = m_layout->rowCount(); - QLabel *label = new QLabel(widget->displayName()); - label->setToolTip(widget->toolTip()); - m_layout->addWidget(label, row, 0, - Qt::Alignment(style()->styleHint(QStyle::SH_FormLayoutLabelAlignment))); - m_layout->addWidget(widget, row, 1); - QWidget *buttonWidget = widget->buttonWidget(); - if (buttonWidget) { - if (buttonWidget->toolTip().isEmpty()) - buttonWidget->setToolTip(widget->toolTip()); - m_layout->addWidget(widget->buttonWidget(), row, 2); - } - + widget->addToLayout(m_layout, m_layout->rowCount()); m_widgets.append(widget); } From f24c9865306624c2fc150d4bd262a5c4d5a3689a Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 5 Sep 2012 21:26:28 +0200 Subject: [PATCH 53/73] update size calculations for assignment statements this was forgotten when the value lists were extended by a size hint. Change-Id: I6f9b55ed671224a9b8735c8d937f94aac4a73a42 Reviewed-by: Daniel Teske --- src/shared/proparser/proitems.h | 1 + src/shared/proparser/qmakeparser.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/shared/proparser/proitems.h b/src/shared/proparser/proitems.h index b63af6c48b4..8e9d63e28d2 100644 --- a/src/shared/proparser/proitems.h +++ b/src/shared/proparser/proitems.h @@ -253,6 +253,7 @@ enum ProToken { TokRemove, // variable -= TokReplace, // variable ~= // previous literal/expansion is a variable manipulation + // - lower bound for expected output length (1) // - value expression + TokValueTerminator TokValueTerminator, // assignment value terminator TokLiteral, // literal string (fully dequoted) diff --git a/src/shared/proparser/qmakeparser.cpp b/src/shared/proparser/qmakeparser.cpp index 7d84a12dbd7..fc53721d316 100644 --- a/src/shared/proparser/qmakeparser.cpp +++ b/src/shared/proparser/qmakeparser.cpp @@ -266,12 +266,12 @@ bool QMakeParser::read(ProFile *pro, const QString &in, SubGrammar grammar) // Worst-case size calculations: // - line marker adds 1 (2-nl) to 1st token of each line // - empty assignment "A=":2 => - // TokHashLiteral(1) + hash(2) + len(1) + "A"(1) + TokAssign(1) + - // TokValueTerminator(1) == 7 (8) + // TokHashLiteral(1) + hash(2) + len(1) + "A"(1) + TokAssign(1) + 0(1) + + // TokValueTerminator(1) == 8 (9) // - non-empty assignment "A=B C":5 => - // TokHashLiteral(1) + hash(2) + len(1) + "A"(1) + TokAssign(1) + + // TokHashLiteral(1) + hash(2) + len(1) + "A"(1) + TokAssign(1) + 2(1) + // TokLiteral(1) + len(1) + "B"(1) + - // TokLiteral(1) + len(1) + "C"(1) + TokValueTerminator(1) == 13 (14) + // TokLiteral(1) + len(1) + "C"(1) + TokValueTerminator(1) == 14 (15) // - variable expansion: "$$f":3 => // TokVariable(1) + hash(2) + len(1) + "f"(1) = 5 // - function expansion: "$$f()":5 => From f626ea951e0278f33d350e6c4ca8e1cfd5a69451 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Fri, 7 Sep 2012 18:05:05 +0200 Subject: [PATCH 54/73] Fix typos Change-Id: Ia3e08a61dcc9856a50ae11134558873a34a767e7 Reviewed-by: Oswald Buddenhagen --- src/plugins/debugger/gdb/gdboptionspage.cpp | 2 +- src/plugins/qtsupport/baseqtversion.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/debugger/gdb/gdboptionspage.cpp b/src/plugins/debugger/gdb/gdboptionspage.cpp index 4535f5cdc46..10221d54359 100644 --- a/src/plugins/debugger/gdb/gdboptionspage.cpp +++ b/src/plugins/debugger/gdb/gdboptionspage.cpp @@ -196,7 +196,7 @@ GdbOptionsPageWidget::GdbOptionsPageWidget(QWidget *parent) checkBoxEnableReverseDebugging = new QCheckBox(groupBoxGeneral); checkBoxEnableReverseDebugging->setText(GdbOptionsPage::tr("Enable reverse debugging")); checkBoxEnableReverseDebugging->setToolTip(GdbOptionsPage::tr( - "

    Enable stepping backwards.

    <.p>" + "

    Enable stepping backwards.

    " "Note: This feature is very slow and unstable on the GDB side. " "It exhibits unpredictable behavior when going backwards over system " "calls and is very likely to destroy your debugging session.

    ")); diff --git a/src/plugins/qtsupport/baseqtversion.cpp b/src/plugins/qtsupport/baseqtversion.cpp index 3a71530e1dc..8fbc5e28748 100644 --- a/src/plugins/qtsupport/baseqtversion.cpp +++ b/src/plugins/qtsupport/baseqtversion.cpp @@ -318,7 +318,7 @@ QList BaseQtVersion::validateKit(const ProjectExplorer::K qtAbiString.append(qtAbi.toString()); } const QString message = QCoreApplication::translate("BaseQtVersion", - "The compiler'%1' (%2) cannot produce code for the Qt version '%3' (%4)."). + "The compiler '%1' (%2) cannot produce code for the Qt version '%3' (%4)."). arg(tc->displayName(), tc->targetAbi().toString(), version->displayName(), From 507334526ec61322244f8e3bc52d0e0d7d2c1cdc Mon Sep 17 00:00:00 2001 From: hjk Date: Sun, 9 Sep 2012 14:06:30 +0200 Subject: [PATCH 55/73] debugger: make 'Attach to Remote Server' port customizable again This was a regression after the target changes. Change-Id: I7dd382d741c64116afee418b12f8774dea4da70a Reviewed-by: hjk --- src/plugins/debugger/debuggerdialogs.cpp | 39 +++++++++++++++--------- src/plugins/debugger/debuggerdialogs.h | 2 -- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/plugins/debugger/debuggerdialogs.cpp b/src/plugins/debugger/debuggerdialogs.cpp index c98e66a05bb..50bd8e64384 100644 --- a/src/plugins/debugger/debuggerdialogs.cpp +++ b/src/plugins/debugger/debuggerdialogs.cpp @@ -88,6 +88,8 @@ class StartApplicationDialogPrivate { public: KitChooser *kitChooser; + QLabel *serverPortLabel; + QSpinBox *serverPortSpinBox; PathChooser *localExecutablePathChooser; FancyLineEdit *arguments; PathChooser *workingDirectory; @@ -157,6 +159,7 @@ public: bool operator!=(const StartApplicationParameters &p) const { return !equals(p); } Id kitId; + uint serverPort; QString localExecutable; QString processArgs; QString workingDirectory; @@ -174,6 +177,7 @@ StartApplicationParameters::StartApplicationParameters() : bool StartApplicationParameters::equals(const StartApplicationParameters &rhs) const { return localExecutable == rhs.localExecutable + && serverPort == rhs.serverPort && processArgs == rhs.processArgs && workingDirectory == rhs.workingDirectory && breakAtMain == rhs.breakAtMain @@ -205,6 +209,7 @@ QString StartApplicationParameters::displayName() const void StartApplicationParameters::toSettings(QSettings *settings) const { settings->setValue(_("LastProfileId"), kitId.toString()); + settings->setValue(_("LastServerPort"), serverPort); settings->setValue(_("LastExternalExecutable"), localExecutable); settings->setValue(_("LastExternalExecutableArguments"), processArgs); settings->setValue(_("LastExternalWorkingDirectory"), workingDirectory); @@ -218,6 +223,7 @@ void StartApplicationParameters::fromSettings(const QSettings *settings) { const QString kitIdString = settings->value(_("LastProfileId")).toString(); kitId = kitIdString.isEmpty() ? Id() : Id(kitIdString); + serverPort = settings->value(_("LastServerPort")).toUInt(); localExecutable = settings->value(_("LastExternalExecutable")).toString(); processArgs = settings->value(_("LastExternalExecutableArguments")).toString(); workingDirectory = settings->value(_("LastExternalWorkingDirectory")).toString(); @@ -244,6 +250,11 @@ StartApplicationDialog::StartApplicationDialog(QWidget *parent) d->localExecutablePathChooser->setPromptDialogTitle(tr("Select Executable")); d->localExecutablePathChooser->lineEdit()->setHistoryCompleter(QLatin1String("LocalExecutable")); + d->serverPortSpinBox = new QSpinBox(this); + d->serverPortSpinBox->setRange(1, 65535); + + d->serverPortLabel = new QLabel(tr("Server port:"), this); + d->arguments = new FancyLineEdit(this); d->arguments->setHistoryCompleter(QLatin1String("CommandlineArguments")); @@ -294,6 +305,7 @@ StartApplicationDialog::StartApplicationDialog(QWidget *parent) QFormLayout *formLayout = new QFormLayout(); formLayout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow); formLayout->addRow(tr("&Kit:"), d->kitChooser); + formLayout->addRow(d->serverPortLabel, d->serverPortSpinBox); formLayout->addRow(tr("Local &executable:"), d->localExecutablePathChooser); formLayout->addRow(tr("Command line &arguments:"), d->arguments); formLayout->addRow(tr("&Working directory:"), d->workingDirectory); @@ -334,12 +346,6 @@ void StartApplicationDialog::setHistory(const QList } } -void StartApplicationDialog::hideStartScript() -{ - d->serverStartScriptPathChooser->setVisible(false); - d->serverStartScriptLabel->setVisible(false); -} - void StartApplicationDialog::historyIndexChanged(int index) { if (index < 0) @@ -349,11 +355,6 @@ void StartApplicationDialog::historyIndexChanged(int index) setParameters(v.value()); } -Id StartApplicationDialog::kitId() const -{ - return d->kitChooser->currentKitId(); -} - void StartApplicationDialog::updateState() { bool okEnabled = d->localExecutablePathChooser->isValid(); @@ -362,6 +363,7 @@ void StartApplicationDialog::updateState() bool StartApplicationDialog::run(QWidget *parent, QSettings *settings, DebuggerStartParameters *sp) { + const bool attachRemote = sp->startMode == AttachToRemoteServer; const QString settingsGroup = QLatin1String("DebugMode"); const QString arrayName = QLatin1String("StartApplication"); @@ -383,8 +385,13 @@ bool StartApplicationDialog::run(QWidget *parent, QSettings *settings, DebuggerS StartApplicationDialog dialog(parent); dialog.setHistory(history); dialog.setParameters(history.back()); - if (sp->startMode == AttachToRemoteServer) - dialog.hideStartScript(); + if (attachRemote) { + dialog.d->serverStartScriptPathChooser->setVisible(false); + dialog.d->serverStartScriptLabel->setVisible(false); + } else { + dialog.d->serverPortSpinBox->setVisible(false); + dialog.d->serverPortLabel->setVisible(false); + } if (dialog.exec() != QDialog::Accepted) return false; @@ -407,6 +414,7 @@ bool StartApplicationDialog::run(QWidget *parent, QSettings *settings, DebuggerS QTC_ASSERT(kit && fillParameters(sp, kit), return false); sp->executable = newParameters.localExecutable; + sp->remoteChannel = sp->connParams.host + QLatin1Char(':') + QString::number(newParameters.serverPort); sp->displayName = newParameters.displayName(); sp->workingDirectory = newParameters.workingDirectory; sp->useTerminal = newParameters.runInTerminal; @@ -418,13 +426,15 @@ bool StartApplicationDialog::run(QWidget *parent, QSettings *settings, DebuggerS bool isLocal = DeviceKitInformation::device(kit)->type() == ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE; - sp->startMode = isLocal ? StartExternal : StartRemoteProcess; + if (!attachRemote) + sp->startMode = isLocal ? StartExternal : StartRemoteProcess; return true; } StartApplicationParameters StartApplicationDialog::parameters() const { StartApplicationParameters result; + result.serverPort = d->serverPortSpinBox->value(); result.localExecutable = d->localExecutablePathChooser->path(); result.serverStartScript = d->serverStartScriptPathChooser->path(); result.kitId = d->kitChooser->currentKitId(); @@ -439,6 +449,7 @@ StartApplicationParameters StartApplicationDialog::parameters() const void StartApplicationDialog::setParameters(const StartApplicationParameters &p) { d->kitChooser->setCurrentKitId(p.kitId); + d->serverPortSpinBox->setValue(p.serverPort); d->localExecutablePathChooser->setPath(p.localExecutable); d->serverStartScriptPathChooser->setPath(p.serverStartScript); d->debuginfoPathChooser->setPath(p.debugInfoLocation); diff --git a/src/plugins/debugger/debuggerdialogs.h b/src/plugins/debugger/debuggerdialogs.h index a0e5c251e9f..1273718ad45 100644 --- a/src/plugins/debugger/debuggerdialogs.h +++ b/src/plugins/debugger/debuggerdialogs.h @@ -96,8 +96,6 @@ private: StartApplicationParameters parameters() const; void setParameters(const StartApplicationParameters &p); void setHistory(const QList &l); - void hideStartScript(); - Core::Id kitId() const; StartApplicationDialogPrivate *d; }; From a131793f517454c6dedfa33926b1012dbc36a839 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sun, 9 Sep 2012 09:28:18 +0300 Subject: [PATCH 56/73] Search: Allow empty prefix for completer Change-Id: Ia3a77c4512c03496cac492d401c2bff3eee7a980 Reviewed-by: Eike Ziller --- src/plugins/find/findtoolwindow.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/find/findtoolwindow.cpp b/src/plugins/find/findtoolwindow.cpp index f37d4593b52..ba57dd35b7d 100644 --- a/src/plugins/find/findtoolwindow.cpp +++ b/src/plugins/find/findtoolwindow.cpp @@ -105,6 +105,8 @@ bool FindToolWindow::eventFilter(QObject *obj, QEvent *event) if (obj == m_ui.searchTerm && event->type() == QEvent::KeyPress) { QKeyEvent *ke = static_cast(event); if (ke->key() == Qt::Key_Down) { + if (m_ui.searchTerm->text().isEmpty()) + m_findCompleter->setCompletionPrefix(QString()); m_findCompleter->complete(); } } From da70f19ba0153cd9e793decaa122ddf32ab0ae89 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 10 Sep 2012 08:58:34 +0200 Subject: [PATCH 57/73] Version bump. Change-Id: If3c1355c49d0447a012c034cc4ff05a80a604767 --- qtcreator.pri | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qtcreator.pri b/qtcreator.pri index 9c8dbd59214..97f5aa3628b 100644 --- a/qtcreator.pri +++ b/qtcreator.pri @@ -1,7 +1,7 @@ !isEmpty(QTCREATOR_PRI_INCLUDED):error("qtcreator.pri already included") QTCREATOR_PRI_INCLUDED = 1 -QTCREATOR_VERSION = 2.5.81 +QTCREATOR_VERSION = 2.5.82 defineReplace(cleanPath) { win32:1 ~= s|\\\\|/|g From beb6bf29722dcda0c51ef40a7d2368a08852b9c1 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sun, 9 Sep 2012 15:55:29 +0300 Subject: [PATCH 58/73] SettingsAccessor: Read pro.shared file Task-number: QTCREATORBUG-7850 Change-Id: I20776c9dc1003dd089e0d5d85b63372d8e68e900 Reviewed-by: Daniel Teske --- src/plugins/projectexplorer/settingsaccessor.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/plugins/projectexplorer/settingsaccessor.cpp b/src/plugins/projectexplorer/settingsaccessor.cpp index 73d82bba70e..19c04d978ee 100644 --- a/src/plugins/projectexplorer/settingsaccessor.cpp +++ b/src/plugins/projectexplorer/settingsaccessor.cpp @@ -657,6 +657,10 @@ QVariantMap SettingsAccessor::restoreSettings() const // Time to consider shared settings... SettingsData sharedSettings; + fn = project()->property(m_sharedFileAcessor.id()).toString(); + if (fn.isEmpty()) + fn = project()->document()->fileName() + m_sharedFileAcessor.suffix(); + sharedSettings.m_fileName = Utils::FileName::fromString(fn); if (!sharedSettings.m_fileName.isEmpty() && m_sharedFileAcessor.readFile(&sharedSettings)) { bool useSharedSettings = true; if (sharedSettings.m_version != settings.m_version) { From b17e944d4bbff3cce7a9a2e9aab7e8b910ca8ad8 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 7 Sep 2012 15:20:09 +0200 Subject: [PATCH 59/73] Fix freeze when clearing search results while doing a search in search By fixing a deadlock in aggregate destructor. Task-number: QTCREATORBUG-7757 Change-Id: I6dffb06a92fb57b23a38b26b1528aed9f9f9d5da Reviewed-by: Daniel Teske --- src/libs/aggregation/aggregate.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/libs/aggregation/aggregate.cpp b/src/libs/aggregation/aggregate.cpp index 5af6c1a189f..42784faf8e9 100644 --- a/src/libs/aggregation/aggregate.cpp +++ b/src/libs/aggregation/aggregate.cpp @@ -203,14 +203,18 @@ Aggregate::Aggregate(QObject *parent) */ Aggregate::~Aggregate() { - QWriteLocker locker(&lock()); - foreach (QObject *component, m_components) { - disconnect(component, SIGNAL(destroyed(QObject*)), this, SLOT(deleteSelf(QObject*))); - aggregateMap().remove(component); + QList components; + { + QWriteLocker locker(&lock()); + foreach (QObject *component, m_components) { + disconnect(component, SIGNAL(destroyed(QObject*)), this, SLOT(deleteSelf(QObject*))); + aggregateMap().remove(component); + } + components = m_components; + m_components.clear(); + aggregateMap().remove(this); } - qDeleteAll(m_components); - m_components.clear(); - aggregateMap().remove(this); + qDeleteAll(components); } void Aggregate::deleteSelf(QObject *obj) From 0df593353953614e2657b5ddb6f31e1b2e9bcd49 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Mon, 10 Sep 2012 10:39:16 +0200 Subject: [PATCH 60/73] QmlJS indenter: Fix wrong indentation after list<> typed properties. Task-number: QTCREATORBUG-7726 Change-Id: If709a9a71cfed69e2f14af92c114f79d11d03145 Reviewed-by: Thomas Hartmann --- src/libs/qmljs/qmljscodeformatter.cpp | 8 ++++---- src/libs/qmljs/qmljscodeformatter.h | 4 ++-- .../qmlcodeformatter/tst_qmlcodeformatter.cpp | 16 ++++++++++++++++ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/libs/qmljs/qmljscodeformatter.cpp b/src/libs/qmljs/qmljscodeformatter.cpp index 1a6d853a931..7eddf86e2b1 100644 --- a/src/libs/qmljs/qmljscodeformatter.cpp +++ b/src/libs/qmljs/qmljscodeformatter.cpp @@ -198,18 +198,18 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block) switch (kind) { case Colon: enter(binding_assignment); break; // oops, was a binding case Var: - case Identifier: enter(property_type); break; + case Identifier: enter(property_name); break; case List: enter(property_list_open); break; default: leave(true); continue; } break; - case property_type: + case property_name: turnInto(property_maybe_initializer); break; case property_list_open: if (m_currentLine.midRef(m_currentToken.begin(), m_currentToken.length) == QLatin1String(">")) - turnInto(property_maybe_initializer); + turnInto(property_name); break; case property_maybe_initializer: @@ -939,7 +939,7 @@ CodeFormatter::TokenKind CodeFormatter::extendedTokenKind(const QmlJS::Token &to if (text == "on") return On; if (text == "list") - return On; + return List; } else if (kind == Keyword) { const QChar char1 = text.at(0); const QChar char2 = text.at(1); diff --git a/src/libs/qmljs/qmljscodeformatter.h b/src/libs/qmljs/qmljscodeformatter.h index ff964280b83..22bf926a78d 100644 --- a/src/libs/qmljs/qmljscodeformatter.h +++ b/src/libs/qmljs/qmljscodeformatter.h @@ -110,9 +110,9 @@ public: // must be public to make Q_GADGET introspection work property_start, // after 'property' default_property_start, // after 'default' - property_type, // after first identifier property_list_open, // after 'list' as a type - property_maybe_initializer, // after + property_name, // after the type + property_maybe_initializer, // after the identifier signal_start, // after 'signal' signal_maybe_arglist, // after identifier diff --git a/tests/auto/qml/qmleditor/qmlcodeformatter/tst_qmlcodeformatter.cpp b/tests/auto/qml/qmleditor/qmlcodeformatter/tst_qmlcodeformatter.cpp index a6a0cb3ed01..3c9ace21b88 100644 --- a/tests/auto/qml/qmleditor/qmlcodeformatter/tst_qmlcodeformatter.cpp +++ b/tests/auto/qml/qmleditor/qmlcodeformatter/tst_qmlcodeformatter.cpp @@ -108,6 +108,7 @@ private Q_SLOTS: void multilineString(); void bug1(); void bug2(); + void bug3(); }; enum { DontCheck = -2, DontIndent = -1 }; @@ -1557,6 +1558,21 @@ void tst_QMLCodeFormatter::bug2() checkIndent(data); } +void tst_QMLCodeFormatter::bug3() +{ + QList data; + data << Line("Item {") + << Line(" property list foo") + << Line(" function f() {") + << Line(" if (1 > 0) {") + << Line(" foo = 1") + << Line(" }") + << Line(" }") + << Line("}") + ; + checkIndent(data); +} + QTEST_APPLESS_MAIN(tst_QMLCodeFormatter) #include "tst_qmlcodeformatter.moc" From 99d2a158c1801957a5f20125689954eb39a6fa6f Mon Sep 17 00:00:00 2001 From: Daniel Teske Date: Mon, 10 Sep 2012 11:21:09 +0200 Subject: [PATCH 61/73] QtVersion: Fix incorrect check for installation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTCREATORBUG-7847 Change-Id: I0af0c02b2ab04a82def5d0e9a1baee0d95919a16 Reviewed-by: Oswald Buddenhagen Reviewed-by: Loïc Yhuel Reviewed-by: Daniel Teske --- src/plugins/qtsupport/baseqtversion.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/plugins/qtsupport/baseqtversion.cpp b/src/plugins/qtsupport/baseqtversion.cpp index 8fbc5e28748..95d5daefbea 100644 --- a/src/plugins/qtsupport/baseqtversion.cpp +++ b/src/plugins/qtsupport/baseqtversion.cpp @@ -886,8 +886,9 @@ void BaseQtVersion::updateVersionInfo() const } // Now check for a qt that is configured with a prefix but not installed - if (!qtInstallBins.isNull()) { - QFileInfo fi(qtInstallBins); + QString installDir = qmakeProperty("QT_HOST_BINS"); + if (!installDir.isNull()) { + QFileInfo fi(installDir); if (!fi.exists()) m_installed = false; } From 615f7900d3e85e3ae118a853d8cacb91b14080b7 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Mon, 10 Sep 2012 15:47:47 +0200 Subject: [PATCH 62/73] Removed pointless numerus form Change-Id: Ia40a01f985499389c04307336d6f480d3c1788a9 Reviewed-by: hjk --- src/plugins/debugger/breakwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/debugger/breakwindow.cpp b/src/plugins/debugger/breakwindow.cpp index 83ca9bf359b..877c0575668 100644 --- a/src/plugins/debugger/breakwindow.cpp +++ b/src/plugins/debugger/breakwindow.cpp @@ -151,7 +151,7 @@ BreakpointDialog::BreakpointDialog(BreakpointModelId id, QWidget *parent) : QDialog(parent), m_enabledParts(~0), m_previousType(UnknownType), m_firstTypeChange(true) { - setWindowTitle(tr("Edit Breakpoint Properties", 0, QApplication::UnicodeUTF8)); + setWindowTitle(tr("Edit Breakpoint Properties")); QGroupBox *groupBoxBasic = new QGroupBox(tr("Basic"), this); From 66a19cc457f472013cfb442904e2ce9d532c4d54 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Mon, 10 Sep 2012 15:51:55 +0200 Subject: [PATCH 63/73] Changes: Mention merging of QmlJSInspector into Debugger plugin Change-Id: I5e04b0f24c56427e30e380e844729ca98111f1e2 Reviewed-by: Leena Miettinen --- dist/changes-2.6.0 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dist/changes-2.6.0 b/dist/changes-2.6.0 index 18920d8c85d..70ea4999b64 100644 --- a/dist/changes-2.6.0 +++ b/dist/changes-2.6.0 @@ -52,6 +52,10 @@ Debugging * Made all views searchable (Ctrl+F) Debugging QML/JS + * Merged the (experimental) QML/JS Inspector plugin into the Debugger: + * Added the QML object tree to the Expressions window + * Added Console window to evaluate JS expressions at runtime + * Added QML specific buttons to the toolbar Analyzing Code From d34f44f460660b4b8afb6d00faddc0a479fb9716 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 10 Sep 2012 23:57:52 +0200 Subject: [PATCH 64/73] debugger: fix display of signed data in arrays This was a regression introduced with the block dumping for arrays. Change-Id: I9684fafeb27a9268a2558557f76d1092136975a4 Reviewed-by: hjk --- share/qtcreator/dumper/dumper.py | 32 +++++++++++++++++++++-------- src/plugins/debugger/watchutils.cpp | 18 +++++++++++++--- src/plugins/debugger/watchutils.h | 8 ++++++-- 3 files changed, 44 insertions(+), 14 deletions(-) diff --git a/share/qtcreator/dumper/dumper.py b/share/qtcreator/dumper/dumper.py index 782f9cd3d7e..c9d826e5b30 100644 --- a/share/qtcreator/dumper/dumper.py +++ b/share/qtcreator/dumper/dumper.py @@ -69,9 +69,13 @@ Hex2EncodedInt1, \ Hex2EncodedInt2, \ Hex2EncodedInt4, \ Hex2EncodedInt8, \ +Hex2EncodedUInt1, \ +Hex2EncodedUInt2, \ +Hex2EncodedUInt4, \ +Hex2EncodedUInt8, \ Hex2EncodedFloat4, \ Hex2EncodedFloat8 \ - = range(23) + = range(27) # Display modes StopDisplay, \ @@ -498,14 +502,24 @@ def simpleEncoding(typeobj): if code == BoolCode or code == CharCode: return Hex2EncodedInt1 if code == IntCode: - if typeobj.sizeof == 1: - return Hex2EncodedInt1 - if typeobj.sizeof == 2: - return Hex2EncodedInt2 - if typeobj.sizeof == 4: - return Hex2EncodedInt4 - if typeobj.sizeof == 8: - return Hex2EncodedInt8 + if str(typeobj).find("unsigned") >= 0: + if typeobj.sizeof == 1: + return Hex2EncodedUInt1 + if typeobj.sizeof == 2: + return Hex2EncodedUInt2 + if typeobj.sizeof == 4: + return Hex2EncodedUInt4 + if typeobj.sizeof == 8: + return Hex2EncodedUInt8 + else: + if typeobj.sizeof == 1: + return Hex2EncodedInt1 + if typeobj.sizeof == 2: + return Hex2EncodedInt2 + if typeobj.sizeof == 4: + return Hex2EncodedInt4 + if typeobj.sizeof == 8: + return Hex2EncodedInt8 if code == FloatCode: if typeobj.sizeof == 4: return Hex2EncodedFloat4 diff --git a/src/plugins/debugger/watchutils.cpp b/src/plugins/debugger/watchutils.cpp index 7767dd33f2a..bada2a9b2c7 100644 --- a/src/plugins/debugger/watchutils.cpp +++ b/src/plugins/debugger/watchutils.cpp @@ -725,15 +725,27 @@ void decodeArray(QList *list, const WatchData &tmplate, { switch (encoding) { case Hex2EncodedInt1: - decodeArrayHelper(list, tmplate, rawData); + decodeArrayHelper(list, tmplate, rawData); break; case Hex2EncodedInt2: - decodeArrayHelper(list, tmplate, rawData); + decodeArrayHelper(list, tmplate, rawData); break; case Hex2EncodedInt4: - decodeArrayHelper(list, tmplate, rawData); + decodeArrayHelper(list, tmplate, rawData); break; case Hex2EncodedInt8: + decodeArrayHelper(list, tmplate, rawData); + break; + case Hex2EncodedUInt1: + decodeArrayHelper(list, tmplate, rawData); + break; + case Hex2EncodedUInt2: + decodeArrayHelper(list, tmplate, rawData); + break; + case Hex2EncodedUInt4: + decodeArrayHelper(list, tmplate, rawData); + break; + case Hex2EncodedUInt8: decodeArrayHelper(list, tmplate, rawData); break; case Hex2EncodedFloat4: diff --git a/src/plugins/debugger/watchutils.h b/src/plugins/debugger/watchutils.h index b62854cdb10..77938ecef31 100644 --- a/src/plugins/debugger/watchutils.h +++ b/src/plugins/debugger/watchutils.h @@ -75,8 +75,12 @@ enum DebuggerEncoding Hex2EncodedInt2 = 18, Hex2EncodedInt4 = 19, Hex2EncodedInt8 = 20, - Hex2EncodedFloat4 = 21, - Hex2EncodedFloat8 = 22 + Hex2EncodedUInt1 = 21, + Hex2EncodedUInt2 = 22, + Hex2EncodedUInt4 = 23, + Hex2EncodedUInt8 = 24, + Hex2EncodedFloat4 = 25, + Hex2EncodedFloat8 = 26 }; bool isEditorDebuggable(Core::IEditor *editor); From e16eb7ea432b7127f12e73bc5a06f6cb1017cad3 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Mon, 10 Sep 2012 20:39:21 +0200 Subject: [PATCH 65/73] Removed unneeded and mistyped HTML Change-Id: I49f50fc213b88af478c1411933630eb705898c23 Reviewed-by: Friedemann Kleint --- src/plugins/debugger/shared/cdbsymbolpathlisteditor.cpp | 2 +- tests/system/shared/debugger.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/debugger/shared/cdbsymbolpathlisteditor.cpp b/src/plugins/debugger/shared/cdbsymbolpathlisteditor.cpp index badcf37c119..eea4c1eb6c1 100644 --- a/src/plugins/debugger/shared/cdbsymbolpathlisteditor.cpp +++ b/src/plugins/debugger/shared/cdbsymbolpathlisteditor.cpp @@ -185,7 +185,7 @@ bool CdbSymbolPathListEditor::promptToAddSymbolServer(const QString &settingsGro "for retrieval of the symbols of the operating system libraries.

    " "

    Note: A fast internet connection is required for this to work smoothly. Also, a delay " "might occur when connecting for the first time.

    " - "

    Would you like to set it up?


    " + "

    Would you like to set it up?

    " "").arg(symServUrl); const QDialogButtonBox::StandardButton answer = Utils::CheckableMessageBox::question(Core::ICore::mainWindow(), tr("Symbol Server"), msg, diff --git a/tests/system/shared/debugger.py b/tests/system/shared/debugger.py index 6432550d94e..1472835b541 100644 --- a/tests/system/shared/debugger.py +++ b/tests/system/shared/debugger.py @@ -9,7 +9,7 @@ def handleDebuggerWarnings(config): "This is recommended for retrieval of the symbols of the operating system libraries.

    " "

    Note: A fast internet connection is required for this to work smoothly. " "Also, a delay might occur when connecting for the first time.

    " - "

    Would you like to set it up?


    ") + "

    Would you like to set it up?

    ") if popup.text == symServerNotConfiged: test.log("Creator warned about the debugger not being configured to use the public Microsoft Symbol Server.") else: From d21c7650d56977cccc83b82ef1d73efcb1af890a Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 11 Sep 2012 09:54:18 +0200 Subject: [PATCH 66/73] Populate Kit Chooser in Analyzer dialog. Task-number: QTCREATORBUG-7857 Change-Id: I9ad560b1cf915e7167b413b697cbf7b89c1f8074 Reviewed-by: Orgad Shaneh --- src/plugins/analyzerbase/startremotedialog.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/analyzerbase/startremotedialog.cpp b/src/plugins/analyzerbase/startremotedialog.cpp index 5dfa8d51b74..6b66f7a0b4f 100644 --- a/src/plugins/analyzerbase/startremotedialog.cpp +++ b/src/plugins/analyzerbase/startremotedialog.cpp @@ -92,6 +92,7 @@ StartRemoteDialog::StartRemoteDialog(QWidget *parent) QSettings *settings = Core::ICore::settings(); settings->beginGroup(QLatin1String("AnalyzerStartRemoteDialog")); QString kit = settings->value(QLatin1String("profile")).toString(); + d->kitChooser->populate(); d->kitChooser->setCurrentKitId(Core::Id(kit)); d->executable->setText(settings->value(QLatin1String("executable")).toString()); d->workingDirectory->setText(settings->value(QLatin1String("workingDirectory")).toString()); From 6063113779aa4ba54160d699ac1640b6128fbfc9 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Tue, 11 Sep 2012 10:49:52 +0200 Subject: [PATCH 67/73] changes-2.6.0: Fix name Change-Id: I031e9be42f111450b6a66509d158d0ef92f8d8f9 Reviewed-by: Eike Ziller --- dist/changes-2.6.0 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/changes-2.6.0 b/dist/changes-2.6.0 index 70ea4999b64..23a47ff527d 100644 --- a/dist/changes-2.6.0 +++ b/dist/changes-2.6.0 @@ -158,7 +158,7 @@ Credits go to: Jonathan Liu Juhapekka Piiroinen Kaffeine - Kai Koehne + Kai Köhne kh1 Konstantin Ritt Konstantin Tokarev From d9f3a86461330e1465a1bf9436b6031e7fb6a109 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Mon, 10 Sep 2012 16:37:01 +0200 Subject: [PATCH 68/73] QmlJSEditor: Use for .qmltypes Make sure that the QML editor is used for .qmltypes files. Change-Id: Ib9c8e497160ec9dc63eebd56485388c4b97635de Reviewed-by: Eike Ziller --- src/plugins/qmljseditor/QmlJSEditor.mimetypes.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/qmljseditor/QmlJSEditor.mimetypes.xml b/src/plugins/qmljseditor/QmlJSEditor.mimetypes.xml index a46ab5ed42b..6c17c146890 100644 --- a/src/plugins/qmljseditor/QmlJSEditor.mimetypes.xml +++ b/src/plugins/qmljseditor/QmlJSEditor.mimetypes.xml @@ -6,6 +6,7 @@ QML file + From 0983e67fd11fda256858b01b9d8e397c6ee3c0d5 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 11 Sep 2012 08:31:14 +0200 Subject: [PATCH 69/73] Update German translation after Kit renaming for 2.6 Beta. Change-Id: Ib6bd46e66eb0d44a9e710f884537d6b85b23f1b9 Reviewed-by: Robert Loehning --- share/qtcreator/translations/qtcreator_de.ts | 4005 ++++++++---------- 1 file changed, 1722 insertions(+), 2283 deletions(-) diff --git a/share/qtcreator/translations/qtcreator_de.ts b/share/qtcreator/translations/qtcreator_de.ts index c6c2b81fd48..8f4b74be113 100644 --- a/share/qtcreator/translations/qtcreator_de.ts +++ b/share/qtcreator/translations/qtcreator_de.ts @@ -2200,10 +2200,6 @@ Weiterführende Informationen befinden sich in /etc/sysctl.d/10-ptrace.conf Select Executable Ausführbare Datei auswählen - - Target: - Ziel: - Core file: Core-Datei: @@ -2220,6 +2216,10 @@ Weiterführende Informationen befinden sich in /etc/sysctl.d/10-ptrace.conf Select Startup Script Startskript auswählen + + Kit: + Kit: + &Executable: &Ausführbare Datei: @@ -2229,47 +2229,6 @@ Weiterführende Informationen befinden sich in /etc/sysctl.d/10-ptrace.conf Startskript &überschreiben: - - Debugger::Internal::AttachExternalDialog - - Process ID - Prozess-ID - - - Name - Name - - - State - Status - - - Refresh - Aktualisieren - - - &Target: - &Ziel: - - - Process Already Under Debugger Control - Prozess bereits unter Debugger-Kontrolle - - - The process %1 is already under the control of a debugger. -Qt Creator cannot attach to it. - Der Prozess %1 wird bereits von einem Debugger kontrolliert. -Qt Creator kann sich nicht anhängen. - - - Start Debugger - Debugger starten - - - Attach to &process ID: - &Prozess-ID: - - Debugger::Internal::BreakHandler @@ -2565,6 +2524,14 @@ Qt Creator kann sich nicht anhängen. Correct breakpoint location Positionen der Haltepunkte korrigieren + + Break on functions: + Halte bei Erreichen von Funktionen: + + + This is useful to catch runtime error messages, for example caused by assert(). + Damit können Laufzeit-Fehlermeldungen abgefangen werden, zum Beispiel bei assert(). + Debugger::Internal::CdbSymbolPathListEditor @@ -2577,8 +2544,8 @@ Qt Creator kann sich nicht anhängen. Fügt den von Microsoft betriebenen Symbol-Server hinzu, der die Symbole für die Bibliotheken des Betriebssystems bereitstellt. Erfordert die Angabe eines lokalen Cache-Verzeichnisses. - <html><head/><body><p>The debugger is not configured to use the public <a href="%1">Microsoft Symbol Server</a>. This is recommended for retrieval of the symbols of the operating system libraries.</p><p><i>Note:</i> A fast internet connection is required for this to work smoothly. Also, a delay might occur when connecting for the first time.</p><p>Would you like to set it up?</p></br></body></html> - <html><head/><body><p>Der Debugger ist nicht zur Benutzung des öffentlichen <a href="%1">Microsoft Symbol Servers</a> eingerichtet. Dies wird zur Anzeige der Symbole der Betriebssystem-Bibliotheken empfohlen.</p><p><i>Hinweis:</i> Eine schnelle Internetverbindung ist erforderlich. Beim ersten Start können Verzögerungen auftreten.</p><p>Möchten Sie den Symbol Server einrichten?</p></br></body></html> + <html><head/><body><p>The debugger is not configured to use the public <a href="%1">Microsoft Symbol Server</a>. This is recommended for retrieval of the symbols of the operating system libraries.</p><p><i>Note:</i> A fast internet connection is required for this to work smoothly. Also, a delay might occur when connecting for the first time.</p><p>Would you like to set it up?</p></body></html> + <html><head/><body><p>Der Debugger ist nicht zur Benutzung des öffentlichen <a href="%1">Microsoft Symbol Servers</a> eingerichtet. Dies wird zur Anzeige der Symbole der Betriebssystem-Bibliotheken empfohlen.</p><p><i>Hinweis:</i> Eine schnelle Internetverbindung ist erforderlich. Beim ersten Start können Verzögerungen auftreten.</p><p>Möchten Sie den Symbol Server einrichten?</p></body></html> Symbol Server @@ -3193,10 +3160,6 @@ Abschnitt %1: %2 Disassembler failed: %1 Fehler beim Disassemblieren: %1 - - The gdb location must be given as an absolute path in the debugger settings (%1). - Es muss ein absoluter Pfad für die ausführbare gdb-Datei in den Debugger-Einstellungen angegeben werden (%1). - The gdb process terminated. Der gdb-Prozess wurde beendet. @@ -3232,14 +3195,6 @@ Abschnitt %1: %2 GDB timeout: GDB-Zeitlimit: - - This is the number of seconds Qt Creator will wait before -it terminates a non-responsive GDB process. The default value of 20 seconds -should be sufficient for most applications, but there are situations when -loading big libraries or listing source files takes much longer than that -on slow machines. In this case, the value should be increased. - Anzahl der Sekunden, die Qt Creator abwartet, bevor GDB-Prozesse abgebrochen werden, die nicht mehr reagieren. Die Vorgabe von 20 Sekunden sollte für die meisten Anwendungsfälle ausreichen, aber es können Situationen auftreten, in denen das Laden großer Bibliotheken oder das Auflisten der Quelldateien viel länger dauert (auf langsamen Maschinen). In diesem Falle sollte der Wert erhöht werden. - sec s @@ -3248,22 +3203,10 @@ on slow machines. In this case, the value should be increased. Skip known frames when stepping Bekannte Stellen beim Einzelschritt überspringen - - Allows 'Step Into' to compress several steps into one step -for less noisy debugging. For example, the atomic reference -counting code is skipped, and a single 'Step Into' for a signal -emission ends up directly in the slot connected to it. - Diese Option bewirkt, dass 'Einzelschritt in' in bestimmten Situationen mehrere Schritte zusammenfasst, was das Debuggen beschleunigt. Zum Beispiel wird der Code des atomaren Referenzzählung übersprungen; und bei der Emission eines Signals gelangt man direkt zum verbundenen Slot. - Show a message box when receiving a signal Empfang eines Signals durch Dialogbox anzeigen - - This will show a message box as soon as your application -receives a signal like SIGSEGV during debugging. - Zeigt ein Benachrichtigungsfenster an, wenn die Anwendung während des Debuggens ein Signal wie SIGSEGV erhält. - Adjust breakpoint locations Positionen der Haltepunkte korrigieren @@ -3281,15 +3224,35 @@ markers in the source code editor. Dynamischen Objekttyp in Anzeige verwenden - This specifies whether the dynamic or the static type of objects will bedisplayed. Choosing the dynamic type might be slower. - Gibt an, ob der dynamische oder statische Typ eines Objekts angezeigt wird. Die Bestimmung des dynamische Typs kann länger dauern. + Specifies whether the dynamic or the static type of objects will be displayed. Choosing the dynamic type might be slower. + Gibt an, ob der dynamische oder statische Typ eines Objekts angezeigt wird. Dynamische Typen könnten langsamer sein. Load .gdbinit file on startup Datei .gdbinit zu Beginn laden - This allows or inhibits reading the user's default + The number of seconds Qt Creator will wait before it terminates +a non-responsive GDB process. The default value of 20 seconds should +be sufficient for most applications, but there are situations when +loading big libraries or listing source files takes much longer than +that on slow machines. In this case, the value should be increased. + Anzahl der Sekunden, die Qt Creator abwartet, bevor GDB-Prozesse abgebrochen werden, die nicht mehr reagieren. Die Vorgabe von 20 Sekunden sollte für die meisten Anwendungsfälle ausreichen, aber es können Situationen auftreten, in denen das Laden großer Bibliotheken oder das Auflisten der Quelldateien viel länger dauert (auf langsamen Maschinen). In diesem Fall sollte der Wert erhöht werden. + + + <html><head/><body><p>Allows <i>Step Into</i> to compress several steps into one step +for less noisy debugging. For example, the atomic reference +counting code is skipped, and a single <i>Step Into</i> for a signal +emission ends up directly in the slot connected to it. + <html><head/><body><p>Diese Option bewirkt, dass <i>Einzelschritt herein</i> in bestimmten Situationen mehrere Schritte zusammenfasst, was das Debuggen beschleunigt. Zum Beispiel wird der Code der atomaren Referenzzählung übersprungen und bei der Emission eines Signals gelangt man direkt zum verbundenen Slot. + + + Displays a message box as soon as your application +receives a signal like SIGSEGV during debugging. + Zeigt ein Benachrichtigungsfenster an, wenn die Anwendung während des Debuggens ein Signal wie SIGSEGV erhält. + + + Allows or inhibits reading the user's default .gdbinit file on debugger startup. Gestattet oder unterdrückt das Lesen der Vorgabe-.gdbinit-Datei des Nutzers beim Starten des Debuggers. @@ -3305,6 +3268,10 @@ markers in the source code editor. The options below should be used with care. Die untenstehenden Einstellungen sollten mit Vorsicht verwendet werden. + + <html><head/><body>The options below give access to advanced or experimental functions of GDB. Enabling them may negatively impact your debugging experience.</body></html> + <html><head/><body>Die untenstehenden Einstellungen betreffen spezielle oder experimentelle Funktionalität von GDB. Ihre Verwendung kann das Debuggen negativ beeinflussen.</body></html> + Use asynchronous mode to control the inferior Asynchronen Modus zur Steuerung des zu debuggenden Prozesses verwenden @@ -3314,42 +3281,33 @@ markers in the source code editor. Verwende Standardpfade zu Debug-Information - This adds common paths to locations of debug information -at debugger startup. - Fügt einige Standardpfade zu Debug-Information beim Starten des Debugger hinzu. + <html><head/><body>Add common paths to locations of debug information such as <i>/usr/src/debug</i> when starting GDB.</body></html> + <html><head/><body>Stelle beim Start von GDB bekannte Pfade (wie <i>/usr/src/debug</i>) der Debuginformation voran.</body></html> - Stop when a qWarning is issued - Bei qWarning anhalten - - - Stop when a qFatal is issued - Bei qFatal anhalten - - - Stop when abort() is called - Bei Aufruf von abort() anhalten + <html><head/><body>Postpone reading debug information as long as possible. This can result in faster startup times at the price of not being able to set breakpoints by file and number.</body></html> + <html><head/><body>Diese Einstellung bewirkt, dass das Lesen der Debug-Information solange wie möglich verzögert wird. Das beschleunigt den Start, kann aber das Setzen von Haltepunkten mit Dateiname und Zeilennummer verhindern.</body></html> Enable reverse debugging Rückwärts Debuggen aktivieren - <html><head/><body><p>Selecting this enables reverse debugging.</p><.p><b>Note:</b> This feature is very slow and unstable on the GDB side.It exhibits unpredictable behavior when going backwards over system calls and is very likely to destroy your debugging session.</p><body></html> - <html><head/><body><p>Rückwärts-Debuggen aktivieren. Hinweis: Diese Funktionalität ist sehr instabil und langsam auf der GDB-Seite. Es kann unvorhersehbares Verhalten auftreten, wenn man rückwärts über einen Systemaufruf geht, und die Debugger-Sitzung kann leicht zerstört werden.</p><body></html> + <html><head/><body><p>Enable stepping backwards.</p><p><b>Note:</b> This feature is very slow and unstable on the GDB side. It exhibits unpredictable behavior when going backwards over system calls and is very likely to destroy your debugging session.</p></body></html> + <html><head/><body><p>Rückwärts-Debuggen aktivieren.</p><p><b>Hinweis:</b> Diese Funktionalität ist sehr instabil und langsam auf der GDB-Seite. Es kann unvorhersehbares Verhalten auftreten, wenn man rückwärts über einen Systemaufruf springt, und die Debugger-Sitzung kann leicht zerstört werden.</p></body></html> Attempt quick start Schnellstart versuchen - - Checking this option will postpone reading debug information as long as possible. This can result in faster startup times at the price of not being able to set breakpoints by file and number. - Diese Einstellung bewirkt, dass das Lesen der Debug-Information solange wie möglich verzögert wird. Das beschleunigt den Start, kann aber das Setzen von Haltepunkten mit Dateiname und Zeilennummer verhindern. - Additional Startup Commands Zusätzliche Kommandos beim Start' + + <html><head/><body><p>GDB commands entered here will be executed after GDB has been started and the debugging helpers have been initialized.</p><p>You can add commands to load further debugging helpers here, or modify existing ones.</p><p>To execute arbitrary Python scripts, use <i>python execfile('/path/to/script.py')</i>.</p></body></html> + <html><head/><body><p>Die hier angegebenen GDB-Kommandos werden ausgeführt, nachdem GDB gestartet wurde und die Ausgabe-Hilfsbibliothek initialisiert wurde.</p><p>Sie können hier Kommandos zum Laden zusätzlicher Ausgabehelfer oder zur Änderung bereits existierender Ausgabehelfer angeben.</p><p>Verwenden Sie <i>python execfile('/path/to/script.py')</i>, um beliebige Python-Scripte auszuführen.</p></body></html> + GDB GDB @@ -3497,11 +3455,11 @@ at debugger startup. Binary debug information is not accessible for this frame. This either means the core was not compiled with debug information, or the debug information is not accessible. Note that most distributions ship debug information in separate packages. - Für diesen Stack-Frame ist keine binäre Debuginformation verfügbar. Entweder stammt die Core-Datei von einer ohne Debuginformation erstellten Anwendung oder es kann nicht auf die Debuginformation zugegriffen werden. Beachten Sie, dass die meisten Distributionen die Debuginformationen in separaten Paketen ausliefern. + Für diesen Stack-Frame ist keine binäre Debuginformation verfügbar. Entweder stammt die Core-Datei von einer ohne Debuginformation erstellten Anwendung oder es kann nicht auf die Debuginformation zugegriffen werden. Beachten Sie, dass manche Distributionen die Debuginformationen in separaten Paketen ausliefern. - Binary debug information is accessible for this frame. However, matching sources have not been found. Note that some distributions ship debug sources in in separate packages. - Für diesen Stack-Frame ist binäre Debuginformation verfügbar, es konnte aber kein passender Quellcode gefunden werden. Beachten Sie, dass die meisten Distributionen die Debuginformationen in separaten Paketen ausliefern. + Binary debug information is accessible for this frame. However, matching sources have not been found. Note that some distributions ship debug sources in separate packages. + Für diesen Stack-Frame ist binäre Debuginformation verfügbar. Es konnte aber kein passender Quellcode gefunden werden. Beachten Sie, dass manche Distributionen die Debuginformationen in separaten Paketen ausliefern. @@ -3511,100 +3469,6 @@ at debugger startup. Stack - - Debugger::Internal::StartExternalDialog - - Select Executable - Ausführbare Datei auswählen - - - Select Working Directory - Wählen Sie das Arbeitsverzeichnis aus - - - Start Debugger - Debugger starten - - - &Executable: - &Ausführbare Datei: - - - &Arguments: - &Argumente: - - - Run in &terminal: - In &Terminal ausführen: - - - &Working directory: - Arbeits&verzeichnis: - - - &Target: - &Ziel: - - - Break at "&main": - Haltepunkt bei '&main': - - - &Recent: - &Letzte: - - - - Debugger::Internal::StartRemoteDialog - - Select Location of Debugging Information - Pfad zu Debug-Information - - - Select Executable - Ausführbare Datei auswählen - - - Select GDB Start Script - GDB-Startskript auswählen - - - Select Server Start Script - Server-Startskript wählen - - - Target: - Ziel: - - - Remote: "%1" - Verbindung: "%1" - - - Start Debugger - Debugger starten - - - Local &executable: - Ausführbare Datei (&lokal): - - - Override host GDB s&tart script: - Startskript auf Host &überschreiben: - - - &Server start script: - &Server-Startskript: - - - Location of debugging &information: - &Pfad zu Debug-Information: - - - &Recent: - &Letzte: - - Debugger::Internal::ThreadsHandler @@ -3887,22 +3751,6 @@ at debugger startup. Designer - - The file name is empty. - Der Dateiname ist leer. - - - XML error on line %1, col %2: %3 - XML-Fehler auf Zeile %1, Spalte %2: %3 - - - The <RCC> root element is missing. - Das Wurzelelement (<RCC>) fehlt. - - - Cannot write file. Disk full? - Die Datei konnte nicht geschrieben werden. Möglicherweise ist kein Speicherplatz mehr auf der Festplatte vorhanden? - Designer Designer @@ -4253,7 +4101,7 @@ Versuchen Sie, das Projekt neu zu erstellen. Error parsing file %1: %2, at line %3, column %4 - Fehler beim Lesen der Datei %1: %2 auf Zeile %3, Spalte %4 + Fehler beim Lesen der Datei %1: %2 in Zeile %3, Spalte %4 @@ -4451,6 +4299,10 @@ Grund: %3 search hit TOP, continuing at BOTTOM Die Suche hat den Anfang erreicht, setze am Ende fort + + Invalid regular expression: %1 + Ungültiger regulärer Ausdruck: %1 + Already at oldest change Älteste Änderung erreicht @@ -4566,6 +4418,10 @@ Grund: %3 Set Plain Style Einfachen Stil setzen + + Use smartcase + Smartcase verwenden + FakeVim::Internal::FakeVimPluginPrivate @@ -5909,13 +5765,6 @@ Grund: %3 The filter "%1" will only show documentation files that have the attributes %2 specified. Das Filter "%1" wird die Dokumentationsdateien anzeigen, die über eines der Attribute %2 verfügen. - - <html><body> -<p> -Add, modify, and remove document filters, which determine the documentation set displayed in the Help mode. The attributes are defined in the documents. Select them to display a set of relevant documentation. Note that some attributes are defined in several documents. -</p></body></html> - <html><body><p>Hinzufügen, Ändern oder Entfernen von Dokumentenfiltern, die die im Hilfsmodus angezeigte Dokumentation festlegen. Die Attribute sind in den Dokumenten definiert. Durch die Angabe der Attribute kann die relevante Dokumentation ausgewählt werden. Beachten Sie, dass einige Attribute in mehreren Dokumenten erscheinen.</p></body></html> - Attributes Attribute @@ -5930,7 +5779,14 @@ Add, modify, and remove document filters, which determine the documentation set Remove - + Entfernen + + + <html><body> +<p> +Add, modify, and remove document filters, which determine the documentation set displayed in the Help mode. The attributes are defined in the documents. Select them to display a set of relevant documentation. Note that some attributes are defined in several documents. +</p></body></html> + <html><body><p>Hinzufügen, Ändern oder Entfernen von Dokumentenfiltern, die die im Hilfsmodus angezeigte Dokumentation festlegen. Die Attribute sind in den Dokumenten definiert. Durch die Angabe der Attribute kann die relevante Dokumentation ausgewählt werden. Beachten Sie, dass einige Attribute in mehreren Dokumenten erscheinen.</p></body></html> @@ -6398,6 +6254,10 @@ Add, modify, and remove document filters, which determine the documentation set Automake based Makefile Automake-basiertes Makefile + + ClearCase submit template + ClearCase submit template + GLSL Shader file GLSL Shader-Datei @@ -7556,6 +7416,10 @@ Fehler: %2 Run Ausführen + + No executable + Keine ausführbare Datei + ProjectExplorer::Internal::ProcessStep @@ -8109,6 +7973,10 @@ konnte dem Projekt '%2' nicht hinzugefügt werden. Collapse All Alle einklappen + + Open Build and Run Kit Selector... + Kit-Auswahl für Erstellung und Ausführung öffnen... + Quick Switch Target Selector Schnelle Zielauswahl @@ -8145,6 +8013,14 @@ konnte dem Projekt '%2' nicht hinzugefügt werden. Do you want to cancel the build process and unload the project anyway? Möchten Sie die Erstellung abbrechen und das Projekt trotzdem schließen? + + Unknown error + Unbekannter Fehler + + + Could Not Run + Keine Ausführung möglich + Ignore all errors? Alle Fehler ignorieren? @@ -8324,10 +8200,6 @@ Möchten Sie sie ignorieren? Set "%1" as Active Project "%1" als aktives Projekt setzen - - Open Build/Run Target Selector... - Zielauswahl für Build/Auswahl öffnen... - Full build path of the current project's active build configuration. Vollständiger Pfad der aktiven Build-Konfiguration des aktuellen Projekts. @@ -8816,10 +8688,6 @@ Wählt eine für Desktop-Entwicklung geeignete Qt-Version aus, sofern sie verfü Details Details - - Symbian Specific - Symbian-spezifisch - Qt4ProjectManager::Internal::MakeStepFactory @@ -9008,7 +8876,7 @@ Wählt eine für Desktop-Entwicklung geeignete Qt-Version aus, sofern sie verfü Run in terminal - In Terminal ausführen + Im Terminal ausführen Base environment for this run configuration: @@ -9043,42 +8911,6 @@ Wählt eine für Desktop-Entwicklung geeignete Qt-Version aus, sofern sie verfü Debug-Version von Frameworks verwenden (DYLD_IMAGE_SUFFIX=_debug) - - Qt4ProjectManager::Internal::S60DeviceDebugRunControl - - Warning: Cannot locate the symbol file belonging to %1. - - Warnung: Die zu %1 gehörige Symboldatei konnte nicht gefunden werden. - - - - Launching debugger... - - Starte Debugger... - - - Debugger for Symbian Platform - Debugger für Symbian-Plattform - - - Debug on Device - Auf Gerät Debuggen - - - - Qt4ProjectManager::Internal::S60DeviceRunConfigurationWidget - - Arguments: - Argumente: - - - - Qt4ProjectManager::Internal::S60Manager - - Run on Device - Auf Gerät ausführen - - Qt4ProjectManager::MakeStep @@ -9087,12 +8919,8 @@ Wählt eine für Desktop-Entwicklung geeignete Qt-Version aus, sofern sie verfü Make - Qt Creator needs a build configuration set up to build. Configure a tool chain in Project mode. - Qt Creator benötigt eine Build-Konfiguration zum Erstellen. Bitte richten Sie eine Toolchain im Projektmodus ein. - - - Qt Creator needs a tool chain set up to build. Configure a tool chain in the target options. - Qt Creator benötigt eine Toolchain zum Erstellen des Projekts. Bitte richten Sie eine Toolchain in den Zieleinstellungen ein. + Qt Creator needs a compiler set up to build. Configure a compiler in the kit options. + Qt Creator benötigt einen Compiler zum Erstellen des Projekts. Bitte richten Sie einen Compiler in den Kit-Einstellungen ein. Cannot find Makefile. Check your build settings. @@ -9538,6 +9366,10 @@ Um es abzurufen, tippen Sie das Kürzel im Locator, gefolgt von einem Leerzeich Rename File... Datei umbenennen... + + Copy Resource Path to Clipboard + Ressourcenpfad in die Zwischenablage kopieren + untitled kein Titel @@ -10462,24 +10294,44 @@ Die folgenden Encodings scheinen der Datei zu entsprechen: Link - Link + Verweis + + + Links that follow symbol under cursor. + Verweise, die dem Symbol unter der Einfügemarke folgen. Selection Auswahl + + Selected text. + Ausgewählter Text. + Line Number Zeilennummer + + Line numbers located on the left side of the editor. + Zeilennummern an der linken Seite des Editors. + Search Result Suchergebnisse + + Highlighted search results inside the editor. + Hervorgehobene Suchergebnisse im Editor. + Search Scope Suchbereich + + Section where the pattern is searched in. + Bereich, in dem das Muster gesucht wird. + Parentheses Klammern @@ -10488,10 +10340,18 @@ Die folgenden Encodings scheinen der Datei zu entsprechen: Current Line Aktuelle Zeile + + Line where the cursor is placed in. + Zeile, in der sich die Einfügemarke befindet. + Current Line Number Zeilennummer + + Line number located on the left side of the editor where the cursor is placed in. + Nummer der Zeile, in der sich die Einfügemarke befindet, an der linken Seite des Editors. + Occurrences Vorkommen @@ -10508,91 +10368,202 @@ Die folgenden Encodings scheinen der Datei zu entsprechen: Number Zahl + + Number literal. + Zahlenliteral. + String Zeichenkette + + Character and string literals. + Zeichen- und Zeichenkettenliterale. + Type Typ + + Name of a type. + Typname. + Local Lokale Variable + + Local variables. + Lokale Variablen. + Field Feld - Static - Statisch + Class' data members. + Mitgliedsvariablen von Klassen. + + + Enumeration + Aufzählung + + + QML item id within a QML file. + QML-Element-ID in einer QML-Datei. + + + QML root Object Property + Eigenschaft des QML-Wurzelelements + + + QML property of a parent item. + QML: Eigenschaft eines externen QML-Objektes + + + QML scope Object Property + Objekteigenschaft im Gültigkeitsbereich von QML + + + Property of the same QML item. + Eigenschaft desselben QML-Objektes. Function Funktion + + Name of a function. + Funktionsname. + Virtual Method Virtuelle Methode + + Name of method declared as virtual. + Name einer als virtuell deklarierten Funktion. + QML Binding QML-Binding + + QML item property, that allows a binding to another property. + QML-Eigenschaft, die ein Binding zu einer anderen Eigenschaft ermöglicht. + QML Local Id Lokale QML-Id - QML Root Object Property - Eigenschaft des QML-Wurzelelements + Displayed when matching parentheses, square brackets or curly brackets are found. + Wird angezeigt, wenn passende Klammern, eckige oder geschweifte Klammern gefunden werden. - QML Scope Object Property - Eigenschaft eines QML-Objektes im Bereich + Occurrences of the symbol under the cursor. +(Only the background will be applied.) + Vorkommen des unter der Einfügemarke befindlichen Symbols (nur Hintergrund). + + + Generic text. +Applied to text, if no other rules matching. + Generischer Text. +Wird auf Text angewandt, sofern keine andere Regel zutrifft. + + + Occurrences of unused variables. + Vorkommen unbenutzter Variablen. + + + Occurrences of a symbol that will be renamed. + Vorkommen eines umzubenennenden Symbols. + + + Applied to Enumeration Items. + Wird auf Aufzählungen angewandt. QML State Name - Name eines Zustands in QML + Name eines States in QML + + + Name of a QML state. + Name eines States in QML. QML Type Name Name eines QML-Typs + + Name of a QML type. + Name eines QML-Typs. + QML External Id Externe QML-Id + + QML id defined in another QML file. + In einer anderen QML-Datei definierte QML-Element-Id. + QML External Object Property Eigenschaft eines externen QML-Objektes + + QML property defined in another QML file. + In einer anderen QML-Datei definierte QML-Eigenschaft. + JavaScript Scope Var JavaScript-Variable im Bereich + + Variables defined inside the JavaScript file. + In einer JavaScript-Datei definierte Variable. + JavaScript Import JavaScript-Import + + Name of a JavaScript import inside a QML file. + Name eines JavaScript-Imports in einer QML-Datei. + JavaScript Global Variable Globale JavaScript-Variable + + Variables defined outside the script. + Außerhalb des Skripts definierte Variablen. + Keyword Schlüsselwort + + Reserved keywords of the programming language. + Reservierte Schlüsselworte der Programmiersprache. + Operator Operator + + Operators. (for example operator++ operator-=) + Operatoren. (zum Beispiel operator++ operator-=) + Preprocessor Präprozessor + + Preprocessor directives. + Präprozessor-Anweisungen. + Label Sprungmarke @@ -10601,22 +10572,56 @@ Die folgenden Encodings scheinen der Datei zu entsprechen: Comment Kommentar + + All style of comments except Doxygen comments. + Nicht-Doxygen-Kommentare. + Doxygen Comment Doxygen-Kommentar + + Doxygen comments. + Doxygen-Kommentare. + Doxygen Tag Doxygen-Schlüsselwort + + Doxygen tags + Doxygen-Schlüsselworte + Visual Whitespace Leerzeichen darstellen + + Whitespace +Will not be applied to whitespace in comments and strings. + Leerzeichen +Außer Leerzeichen innerhalb von Kommentaren und Zeichenketten. + + + Applied to added lines in differences (in diff editor). + Wird auf hinzugefügte Zeilen angewandt (in Diff-Editor). + + + Applied to removed lines in differences (in diff editor). + Wird auf entfernte Zeilen angewandt (in Diff-Editor). + Disabled Code Deaktivierter Code + + Labels for goto statements. + Sprungmarken für goto-Befehle. + + + Code disabled by preprocessor directives. + Durch Präprozessor-Anweisungen deaktivierter Code. + Added Line Hinzugefügte Zeile @@ -10629,10 +10634,18 @@ Die folgenden Encodings scheinen der Datei zu entsprechen: Diff File Diff-Dateiangabe + + Compared files (in diff editor). + Verglichene Dateien (in Diff-Editor). + Diff Location Diff-Zeilenangabe + + Location in the files where the difference is (in diff editor). + Stelle, an der sich der Unterschied befindet (in Diff-Editor). + Behavior Verhalten @@ -11551,6 +11564,14 @@ Sie können die Änderungen in einem Stash ablegen oder zurücksetzen.TargetSettingsWidget TargetSettingsWidget + + Add Kit + Kit hinzufügen + + + Manage Kits... + Kits verwalten... + QmlDesigner::Internal::SettingsPage @@ -11698,6 +11719,14 @@ Sie können die Änderungen in einem Stash ablegen oder zurücksetzen.Default display name for the cmake make step. Make + + Qt Creator needs a compiler set up to build. Configure a compiler in the kit options. + Qt Creator benötigt einen Compiler zum Erstellen des Projekts. Bitte richten Sie einen Compiler in den Kit-Einstellungen ein. + + + Configuration is faulty. Check the Issues view for details. + Die Konfiguration ist fehlerhaft. Details befinden sich in der Ansicht "Build-Probleme". + CMakeProjectManager::Internal::MakeStepFactory @@ -11855,6 +11884,26 @@ Sie können die Änderungen in einem Stash ablegen oder zurücksetzen.Bazaar Commit Log Editor Bazaar Commit-Log-Editor + + ClearCase Check In Editor + ClearCase Check-In-Editor + + + ClearCase Command Log Editor + ClearCase Kommando-Log-Editor + + + ClearCase File Log Editor + ClearCase Datei-Log-Editor + + + ClearCase Annotation Editor + ClearCase Annotations-Editor + + + ClearCase Diff Editor + ClearCase Diff-Editor + Cvs::Internal::CvsEditor @@ -11917,6 +11966,14 @@ Sie können die Änderungen in einem Stash ablegen oder zurücksetzen.Make Make + + Qt Creator needs a compiler set up to build. Configure a compiler in the kit options. + Qt Creator benötigt einen Compiler zur Erstellung des Projekts. Bitte konfigurieren Sie einen Compiler in den Kit-Einstellungen. + + + Configuration is faulty. Check the Issues view for details. + Die Konfiguration ist fehlerhaft. Details befinden sich in der Ansicht "Build-Probleme". + Override %1: Überschreibe %1: @@ -12327,14 +12384,14 @@ Sie können die Änderungen in einem Stash ablegen oder zurücksetzen.Project Projekt - - Target - Ziel - Build Erstellen + + Kit + Kit + Deploy Deployment @@ -12375,6 +12432,10 @@ Sie können die Änderungen in einem Stash ablegen oder zurücksetzen.<html><nobr>%1</html> <html><nobr>%1</html> + + Kit: <b>%1</b><br/> + Kit: <b>%1</b><br/> + <style type=text/css>a:link {color: rgb(128, 128, 255, 240);}</style>The project <b>%1</b> is not yet configured<br/><br/>You can configure it in the <a href="projectmode">Projects mode</a><br/> <style type=text/css>a:link {color: rgb(128, 128, 255, 240);}</style>Das Projekt <b>%1</b> ist noch nicht konfiguriert<br/><br/>Sie können es im <a href="projectmode">Projektmodus</a> konfigurieren<br/> @@ -12383,10 +12444,6 @@ Sie können die Änderungen in einem Stash ablegen oder zurücksetzen.Project: <b>%1</b><br/> Projekt: <b>%1</b><br/> - - Target: <b>%1</b><br/> - Ziel: <b>%1</b><br/> - Build: <b>%1</b><br/> Erstellung: <b>%1</b><br/> @@ -12445,38 +12502,39 @@ Sie können die Änderungen in einem Stash ablegen oder zurücksetzen. ProjectExplorer::Internal::TargetSettingsPanelWidget - No target defined. - Es ist kein Ziel festgelegt. + No kit defined in this project. + In diesem Projekt ist kein Kit festgelegt. - Cancel Build && Remove Target - Build abbrechen und Ziel löschen + Cancel Build && Remove Kit + Build abbrechen und Kit löschen Do Not Remove Nicht löschen - Remove Target %1? - Soll das Ziel %1 gelöscht werden? + Remove Kit %1? + Soll das Kit %1 gelöscht werden? - The target <b>%1</b> is currently being built. - Das Ziel %1 wird gerade erstellt. + The kit <b>%1</b> is currently being built. + Das Kit %1 wird gerade erstellt. - Do you want to cancel the build process and remove the Target anyway? - Möchten Sie die Erstellung abbrechen und das Ziel löschen? + Do you want to cancel the build process and remove the Kit anyway? + Möchten Sie die Erstellung abbrechen und das Kit löschen? + + + Do you really want to remove the +"%1" kit? + Möchten Sie das Kit +"%1" wirklich entfernen? Qt Creator Qt Creator - - Do you really want to remove the -"%1" target? - Möchten Sie das Ziel "%1" entfernen? - GenericProjectManager::GenericTarget @@ -12493,16 +12551,6 @@ Sie können die Änderungen in einem Stash ablegen oder zurücksetzen.Qt4 Desktop target display name Desktop - - Symbian Emulator - Qt4 Symbian Emulator target display name - Symbian-Emulator - - - Symbian Device - Qt4 Symbian Device target display name - Symbian-Gerät - Maemo Emulator Qt4 Maemo Emulator target display name @@ -12868,8 +12916,8 @@ Sie können die Änderungen in einem Stash ablegen oder zurücksetzen.Der symbolische Link zu der Vorgabe-mkspec ist fehlerhaft. - ABI detection failed: Make sure to use a matching tool chain when building. - Die ABI konnte nicht bestimmt werden. Stellen Sie sicher, dass Sie eine passende Toolchain zum Erstellen verwenden. + ABI detection failed: Make sure to use a matching compiler when building. + Die ABI konnte nicht bestimmt werden. Stellen Sie sicher, dass Sie einen passenden Compiler zum Erstellen verwenden. Non-installed -prefix build - for internal development only. @@ -12879,20 +12927,11 @@ Sie können die Änderungen in einem Stash ablegen oder zurücksetzen.No qmlviewer installed. Es ist kein qmlviewer installiert. - - SBS was not found. - SBS konnte nicht gefunden werden. - Desktop Qt Version is meant for the desktop Desktop - - Symbian - Qt Version is meant for Symbian - Symbian - Maemo Qt Version is meant for Maemo5 @@ -12903,6 +12942,10 @@ Sie können die Änderungen in einem Stash ablegen oder zurücksetzen.Qt Version is meant for Harmattan Harmattan + + No qmlscene installed. + qmlscene ist nicht installiert. + Qt Simulator Qt Version is meant for Qt Simulator @@ -12924,7 +12967,7 @@ Sie können die Änderungen in einem Stash ablegen oder zurücksetzen. Build succeeded. - + Erstellung erfolgreich beendet. Qt for WinCE @@ -13188,15 +13231,15 @@ Sie können die Änderungen in einem Stash ablegen oder zurücksetzen. EditorSettingsPanelFactory - Editor Settings - Editoreinstellungen + Editor + Editor EditorSettingsPanel - Editor Settings - Editoreinstellungen + Editor + Editor @@ -13270,8 +13313,13 @@ Erfordert <b>Qt 4.7.4</b> oder neuer. QmlProjectManager::QmlProjectRunConfiguration - No qmlviewer or qmlobserver found. - qmlviewer oder qmlobserver konnten nicht gefunden werden. + No qmlviewer or qmlscene found. + Es konnten weder qmlviewer noch qmlscene gefunden werden. + + + QML Scene + QMLRunConfiguration display name. + QML Scene QML Viewer @@ -13282,15 +13330,19 @@ Erfordert <b>Qt 4.7.4</b> oder neuer. QmlProjectManager::Internal::QmlProjectRunConfigurationFactory - Run QML Script - QML-Skriptdatei ausführen + QML Viewer + QML-Betrachter + + + QML Scene + QML Scene TargetSettingsPanelFactory - Targets - Ziele + Build & Run + Erstellung und Ausführung @@ -13338,45 +13390,6 @@ Erfordert <b>Qt 4.7.4</b> oder neuer. Design - - Qt4ProjectManager::Internal::S60CreatePackageStepWidget - - Self-signed certificate - Selbstsigniertes Zertifikat - - - Custom certificate: - Benutzerdefiniertes Zertifikat: - - - Key file: - Datei mit Schlüssel: - - - Create Smart Installer package - Smart-Installer-Paket erzeugen - - - Resets saved passphrases for all used keys - Setzt die Passphrasen aller verwendeten Schlüssel zurück - - - Reset Passphrases - Passphrase zurücksetzen - - - Not signed - Unsigniert - - - Choose certificate file - Zertifikatdatei auswählen - - - Certificate's details - Details des Zertifikats - - VcsBase::CleanDialog @@ -13551,130 +13564,6 @@ Erfordert <b>Qt 4.7.4</b> oder neuer. <Aktuelle Datei> - - Qt4ProjectManager::Internal::S60CreatePackageStep - - Create SIS Package - default create SIS package build step display name - SIS-Paketdatei erzeugen - - - The selected target is not configured with a Symbian Qt - Das ausgewählte Ziel ist nicht mit Qt für Symbian konfiguriert - - - Could not find make command '%1' in the build environment - Das 'make'-Kommando '%1' konnte in der Build-Umgebung nicht gefunden werden - - - Ignore patching for this packaging step. - Kein Patchen bei diesem Schritt durchführen. - - - The process "%1" exited normally. - Der Prozess "%1" wurde normal beendet. - - - The process "%1" exited with code %2. - Der Prozess "%1" wurde mit dem Rückgabewert %2 beendet. - - - The process "%1" crashed. - Der Prozess "%1" ist abgestürzt. - - - Could not start process "%1" in %2 - Der Prozess "%1" konnte in "%2" nicht gestartet werden - - - Package Modified - Paket geändert - - - <p>Qt modified your package <b>%1</b>.</p> - <p>Qt hat das Paket <b>%1</b> geändert.</p> - - - Packages Modified - Pakete geändert - - - <p>Qt modified some of your packages.</p> - <p>Qt hat einige der Pakete geändert.</p> - - - %1<p><em>These changes were not part of your build profile</em> but are required to make sure the <em>self-signed</em> package can be installed successfully on a device.</p><p>Check the Issues pane for more details on the modifications made.</p><p>Please see the <a href="%2">documentation</a> for other signing options which remove the need for this patching.</p> - %1<p><em>Diese Änderungen wurden nicht vom Build-System vorgenommen,</em> sind aber die Voraussetzung für die erfolgreiche Installation eines <em>selbstsignierten</em> Pakets auf einem Mobilgerät.</p><p>Das Panel "Build-Probleme" enthält detaillierte Informationen über die Änderungen.</p><p>Die <a href="%2">Dokumentation</a> enthält weitere Möglichkeiten der Signierung, die diesen Schritt überflüssig machen.</p> - - - Starting: "%1" %2 in %3 - - Starte: "%1" %2 in %3 - - - - No certificate file specified. Please specify one in the project settings. - Es wurde keine Zertifikatdatei angegeben. Bitte geben Sie sie in den Projekteinstellungen an. - - - Certificate file "%1" does not exist. Please specify an existing certificate file in the project settings. - Die angegebene Zertifikatdatei "%1" existiert nicht. Bitte geben Sie eine existierende Zertifikatdatei in den Projekteinstellungen an. - - - No key file specified. Please specify one in the project settings. - Es wurde keine Schlüsseldatei angegeben. Bitte geben Sie sie in den Projekteinstellungen an. - - - Key file "%1" does not exist. Please specify an existing key file in the project settings. - Die angegebene Schlüsseldatei "%1" existiert nicht. Bitte geben Sie eine existierende Schlüsseldatei in den Projekteinstellungen an. - - - The package created will not install on a device as some of the defined capabilities are not supported by the certificate: %1 - Das erzeugte Paket kann nicht auf einem Mobilgerät installiert werden, da einige der angegebenen Rechte nicht durch das Zertifikat unterstützt werden: %1 - - - - Qt4ProjectManager::Internal::S60CreatePackageStepFactory - - Create SIS Package - SIS-Paketdatei erzeugen - - - - Qt4ProjectManager::Internal::S60CreatePackageStepConfigWidget - - Reset Passphrases - Passphrase zurücksetzen - - - Do you want to reset all passphrases saved for keys used? - Möchten Sie Passwörter aller verwendeten Schlüssel zurücksetzen? - - - signed with the certificate "%1" using the key "%2" - signiert mit dem Zertifikat "%1" unter Verwendung des Schlüssels "%2" - - - signed with a certificate and a key that need to be specified - signiert mit noch anzugebendem Zertifikat und Schlüssel - - - not signed - Unsigniert - - - self-signed - Selbstsigniert - - - <b>Create SIS Package:</b> %1, using Smart Installer - <b>Erzeuge SIS-Paketdatei:</b> %1 einschließlich Smart-Installer - - - <b>Create SIS Package:</b> %1 - <b>Erzeuge SIS-Paketdatei:</b> %1 - - Qt4ProjectManager::Qt4Project @@ -14194,21 +14083,6 @@ Verwenden Sie die Eigenschaft importPaths, um Importpfade zu qmlproject-basierte Alle außer %1 schließen - - Qt4ProjectManager::Internal::TargetSetupPage - - Qt Creator can set up the following targets: - Qt Creator kann die folgenden Ziele einrichten: - - - Set up Targets for Your Project - Ziele des Projekts einrichten - - - <html><head/><body><p><span style=" font-weight:600;">No valid Targets found.</span></p><p>Please add a target in <a href="buildandrun"><span style=" text-decoration: underline; color:#0000ff;">Tools &gt; Options &gt; Build &amp; Run</span></a> (<a href="buildandrun"><span style=" text-decoration: underline; color:#0000ff;">Qt Creator &gt; Preferences &gt; Build &amp; Run</span></a> on Mac OS) or via the maintenance tool of the SDK.</p></body></html> - <html><head/><body><p><span style=" font-weight:600;">Es wurden keine gültigen Ziele gefunden.</span></p><p>Bitte fügen Sie ein Ziel unter <a href="buildandrun"><span style=" text-decoration: underline; color:#0000ff;">Extras &gt;Einstellungen &gt; Erstellung &amp; Ausführung</span></a> (<a href="buildandrun"><span style=" text-decoration: underline; color:#0000ff;">Qt Creator &gt; Einstellungen &gt; Erstellung &amp; Ausführung</span></a> auf Mac OS) oder mit dem SDK-Verwaltungswerkzeug hinzu.</p></body></html> - - Utils::FileWizardDialog @@ -14411,8 +14285,8 @@ Verwenden Sie die Eigenschaft importPaths, um Importpfade zu qmlproject-basierte Module - Targets - Ziele + Kits + Kits @@ -15304,10 +15178,6 @@ IDs müssen außerdem mit einem Kleinbuchstaben beginnen. Windows Windows - - Symbian - Symbian - Linkage: Linken: @@ -15584,26 +15454,6 @@ Flags: %3 Debugger::Internal::CdbEngine - - The CDB debug engine required for %1 is currently disabled. - %1 erfordert den Debugger CDB, der gegenwärtig deaktiviert ist. - - - There is no CDB binary available for binaries in format '%1' - Für ausführbare Dateien im Format '%1' ist keine ausführbare CDB-Datei verfügbar - - - The CDB engine does not support start mode %1. - Der CDB-Debugger unterstützt den Startmodus %1 nicht. - - - The CDB debug engine does not support the %1 ABI. - Der CDB-Debugger unterstützt die ABI %1 nicht. - - - The CDB debug engine cannot debug gdb core files. - Der CDB-Debugger kann keine gdb-core-Dateien debuggen. - The console process '%1' could not be started. Der Konsolenprozess '%1' konnte nicht gestartet werden. @@ -15714,38 +15564,10 @@ Flags: %3 Invalid debugger option: %1 Ungültiger Debugger-Kommandozeilenparameter: %1 - - The application requires the debugger engine '%1', which is disabled. - Diese Anwendung erfordert den Debugger '%1', der gegenwärtig deaktiviert ist. - - - Warning - Warnung - Some breakpoints cannot be handled by the debugger languages currently active, and will be ignored. Einige Haltepunkte werden von den Debuggern der gegenwärtig aktiven Sprachen nicht unterstützt und werden daher nicht berücksichtigt. Möchten Sie fortsetzen? - - The debugger engine '%1' is disabled. - Der Debugger-Engine '%1' ist deaktiviert. - - - The debugger engine '%1' required for debugging binaries of the type '%2' is not configured correctly. - Der zum Debuggen von ausführbaren Dateien des Typs '%2' erforderliche Debugger-Engine '%1' ist nicht richtig eingerichtet. - - - None of the debugger engines '%1' capable of debugging binaries of the type '%2' is configured correctly. - Keiner der zum Debuggen von ausführbaren Dateien des Typs '%2' geeigneten Debugger-Engines '%1' ist richtig eingerichtet. - - - The preferred debugger engine for debugging binaries of type '%1' is not available. -The debugger engine '%2' will be used as a fallback. -Details: %3 - Der zum Debuggen von ausführbaren Dateien des Typs '%1' am besten geeignete Debugger-Engine ist nicht verfügbar. -Es wird stattdesen der Debugger-Engine '%2' benutzt. -Details: %3 - Install &Debug Information Installiere &Debuginformationen @@ -16134,10 +15956,6 @@ wenn es außerhalb von git bash aufgerufen wird. Deploy to Maemo device Deployment auf Maemo-Gerät - - Deploy to Symbian device - Deployment auf Symbian-Gerät - ProjectExplorer::Internal::VcsAnnotateTaskHandler @@ -16312,197 +16130,6 @@ Der Pfad zur Bibliothek und der Pfad zu den Headerdateien werden zur .pro-Datei %1 Bibliothek - - Qt4ProjectManager::PassphraseForKeyDialog - - Passphrase: - Passphrase: - - - Save passphrase - Passphrase speichern - - - This is an insecure option. The password will be saved as plain text. - Diese Einstellung ist unsicher. Das Passwort wird als Text gespeichert. - - - Passphrase for %1 - Passphrase für %1 - - - - Qt4ProjectManager::Internal::S60DeployConfigurationWidget - - Silent installation - Stille Installation - - - Installation file: - Installationspaket: - - - Silent installation is an installation mode that does not require user's intervention. In case it fails the non silent installation is launched. - Im Modus 'Stille Installation' ist keine Interaktion mit dem Nutzer auf dem Mobilgerät erforderlich. Bei Fehlschlag wird eine Standardinstallation gestartet. - - - Installation drive: - Installationslaufwerk: - - - - Qt4ProjectManager::Internal::S60DeployStep - - Unable to remove existing file '%1': %2 - Die existierende Datei '%1' konnte nicht entfernt werden: %2 - - - Unable to rename file '%1' to '%2': %3 - Die Datei '%1' konnte nicht in '%2' umbenannt werden: %3 - - - Renaming new package '%1' to '%2' - Die Paketdatei wird von '%1' zu '%2' umbenannt - - - Removing old package '%1' - Entferne Paketdatei '%1' - - - '%1': Package file not found - '%1': Paketdatei nicht gefunden - - - Copy progress: %1% - Kopiere: %1% - - - Failed to find package %1 - Die Paketdatei'%1 konnte nicht gefunden werden - - - Could not write to file %1 on device: %2 - Die Datei %1 konnte nicht auf dem Gerät geschrieben werden: %2 - - - Could not open serial device: %1 - Die serielle Schnittstelle konnte nicht geöffnet werden: %1 - - - No package has been found. Specify at least one installation package. - Es konnte kein Installationspaket gefunden werden. Bitte geben Sie mindestens eines an. - - - No device is connected. Connect a device and try again. - Es ist kein Gerät verbunden. Bitte stellen Sie die Verbindung zu einem Gerät her und versuchen Sie es erneut. - - - No address for a device has been defined. Define an address and try again. - Es wurde kein Adresse für das Gerät angegeben. Bitte geben Sie eine Adresse an und versuchen Sie es erneut. - - - Continue the installation on your device. - Bitte setzen Sie die Installation auf dem Mobilgerät fort. - - - Could not open remote file: %1 - Die entfernte Datei konnte nicht geöffnet werden: %1 - - - Could not open local file %1: %2 - Die lokale Datei %1 konnte nicht geöffnet werden: %2 - - - Installation failed: %1; see %2 for descriptions of the error codes - Die Installation schlug fehl: %1; siehe %2 für eine Beschreibung der Fehlercodes - - - Failed to close the remote file: %1 - Die entfernte Datei konnte nicht geschlossen werden: %1 - - - Copying "%1"... - Kopieren "%1"... - - - Deploy SIS Package - Qt4 Deploystep display name - Deployment der SIS-Paketdatei - - - Deploying application to '%1'... - Deployment der Anwendung auf '%1'... - - - No such port - Schnittstelle existiert nicht - - - Connecting to %1:%2... - Verbinde zu %1: %2... - - - Error: %1 - Fehler: %1 - - - Installing package "%1" on drive %2:... - Installiere Paket "%1" auf Laufwerk %2:... - - - Internal error: No filehandle obtained - Interner Fehler: Es konnte kein Datei-Handle erhalten werden - - - Installation has finished - Installation beendet - - - Installation - Installation - - - A timeout while deploying has occurred. CODA might not be responding. Try reconnecting the device. - Während des Deployments trat eine Zeitüberschreitung auf. CODA antwortet möglicherweise nicht. Versuchen Sie die Verbindung zum Gerät neu herzustellen. - - - Deployment has been cancelled. - Das Deployment wurde abgebrochen. - - - The device '%1' has been disconnected - Die Verbindung zum Gerät '%1' wurde getrennt - - - - Qt4ProjectManager::Internal::S60DeployStepFactory - - Deploy SIS Package - Deployment der SIS-Paketdatei - - - - Qt4ProjectManager::SbsV2Parser - - SBSv2 build log - Build-Log von SBSv2 - - - The file '%1' is not a SBSv2 log file. - Die Datei '%1; ist kein Build-Log von SBSv2. - - - Running command: %1 - - Führe Kommando '%1' aus - - - - Recipe %1 failed with exit code %2. - %1 is the SBSv2 build recipe name, %2 the return code of the failed command - Recipe %1 schlug mit Rückgabewert %2 fehl. - - Qt4ProjectManager::Internal::QtQuickApp @@ -16907,28 +16534,32 @@ Wählt Qt-Versionen für Simulator und mobile Ziele aus, sofern sie verfügbar s Erstellt eine Qt Quick-Anwendung, die sowohl QML- als auch C++-Code enthält und eine Instanz der Klasse QDeclarativeView verwendet. - Qt Quick Application (Built-in Elements) - Qt Quick-Anwendung (nur eingebaute Elemente) + Qt Quick 1 Application (Built-in Elements) + Qt Quick-1 Anwendung (nur eingebaute Elemente) - The built-in elements in the QtQuick namespace allow you to write cross-platform applications with a custom look and feel. + The built-in elements in the QtQuick 1 namespace allow you to write cross-platform applications with a custom look and feel. Requires <b>Qt 4.7.0</b> or newer. - Die eingebauten Elemente im QtQuick-Namensraum erlauben es, plattformübergreifende Anwendungen mit benutzerdefinierbarem Look and Feel zu erstellen. + Die eingebauten Elemente im QtQuick-1 Namensraum erlauben es, plattformübergreifende Anwendungen mit benutzerdefiniertem Look and Feel zu erstellen. Erfordert <b>Qt 4.7.0</b> oder neuer. - Qt Quick Application for Symbian - Qt Quick-Anwendung für Symbian + Qt Quick 2 Application (Built-in Elements) + Qt Quick-2 Anwendung (nur eingebaute Elemente) - The Qt Quick Components for Symbian are a set of ready-made components that are designed with specific native appearance for the Symbian platform. + Creates a Qt Quick application project that can contain both QML and C++ code and includes a QQuickView. -Requires <b>Qt 4.7.4</b> or newer, and the component set installed for your Qt version. - Die Qt Quick-Komponenten für Symbian sind ein Satz vorgefertigter Komponenten, die entworfen worden, um das Symbian-spezifische Erscheinungsbild wiederzugeben. +The built-in elements in the QtQuick 2 namespace allow you to write cross-platform applications with a custom look and feel. -Erfordert <b>Qt 4.7.4</b> oder neuer sowie die Installation des Komponentensatzes für diese Qt-Version. +Requires <b>Qt 5.0</b> or newer. + Erstellt ein Qt Quick-Anwendungsprojekt, das sowohl QML- als auch C++-Code enthalten kann und QQuickView verwendet. + +Die eingebauten Elemente im QtQuick-2 Namensraum erlauben es, plattformübergreifende Anwendungen mit benutzerdefiniertem Look and Feel zu erstellen. + +Erfordert <b>Qt 5.0</b> oder neuer. Qt Quick Application for MeeGo Harmattan @@ -17027,6 +16658,10 @@ Erforder <b>Qt 4.7.0</b> oder neuer. Break when JavaScript exception is thrown Halte beim Auftreten einer JavaScript-Ausnahme an + + &One shot only: + Nur &einmal auslösen: + Specifying the module (base name of the library or executable) for function or file type breakpoints can significantly speed up @@ -17034,12 +16669,6 @@ debugger start-up times (CDB, LLDB). Die Angabe des Moduls (Basisname der Bibliothek oder der ausführbaren Datei) für Haltepunkte des Typs Datei/Zeile oder Funktion kann die Startzeit des Debuggers erheblich reduzieren (CDB, LLDB). - - - Debugger command to be executed when the breakpoint is hit. -GDB allows for specifying a sequence of commands separated by the delimiter '\n'. - Debugger-Kommando zur Ausführung beim Auslösen des Haltepunkts. -Bei GDB kann eine durch '\n' getrennte Kommandosequenz angegeben werden. <html><head/><body><p>Determines how the path is specified when setting breakpoints:</p><ul><li><i>Use Engine Default</i>: Preferred setting of the debugger engine.</li><li><i>Use Full Path</i>: Pass full path, avoiding ambiguities should files of the same name exist in several modules. This is the engine default for CDB and LLDB.</li><li><i>Use File Name</i>: Pass the file name only. This is useful when using a source tree whose location does not match the one used when building the modules. It is the engine default for GDB as using full paths can be slow with this engine.</li></ul></body></html> @@ -17089,10 +16718,6 @@ Bei GDB kann eine durch '\n' getrennte Kommandosequenz angegeben werde &Module: &Modul: - - &Command: - &Kommando: - C&ondition: &Bedingung: @@ -17117,6 +16742,15 @@ Bei GDB kann eine durch '\n' getrennte Kommandosequenz angegeben werde Use File Name Dateinamen verwenden + + Debugger commands to be executed when the breakpoint is hit. +This feature is only available for GDB. + Debugger-Kommandos, die beim Auslösen eines Haltepunkts ausgeführt werden (nur GDB). + + + &Commands: + &Kommandos: + &Thread specification: &Thread: @@ -17350,21 +16984,6 @@ Fehler: %2 Deklaration für %1 hinzufügen - - Debugger::Internal::BreakCondition - - &Condition: - &Bedingung: - - - &Ignore count: - Anhalten &erst nach: - - - &Thread specification: - &Thread: - - Macros::Internal::MacroOptionsWidget @@ -17571,11 +17190,23 @@ konnte nicht unter Versionsverwaltung (%2) gestellt werden. Edit Breakpoint Properties Haltepunkt bearbeiten + + &Condition: + &Bedingung: + + + &Ignore count: + Anhalten &erst nach: + + + &Thread specification: + &Thread: + Debugger::Internal::StartRemoteCdbDialog - <html><body><p>The remote CDB needs to load the matching Qt Creator CDB extension (<code>%1</code> or <code>%2</code>, respectively).</p><p>Copy it onto the remote machine and set the environment variable <code>%3</code> to point to its folder.</p><p>Launch the remote CDB as <code>%4 &lt;executable&gt;</code> to use TCP/IP as communication protocol.</p><p>Enter the connection parameters as:</p><pre>%5</pre></body></html> + <html><body><p>The remote CDB needs to load the matching Qt Creator CDB extension (<code>%1</code> or <code>%2</code>, respectively).</p><p>Copy it onto the remote machine and set the environment variable <code>%3</code> to point to its folder.</p><p>Launch the remote CDB as <code>%4 &lt;executable&gt;</code> to use TCP/IP as communication protocol.</p><p>Enter the connection parameters as:</p><pre>%5</pre></body></html> <html><body><p>Der entfernte CDB muss die passende CDB-Erweiterungsbibliothek von Qt Creator (<code>%1</code> beziehungsweise <code>%2</code> laden.</p><p>Kopieren Sie sie auf den entfernten Rechner und setzen Sie die Umgebungsvariable <code>%3</code> auf den Ordner.</p><p>Starten Sie den entfernten CDB als <code>%4 &lt;ausführbare Datei&gt;</code> um TCP/IP als Kommunikationsprotokoll zu verwenden.</p><p>Geben Sie die Verbindungsparameter wie folgt an:</p><pre>%5</pre></body></html> @@ -17652,10 +17283,6 @@ konnte nicht unter Versionsverwaltung (%2) gestellt werden. Cannot attach to process with PID 0 Anhängen an Prozess-ID 0 nicht möglich - - Debugger attached to %1 - Debugger an %1 angehangen - Set Breakpoint at Line %1 Haltepunkt bei Zeile %1 setzen @@ -17668,14 +17295,6 @@ konnte nicht unter Versionsverwaltung (%2) gestellt werden. Disassemble Function "%1" Funktion "%1" disassemblieren - - Open Qt Options - Einstellungen zur Qt-Bibliothek öffnen - - - The debugging helper is used to nicely format the values of some Qt and Standard Library data types. It must be compiled for each used Qt version separately. In the Qt Creator Build and Run preferences page, select a Qt version, expand the Details section and click Build All. - Die Ausgabe-Hilfsbibliothek dient zur Ausgabe der Werte einiger Datentypen aus Qt- und den Standardbibliotheken. Sie muss mit jeder benutzten Qt-Version compiliert werden. Das geschieht in der Seite 'Erstellung und Ausführung' durch Auswahl der Qt-Installation und Klicken auf 'Erstellen' für die Ausgabe-Hilfsbibliothek. - Debugger finished. Debuggen beendet. @@ -17746,22 +17365,6 @@ konnte nicht unter Versionsverwaltung (%2) gestellt werden. User commands are not accepted in the current state. Die Eingabe von Nutzerkommandos ist in diesem Zustand nicht möglich. - - Turn off Helper Usage - Ausgabe-Hilfsbibliothek deaktivieren - - - Continue Anyway - Trotzdem fortsetzen - - - Debugging Helper Missing - Ausgabe-Hilfsbibliothek nicht gefunden - - - The debugger could not load the debugging helper library. - Der Debugger konnte die Ausgabe-Hilfsbibliothek nicht finden. - Starting debugger "%1" for ABI "%2"... Starte Debugger "%1" für ABI "%2"... @@ -17858,22 +17461,10 @@ konnte nicht unter Versionsverwaltung (%2) gestellt werden. Start and Debug External Application... Debugge externe Anwendung... - - Start and Debug External Application with External Engine... - Debugge externe Anwendung mit externem Engine... - - - Attach to Running Local Application... - Debugge externe, lokal laufende Anwendung... - Load Core File... Core-Datei auswählen... - - Start and Debug Remote Application... - Starte und Debugge entfernte Anwendung... - Attach to Remote Debug Server... Verbinde zu Debug-Server... @@ -17882,10 +17473,6 @@ konnte nicht unter Versionsverwaltung (%2) gestellt werden. Start Remote Debug Server Attached to Process... Starte Debug-Server an Prozess... - - Attach to Running Remote Process... - Debugge entfernt laufende Anwendung... - Attach to QML Port... Verbinde zu QML-Port... @@ -17902,10 +17489,6 @@ konnte nicht unter Versionsverwaltung (%2) gestellt werden. Start Gdbserver Gdbserver starten - - Attach to Remote Process - An entfernten Prozess anhängen - Interrupt Debugger Debugger unterbrechen @@ -17914,6 +17497,24 @@ konnte nicht unter Versionsverwaltung (%2) gestellt werden. Stop Debugger Debugger anhalten + + Process Already Under Debugger Control + Prozess bereits unter Debugger-Kontrolle + + + The process %1 is already under the control of a debugger. +Qt Creator cannot attach to it. + Der Prozess %1 wird bereits von einem Debugger gesteuert. +Qt Creator kann sich nicht anhängen. + + + Attach to Running Application... + Debugge externe, lokal laufende Anwendung... + + + Attach to Running Application + Debugge externe, lokal laufende Anwendung + Shift+Ctrl+Y Shift+Ctrl+Y @@ -18116,7 +17717,7 @@ Soll es noch einmal versucht werden? Die Anwendung konnte nicht gestartet werden: %1 - Run to line %1 (%2) requested... + Run to line %1 (%2) requested... Ausführung bis Zeile %1 (%2) angefordert... @@ -18520,80 +18121,6 @@ Fehler: %2 Systemumgebung - - Qt4ProjectManager::Internal::S60CertificateInfo - - The certificate "%1" has already expired and cannot be used. -Expiration date: %2. - Das Zertifikat "%1" ist bereits abgelaufen und kann daher nicht verwendet werden. -Verfallsdatum: %2. - - - The certificate "%1" is not yet valid. -Valid from: %2. - Das Zertifikat "%1" ist noch nicht gültig. -Es gilt ab: %2. - - - The certificate "%1" is not a valid X.509 certificate. - Das Zertifikat "%1" ist kein gültiges X.509-Zertifikat. - - - Type: - Typ: - - - Developer certificate - Entwicklerzertifikat - - - Self signed certificate - Selbstsigniertes Zertifikat - - - Issued by: - Ausgestellt von: - - - Issued to: - Ausgestellt für: - - - Valid from: - Gültig ab: - - - Valid to: - Gültig bis: - - - Capabilities: - Berechtigungen: - - - Supporting %n device(s): - - Unterstützt ein Gerät: - Unterstützt %n Geräte: - - - - - Qt4ProjectManager::Internal::S60CreatePackageParser - - The binary package '%1' was patched to be installable after being self-signed. -%2 -Use a developer certificate or any other signing option to prevent this patching from happening. - %1 package name, %2 will be replaced by a list of patching lines. - Das selbstsignierte Paket '%1' wurde modifiziert, um eine Installation zu ermöglichen. -%2 -Verwenden Sie ein Entwicklerzertifikat oder eine andere Form der Signierung, um dies zu umgehen. - - - Cannot create Smart Installer package as the Smart Installer's base file is missing. Please ensure that it is located in the SDK. - Es kann kein Smart-Installer-Paket erstellt werden, da die Basisdatei des Smart-Installers fehlt. Bitte stellen Sie sicher, dass sie im SDK vorhanden ist. - - Qt4ProjectManager::Internal::Html5AppWizardDialog @@ -18618,10 +18145,10 @@ Verwenden Sie ein Entwicklerzertifikat oder eine andere Form der Signierung, um Creates an HTML5 application project that can contain both HTML5 and C++ code and includes a WebKit view. -You can build the application and deploy it on desktop and mobile target platforms. For example, you can create signed Symbian Installation System (SIS) packages for this type of projects. - Erstellt ein HTML5-Projekt, welches HTML5- und C++-Code enthält und WebKit zur Anzeige verwendet. +You can build the application and deploy it on desktop and mobile target platforms. + Erstellt ein HTML5-Anwendungsprojekt, welches HTML5- und C++-Code enthalten kann und WebKit zur Anzeige verwendet. -Sie können diese Anwendung sowohl auf Desktop- als auch auf mobilen Plattformen ausführen. Dieser Projekttyp ermöglicht zum Beispiel die Erstellung eines signierten Symbian Installation System (SIS)-Paketes. +Sie können diese Anwendung erstellen und sowohl auf Desktop- als auch auf mobilen Plattformen ausführen. @@ -19114,33 +18641,6 @@ Lokale Pull-Operationen werden nicht auf den Master-Branch angewandt.Variablen einfügen - - Qt4ProjectManager::Internal::RvctToolChainConfigWidget - - Form - Form - - - ARM &version: - ARM &Version: - - - Version 5 - Version 5 - - - Version 6 - Version 6 - - - &Compiler path: - &Compiler-Pfad: - - - Environment Variables - Umgebungsvariablen - - Bazaar::Internal::BazaarControl @@ -19626,27 +19126,23 @@ Lokale Pull-Operationen werden nicht auf den Master-Branch angewandt.Typ - Duplicate Tool Chain detected - Es wurde eine duplizierte Toolchain festgestellt + Duplicate Compilers Detected + Mehrfach auftretende Compiler - The following tool chain was already configured:<br>&nbsp;%1<br>It was not configured again. - Die folgende Toolchain ist bereits konfiguriert:<br>&nbsp;%1<br>Sie wurde nicht noch einmal konfiguriert. + The following compiler was already configured:<br>&nbsp;%1<br>It was not configured again. + Der folgende Compiler ist bereits konfiguriert:<br>&nbsp;%1<br>Er wurde nicht noch einmal konfiguriert. - Duplicate Tool Chains detected - Duplizierte Toolchains - - - The following tool chains were already configured:<br>&nbsp;%1<br>They were not configured again. - Die folgenden Toolchains wurden bereits konfiguriert:<br>&nbsp;%1<br>Sie wurden nicht noch einmal konfiguriert. + The following compilers were already configured:<br>&nbsp;%1<br>They were not configured again. + Die folgenden Compiler wurden bereits konfiguriert:<br>&nbsp;%1<br>Sie wurden nicht noch einmal konfiguriert. ProjectExplorer::Internal::ToolChainOptionsPage - Tool Chains - Toolchains + Compilers + Compiler Add @@ -19658,7 +19154,7 @@ Lokale Pull-Operationen werden nicht auf den Master-Branch angewandt. Remove - + Entfernen @@ -19705,41 +19201,6 @@ Reason: %2 Fehler: %2 - - Qt4ProjectManager::Internal::GcceToolChainFactory - - GCCE - GCCE - - - GCCE from Qt version - GCCE aus Qt-Version - - - GCCE (%1) - GCCE (%1) - - - - Qt4ProjectManager::Internal::RvctToolChainFactory - - ARMv5 - ARMv5 - - - ARMv6 - ARMv6 - - - RVCT - RVCT - - - RVCT (%1 %2.%3 Build %4) - %1 arm version, %2 major version, %3 minor version, %4 build number - RVCT (%1 %2.%3 Build %4) - - TextEditor::BaseTextEditorWidget @@ -19841,237 +19302,6 @@ Fehler: %2 Möchten Sie diese Änderung anwenden? - - Qt4ProjectManager::Internal::S60PublisherOvi - - Clean - Bereinigen - - - qmake - qmake - - - Build - Erstellen - - - Freeze - Einfrieren - - - Secondary clean - Sekundäres Bereinigen - - - Secondary qmake - Sekundäres QMake - - - Secondary build - Sekundäres Erstellen - - - Making SIS file - Erstelle Sis-Datei - - - SIS file not created due to previous errors. - - Erstellung der Sis-Datei durch vorangegangene Fehler fehlgeschlagen. - - - - Done. - - Beendet. - - - - Created %1. - - %1 wurde erstellt. - - - - - Qt4ProjectManager::Internal::S60PublishingResultsPageOvi - - Open Containing Folder - Beinhaltenden Ordner öffnen - - - Close - Schließen - - - Form - Form - - - - Qt4ProjectManager::Internal::S60PublishingSisSettingsPageOvi - - This should be application's display name. <br>It cannot be empty.<br> - Der angezeigte Name der Anwendung. <br>Er darf nicht leer sein.<br> - - - The display name is quite long.<br>It might not be fully visible in the phone's menu.<br> - Der angezeigte Name ist sehr lang <br>Möglicherweise wird er nicht vollständig im Menü des Telefons angezeigt.<br> - - - %1 is a default vendor name used for testing and development. - "%1" ist ein zum Testen und zur Entwicklung vorgegebener Anbietername. - - - %1 are default vendor names used for testing and development. - %1 sind zum Testen und zur Entwicklung vorgegebene Anbieternamen. - - - "%1" is a default vendor name used for testing and development. <br>The Vendor_Name field cannot contain the name 'Nokia'. <br>You are advised against using the default names 'Vendor' and 'Vendor-EN'. <br>You should also not leave the entry blank. <br>see <a href="http://www.developer.nokia.com/Distribute/Packaging_and_signing.xhtml">Packaging and Signing</a> for guidelines.<br> - "%1" ist ein zum Testen und zur Entwicklung vorgegebener Anbietername. <br>Das Feld Vendor_Name darf den Namen 'Nokia' nicht enthalten.<br>Es wird davon abgeraten, die Vorgabenamen 'Vendor' oder 'Vendor-EN' zu verwenden.<br>Das Feld sollte auch nicht leer sein.<br>siehe <a href="http://www.forum.nokia.com/Distribute/Packaging_and_signing.xhtml">Paketierungs- und Signierungsrichtlinien</a>.<br> - - - %1 <br>The Vendor_Name field cannot contain the name 'Nokia'. <br>You are advised against using the default names 'Vendor' and 'Vendor-EN'. <br>You should also not leave the entry blank. <br>See <a href="http://www.developer.nokia.com/Distribute/Packaging_and_signing.xhtml">Packaging and Signing</a> for guidelines.<br> - %1 <br>Das Feld Vendor_Name darf den Namen 'Nokia' nicht enthalten.<br>Es davon abgeraten, die Vorgabenamen 'Vendor' oder 'Vendor-EN' zu verwenden.<br>Das Feld sollte auch nicht leer sein.<br>siehe <a href="http://www.forum.nokia.com/Distribute/Packaging_and_signing.xhtml">Paketierungs- und Signierungsrichtlinien</a>.<br> - - - The application UID %1 is only for testing and development.<br>SIS packages built with it cannot be distributed via the Nokia Store.<br> - Die Anwendungs-UID %1 kann nur zum Testen und zur Entwicklung verwendet werden.<br>Damit erstellte SIS-Pakete können nicht über den Ovi Store verbreitet werden.<br> - - - The application UID %1 is a symbiansigned.com UID. <br>Applications with this UID will be rejected by Application Signing Services for Nokia Store.<br>If you want to continue with a symbiansigned.com UID, sign your application on symbiansigned.com and upload the signed application to Nokia Publish.<br> - Die Anwendungs-UID %1 stammt von symbiansigned.com.<br>Anwendungen mit dieser UID werden von den Application Signing Services von Ovi Store zurückgewiesen.<br>Wenn Sie eine von symbiansigned.com stammende UID verwenden möchten, lassen Sie bitte Ihre Anwendung von symbiansigned.com signieren und laden die signierte Anwendung zu Publish to Ovi hoch.<br> - - - The application UID %1 is not an acceptable UID.<br>SIS packages built with it cannot be signed by Application Signing Services for Nokia Store.<br> - Die Anwendungs-UID %1 ist ungültig.<br>Damit erstellte SIS-Paketdateien können von den Application Signing Services des Ovi Store nicht signiert werden.<br> - - - The application UID is a global unique indentifier of the SIS package.<br> - Die Anwendungs-UID ist ein global eindeutiger Bezeichner eines SIS-Paketes.<br> - - - To get a unique application UID for your package file,<br>please register at <a href="http://info.publish.ovi.com/">publish.ovi.com</a> - Um eine eindeutige Anwendungs-UID für Ihre Paketdatei zu erhalten,<br>registrieren Sie sich bitte bei <a href="http://info.publish.ovi.com/">publish.ovi.com</a> - - - If this UID is from symbiansigned.com, It will be rejected by Application Signing Services for Nokia Store.<br>If you want to continue with a symbiansigned.com UID, sign your application on symbiansigned.com and upload the signed application to Nokia Publish.<br>It is, however, recommended that you obtain a UID from <a href="http://info.publish.ovi.com/">publish.ovi.com</a> - Die Application Signing Services von Nokia weisen von symbiansigned.com stammende UIDs zurück.<br> Wenn Sie mit einer von symbiansigned.com stammenden UID weiterarbeiten möchten, signieren Sie die Anwendung auf symbiansigned.com und laden die signierte Anwendung zu Nokia Publish hoch. <br> Es ist jedoch empfehlenswert, UIDs von <a href="http://info.publish.ovi.com/">publish.ovi.com</a> zu verwenden - - - %1 need(s) to be certified signed. Please go to <a href="symbiansigned.com">symbiansigned.com</a> for guidance. - %1 muss zertifiziert und signiert werden. Bitte wenden Sie sich für eine weitere Anleitung an <a href="symbiansigned.com">symbiansigned.com</a> . - - - <br>%1 need(s) manufacturer approval.<br> - <br>%1 benötigt die Zustimmung des Herstellers.<br> - - - Some capabilities might require a special kind of signing or approval from the manufacturer.<br> - Einige Berechtigungen benötigen möglicherweise eine spezielle Signierung oder Zustimmung des Herstellers.<br> - - - Please verify that you have a released version of Qt. <br><a href="http://www.developer.nokia.com/Community/Wiki/Nokia_Smart_Installer_for_Symbian">Qt Packages Distributed by Smart Installer</a> has a list of released Qt versions. - Bitte stellen Sie sicher, dass Sie eine freigegebene Qt-Version verwenden. <br><a href="http://wiki.forum.nokia.com/index.php/Nokia_Smart_Installer_for_Symbian">Qt Packages Distributed by Smart Installer</a> stellt eine Liste freigegebener Qt-Versionen bereit. - - - Form - Form - - - Localised Vendor Names - Lokalisierte Anbieternamen - - - Current Global Vendor Name - Aktueller, eindeutiger Anbietername - - - Display name: - Anzuzeigender Name: - - - Localised vendor names: - Lokalisierte Anbieternamen: - - - Capabilities: - Berechtigungen: - - - Current UID3 - Aktuelle UID3 - - - Application UID: - UID der Anwendung: - - - Current Qt Version - Aktuelle Qt-Version - - - Qt version used in builds: - Bei Erstellung verwendete Qt-Version: - - - Current set of capabilities - Akuelle Berechtigungen - - - Global vendor name: - Eindeutiger Anbietername: - - - - Qt4ProjectManager::Internal::S60PublishingWizardFactoryOvi - - Publish Qt Symbian Applications to Nokia Store - Qt Symbian-Anwendungen im Ovi-Store veröffentlichen - - - This wizard checks your project file to make sure it complies with Nokia Store submission criteria. - -The wizard creates SIS files that can be submitted to Nokia Publish. - -You cannot use it if you use application UIDs from Symbian Signed. - -You cannot use it for the Certified Signed and Manufacturer level capabilities: -NetworkControl, MultimediaDD, CommDD, DiskAdmin, AllFiles, DRM and TCB. - -Your application will also be rejected by Nokia Store QA if you choose an unreleased Qt version on the next page. - Dieser Wizard prüft Ihre Projektdatei um sicherzustellen, dass sie den Bestimmungen von Ovi Store entspricht. - -Dieser Wizard erstellt SIS-Paketdateien, die zur Veröffentlichung auf Ovi eingereicht werden können. - -Er kann nicht im Zusammenhang mit UIDs von Symbian Signed verwendet werden. - -Er kann ebenfalls nicht für zertifikatssignierte oder Herstellerberechtigungen verwendet werden: -NetworkControl, MultimediaDD, CommDD, DiskAdmin, AllFiles, DRM und TCB - -Außerdem wird die Anwendung bei Verwendung einer nicht freigegebenen Qt-Version zurückgewiesen. - - - - Qt4ProjectManager::Internal::S60PublishingWizardOvi - - Publishing to Nokia Store - Im OviStore veröffentlichen - - - Build Configuration - Build-Konfiguration - - - Project File Checks - An Projektdatei vorgenommene Überprüfungen - - - Creating an Uploadable SIS File - Erzeuge hochladbare SIS-Datei - - Core::Internal::MimeTypeSettingsModel @@ -20117,7 +19347,7 @@ Außerdem wird die Anwendung bei Verwendung einer nicht freigegebenen Qt-Version Setting anchors in states is not supported. - Anker koennen nicht innerhalb von States gesetzt werden. + Anker können nicht innerhalb von States gesetzt werden. Set bottom anchor @@ -20389,8 +19619,8 @@ Außerdem wird die Anwendung bei Verwendung einer nicht freigegebenen Qt-Version Analyzer::IAnalyzerTool - (Remote) - (entfernt) + (External) + (Extern) @@ -20463,65 +19693,6 @@ Außerdem wird die Anwendung bei Verwendung einer nicht freigegebenen Qt-Version Kopie von %1 - - SymbianUtils::VirtualSerialDevice - - Port not found - Port nicht gefunden - - - Port in use - Der Port ist bereits in Verwendung - - - Timed out - Zeitlimit überschritten - - - Port unreachable - Port nicht erreichbar - - - The port %1 could not be opened: %2 - Der Port %1 konnte nicht geöffnet werden: %2 - - - An error occurred while waiting for read notifications from %1: %2 - Beim Lesen von %1 ist ein Fehler aufgetreten: %2 - - - An error occurred while reading from %1: %2 - Beim Lesen von %1 ist ein Fehler aufgetreten: %2 - - - An error occurred while writing to %1: %2 - Beim Schreiben zu %1 ist ein Fehler aufgetreten: %2 - - - An error occurred while syncing on waitForBytesWritten for %1: %2 - Beim Schreiben zu %1 ist ein Fehler aufgetreten: %2 - - - The port %1 could not be opened: %2 (POSIX error %3) - Der Port %1 konnte nicht geöffnet werden: %2 (POSIX-Fehler %3) - - - Unable to retrieve terminal settings of port %1: %2 (POSIX error %3) - Die Terminal-Einstellungen von Port %1 konnten nicht abgefragt werden: %2 (POSIX-Fehler %3) - - - Unable to apply terminal settings to port %1: %2 (POSIX error %3) - Die Terminal-Einstellungen von Port %1 konnten nicht gesetzt werden: %2 (POSIX-Fehler %3) - - - Cannot write to port %1: %2 (POSIX error %3) - Es konnte nicht zu Port %1 geschrieben werden: %2 (POSIX-Fehler %3) - - - The function select() returned an error on port %1: %2 (POSIX error %3) - Bei Port %1 gab die Funktion select() einen Fehler zurück: %2 (POSIX-Fehler %3) - - Qt4ProjectManager::AbstractMobileAppWizardDialog @@ -20532,10 +19703,6 @@ Außerdem wird die Anwendung bei Verwendung einer nicht freigegebenen Qt-Version Mobile Options Einstellungen für Mobilgeräte - - Symbian Specific - Symbian-spezifisch - Maemo5 And MeeGo Specific Maemo5- und Meego-spezifisch @@ -20548,13 +19715,25 @@ Außerdem wird die Anwendung bei Verwendung einer nicht freigegebenen Qt-Version Qt4ProjectManager::TargetSetupPage - Target Setup - Ziel einrichten + <span style=" font-weight:600;">No valid kits found.</span> + <span style=" font-weight:600;">Es wurden keine gültigen Kits gefunden.</span> - Qt Creator can set up the following targets for project <b>%1</b>: + Please add a kit in the <a href="buildandrun">options</a> or via the maintenance tool of the SDK. + Bitte fügen Sie ein Kit in den <a href="buildandrun">Einstellungen</a> oder unter Verwendung des SDK-Verwaltungswerkzeugs hinzu. + + + Select Kits for Your Project + Kits des Projekts einrichten + + + Kit Selection + Kit-Auswahl + + + Qt Creator can use the following kits for project <b>%1</b>: %1: Project name - Qt Creator kann für das Projekt <b>%1</b> die folgenden Ziele anlegen: + Qt Creator kann für das Projekt <b>%1</b> die folgenden Kits verwenden: No Build Found @@ -20875,8 +20054,8 @@ Gibt an, wie sich die Rücktaste bezüglich Einrückung verhält. Alles erstellen - Tool chain: - Toolchain: + Compiler: + Compiler: @@ -21080,6 +20259,10 @@ Bei vollständiger Cache-Simulation werden weitere Ereigniszähler aktiviert: Please configure <b>%1</b> now. Bitte konfigurieren Sie jetzt <b>%1</b>. + + Configure... + Einstellungen... + FlickableGroupBox @@ -21822,15 +21005,15 @@ Sollen sie überschrieben werden? CodeStyleSettingsPanelFactory - Code Style Settings - Coding-Stil-Einstellungen + Code Style + Coding-Stil CodeStyleSettingsPanel - Code Style Settings - Coding-Stil-Einstellungen + Code Style + Coding-Stil @@ -21965,12 +21148,6 @@ Sollen sie überschrieben werden? Save QML Trace QML-Trace speichern - - Application finished before loading profiled data. - Please use the stop button instead. - Die Anwendung wurde vor dem Laden der Profildaten beenden. -Bitte verwenden Sie den Stop-Button. - The QML profiler requires Qt 4.7.4 or newer. The Qt version configured in your active build configuration is too old. @@ -21991,6 +21168,12 @@ Wollen Sie fortfahren? QML traces (*%1) QML-Traces (*%1) + + Application finished before loading profiled data. +Please use the stop button instead. + Die Anwendung wurde vor dem Laden der Profildaten beendet. +Bitte verwenden Sie den Stop-Button. + Discard data Daten löschen @@ -22026,238 +21209,6 @@ Wollen Sie fortfahren? Ausführen - - Qt4ProjectManager::CodaRunControl - - No device is connected. Please connect a device and try again. - - Es ist kein Gerät verbunden. Bitte stellen Sie die Verbindung zu einem Gerät her und versuchen Sie es erneut. - - - - Executable file: %1 - - Ausführbare Datei: %1 - - - - Connecting to '%1'... - - Verbinde zu '%1'... - - - - Unable to create CODA connection. Please try again. - - Es konnte keine Vebindung zu CODA hergestellt werden. Bitte versuchen Sie es erneut. - - - - Could not open serial device: %1 - - Die serielle Schnittstelle konnte nicht geöffnet werden: %1 - - - - Connecting to %1:%2... - - Verbinde zu %1: %2... - - - - Error: %1 - - Fehler: %1 - - - - Connected. - - verbunden. - - - - Process has finished. - - Der Prozess wurde beendet. - - - - Thread has crashed: %1 - - Ein Thread ist abgestürzt: %1 - - - - The process is already running on the device. Please first close it. - - Der Prozess läuft bereits auf dem Mobilgerät. Bitte schließen Sie ihn zuerst. - - - - Launching: %1 - - Starte: %1 - - - - Launched. - - Gestartet. - - - - Launch failed: %1 - - Fehlschlag beim Starten: %1 - - - - Waiting for CODA - Warte auf CODA - - - Qt Creator is waiting for the CODA application to connect.<br>Please make sure the application is running on your mobile phone and the right IP address and/or port are configured in the project settings. - Qt Creator wartet auf eine Verbindung zur CODA-Anwendung.<br>Bitte starten Sie die Anwendung auf dem Mobiltelefon und prüfen Sie die Einstellung der IP-Adresse und des Ports in der Projektkonfiguration. - - - Canceled. - - Abgebrochen. - - - - The device '%1' has been disconnected. - - Die Verbindung zum Gerät '%1' wurde getrennt. - - - - - Qt4ProjectManager::S60DeployConfiguration - - Deploy %1 to Symbian device - Deployment von %1 auf Symbian-Gerät - - - Deploy to Symbian device - Deployment auf Symbian-Gerät - - - - Qt4ProjectManager::S60DeployConfigurationFactory - - %1 on Symbian Device - %1 auf Symbian-Gerät - - - Deploy to Symbian device - Deployment auf Symbian-Gerät - - - - Qt4ProjectManager::S60DeviceRunConfiguration - - %1 on Symbian Device - S60 device runconfiguration default display name, %1 is base pro-File name - %1 auf Symbian-Gerät - - - Run on Symbian device - S60 device runconfiguration default display name (no profile set) - Ausführung auf Symbian-Gerät - - - The .pro file '%1' is currently being parsed. - Die .pro-Datei '%1' wird gerade ausgewertet. - - - - Qt4ProjectManager::S60DeviceRunConfigurationFactory - - %1 on Symbian Device - %1 auf Symbian-Gerät - - - - Qt4ProjectManager::Internal::S60CommandPublishStep - - Running %1 - %1 is a name of the Publish Step i.e. Clean Step - Führe %1 aus - - - - Qt4ProjectManager::Internal::S60PublishingBuildSettingsPageOvi - - No valid Qt version has been detected.<br>Define a correct Qt version in "Options > Qt4" - Es konnte keine gültige Qt-Version gefunden werden. <br> Bitte geben Sie eine korrekte Qt-Version unter "Einstellungen/Qt 4" an - - - No valid tool chain has been detected.<br>Define a correct tool chain in "Options > Tool Chains" - Es konnte keine gültige Toolchain gefunden werden. <br> Bitte geben Sie eine korrekte Toolchain unter "Einstellungen/Toolchains" an - - - Form - Form - - - Choose a build configuration: - Build-Konfiguration wählen: - - - Choose a tool chain: - Toolchain wählen: - - - Only Qt versions above 4.6.3 are made available in this wizard. -Previous Qt versions have limitations in building suitable SIS files. - Dieser Wizard zeigt nur Qt-Versionen nach Version 4.6.3 an, da in den vorangegangenen Versionen -Einschränkungen bezüglich der Erstellung von SIS-Dateien bestehen. - - - - Qt4ProjectManager::S60RunControlBase - - Launching - Starte - - - Please finalise the installation on your device. - - Bitte beenden Sie die Installation auf dem Mobilgerät. - - - - <html><head/><body><center><i>%1</i> is still running on the device.</center><center>Terminating it can leave the target in an inconsistent state.</center><center>Would you still like to terminate it?</center></body></html> - <html><head/><body><center><i>%1</i> läuft noch auf dem Mobilgerät.<center/><center>Ein Abbruch kann zu einem inkonsistenten Zustand des Gerätes führen.</center><center>Möchten Sie dennoch abbrechen?</center></body></html> - - - Application Still Running - Anwendung läuft noch - - - Force Quit - Beenden - - - Keep Running - Fortsetzen - - - Finished. - - Beendet. - - - - - Qt4ProjectManager::Internal::SymbianQtConfigWidget - - SBS v2 directory: - SBS-v2-Ordner: - - Qt4ProjectManager::Qt4BuildConfiguration @@ -22314,8 +21265,8 @@ Einschränkungen bezüglich der Erstellung von SIS-Dateien bestehen. BaseQtVersion - The tool chain '%1' (%2) cannot produce code for the Qt version '%3' (%4). - Die Toolchain '%1' (%2) kann für die Qt-Version '%3' (%4) keinen Code erstellen. + The compiler '%1' (%2) cannot produce code for the Qt version '%3' (%4). + Der Compiler '%1' (%2) kann für die Qt-Version '%3' (%4) keinen Code erstellen. Name: @@ -22368,14 +21319,6 @@ Einschränkungen bezüglich der Erstellung von SIS-Dateien bestehen.Do you want to remove all invalid Qt Versions?<br><ul><li>%1</li></ul><br>will be removed. Möchten Sie alle ungültigen Qt-Versionen entfernen? <br><ul><li>%1</li></ul><br> wird entfernt. - - No tool chain can produce code for this Qt version. Please define one or more tool chains. - Keine Toolchain kann für diese Qt-Version Code erzeugen. Bitte richten Sie geeignete Toolchains ein. - - - Not all possible target environments can be supported due to missing tool chains. - Es können nicht alle Zielumgebungen unterstützt werden, da einige Toolchains fehlen. - Building helpers Ausgabe-Hilfsbibliothek @@ -22417,6 +21360,14 @@ Einschränkungen bezüglich der Erstellung von SIS-Dateien bestehen.Remove Invalid Qt Versions Ungültige Qt-Versionen entfernen + + No compiler can produce code for this Qt version. Please define one or more compilers. + Kein Compiler kann für diese Qt-Version Code erzeugen. Bitte richten Sie einen oder mehrere geeignete Compiler ein. + + + Not all possible target environments can be supported due to missing compilers. + Es können nicht alle Zielumgebungen unterstützt werden, da einige Compiler fehlen. + The following ABIs are currently not supported:<ul><li>%1</li></ul> Die folgenden ABIs werden gegenwärtig nicht unterstützt: <ul><li>%1</ul> @@ -22429,21 +21380,6 @@ Einschränkungen bezüglich der Erstellung von SIS-Dateien bestehen.The Qt version selected must be for the same target. Die ausgewählte Qt-Version muss für dasselbe Ziel vorgesehen sein. - - S60 SDK: - S60 SDK: - - - SBS v2 directory: - SBS-v2-Ordner: - - - - QtSupport::QtVersionManager - - MinGW from %1 - MinGW aus %1 - RemoteLinux::Internal::MaemoGlobal @@ -22623,14 +21559,14 @@ Einschränkungen bezüglich der Erstellung von SIS-Dateien bestehen.Cost Format Format der Kosten - - Cycle Detection - Schleifenerkennung - Enable cycle detection to properly handle recursive or circular function calls. Aktivieren Sie die Schleifenerkennung, um rekursive oder zyklische Funktionsaufrufe richtig zu behandeln. + + This removes template parameter lists when displaying function names. + Entfernt Template-Parameterlisten bei der Anzeige von Funktionsnamen. + Show Project Costs Only Nur Projektkosten anzeigen @@ -22838,41 +21774,6 @@ Einschränkungen bezüglich der Erstellung von SIS-Dateien bestehen.Neues Projekt - - Coda::Session - - CPU: v%1.%2%3%4 - CPU description of an S60 device %1 major verison, %2 minor version %3 real name of major verison, %4 real name of minor version - CPU: v%1.%2%3%4 - - - CODA: v%1.%2 CODA protocol: v%3.%4 - CODA: v%1.%2 CODA-Protokoll: v%3.%4 - - - %1, %2%3%4, %5 - s60description description of an S60 device %1 CPU description, %2 endianness %3 default type size (if any), %4 float size (if any) %5 Coda version - %1, %2%3%4, %5 - - - big endian - big endian - - - little endian - little endian - - - , type size: %1 - will be inserted into s60description - , Typgröße: %1 - - - , float size: %1 - will be inserted into s60description - , Gleitkomma-Größe: %1 - - Valgrind::Callgrind::ParseData @@ -23443,7 +22344,7 @@ Zusätzlich wird die Verbindung zum Gerät getestet. Debug - + Debug Release @@ -23454,8 +22355,8 @@ Zusätzlich wird die Verbindung zum Gerät getestet. Soll %1 im Modus %2 ausgeführt werden? - <html><head/><body><p>You are trying to run the tool "%1" on an application in %2 mode. The tool is designed to be used in %3 mode.</p><p>Do you want to continue and run it in %2 mode?</p></body></html> - <html><head/><body><p>Sie versuchen, das Werkzeug '%1' mit einer Anwendung im Modus %2 zu betreiben. Das Werkzeug ist zur Verwendung im Modus %3 vorgesehen.</p><p>Möchten Sie trotzdem fortsetzen und es im Modus %2 laufen lassen?</p></body></html> + <html><head/><body><p>You are trying to run the tool "%1" on an application in %2 mode. The tool is designed to be used in %3 mode.</p><p>Debug and Release mode run-time characteristics differ significantly, analytical findings for one mode may or may not be relevant for the other.</p><p>Do you want to continue and run the tool in %2 mode?</p></body></html> + <html><head/><body><p>Sie versuchen, das Werkzeug "%1" mit einer Anwendung im Modus %2 zu verwenden. Das Werkzeug ist zur Verwendung im Modus %3 vorgesehen.</p><p>Die Charakteristiken von Debug- und Release-Modus unterscheiden sich beträchtlich; die Analyseergebnisse eines Modus' sind nicht immer für den jeweils anderen Modus relevant.</p><p>Möchten Sie trotzdem fortsetzen und es im Modus %2 verwenden?</p></body></html> &Do not ask again @@ -23861,9 +22762,12 @@ Um den QML-Beobachter zu erstellen, gehen Sie auf die Qt-Einstellungsseite, wäh Do not warn again Nicht noch einmal anzeigen - - The search resulted in more than %1 items, do you still want to continue? - Die Suche ergab mehr als %1 Treffer. Möchten Sie trotzdem fortsetzen? + + The search resulted in more than %n items, do you still want to continue? + + Die Suche ergab mehr als einen Treffer. Möchten Sie trotzdem fortsetzen? + Die Suche ergab mehr als %n Treffer. Möchten Sie trotzdem fortsetzen? + Continue @@ -23959,17 +22863,6 @@ Um den QML-Beobachter zu erstellen, gehen Sie auf die Qt-Einstellungsseite, wäh Es sind keine Qt-Pakete installiert. - - Madde::Internal::AbstractMaddeUploadAndInstallPackageAction - - Cannot deploy: Qemu was not running. It has now been started up for you, but it will take a bit of time until it is ready. Please try again then. - Das Deployment schlug fehl, da Qemu nicht lief. Es wurde soeben gestartet, benötigt jedoch noch einige Zeit. Bitte versuchen Sie es nach einiger Zeit noch einmal. - - - Cannot deploy: You want to deploy to Qemu, but it is not enabled for this Qt version. - Das Deployment zu Qemu schlug fehl, da Qemu für diese Qt-Version nicht verfügbar ist. - - Madde::Internal::MaemoUploadAndInstallPackageStep @@ -23983,14 +22876,6 @@ Um den QML-Beobachter zu erstellen, gehen Sie auf die Qt-Einstellungsseite, wäh Madde::Internal::AbstractMaemoDeployByMountService - - Cannot deploy: Qemu was not running. It has now been started up for you, but it will take a bit of time until it is ready. Please try again then. - Das Deployment schlug fehl, da Qemu nicht lief. Es wurde soeben gestartet, benötigt jedoch noch einige Zeit. Bitte versuchen Sie es nach einiger Zeit noch einmal. - - - Cannot deploy: You want to deploy to Qemu, but it is not enabled for this Qt version. - Das Deployment zu Qemu schlug fehl, da Qemu für diese Qt-Version nicht verfügbar ist. - Missing build configuration. Fehlende Build-Konfiguration. @@ -24178,8 +23063,8 @@ Um den QML-Beobachter zu erstellen, gehen Sie auf die Qt-Einstellungsseite, wäh Der angegebene Ordner existiert nicht und kann nicht angelegt werden. - Creating keys... - Erzeuge Schlüssel... + Creating keys... + Erzeuge Schlüssel... Key creation failed: %1 @@ -24217,7 +23102,7 @@ Um den QML-Beobachter zu erstellen, gehen Sie auf die Qt-Einstellungsseite, wäh Schlüssel senden - Deploying... + Deploying... Sende Schlüssel... @@ -25495,8 +24380,8 @@ Fehlerausgabe: '%1' Coding-Stile (*.xml);;Alle Dateien (*) - Cannot import code style - Der Coding-Stil kann nicht importiert werden + Cannot import code style from %1 + Der Coding-Stil kann nicht von %1 importiert werden Export Code Style @@ -25983,12 +24868,8 @@ p, li { white-space: pre-wrap; } Debugger starten - Target: - Ziel: - - - &Host: - &Host: + Kit: + Kit: &Port: @@ -26061,6 +24942,22 @@ p, li { white-space: pre-wrap; } Show QML object tree QML-Objektbaum anzeigen + + Enable a full file path in breakpoints by default also for the GDB + Vollständiger Pfad für Haltepunkte auch bei GDB als Vorgabe + + + Breakpoints full path by default + Vollständiger Pfad für Haltepunkte als Vorgabe + + + Stop when %1() is called + Bei Aufruf von %1() anhalten + + + Always add a breakpoint on the <i>%1()</i> function. + Fügt bei der Funktion <i>%1()</i> stets einen Haltepunkt ein. + Debugger::Internal::DebuggingHelperOptionPage @@ -26354,13 +25251,6 @@ Die Ausgabe-Hilfsbibliothek dient lediglich zur formatierten Ausgabe von Objekte Resultierender qmake-Aufruf: - - Qt4ProjectManager::Internal::S60CertificateDetailsDialog - - Details of Certificate - Details zum Zertifikat - - Qt4ProjectManager::Internal::Html5AppWizardSourcesPage @@ -26434,43 +25324,16 @@ Die Ausgabe-Hilfsbibliothek dient lediglich zur formatierten Ausgabe von Objekte Symbol der Anwendung (64x64): - - Qt4ProjectManager::Internal::MobileAppWizardSymbianOptionsPage - - WizardPage - WizardPage - - - Application icon (.svg): - Symbol der Anwendung (.svg): - - - Target UID3: - Ziel-UID3: - - - Enable network access - Netzwerkzugriff gestatten - - Qt4ProjectManager::Internal::MobileLibraryWizardOptionPage WizardPage WizardPage - - Target UID3: - Ziel-UID3: - Plugin's directory name: Ordner des Plugins: - - Enable network access - Netzwerkzugriff gestatten - QtSupport::Internal::ShowBuildLog @@ -27106,13 +25969,6 @@ should a repository require SSH-authentication (see documentation on SSH and the &Graphische SSH-Passwortabfrage: - - VcsBase::Internal::VcsConfigurationPage - - Configure... - Einstellungen... - - develop @@ -27768,6 +26624,14 @@ should a repository require SSH-authentication (see documentation on SSH and the Make Make + + Qt Creator needs a compiler set up to build. Configure a compiler in the kit options. + Qt Creator benötigt einen Compiler zum Erstellen des Projekts. Bitte richten Sie einen Compiler in den Kit-Einstellungen ein. + + + Configuration is faulty. Check the Issues view for details. + Die Konfiguration ist fehlerhaft. Details befinden sich in der Ansicht "Build-Probleme". + AutotoolsProjectManager::Internal::MakeStepConfigWidget @@ -28277,6 +27141,10 @@ references to elements in other files, loops, etc.) Analyzer Analyse + + No analyzer tool selected + Es ist kein Analysewerkzeug ausgewählt. + QuickFix::ExtractFunction @@ -28357,16 +27225,16 @@ references to elements in other files, loops, etc.) Projekt konfigurieren - <p>The project <b>%1</b> is not yet configured.</p><p>Qt Creator cannot parse the project, because no target has been set up. You can set up targets in the <b><a href="edit">settings.</a></b></p> - <p>Das Projekt <b>%1</b> ist noch nicht konfiguriert.</p><p>Qt Creator kann es nicht auswerten, weil noch kein Ziel eingerichtet wurde. Sie können Ziele in den <b><a href="edit">Einstellungen</a></b> einrichten.</p> + The project <b>%1</b> is not yet configured.<br/>Qt Creator cannot parse the project, because no kit has been set up. + Das Projekt <b>%1</b> ist noch nicht konfiguriert.<br/>Qt Creator kann es nicht auswerten, weil noch kein Kit eingerichtet wurde. - <p>The project <b>%1</b> is not yet configured.</p><p>Qt Creator uses the target: <b>%2</b> to parse the project. You can edit these in the <b><a href="edit">settings.</a></b></p> - <p>Das Projekt <b>%1</b> ist noch nicht konfiguriert.</p><p>Qt Creator verwendet das Ziel <b>%2</b>, um das Projekt auszuwerten. Sie können es in den <b><a href="edit">Einstellungen</a></b> bearbeiten.</p> + The project <b>%1</b> is not yet configured.<br/>Qt Creator uses the kit <b>%2</b> to parse the project. + Das Projekt <b>%1</b> ist noch nicht konfiguriert.<br/>Qt Creator verwendet das Kit <b>%2</b> um das Projekt auszuwerten. - <p>The project <b>%1</b> is not yet configured.</p><p>Qt Creator uses the <b>invalid</b> target: <b>%2</b> to parse the project. You can edit these in the <b><a href="edit">settings</a></b></p> - <p>Das Projekt <b>%1</b> ist noch nicht konfiguriert.</p><p>Qt Creator verwendet das <b>ungültige</b> Ziel <b>%2</b>, um das Projekt auszuwerten. Sie können es in den <b><a href="edit">Einstellungen</a></b> bearbeiten.</p> + The project <b>%1</b> is not yet configured.<br/>Qt Creator uses the <b>invalid</b> kit <b>%2</b> to parse the project. + Das Projekt <b>%1</b> ist noch nicht konfiguriert.<br/>Qt Creator verwendet das <b>ungültige</b> Kit <b>%2</b> um das Projekt auszuwerten. @@ -28379,10 +27247,6 @@ references to elements in other files, loops, etc.) Maemo/Fremantle Maemo/Fremantle - - Symbian - Symbian - Desktop Desktop @@ -28602,16 +27466,12 @@ references to elements in other files, loops, etc.) Die Datei <i>%1</i> ist schreibgeschützt. - Open with VCS (%1) - Öffnen mittels Versionskontrollsystem (%1) + Make &Writable + &Schreibbar machen - Make Writable - Schreibbar machen - - - Save As... - Speichern als... + &Save As... + Speichern &unter... Cannot reload %1 @@ -28861,10 +27721,6 @@ references to elements in other files, loops, etc.) Name: Name: - - Target: - Ziel: - SD card size: Größe der SD-Karte: @@ -28873,6 +27729,10 @@ references to elements in other files, loops, etc.) MiB MiB + + Kit: + Kit: + AndroidCreateKeystoreCertificate @@ -29131,7 +27991,11 @@ Sie müssen für die Plattform kompiliert vorliegen <p align="justify">Packages are usually defined using a hierarchical naming pattern, with levels in the hierarchy separated by periods (.) (pronounced "dot").</p> <p align="justify">In general, a package name begins with the top level domain name of the organization and then the organization's domain and then any subdomains listed in reverse order. The organization can then choose a specific name for their package. Package names should be all lowercase characters whenever possible.</p> <p align="justify">Complete conventions for disambiguating package names and rules for naming packages when the Internet domain name cannot be directly used as a package name are described in section 7.7 of the Java Language Specification.</p> - + <p align="justify">Bitte wählen Sie einen gültigen Paketnamen für Ihre Anwendung (z.B. "org.example.myapplication").</p> +<p align="justify">Paketnamen werden üblicherweise nach einem hierarchischem Namensschema festgelegt, bei dem die Ebenen der Hierarchie durch Punkte (.) (ausgesprochen "dot") getrennt werden.</p> +<p align="justify">Im allgemeinen beginnt ein Paketname mit dem Top-Level-Domainname der Organisation, gefolgt von der Domain der Organisation und den Sub-Domains in umgekehrter Reihenfolge. Die Organisation kann dann einen spezifischen Namen für das Paket festlegen. Paketnamen sollten nach Möglichkeit nur aus Kleinbuchstaben bestehen.</p> +<p align="justify">Die vollständigen Konventionen zur Sicherstellung der Eindeutigkeit der Paketnamen und Regeln für den Fall, dass der Internet-Domain-Name nicht direkt als Paketname verwendet werden kann, sind im Abschnnitt 7.7 der Java-Sprachspezifikation beschrieben.</p> + <center>Prebundled libraries</center> @@ -29303,6 +28167,10 @@ Sie müssen für die Plattform kompiliert vorliegen No Nein + + Remote Processes + Entfernte Prozesse + Qnx::Internal::BarDescriptorFileImageWizardPage @@ -29606,6 +28474,10 @@ Sie müssen für die Plattform kompiliert vorliegen Cannot append to remote file: Server does not support the file size attribute. Es können keine Daten an die entfernte Datei angehängt werden, da der Server das Dateigrößenattribut nicht unterstützt. + + SFTP channel closed unexpectedly. + Der SFTP-Kanal wurde unerwartet geschlossen. + Server could not start session: %1 Der Server konnte keine Sitzung starten: %1 @@ -29736,8 +28608,8 @@ Sie müssen für die Plattform kompiliert vorliegen Entfernte Analyse starten - Target: - Ziel: + Kit: + Kit: Executable: @@ -30163,22 +29035,6 @@ Bitte wählen Sie einen gültigen Paketnamen für Ihre Anwendung (z.B. "org Android-Konfigurationen - - Android::Internal::AVDModel - - AVD Name - AVD - Android Virtual Device - AVD-Name - - - AVD Target - AVD-Ziel - - - CPU/ABI - CPU/ABI - - Android::Internal::AndroidSettingsWidget @@ -30236,8 +29092,8 @@ Bitte wählen Sie einen gültigen Paketnamen für Ihre Anwendung (z.B. "org Android::Internal::AndroidToolChainConfigWidget - NDK Root: %1 - NDK-Wurzel: %1 + NDK Root: + NDK Root: @@ -30325,59 +29181,12 @@ Bitte wählen Sie einen gültigen Paketnamen für Ihre Anwendung (z.B. "org Haltepunkt setzen - - Debugger::Internal::DebuggerProfileConfigWidget - - <html><body><p>Specify the path to the <a href="%1">Windows Console Debugger executable</a> (%2) here.</p></body></html> - Label text for path configuration. %2 is "x-bit version". - <html><body><p>Geben Sie den Pfad zu der ausführbaren Datei des <a href="%1">Windows Console Debuggers</a> (%2) an.</p></body></html> - - - 64-bit version - 64-bit-Version - - - 32-bit version - 32-bit-Version - - - Auto detect - Automatisch bestimmen - - - Debugger command: - Debugger: - - - - Debugger::DebuggerProfileInformation - - No debugger set up. - Es ist kein Debugger eingerichtet. - - - Debugger not found. - Es konnte kein Debugger gefunden werden. - - - Debugger not exectutable. - Der Debugger ist nicht ausführbar. - - - Debugger - Debugger - - DebuggerPlugin Debug Debug - - Debugger - Debugger - Unable to create a debugger engine of the type '%1' Es konnte keine Debugger-Engine des Typs '%1' erzeugt werden @@ -30399,23 +29208,6 @@ Bitte wählen Sie einen gültigen Paketnamen für Ihre Anwendung (z.B. "org An Prozess %1 angehängt. - - Debugger::Internal::GdbCodaEngine - - Process started, PID: 0x%1, thread id: 0x%2, code segment: 0x%3, data segment: 0x%4. - Der Prozess wurde gestartet, PID: 0x%1, Thread-ID: 0x%2, Code-Segment: 0x%3, Datensegment: 0x%4. - - - Connecting to CODA server adapter failed: - - Die Verbindung zum CODA-Server-Adapter schlug fehl: - - - - Could not obtain device. - Es konnte keine Verbindung erhalten werden. - - Debugger::Internal::GdbCoreEngine @@ -30671,10 +29463,6 @@ Einzelschritt in den Modul und das Setzen von Haltepunkten nach Datei und Zeilen Connecting to debug server %1:%2 Verbinde zum Debug-Server %1:%2 - - Connecting to debug server on %1 - Verbinde zum Debug-Server an %1 - Error: (%1) %2 %1=error code, %2=error message @@ -31418,90 +30206,12 @@ Möchten Sie sie zum Projekt hinzufügen?</html> Gerät - - ProjectExplorer::Profile - - Unnamed - Unbenannt - - - Clone of %1 - Kopie von %1 - - - Error: - Fehler: - - - Warning: - Warnung: - - - - ProjectExplorer::ProfileChooser - - %1 (%2) - %1 (%2) - - - <html><head/><body><table><tr><td>ABI:</td><td><i>%1</i></td></tr><tr><td>Debugger:</td><td>%2</td></tr> - <html><head/><body><table><tr><td>ABI:</td><td><i>%1</i></td></tr><tr><td>Debugger:</td><td>%2</td></tr> - - - - ProjectExplorer::SysRootProfileInformation - - Sys Root "%1" is not a directory. - Sys-Root "%1" ist kein Ordner. - - - Sys Root - Sys-Root - - - - ProjectExplorer::ToolChainProfileInformation - - Tool chain - Toolchain - - - None - Keine - - - No tool chain set in target. - Im Ziel ist keine Toolchain eingerichtet. - - - - ProjectExplorer::DeviceTypeProfileInformation - - Device does not match device type. - Das Gerät entspricht nicht dem Gerätetyp. - - - Unknown device type - Unbekannter Gerätetyp - - - Device type - Gerätetyp - - - - ProjectExplorer::DeviceProfileInformation - - Device - Gerät - - - Unconfigured - Nicht konfiguriert - - ProjectExplorer::Internal::SysRootInformationConfigWidget + + The root directory of the system image to use.<br>Leave empty when building for the desktop. + Das Wurzelverzeichnis des zu verwendenden System-Images.<br>Bei der Erstellung für Desktop ist keine Angabe erforderlich. + Sysroot: Sysroot: @@ -31509,21 +30219,29 @@ Möchten Sie sie zum Projekt hinzufügen?</html> ProjectExplorer::Internal::ToolChainInformationConfigWidget + + The compiler to use for building.<br>Make sure the compiler will produce binaries compatible with the target device, Qt version and other libraries used. + Der zur Erstellung zu verwendende Compiler.<br>Stellen Sie sicher, dass dieser Compiler Binärdateien erstellt, die mit dem Zielgerät, der Qt-Version und anderen verwendeten Bibliotheken kompatibel sind. + Manage... Verwalten... - Tool chain: - Toolchain: + Compiler: + Compiler: - <No tool chain available> - <Keine Toolchain verfügbar> + <No compiler available> + <Kein Compiler verfügbar> ProjectExplorer::Internal::DeviceTypeInformationConfigWidget + + The type of device to run applications on. + Der Typ des Geräts, auf dem die Anwendung laufen soll. + Device Type: Gerätetyp: @@ -31531,6 +30249,10 @@ Möchten Sie sie zum Projekt hinzufügen?</html> ProjectExplorer::Internal::DeviceInformationConfigWidget + + The device to run the applications on. + Das Gerät, auf dem die Anwendung laufen soll. + Manage... Verwalten... @@ -31540,87 +30262,6 @@ Möchten Sie sie zum Projekt hinzufügen?</html> Gerät: - - ProjectExplorer::ProfileManager - - Desktop - Desktop - - - - ProjectExplorer::Internal::ProfileManagerConfigWidget - - Targets - Ziele - - - Select Icon - Symbol auswählen - - - Images (*.png *.xpm *.jpg) - Bilddateien (*.png *.xpm *.jpg) - - - - ProjectExplorer::Internal::ProfileModel - - Auto-detected - Automatisch bestimmt - - - Manual - Benutzerdefiniert - - - %1 (default) - Mark up a profile as the default one. - %1 (Vorgabe) - - - Name - Name - - - Duplicate Target Detected - Mehrfach auftretendes Ziel - - - The target<br>&nbsp;%1<br> was already configured. It was not configured again. - Das Ziel <br>&nbsp;%1<br> wurde bereits konfiguriert. Es wurde nicht noch einmal konfiguriert. - - - Duplicate Targets Detected - Mehrfach auftretende Ziele - - - The following targets were already configured:<br>&nbsp;%1<br>They were not configured again. - Die folgenden Ziele wurden bereits konfiguriert:<br>&nbsp;%1<br>Sie wurden nicht noch einmal konfiguriert. - - - - ProjectExplorer::ProfileOptionsPage - - Targets - Ziele - - - Add - Hinzufügen - - - Clone - Klonen - - - Remove - Entfernen - - - Make Default - Als Vorgabe setzen - - ProjectExplorer::Target @@ -31960,6 +30601,10 @@ Soll es noch einmal versucht werden? Qnx::Internal::BlackBerryRunControlFactory + + No active deploy configuration + Es ist keine aktive Deploy-Konfiguration vorhanden + Run on BlackBerry Device Ausführung auf BlackBerry-Gerät @@ -32031,178 +30676,6 @@ Soll es noch einmal versucht werden? Ausführung auf QNX-Gerät - - Qt4ProjectManager::Internal::QmakeProfileConfigWidget - - Qt mkspec: - Qt-mkspec: - - - - Qt4ProjectManager::QmakeProfileInformation - - No Qt version set, so mkspec is ignored. - Es ist keine Qt-Version gesetzt, die mkspec wird ignoriert. - - - Mkspec not found for Qt version. - Für diese Qt-Version konnte keine Mkspec gefunden werden. - - - mkspec - mkspec - - - - Qt4ProjectManager::SymbianIDevice - - Device - Gerät - - - Not connected - Nicht verbunden - - - %1, %2 - %1 device friendly name, %2 additional information - %1, %2 - - - IP address - IP-Adresse - - - %1:%2 - %1:%2 - - - Symbian Device - Symbian-Gerät - - - - Qt4ProjectManager::Internal::SymbianIDeviceConfigurationWidget - - Device: - Gerät: - - - Serial: - Seriell: - - - WLAN: - WLAN: - - - Queries the device for information - Fragt Informationen vom Gerät ab - - - Serial port: - Serielle Schnittstelle: - - - Communication Channel - Kommunikationskanal - - - Address: - Adresse: - - - Connecting - Verbinde - - - Unable to create CODA connection. Please try again. - Es konnte keine CODA-Verbindung hergestellt werden. Bitte versuchen Sie es erneut. - - - Currently there is no information about the device for this connection type. - Für diesen Verbindungstyp sind gegenwärtig keine Informationen über das Gerät verfügbar. - - - No device information available - Keine Informationen für Gerät verfügbar - - - Qt version: - Qt-Version: - - - Not installed on device - Nicht auf Gerät installiert - - - Qt version: - Qt-Version: - - - Unrecognised Symbian version 0x%1 - Unbekannte Symbian-Version 0x%1 - - - Unrecognised S60 version 0x%1 - Unbekannte S60-Version 0x%1 - - - OS version: - Betriebssystem-Version: - - - unknown - unbekannt - - - ROM version: - ROM-Version: - - - Release: - Release: - - - CODA version: - CODA-Version: - - - Error reading CODA version - Fehler beim Bestimmen der CODA-Version - - - Qt Mobility version: - Qt Mobility-Version: - - - Error reading Qt Mobility version - Fehler beim Lesen der Qt Mobility-Version - - - Qt Quick components version: - Version der Qt Quick-Komponenten: - - - Not installed - Nicht installiert - - - QML Viewer version: - Version des QML Viewers: - - - Screen size: - Bildschirmgröße: - - - - Qt4ProjectManager::Internal::SymbianIDeviceFactory - - Symbian Device - Symbian-Gerät - - Qt4ProjectManager::Qt4TargetSetupWidget @@ -32247,7 +30720,7 @@ Soll es noch einmal versucht werden? Run in &terminal - In &Terminal ausführen + Im &Terminal ausführen Run Environment @@ -32304,32 +30777,6 @@ Soll es noch einmal versucht werden? Benutzerdefinierte ausführbare Datei - - QtSupport::Internal::QtProfileConfigWidget - - Manage... - Verwalten... - - - None - Keine - - - Qt version: - Qt-Version: - - - - QtSupport::QtProfileInformation - - Qt version - Qt-Version: - - - None - Keine - - RemoteLinux::RemoteLinuxCheckForFreeDiskSpaceService @@ -32345,17 +30792,17 @@ Soll es noch einmal versucht werden? Unerwartete Ausgabe des entfernten Prozesses: '%1'. - The remote file system has only %n bytes of free space, but %1 bytes are required. + The remote file system has only %n megabytes of free space, but %1 megabytes are required. - Das entfernte Dateisystem hat nur ein Byte freien Speicherplatz; es sind aber %1 Bytes erforderlich. - Das entfernte Dateisystem hat nur %n Bytes freien Speicherplatz; es sind aber %1 Bytes erforderlich. + Das entfernte Dateisystem hat nur 1 Megabyte freien Speicherplatz; es sind aber %1 Megabytes erforderlich. + Das entfernte Dateisystem hat nur %n Megabytes freien Speicherplatz; es sind aber %1 Megabytes erforderlich. - The remote file system has %n bytes of free space, going ahead. + The remote file system has %n megabytes of free space, going ahead. - Das entfernte Dateisystem hat 1 Byte freien Speicherplatz; setze fort. - Das entfernte Dateisystem hat %n Bytes freien Speicherplatz; setze fort. + Das entfernte Dateisystem hat 1 Megabyte freien Speicherplatz; setze fort. + Das entfernte Dateisystem hat %n Megabytes freien Speicherplatz; setze fort. @@ -32501,10 +30948,6 @@ Soll es noch einmal versucht werden? Test Test - - Remote Processes... - Prozesse auf Gerät... - Deploy Public Key... Öffentlichen Schlüssel senden... @@ -32589,62 +31032,41 @@ Qt Creator know about a likely URI. - ProjectExplorer::Internal::DeviceProcessesDialog + ProjectExplorer::DeviceProcessesDialog - List of Remote Processes - Liste der entfernten Prozesse - - - &Filter entries: - Einträge &filtern: + Filter + Filter &Update List Liste &aktualisieren - &Kill Selected Process - Ausgewählten Prozess b&eenden + &Kill Process + Prozess b&eenden - - - ProjectExplorer::DeviceProcessesDialog - Remote Error - Entfernter Fehler + Kit: + Kit: + + + &Filter: + &Filter: + + + List of Processes + Liste der Prozesse ProjectExplorer::DeviceProcessList - - PID - PID - Command Line Kommandozeile - Connection failure: %1 - Verbindungsfehler: %1 - - - Error: Remote process failed to start: %1 - Fehler: Der entfernte Prozess konnte nicht gestartet werden: %1 - - - Error: Remote process crashed: %1 - Fehler: Der entfernte Prozess ist abgestürzt: %1 - - - Remote process failed. - Der entfernte Prozess ist fehlgeschlagen. - - - -Remote stderr was: %1 - -Fehlerausgabe: %1 + Process ID + Prozess-ID @@ -32725,81 +31147,6 @@ Remote error output was: %1 Fehlerausgabe: %1 - - Debugger::StartGdbServerDialog - - &Attach to Selected Process - An ausgewählten Prozess &anhängen - - - Close - Schließen - - - Target: - Ziel: - - - &Filter entries: - Einträge &filtern: - - - List of Remote Processes - Liste der entfernten Prozesse - - - Remote Error - Entfernter Fehler - - - Process aborted - Prozess abgebrochen - - - Could not retrieve list of free ports: - Die Liste der freien Ports konnte nicht bestimmt werden: - - - Connection error: %1 - Verbindungsfehler: %1 - - - Starting gdbserver... - Starte gdbserver... - - - Port %1 is now accessible. - Der Port %1 ist nun verfügbar. - - - Server started on %1 - Server gestartet auf %1 - - - Warning - Warnung - - - Cannot find local executable for remote process "%1". - Die lokale ausführbare Datei für den entfernten Prozess "%1" konnte nicht gefunden werden. - - - Cannot find ABI for remote process "%1". - Die ABI des entfernten Prozesses "%1" konnte nicht bestimmt werden. - - - Remote: "%1" - Verbindung: "%1" - - - Process gdbserver finished. Status: %1 - gdbserver-Prozess beendet. Status: %1 - - - Running command: %1 - Ausführung des Kommandos: %1 - - ProjectExplorer::DeviceApplicationRunner @@ -32845,10 +31192,6 @@ Fehlerausgabe: %1 Test Test - - Remote Processes... - Prozesse auf Gerät... - Deploy Public Key... Öffentlichen Schlüssel senden... @@ -32875,4 +31218,1100 @@ Fehlerausgabe: %1 Auf dem Gerät sind nicht genügend freie Ports für das Debuggen vorhanden. + + ClearCase::Internal::CheckOutDialog + + Check Out + Check Out + + + &Checkout Comment: + &Checkout-Kommentar: + + + &Reserved + &Reserviert + + + &Unreserved if already reserved + &Nicht reserviert, falls bereits reserviert + + + &Preserve file modification time + Änderungsdatum von D&ateien beibehalten + + + Use &Hijacked file + Hijack: Unset read-only flag without check-out. This is used for local changes which the user does not want to commit. + Datei &hijacked verwenden + + + + ClearCase::Internal::SettingsPage + + Configuration + Konfiguration + + + &Command: + &Kommando: + + + Diff + Diff + + + &Graphical (Single file only) + &Graphisch (nur einzelne Dateien) + + + &External + &Extern + + + Arg&uments: + Arg&umente: + + + Miscellaneous + Sonstige Einstellungen + + + &History count: + Beschränkung der History: + + + &Timeout: + &Zeitlimit: + + + s + s + + + &Automatically check out files on edit + Dateien bei Bearbeitung automatisch anfordern + + + Check this if you have a trigger that renames the activity automatically. You will not be prompted for activity name + Aktivieren Sie diese Einstellung, wenn Sie einen Trigger verwenden, der die Aktivität automatisch umbenennt. Sie werden nicht nach dem Namen der Aktivität gefragt + + + Aut&o assign activity names + Aktivitäten automatisch Namen zuweisen + + + &Prompt on check-in + &Abgabe bestätigen + + + Di&sable indexer + Indexer deaktivieren + + + &Index only VOBs: + VOB: Versioned Object Base + Nur VOBs &indizieren: + + + VOBs list, separated by comma. Indexer will only traverse the specified VOBs. If left blank, all active VOBs will be indexed + VOB-Liste, durch Kommata getrennt. Der Indexer wird nur die hier angegebenen VOBs abarbeiten. Wenn das Feld leer ist, werden alle aktiven VOBs indiziert + + + ClearCase + ClearCase + + + + ClearCase::Internal::UndoCheckOut + + Dialog + Dialog + + + &Save copy of the file with a '.keep' extension + &Kopie der Datei mit dem Suffix '.keep' erstellen + + + The file was changed. + Die Datei wurde geändert. + + + + ClearCase::Internal::VersionSelector + + Confirm Version to Check Out + Bestätigung der Check-Out-Version + + + There are multiple versions of '%1' which can be considered for checkout. Please select version to checkout: + Es gibt mehrere Versionen von '%1', die für einen Check Out in Frage kommen. Bitte wählen Sie eine Version für den Check Out: + + + &Loaded Version + Ge&ladene Version + + + Created By: + Erstellt von: + + + Created On: + Date + Erstellt am: + + + Version after &update + Version nach &Aktualisierung + + + <html><head/><body><p><b>NOTE: You will not be able to check in this file without merging the changes (not supported by the plugin)</b></p></body></html> + <html><head/><body><p><b>Hinweis: Diese Datei kann nicht ohne Mergen der Änderungen eingecheckt werden (durch das Plugin nicht unterstützt)</b></p></body></html> + + + + Android::Internal::AvdModel + + AVD Name + AVD - Android Virtual Device + AVD-Name + + + AVD Target + AVD-Ziel + + + CPU/ABI + CPU/ABI + + + + ClearCase::Internal::ActivitySelector + + Select &Activity: + Aktivität &auswählen: + + + Add + Hinzufügen + + + Keep item activity + Aktivität des Elements beibehalten + + + + ClearCase::Internal::ClearCaseEditor + + Annotate version "%1" + Annotation für Version "%1" + + + + ClearCase::Internal::ClearCasePlugin + + C&learCase + C&learCase + + + Check Out... + Auschecken... + + + Check &Out "%1"... + "%1" &auschecken... + + + Meta+L,Meta+O + Meta+L,Meta+O + + + Alt+L,Alt+O + Alt+L,Alt+O + + + Check &In... + &Einchecken... + + + Check &In "%1"... + "%1" &einchecken... + + + Meta+L,Meta+I + Meta+L,Meta+I + + + Alt+L,Alt+I + Alt+L,Alt+I + + + Undo Check Out + Auschecken rückgängig machen + + + &Undo Check Out "%1" + Auschecken von "%1" rückgängig machen + + + Meta+L,Meta+U + Meta+L,Meta+U + + + Alt+L,Alt+U + Alt+L,Alt+U + + + Undo Hijack + Hijack rückgängig machen + + + Undo Hi&jack "%1" + Hijack von "%1" rückgängig machen + + + Meta+L,Meta+R + Meta+L,Meta+R + + + Alt+L,Alt+R + Alt+L,Alt+R + + + Diff Current File + Diff für Datei + + + &Diff "%1" + &Diff für "%1" + + + Meta+L,Meta+D + Meta+L,Meta+D + + + Alt+L,Alt+D + Alt+L,Alt+D + + + History Current File + History für Datei + + + &History "%1" + &History von "%1" + + + Meta+L,Meta+H + Meta+L,Meta+H + + + Alt+L,Alt+H + Alt+L,Alt+H + + + Annotate Current File + Annotation für Datei + + + &Annotate "%1" + &Annotation für "%1" + + + Meta+L,Meta+A + Meta+L,Meta+A + + + Alt+L,Alt+A + Alt+L,Alt+A + + + Add File... + Datei hinzufügen... + + + Add File "%1" + Datei "%1" hinzufügen + + + Diff A&ctivity... + Diff der A&ktivität... + + + Ch&eck In Activity + &Aktivität einchecken + + + Chec&k In Activity "%1"... + &Aktivität "%1" einchecken... + + + Update Index + Index aktualisieren + + + Update View + Ansicht aktualisieren + + + U&pdate View "%1" + Ansicht "%1" aktualisieren + + + Check In All &Files... + Alle &Dateien einchecken... + + + Meta+L,Meta+F + Meta+L,Meta+F + + + Alt+L,Alt+F + Alt+L,Alt+F + + + View &Status + Status anzeigen + + + Meta+L,Meta+S + Meta+L,Meta+S + + + Alt+L,Alt+S + Alt+L,Alt+S + + + Check In + Einchecken + + + Diff Selected Files + Diff für Auswahl + + + &Undo + &Rückgängig + + + &Redo + &Wiederholen + + + Closing ClearCase Editor + ClearCase-Editor schließen + + + Do you want to check in the files? + Möchten Sie die Dateien einchecken? + + + The comment check failed. Do you want to check in the files? + Die Überprüfung der Beschreibung schlug fehl. Möchten Sie die Dateien trotzdem einchecken? + + + Do you want to undo the check out of '%1'? + Möchten Sie das Auschecken von "%1" rückgängig machen? + + + Undo Hijack File + Hijack rückgängig machen + + + External diff is required to compare multiple files. + Um mehrere Dateien zu vergleichen, ist ein externer Diff erforderlich. + + + No ClearCase executable specified. + Es wurde keine ausführbare ClearCase-Datei angegeben. + + + File is already checked out. + Die Datei ist bereits ausgecheckt. + + + This operation is irreversible. Are you sure? + Dieser Vorgang kann nicht rückgängig gemacht werden. Sind Sie sicher? + + + Do you want to undo hijack of '%1'? + Möchten Sie den Hijack von "%1" rückgängig machen? + + + Enter Activity + Aktivität eingeben + + + Activity Name + Name der Aktivität + + + Check In Activity + Aktivität einchecken + + + Another check in is currently being executed. + Es läuft bereits ein Eincheck-Vorgang. + + + There are no modified files. + Es gibt keine geänderten Dateien. + + + ClearCase Checkout + ClearCase Auschecken + + + Set current activity failed: %1 + Das Setzen der aktuellen Aktivität schlug fehl: %1 + + + Enter &comment: + &Kommentar eingeben: + + + ClearCase Add File + ClearCase Datei hinzufügen + + + ClearCase Remove Element + ClearCase Element entfernen + + + ClearCase Remove File + ClearCase Datei löschen + + + ClearCase Rename File + ClearCase Datei umbenennen + + + Activity Headline + Titel der Aktivität + + + Enter activity headline + Geben Sie den Titel der Aktivität ein + + + CC Indexing + CC Indizierung + + + + ClearCase::Internal::ClearCaseSubmitEditor + + ClearCase Check In + ClearCase Einchecken + + + + ClearCase::Internal::ClearCaseSubmitEditorWidget + + Chec&k in even if identical to previous version + Einchecken auch wenn zur Vorgängerversion identisch + + + &Preserve file modification time + Änderungsdatum von D&ateien beibehalten + + + &Check In + &Einchecken + + + + ClearCase::Internal::SettingsPageWidget + + ClearCase Command + ClearCase-Befehl + + + In order to use External diff, 'diff' command needs to be accessible. + Zur Verwendung von externen Diffs ist muss ein 'diff'-Kommando verfügbar sein. + + + DiffUtils is available for free download <a href="http://gnuwin32.sourceforge.net/packages/diffutils.htm">here</a>. Please extract it to a directory in your PATH. + DiffUtils sind <a href="http://gnuwin32.sourceforge.net/packages/diffutils.htm">kostenlos erhältlich</a>. Bitte entpacken Sie sie in einen im Pfad befindlichen Ordner. + + + + Debugger::Internal::StartApplicationDialog + + Start Debugger + Debugger starten + + + Select Executable + Ausführbare Datei auswählen + + + Server port: + + + + Select Working Directory + Wählen Sie das Arbeitsverzeichnis aus + + + Select Server Start Script + Server-Startskript wählen + + + This option can be used to point to a script that will be used to start a debug server. If the field is empty, Qt Creator's default methods to set up debug servers will be used. + Mit dieser Einstellung kann ein Skript zum Start eines Debug-Servers angegeben werden. Wenn das Feld leer ist, wird Qt Creator den Debug-Server mit den eingebauten Methoden einrichten. + + + &Server start script: + &Server-Startskript: + + + Select Location of Debugging Information + Pfad zu Debug-Information + + + Base path for external debug information and debug sources. If empty, $SYSROOT/usr/lib/debug will be chosen. + Basispfad für Debuginformationen und Quellen. Als Vorgabe wird $SYSROOT/usr/lib/debug benutzt. + + + &Kit: + &Kit: + + + Local &executable: + Ausführbare Datei (&lokal): + + + Command line &arguments: + Kommandozeilen&argumente: + + + &Working directory: + Arbeits&verzeichnis: + + + Run in &terminal: + Im &Terminal ausführen: + + + Break at "&main": + Haltepunkt bei "&main": + + + Debug &information: + Debug&information: + + + &Recent: + &Letzte: + + + + DeviceProcessesDialog + + &Attach to Process + &An Prozess anhängen + + + + Debugger::Internal::DebuggerCore + + Open Qt Options + Einstellungen zur Qt-Bibliothek öffnen + + + Turn off Helper Usage + Ausgabe-Hilfsbibliothek deaktivieren + + + Continue Anyway + Trotzdem fortsetzen + + + Debugging Helper Missing + Ausgabe-Hilfsbibliothek nicht gefunden + + + The debugger could not load the debugging helper library. + Der Debugger konnte die Ausgabe-Hilfsbibliothek nicht finden. + + + The debugging helper is used to nicely format the values of some Qt and Standard Library data types. It must be compiled for each used Qt version separately. In the Qt Creator Build and Run preferences page, select a Qt version, expand the Details section and click Build All. + Die Ausgabe-Hilfsbibliothek dient zur Ausgabe der Werte einiger Datentypen aus Qt- und den Standardbibliotheken. Sie muss für jede benutzte Qt-Version compiliert werden. Das geschieht auf der Seite 'Erstellung und Ausführung' durch Auswahl der Qt-Installation, Anzeige der Details und Klicken auf 'Erstellen' für die Ausgabe-Hilfsbibliothek. + + + + Debugger::Internal::GdbServerStarter + + Remote Error + Entfernter Fehler + + + Could not retrieve list of free ports: + Die Liste der freien Ports konnte nicht bestimmt werden: + + + Process aborted + Prozess abgebrochen + + + Running command: %1 + Ausführung des Kommandos: %1 + + + Connection error: %1 + Verbindungsfehler: %1 + + + Starting gdbserver... + Starte gdbserver... + + + Port %1 is now accessible. + Der Port %1 ist nun verfügbar. + + + Server started on %1:%2 + Server gestartet auf %1:%2 + + + Warning + Warnung + + + Cannot find local executable for remote process "%1". + Die lokale ausführbare Datei für den entfernten Prozess "%1" konnte nicht gefunden werden. + + + Cannot find ABI for remote process "%1". + Die ABI des entfernten Prozesses "%1" konnte nicht bestimmt werden. + + + Remote: "%1:%2" + Verbunden zu: "%1:%2" + + + Process gdbserver finished. Status: %1 + gdbserver-Prozess beendet. Status: %1 + + + + ProjectExplorer::Internal::DeviceProcessesDialogPrivate + + Remote Error + Entfernter Fehler + + + + ProjectExplorer::Internal::LocalProcessList + + Cannot terminate process %1: %2 + Der Prozess %1 konnte nicht beendet werden: %2 + + + Cannot open process %1: %2 + Der Prozess :"%1" konnte nicht geöffnet werden: %2 + + + + ProjectExplorer::SshDeviceProcessList + + Connection failure: %1 + Fehler beim Herstellen der Verbindung: %1 + + + Error: Process listing command failed to start: %1 + Fehler: Das Kommando zur Auflistung der Prozesse konnte nicht gestartet werden: %1 + + + Error: Process listing command crashed: %1 + Fehler: Das Kommando zur Auflistung der Prozesse ist abgestürzt : %1 + + + Process listing command failed with exit code %1. + Das Kommando zur Auflistung der Prozesse schlug mit Rückgabewert %1 fehl. + + + Error: Kill process failed to start: %1 + Fehler: Das Kommando zum Beenden des Prozesses konnte nicht gestartet werden: %1 + + + Error: Kill process crashed: %1 + Fehler: Das Kommando zum Beenden des Prozesses ist abgestürzt: %1 + + + Kill process failed with exit code %1. + Das Kommando zum Beenden schlug mit dem Rückgabewert %1 fehl. + + + +Remote stderr was: %1 + +Fehlerausgabe: %1 + + + + ProjectExplorer::ToolChainConfigWidget + + Name: + Name: + + + + ResourceFile + + The file name is empty. + Der Dateiname ist leer. + + + XML error on line %1, col %2: %3 + XML-Fehler in Zeile %1, Spalte %2: %3 + + + The <RCC> root element is missing. + Das Wurzelelement (<RCC>) fehlt. + + + Cannot write file. Disk full? + Die Datei konnte nicht geschrieben werden. Möglicherweise ist kein Speicherplatz mehr auf der Festplatte vorhanden? + + + + ClearCase::Internal::ClearCaseControl + + &Check Out + &Checkout + + + &Hijack + &Hijack + + + + Core::IVersionControl + + Open with VCS (%1) + Öffnen mittels Versionskontrollsystem (%1) + + + + Debugger::Internal::DebuggerKitConfigWidget + + The debugger to use for this kit. + Der für dieses Kit zu verwendende Debugger. + + + <html><body><p>Specify the path to the <a href="%1">Windows Console Debugger executable</a> (%2) here.</p></body></html> + Label text for path configuration. %2 is "x-bit version". + <html><body><p>Geben Sie den Pfad zu der ausführbaren Datei des <a href="%1">Windows Console Debuggers</a> (%2) an.</p></body></html> + + + 64-bit version + 64-bit-Version + + + 32-bit version + 32-bit-Version + + + Auto detect + Automatisch bestimmen + + + Debugger: + Debugger: + + + + Debugger::DebuggerKitInformation + + No debugger set up. + Es ist kein Debugger eingerichtet. + + + Debugger '%1' not found. + Der Debugger '%1' konnte nicht gefunden werden. + + + Debugger '%1' not executable. + Der Debugger '%1' ist nicht ausführbar. + + + The debugger location must be given as an absolute path (%1). + Der Pfad zum Debugger muss als absoluter Pfad angegeben werden (%1). + + + %1 using '%2' + %1 unter Verwendung von '%2' + + + Debugger + Debugger + + + GDB Engine + GDB-Engine + + + CDB Engine + CDB-Engine + + + LLDB Engine + LLDB-Engine + + + No kit found. + Es wurde kein Kit gefunden. + + + + Madde::Internal::MaddeQemuStartService + + Checking whether to start Qemu... + Prüfe, ob Qemu gestartet werden soll... + + + Target device is not an emulator. Nothing to do. + Das Zielgerät ist kein Emulator. Keine Aktion erforderlich. + + + Qemu is already running. Nothing to do. + Qemu läuft bereits. Keine Aktion erforderlich. + + + Cannot deploy: Qemu was not running. It has now been started up for you, but it will take a bit of time until it is ready. Please try again then. + Das Deployment schlug fehl, da Qemu nicht lief. Es wurde soeben gestartet, benötigt jedoch noch einige Zeit. Bitte versuchen Sie es später noch einmal. + + + Cannot deploy: You want to deploy to Qemu, but it is not enabled for this Qt version. + Das Deployment zu Qemu schlug fehl, da Qemu für diese Qt-Version nicht verfügbar ist. + + + + Madde::Internal::MaddeQemuStartStep + + Start Qemu, if necessary + Qemu starten, falls erforderlich + + + + Perforce::Internal::PerforceVersionControl + + &Edit (%1) + %1 &anfordern + + + &Hijack + &Hijack + + + + ProjectExplorer::Kit + + Unnamed + Unbenannt + + + Clone of %1 + Kopie von %1 + + + Error: + Fehler: + + + Warning: + Warnung: + + + + ProjectExplorer::SysRootKitInformation + + Sys Root "%1" is not a directory. + Sys-Root "%1" ist kein Ordner. + + + Sys Root + Sys-Root + + + + ProjectExplorer::ToolChainKitInformation + + Compiler + Compiler + + + None + Keine + + + No compiler set in kit. + Im Kit ist kein Compiler eingerichtet. + + + + ProjectExplorer::DeviceTypeKitInformation + + Device does not match device type. + Das Gerät entspricht nicht dem Gerätetyp. + + + Unknown device type + Unbekannter Gerätetyp + + + Device type + Gerätetyp + + + + ProjectExplorer::DeviceKitInformation + + Device + Gerät + + + Unconfigured + Nicht konfiguriert + + + + ProjectExplorer::KitManager + + Desktop + Desktop + + + + ProjectExplorer::Internal::KitManagerConfigWidget + + Kits + Kits + + + Select Icon + Symbol auswählen + + + Images (*.png *.xpm *.jpg) + Bilddateien (*.png *.xpm *.jpg) + + + + ProjectExplorer::Internal::KitModel + + Auto-detected + Automatisch bestimmt + + + Manual + Benutzerdefiniert + + + %1 (default) + Mark up a kit as the default one. + %1 (Vorgabe) + + + Name + Name + + + Duplicate Kit Detected + Mehrfach auftretendes Kit festgestellt + + + The kit<br>&nbsp;%1<br> was already configured. It was not configured again. + Das Kit<br>&nbsp;%1<br> wurde bereits konfiguriert. Es wurde nicht noch einmal konfiguriert. + + + Duplicate Kits Detected + Mehrfach auftretende Kits festgestellt + + + The following kits were already configured:<br>&nbsp;%1<br>They were not configured again. + Die folgenden Kits wurden bereits konfiguriert:<br>&nbsp;%1<br>Sie wurden nicht noch einmal konfiguriert. + + + + ProjectExplorer::KitOptionsPage + + Kits + Kits + + + Add + Hinzufügen + + + Clone + Klonen + + + Remove + Entfernen + + + Make Default + Als Vorgabe setzen + + + + Qt4ProjectManager::Internal::QmakeKitConfigWidget + + The mkspec to use when building the project with qmake.<br>This setting is ignored when using other build systems. + Die zur Erstellung des Projekts mit qmake zu verwendende mkspec.<br>Diese Einstellung hat keine Auswirkung auf andere Build-Systeme. + + + Qt mkspec: + Qt-mkspec: + + + + Qt4ProjectManager::QmakeKitInformation + + No Qt version set, so mkspec is ignored. + Es ist keine Qt-Version gesetzt, die mkspec wird ignoriert. + + + Mkspec not found for Qt version. + Für diese Qt-Version konnte keine mkspec gefunden werden. + + + mkspec + mkspec + + + + QtSupport::Internal::QtKitConfigWidget + + The Qt library to use for all projects using this kit.<br>A Qt version is required for qmake-based projects and optional when using other build systems. + Die für alle Projekte, die dieses Kit verwenden, zu benutzende Qt-Bibliothek.<br>Für qmake-basierende Projekte ist diese Angabe erforderlich, für andere Build-Systeme optional. + + + Manage... + Verwalten... + + + None + Keine + + + Qt version: + Qt-Version: + + + + QtSupport::QtKitInformation + + Qt version + Qt-Version: + + + None + Keine + + From 2fc6b24a8a5b11d4ea9895cd5e5f7a17f070f295 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 11 Sep 2012 11:37:19 +0200 Subject: [PATCH 70/73] CDB: Fix dumping of objectNames() in Qt 5. Qt 5 has an additional extraData. Change-Id: Ieac0a1855ed93b4ef2c0900e37097d89de440895 Reviewed-by: hjk --- src/libs/qtcreatorcdbext/symbolgroupvalue.cpp | 42 ++++++++++--------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/src/libs/qtcreatorcdbext/symbolgroupvalue.cpp b/src/libs/qtcreatorcdbext/symbolgroupvalue.cpp index 154f88334e9..25a4664111a 100644 --- a/src/libs/qtcreatorcdbext/symbolgroupvalue.cpp +++ b/src/libs/qtcreatorcdbext/symbolgroupvalue.cpp @@ -2122,21 +2122,32 @@ SymbolGroupValue qobjectDerivedPrivate(const SymbolGroupValue &v, return SymbolGroupValue(qwPrivateNode, v.context()); } +static bool dumpQObjectName(const SymbolGroupValue &qoPrivate, std::wostream &str) +{ + // Qt 4: plain member. + if (QtInfo::get(qoPrivate.context()).version < 5) { + if (const SymbolGroupValue oName = qoPrivate["objectName"]) + return dumpQString(oName, str); + } + // Qt 5: member of allocated extraData. + if (const SymbolGroupValue extraData = qoPrivate["extraData"]) + if (extraData.pointerValue()) + if (const SymbolGroupValue oName = extraData["objectName"]) + return dumpQString(oName, str); + return false; +} + // Dump the object name static inline bool dumpQWidget(const SymbolGroupValue &v, std::wostream &str, void **specialInfoIn = 0) { const QtInfo &qtInfo = QtInfo::get(v.context()); const SymbolGroupValue qwPrivate = qobjectDerivedPrivate(v, qtInfo.qWidgetPrivateType, qtInfo); - if (!qwPrivate) - return false; // QWidgetPrivate inherits QObjectPrivate - const SymbolGroupValue oName = qwPrivate[unsigned(0)]["objectName"]; - if (!oName) + if (!qwPrivate || !dumpQObjectName(qwPrivate[unsigned(0)], str)) return false; if (specialInfoIn) *specialInfoIn = qwPrivate.node(); - dumpQString(oName, str); return true; } @@ -2144,15 +2155,12 @@ static inline bool dumpQWidget(const SymbolGroupValue &v, std::wostream &str, vo static inline bool dumpQObject(const SymbolGroupValue &v, std::wostream &str, void **specialInfoIn = 0) { const std::string &qoPrivateType = QtInfo::get(v.context()).qObjectPrivateType; - if (SymbolGroupValue qoPrivate = v["d_ptr"]["d"].pointerTypeCast(qoPrivateType.c_str())) { - if (SymbolGroupValue oName = qoPrivate["objectName"]) { - if (specialInfoIn) - *specialInfoIn = qoPrivate.node(); - dumpQString(oName, str); - return true; - } - } - return false; + const SymbolGroupValue qoPrivate = v["d_ptr"]["d"].pointerTypeCast(qoPrivateType.c_str()); + if (!qoPrivate || !dumpQObjectName(qoPrivate, str)) + return false; + if (specialInfoIn) + *specialInfoIn = qoPrivate.node(); + return true; } // Dump the object name @@ -2161,15 +2169,11 @@ static inline bool dumpQWindow(const SymbolGroupValue &v, std::wostream &str, vo const QtInfo &qtInfo = QtInfo::get(v.context()); const SymbolGroupValue qwPrivate = qobjectDerivedPrivate(v, qtInfo.qWindowPrivateType, qtInfo); - if (!qwPrivate) - return false; // QWindowPrivate inherits QObjectPrivate - const SymbolGroupValue oName = qwPrivate[unsigned(0)]["objectName"]; // QWidgetPrivate inherits QObjectPrivate - if (!oName) + if (!qwPrivate || !dumpQObjectName(qwPrivate[unsigned(0)], str)) return false; if (specialInfoIn) *specialInfoIn = qwPrivate.node(); - dumpQString(oName, str); return true; } From e5222c5d4d3fac3478a0e57827818a4e33303c97 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 10 Sep 2012 15:05:14 +0200 Subject: [PATCH 71/73] Debugger: Make built-in tests work for shadow builds. Copy testing resources to build directory. Task-number: QTCREATORBUG-7834 Change-Id: I8397da049142817a16d433e8805144c4ae6bc305 Reviewed-by: Joerg Bornemann --- src/plugins/debugger/debugger.pro | 15 +++++++++++++++ src/plugins/debugger/debugger.qbs | 8 ++++++++ 2 files changed, 23 insertions(+) diff --git a/src/plugins/debugger/debugger.pro b/src/plugins/debugger/debugger.pro index 83d207eead6..fe4a45e576d 100644 --- a/src/plugins/debugger/debugger.pro +++ b/src/plugins/debugger/debugger.pro @@ -159,3 +159,18 @@ include(qml/qml.pri) include(namedemangler/namedemangler.pri) include(shared/shared.pri) + +equals(TEST, 1):!isEmpty(copydata) { + TEST_DIR = ../../../tests/manual/debugger/simple + INPUT_FILE = $$PWD/$$TEST_DIR/simple.pro + OUTPUT_DIR = $$OUT_PWD/$$TEST_DIR + win32 { + INPUT_FILE ~= s,/,\\\\,g + OUTPUT_DIR ~= s,/,\\\\,g + } + testfile.target = test_resources + testfile.commands = ($$QMAKE_CHK_DIR_EXISTS $$OUTPUT_DIR $$QMAKE_CHK_EXISTS_GLUE $$QMAKE_MKDIR $$OUTPUT_DIR) \ + && $$QMAKE_COPY $$INPUT_FILE $$OUTPUT_DIR + QMAKE_EXTRA_TARGETS += testfile + PRE_TARGETDEPS += $$testfile.target +} diff --git a/src/plugins/debugger/debugger.qbs b/src/plugins/debugger/debugger.qbs index 7538677da29..7bb7c6648cf 100644 --- a/src/plugins/debugger/debugger.qbs +++ b/src/plugins/debugger/debugger.qbs @@ -4,6 +4,7 @@ import "../QtcPlugin.qbs" as QtcPlugin QtcPlugin { name: "Debugger" + type: base.concat(["installed_content"]) Depends { name: "Qt"; submodules: ["widgets", "network", "script"] } Depends { name: "Core" } @@ -31,6 +32,13 @@ QtcPlugin { "../../shared/registryaccess/" ] + Group { + condition: qbs.buildVariant === "debug" + qbs.installDir: "tests/manual/debugger/simple/" + fileTags: ["install"] + files: ["../../../tests/manual/debugger/simple/simple.pro"] + } + files: [ "debugger.qrc", "debuggerkitconfigwidget.cpp", From 799cf1cee39436adbc6593e06e7bb6ab80f03f6c Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 10 Sep 2012 18:22:19 +0200 Subject: [PATCH 72/73] Changes: mention some debugger and fakevim related items Change-Id: Ifcea35fc39c06c095ecc03d129246d6d6538dd30 Reviewed-by: Leena Miettinen --- dist/changes-2.6.0 | 56 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 11 deletions(-) diff --git a/dist/changes-2.6.0 b/dist/changes-2.6.0 index 23a47ff527d..e606e1eaa06 100644 --- a/dist/changes-2.6.0 +++ b/dist/changes-2.6.0 @@ -19,8 +19,8 @@ General Editing * Added a context menu for adding and removing UTF-8 bom - * Added shortcuts for searching for next and previous - occurrence of selected text without opening the find tool bar (QTCREATORBUG-464) + * Added shortcuts for searching for next and previous occurrence + of selected text without opening the find tool bar (QTCREATORBUG-464) * Made resource files searchable (Ctrl+F) * Added file type icons to the resource editor * Added opening of files from the resource editor @@ -29,9 +29,9 @@ Editing * Fixed problems when closing documents in a split view (QTCREATORBUG-7361) Managing Projects - * Introduced "Kits" that supersede the previous "Targets". They bundle the settings - for the target device, compiler, debugger, Qt version and more into - a user definable, reusable setting. + * Introduced "Kits" that supersede the previous "Targets". They bundle + the settings for the target device, compiler, debugger, Qt version and + more into a user definable, reusable setting. * Moved the debugger setting from tool chains to kits and renamed tool chains to compilers * Added experimental support for Android (enable the plugin in Help > About Plugins) @@ -49,15 +49,37 @@ CMake Projects * Added CMake specific context menu items to the CMakeLists.txt editor Debugging + * Updated dumpers to internal changes in Qt 5 (structure layout, namespaces) + * Adjusted state engine to changes in GDB/MI notifications * Made all views searchable (Ctrl+F) + * Made extensive use of HistoryCompleter + * Consolidated the special start options in Debug > Start Debugging + after the Kits changes + * Renamed "Watcher" into "Expression Evaluator" + * Generalized process listing and attaching facilities + * Adjusted to changed code generation in MinGW 4.6 + * Added GUI support for temporary breakpoints + * Added a shortcut (F10) for start-and-stop-at-main + * Added direct loading of remote core files + * Added an option to create watch points in the Memory view context menu + * Added GDB pretty-printers for QFiniteStack, QHash::{const_}iterator, + std::{map,set}::iterator + * Added support for IPv6-enabled builds of GDB + * Improved logging and output pane performance + * Improved performance of retrieving large arrays of plain data + * Fixed use of non-xterm terminals (QTCREATORBUG-1633) + * Fixed use of multi-line breakpoint commands + * Fixed off-by-one error in the Address field in the Symbols view Debugging QML/JS * Merged the (experimental) QML/JS Inspector plugin into the Debugger: - * Added the QML object tree to the Expressions window - * Added Console window to evaluate JS expressions at runtime - * Added QML specific buttons to the toolbar + * Added the QML object tree to the Expressions window + * Added Console window to evaluate JS expressions at runtime + * Added QML specific buttons to the toolbar Analyzing Code + * Added an option to shorten template names in function profiler output + * Simplified the remote start dialogs C++ Support * Fixed lambda formatting issues @@ -66,6 +88,7 @@ C++ Support * Fixed the display of results when searching for macro usages (QTCREATORBUG-7217) * Added highlighting of macro usages * Implemented renaming of macro usages (QTCREATORBUG-413) + * Fixed detection of C++11 features for MSVC QML/JS Support * Added support for adding the file to VCS when moving a component into @@ -96,7 +119,18 @@ SVN * Fixed completion in the submit editor FakeVim + * Added support for smartcase searching + * Added support for last selection operations + * Added support for counts in block selections (for example "2vi)", "3da{") + * Added support for special registers "+ and "* + * Added selection commands for strings (for example "di'", "ca`") + * Improved emulation of Vim regexps * Fixed :!cmd if there is no selection + * Fixed handling of "ci(", "di[", "ca{" inside nested blocks + * Fixed search without matches + * Fixed pasting text [count] times and in selection + * Fixed pasting from clipboard + * Made clipboard data format compatible with Vim Platform Specific @@ -104,7 +138,7 @@ Mac * Added support for fullscreen (Lion and later) * Changed the VCS shortcuts to use the Ctrl modifier instead of the Opt modifier (the Opt modifier inserts special characters on Mac) - * Made the shortcut modifiers (e.g. Cmd+...) searchable in the Filter + * Made the shortcut modifiers (for example Cmd+...) searchable in the Filter functionality of the keyboard shortcut settings Linux (GNOME and KDE) @@ -119,13 +153,14 @@ Symbian Target Remote Linux Support Madde - * Removed generic MeeGo support due to complete irrelevance + * Removed generic MeeGo support due to complete irrelevance Credits go to: Aleksey Sidorov Alessandro Portale Andreas Holzammer Andre Hartmann + André Pönitz Aurélien Gâteau Aurindam Jana Bill King @@ -149,7 +184,6 @@ Credits go to: Flex Ferrum Francois Ferrand Friedemann Kleint - hjk hluk Hugues Delorme Jarek Kobus From fa094b226148fa8a6da0036ecc15b7bf6b11cbf6 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 11 Sep 2012 13:52:33 +0200 Subject: [PATCH 73/73] Version bump. Change-Id: I9e4f32135a36ab15888e2461c3ec599ea11c6dfd Reviewed-by: Eike Ziller --- qtcreator.pri | 2 +- qtcreator.qbp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/qtcreator.pri b/qtcreator.pri index 97f5aa3628b..4645b45e0e5 100644 --- a/qtcreator.pri +++ b/qtcreator.pri @@ -1,7 +1,7 @@ !isEmpty(QTCREATOR_PRI_INCLUDED):error("qtcreator.pri already included") QTCREATOR_PRI_INCLUDED = 1 -QTCREATOR_VERSION = 2.5.82 +QTCREATOR_VERSION = 2.5.83 defineReplace(cleanPath) { win32:1 ~= s|\\\\|/|g diff --git a/qtcreator.qbp b/qtcreator.qbp index 069f2948a2c..a8c0c2e8627 100644 --- a/qtcreator.qbp +++ b/qtcreator.qbp @@ -4,7 +4,7 @@ import qbs.fileinfo 1.0 as FileInfo Project { property string ide_version_major: '2' property string ide_version_minor: '5' - property string ide_version_release: '81' + property string ide_version_release: '83' property string qtcreator_version: ide_version_major + '.' + ide_version_minor + '.' + ide_version_release property var additionalCppDefines: [ 'IDE_LIBRARY_BASENAME="lib"' ] moduleSearchPaths: "qbs"