From d891aff7fa42823dd6672a9ced65d7d154e51541 Mon Sep 17 00:00:00 2001 From: con Date: Mon, 29 Mar 2010 17:01:53 +0200 Subject: [PATCH 01/19] Remove use of tool bars because of funny resize behavior. Also fixes a problem on Mac Cocoa with not being able to use the close editor button. Reviewed-by: Lasse Holmstedt --- src/plugins/coreplugin/editortoolbar.cpp | 8 ++------ src/plugins/coreplugin/editortoolbar.h | 2 -- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/plugins/coreplugin/editortoolbar.cpp b/src/plugins/coreplugin/editortoolbar.cpp index f01dbffe72e..7cbe350b370 100644 --- a/src/plugins/coreplugin/editortoolbar.cpp +++ b/src/plugins/coreplugin/editortoolbar.cpp @@ -75,7 +75,6 @@ namespace Core { EditorToolBar::EditorToolBar(QWidget *parent) : Utils::StyledBar(parent), m_editorList(new QComboBox(this)), - m_rightToolBar(new QToolBar(this)), m_closeButton(new QToolButton), m_lockButton(new QToolButton), @@ -124,10 +123,6 @@ EditorToolBar::EditorToolBar(QWidget *parent) : m_forwardButton= new QToolButton(this); m_forwardButton->setDefaultAction(m_goForwardAction); - m_rightToolBar->setLayoutDirection(Qt::RightToLeft); - m_rightToolBar->addWidget(m_closeButton); - m_rightToolBar->addWidget(m_lockButton); - QHBoxLayout *toplayout = new QHBoxLayout(this); toplayout->setSpacing(0); toplayout->setMargin(0); @@ -135,7 +130,8 @@ EditorToolBar::EditorToolBar(QWidget *parent) : toplayout->addWidget(m_forwardButton); toplayout->addWidget(m_editorList); toplayout->addWidget(m_toolBarPlaceholder, 1); // Custom toolbar stretches - toplayout->addWidget(m_rightToolBar); + toplayout->addWidget(m_lockButton); + toplayout->addWidget(m_closeButton); setLayout(toplayout); diff --git a/src/plugins/coreplugin/editortoolbar.h b/src/plugins/coreplugin/editortoolbar.h index 227a210fe2a..7713be7743c 100644 --- a/src/plugins/coreplugin/editortoolbar.h +++ b/src/plugins/coreplugin/editortoolbar.h @@ -111,8 +111,6 @@ private: IEditor *currentEditor() const; Core::OpenEditorsModel *m_editorsListModel; QComboBox *m_editorList; - QToolBar *m_centerToolBar; - QToolBar *m_rightToolBar; QToolButton *m_closeButton; QToolButton *m_lockButton; QAction *m_goBackAction; From 0b12111d6e88c6bd173acb34b36180ac0acc2f87 Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Mon, 29 Mar 2010 17:20:38 +0200 Subject: [PATCH 02/19] Regenerated the qml/js front-end. --- src/libs/qmljs/parser/gen-parser.sh | 2 +- src/libs/qmljs/parser/qmljs.g | 60 +++++++++++++++++++-------- src/libs/qmljs/parser/qmljsparser.cpp | 11 ++--- 3 files changed, 49 insertions(+), 24 deletions(-) diff --git a/src/libs/qmljs/parser/gen-parser.sh b/src/libs/qmljs/parser/gen-parser.sh index 7123511b2ca..acd6a19ce7c 100755 --- a/src/libs/qmljs/parser/gen-parser.sh +++ b/src/libs/qmljs/parser/gen-parser.sh @@ -2,7 +2,7 @@ me=$(dirname $0) -for i in $QTDIR/src/declarative/qml/parser/*.{h,cpp,pri}; do +for i in $QTDIR/src/declarative/qml/parser/*.{g,h,cpp,pri}; do sed -f $me/cmd.sed $i > $me/$(echo $(basename $i) | sed s/qdeclarativejs/qmljs/) done diff --git a/src/libs/qmljs/parser/qmljs.g b/src/libs/qmljs/parser/qmljs.g index 90949d57105..1d59d21f16a 100644 --- a/src/libs/qmljs/parser/qmljs.g +++ b/src/libs/qmljs/parser/qmljs.g @@ -65,6 +65,7 @@ %token T_PUBLIC "public" %token T_IMPORT "import" %token T_AS "as" +%token T_ON "on" --- feed tokens %token T_FEED_UI_PROGRAM @@ -653,18 +654,15 @@ case $rule_number: { node = makeAstNode(driver->nodePool(), importIdLiteral->value); node->fileNameToken = loc(2); } else if (AST::UiQualifiedId *qualifiedId = reparseAsQualifiedId(sym(2).Expression)) { - QString text; - for (AST::UiQualifiedId *q = qualifiedId; q; q = q->next) { - text += q->name->asString(); - if (q->next) text += QLatin1String("."); - } node = makeAstNode(driver->nodePool(), qualifiedId); node->fileNameToken = loc(2); } sym(1).Node = node; - if (! node) { + if (node) { + node->importToken = loc(1); + } else { diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, loc(1), QLatin1String("Expected a qualified name id or a string literal"))); @@ -773,6 +771,17 @@ case $rule_number: { } break; ./ +UiObjectMember: UiQualifiedId T_ON UiQualifiedId UiObjectInitializer ; +/. +case $rule_number: { + AST::UiObjectBinding *node = makeAstNode (driver->nodePool(), + sym(3).UiQualifiedId, sym(1).UiQualifiedId, sym(4).UiObjectInitializer); + node->colonToken = loc(2); + node->hasOnToken = true; + sym(1).Node = node; +} break; +./ + UiObjectMember: UiQualifiedId T_COLON Block ; /.case $rule_number:./ @@ -870,8 +879,8 @@ case $rule_number: { } break; ./ -UiObjectMember: T_PROPERTY T_IDENTIFIER T_LT UiPropertyType T_GT T_IDENTIFIER T_AUTOMATIC_SEMICOLON ; -UiObjectMember: T_PROPERTY T_IDENTIFIER T_LT UiPropertyType T_GT T_IDENTIFIER T_SEMICOLON ; +UiObjectMember: T_PROPERTY T_IDENTIFIER T_LT UiPropertyType T_GT JsIdentifier T_AUTOMATIC_SEMICOLON ; +UiObjectMember: T_PROPERTY T_IDENTIFIER T_LT UiPropertyType T_GT JsIdentifier T_SEMICOLON ; /. case $rule_number: { AST::UiPublicMember *node = makeAstNode (driver->nodePool(), sym(4).sval, sym(6).sval); @@ -885,8 +894,8 @@ case $rule_number: { } break; ./ -UiObjectMember: T_PROPERTY UiPropertyType T_IDENTIFIER T_AUTOMATIC_SEMICOLON ; -UiObjectMember: T_PROPERTY UiPropertyType T_IDENTIFIER T_SEMICOLON ; +UiObjectMember: T_PROPERTY UiPropertyType JsIdentifier T_AUTOMATIC_SEMICOLON ; +UiObjectMember: T_PROPERTY UiPropertyType JsIdentifier T_SEMICOLON ; /. case $rule_number: { AST::UiPublicMember *node = makeAstNode (driver->nodePool(), sym(2).sval, sym(3).sval); @@ -898,8 +907,8 @@ case $rule_number: { } break; ./ -UiObjectMember: T_DEFAULT T_PROPERTY UiPropertyType T_IDENTIFIER T_AUTOMATIC_SEMICOLON ; -UiObjectMember: T_DEFAULT T_PROPERTY UiPropertyType T_IDENTIFIER T_SEMICOLON ; +UiObjectMember: T_DEFAULT T_PROPERTY UiPropertyType JsIdentifier T_AUTOMATIC_SEMICOLON ; +UiObjectMember: T_DEFAULT T_PROPERTY UiPropertyType JsIdentifier T_SEMICOLON ; /. case $rule_number: { AST::UiPublicMember *node = makeAstNode (driver->nodePool(), sym(3).sval, sym(4).sval); @@ -913,8 +922,8 @@ case $rule_number: { } break; ./ -UiObjectMember: T_PROPERTY UiPropertyType T_IDENTIFIER T_COLON Expression T_AUTOMATIC_SEMICOLON ; -UiObjectMember: T_PROPERTY UiPropertyType T_IDENTIFIER T_COLON Expression T_SEMICOLON ; +UiObjectMember: T_PROPERTY UiPropertyType JsIdentifier T_COLON Expression T_AUTOMATIC_SEMICOLON ; +UiObjectMember: T_PROPERTY UiPropertyType JsIdentifier T_COLON Expression T_SEMICOLON ; /. case $rule_number: { AST::UiPublicMember *node = makeAstNode (driver->nodePool(), sym(2).sval, sym(3).sval, @@ -928,8 +937,8 @@ case $rule_number: { } break; ./ -UiObjectMember: T_READONLY T_PROPERTY UiPropertyType T_IDENTIFIER T_COLON Expression T_AUTOMATIC_SEMICOLON ; -UiObjectMember: T_READONLY T_PROPERTY UiPropertyType T_IDENTIFIER T_COLON Expression T_SEMICOLON ; +UiObjectMember: T_READONLY T_PROPERTY UiPropertyType JsIdentifier T_COLON Expression T_AUTOMATIC_SEMICOLON ; +UiObjectMember: T_READONLY T_PROPERTY UiPropertyType JsIdentifier T_COLON Expression T_SEMICOLON ; /. case $rule_number: { AST::UiPublicMember *node = makeAstNode (driver->nodePool(), sym(3).sval, sym(4).sval, @@ -945,8 +954,8 @@ case $rule_number: { } break; ./ -UiObjectMember: T_DEFAULT T_PROPERTY UiPropertyType T_IDENTIFIER T_COLON Expression T_AUTOMATIC_SEMICOLON ; -UiObjectMember: T_DEFAULT T_PROPERTY UiPropertyType T_IDENTIFIER T_COLON Expression T_SEMICOLON ; +UiObjectMember: T_DEFAULT T_PROPERTY UiPropertyType JsIdentifier T_COLON Expression T_AUTOMATIC_SEMICOLON ; +UiObjectMember: T_DEFAULT T_PROPERTY UiPropertyType JsIdentifier T_COLON Expression T_SEMICOLON ; /. case $rule_number: { AST::UiPublicMember *node = makeAstNode (driver->nodePool(), sym(3).sval, sym(4).sval, @@ -1005,6 +1014,15 @@ case $rule_number: { } ./ +JsIdentifier: T_ON ; +/. +case $rule_number: { + QString s = QLatin1String(QmlJSGrammar::spell[T_ON]); + sym(1).sval = driver->intern(s.constData(), s.length()); + break; +} +./ + -------------------------------------------------------------------------------------------------------- -- Expressions -------------------------------------------------------------------------------------------------------- @@ -1086,6 +1104,9 @@ case $rule_number: { diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, location(lexer), lexer->errorMessage())); return false; // ### remove me } + + loc(1).length = lexer->tokenLength(); + AST::RegExpLiteral *node = makeAstNode (driver->nodePool(), lexer->pattern, lexer->flags); node->literalToken = loc(1); sym(1).Node = node; @@ -1103,6 +1124,9 @@ case $rule_number: { diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, location(lexer), lexer->errorMessage())); return false; } + + loc(1).length = lexer->tokenLength(); + AST::RegExpLiteral *node = makeAstNode (driver->nodePool(), lexer->pattern, lexer->flags); node->literalToken = loc(1); sym(1).Node = node; diff --git a/src/libs/qmljs/parser/qmljsparser.cpp b/src/libs/qmljs/parser/qmljsparser.cpp index 5e12f8543cd..86b9903189c 100644 --- a/src/libs/qmljs/parser/qmljsparser.cpp +++ b/src/libs/qmljs/parser/qmljsparser.cpp @@ -273,11 +273,6 @@ case 20: { node = makeAstNode(driver->nodePool(), importIdLiteral->value); node->fileNameToken = loc(2); } else if (AST::UiQualifiedId *qualifiedId = reparseAsQualifiedId(sym(2).Expression)) { - QString text; - for (AST::UiQualifiedId *q = qualifiedId; q; q = q->next) { - text += q->name->asString(); - if (q->next) text += QLatin1String("."); - } node = makeAstNode(driver->nodePool(), qualifiedId); node->fileNameToken = loc(2); } @@ -571,6 +566,9 @@ case 76: { diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, location(lexer), lexer->errorMessage())); return false; // ### remove me } + + loc(1).length = lexer->tokenLength(); + AST::RegExpLiteral *node = makeAstNode (driver->nodePool(), lexer->pattern, lexer->flags); node->literalToken = loc(1); sym(1).Node = node; @@ -582,6 +580,9 @@ case 77: { diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, location(lexer), lexer->errorMessage())); return false; } + + loc(1).length = lexer->tokenLength(); + AST::RegExpLiteral *node = makeAstNode (driver->nodePool(), lexer->pattern, lexer->flags); node->literalToken = loc(1); sym(1).Node = node; From db753cd83efffcc2f1c26fb62ea9ae8c30560706 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 29 Mar 2010 16:45:34 +0200 Subject: [PATCH 03/19] debugger: avoid confusing status message when exiting debugging if the the binary is already gone. --- src/plugins/debugger/gdb/gdbengine.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 502c96e3eda..965b8385a5a 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -615,8 +615,11 @@ void GdbEngine::handleResponse(const QByteArray &buff) void GdbEngine::readGdbStandardError() { QByteArray err = m_gdbProc.readAllStandardError(); + debugMessage(_("UNEXPECTED GDB STDERR: " + err)); if (err == "Undefined command: \"bb\". Try \"help\".\n") return; + if (err.startsWith("BFD: reopening")) + return; qWarning() << "Unexpected gdb stderr:" << err; } @@ -1651,11 +1654,20 @@ void GdbEngine::handleInferiorShutdown(const GdbResponse &response) debugMessage(_("INFERIOR SUCCESSFULLY SHUT DOWN")); setState(InferiorShutDown); } else { - debugMessage(_("INFERIOR SHUTDOWN FAILED")); - setState(InferiorShutdownFailed); - QString msg = m_gdbAdapter->msgInferiorStopFailed( - QString::fromLocal8Bit(response.data.findChild("msg").data())); - showMessageBox(QMessageBox::Critical, tr("Failed to shut down application"), msg); + QByteArray ba = response.data.findChild("msg").data(); + if (ba.contains(": No such file or directory.")) { + // This happens when someone removed the binary behind our back. + // It is not really an error from a user's point of view. + debugMessage(_("INFERIOR SUCCESSFULLY SHUT DOWN")); + debugMessage(_("NOTE: " + ba)); + setState(InferiorShutDown); + } else { + debugMessage(_("INFERIOR SHUTDOWN FAILED")); + setState(InferiorShutdownFailed); + showMessageBox(QMessageBox::Critical, + tr("Failed to shut down application"), + m_gdbAdapter->msgInferiorStopFailed(QString::fromLocal8Bit(ba))); + } } shutdown(); // re-iterate... } From b1aae1b65d0ee5bb10f0de1a97f0ebaa89aa3ac3 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 29 Mar 2010 17:23:40 +0200 Subject: [PATCH 04/19] qmlprojectmanager: compile fix --- src/plugins/qmlprojectmanager/fileformat/filesystemwatcher.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/qmlprojectmanager/fileformat/filesystemwatcher.h b/src/plugins/qmlprojectmanager/fileformat/filesystemwatcher.h index cc08a85b550..7f9549c50ac 100644 --- a/src/plugins/qmlprojectmanager/fileformat/filesystemwatcher.h +++ b/src/plugins/qmlprojectmanager/fileformat/filesystemwatcher.h @@ -36,8 +36,10 @@ #include #include +QT_BEGIN_NAMESPACE class QTimer; class QFileSystemWatcher; +QT_END_NAMESPACE namespace QmlProjectManager { From 2319f57caaaf1668f1d32fec95b104d4ec70b698 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Mon, 29 Mar 2010 18:32:37 +0200 Subject: [PATCH 05/19] The constructor of Wizard takes now WindowFlags, get rid of QScopedPointer --- src/libs/utils/wizard.cpp | 12 +++++++++--- src/libs/utils/wizard.h | 9 +++++---- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/libs/utils/wizard.cpp b/src/libs/utils/wizard.cpp index 0149c882b6c..4489c95ca2b 100644 --- a/src/libs/utils/wizard.cpp +++ b/src/libs/utils/wizard.cpp @@ -290,8 +290,8 @@ public: WizardProgress *m_wizardProgress; }; -Wizard::Wizard(QWidget *parent) : - QWizard(parent), d_ptr(new WizardPrivate) +Wizard::Wizard(QWidget *parent, Qt::WindowFlags flags) : + QWizard(parent, flags), d_ptr(new WizardPrivate) { d_ptr->q_ptr = this; d_ptr->m_wizardProgress = new WizardProgress(this); @@ -301,6 +301,11 @@ Wizard::Wizard(QWidget *parent) : setSideWidget(new LinearProgressWidget(d_ptr->m_wizardProgress, this)); } +Wizard::~Wizard() +{ + delete d_ptr; +} + bool Wizard::isAutomaticProgressCreationEnabled() const { Q_D(const Wizard); @@ -563,6 +568,7 @@ WizardProgress::~WizardProgress() delete it.key(); ++it; } + delete d_ptr; } WizardProgressItem *WizardProgress::addItem(const QString &title) @@ -764,7 +770,7 @@ WizardProgressItem::WizardProgressItem(WizardProgress *progress, const QString & WizardProgressItem::~WizardProgressItem() { - + delete d_ptr; } void WizardProgressItem::addPage(int pageId) diff --git a/src/libs/utils/wizard.h b/src/libs/utils/wizard.h index 9c222408f6a..87e43278c1c 100644 --- a/src/libs/utils/wizard.h +++ b/src/libs/utils/wizard.h @@ -47,7 +47,8 @@ class QTCREATOR_UTILS_EXPORT Wizard : public QWizard Q_PROPERTY(bool automaticProgressCreationEnabled READ isAutomaticProgressCreationEnabled WRITE setAutomaticProgressCreationEnabled) public: - explicit Wizard(QWidget *parent = 0); + explicit Wizard(QWidget *parent = 0, Qt::WindowFlags flags = 0); + virtual ~Wizard(); bool isAutomaticProgressCreationEnabled() const; void setAutomaticProgressCreationEnabled(bool enabled); @@ -66,7 +67,7 @@ private: Q_DISABLE_COPY(Wizard) Q_DECLARE_PRIVATE(Wizard) - QScopedPointer d_ptr; + class WizardPrivate *d_ptr; }; class WizardProgressItem; @@ -118,7 +119,7 @@ private: Q_DISABLE_COPY(WizardProgress) Q_DECLARE_PRIVATE(WizardProgress) - QScopedPointer d_ptr; + class WizardProgressPrivate *d_ptr; }; class WizardProgressItemPrivate; @@ -150,7 +151,7 @@ private: Q_DISABLE_COPY(WizardProgressItem) Q_DECLARE_PRIVATE(WizardProgressItem) - QScopedPointer d_ptr; + class WizardProgressItemPrivate *d_ptr; }; } // namespace Utils From e9e84fc1be8acea8b9ae09c5c15e38a6057221c8 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Mon, 29 Mar 2010 17:57:18 +0200 Subject: [PATCH 06/19] Update wizards to use targetsetuppage --- .../customwidgetwizarddialog.cpp | 2 +- .../wizards/consoleappwizarddialog.cpp | 2 +- .../wizards/emptyprojectwizarddialog.cpp | 2 +- .../wizards/guiappwizarddialog.cpp | 9 +- .../wizards/librarywizarddialog.cpp | 2 +- .../qt4projectmanager/wizards/qtwizard.cpp | 66 ++++-- .../qt4projectmanager/wizards/qtwizard.h | 14 +- .../qt4projectmanager/wizards/targetspage.cpp | 213 ------------------ .../qt4projectmanager/wizards/targetspage.h | 78 ------- .../wizards/testwizarddialog.cpp | 2 +- 10 files changed, 61 insertions(+), 329 deletions(-) delete mode 100644 src/plugins/qt4projectmanager/wizards/targetspage.cpp delete mode 100644 src/plugins/qt4projectmanager/wizards/targetspage.h diff --git a/src/plugins/qt4projectmanager/customwidgetwizard/customwidgetwizarddialog.cpp b/src/plugins/qt4projectmanager/customwidgetwizard/customwidgetwizarddialog.cpp index d478bc50752..1870531b7b6 100644 --- a/src/plugins/qt4projectmanager/customwidgetwizard/customwidgetwizarddialog.cpp +++ b/src/plugins/qt4projectmanager/customwidgetwizard/customwidgetwizarddialog.cpp @@ -52,7 +52,7 @@ CustomWidgetWizardDialog::CustomWidgetWizardDialog(const QString &templateName, setIntroDescription(tr("This wizard generates a Qt4 Designer Custom Widget " "or a Qt4 Designer Custom Widget Collection project.")); - addTargetsPage(BaseQt4ProjectWizardDialog::desktopTarget()); + addTargetSetupPage(BaseQt4ProjectWizardDialog::desktopTarget()); m_widgetPageId = addPage(m_widgetsPage); m_pluginPageId = addPage(m_pluginPage); diff --git a/src/plugins/qt4projectmanager/wizards/consoleappwizarddialog.cpp b/src/plugins/qt4projectmanager/wizards/consoleappwizarddialog.cpp index d34793489e4..fc59468d94b 100644 --- a/src/plugins/qt4projectmanager/wizards/consoleappwizarddialog.cpp +++ b/src/plugins/qt4projectmanager/wizards/consoleappwizarddialog.cpp @@ -52,7 +52,7 @@ ConsoleAppWizardDialog::ConsoleAppWizardDialog(const QString &templateName, "provide a GUI.")); addModulesPage(); - addTargetsPage(); + addTargetSetupPage(); foreach (QWizardPage *p, extensionPages) addPage(p); diff --git a/src/plugins/qt4projectmanager/wizards/emptyprojectwizarddialog.cpp b/src/plugins/qt4projectmanager/wizards/emptyprojectwizarddialog.cpp index a10dd604873..e572120cf3d 100644 --- a/src/plugins/qt4projectmanager/wizards/emptyprojectwizarddialog.cpp +++ b/src/plugins/qt4projectmanager/wizards/emptyprojectwizarddialog.cpp @@ -45,7 +45,7 @@ EmptyProjectWizardDialog::EmptyProjectWizardDialog(const QString &templateName, setIntroDescription(tr("This wizard generates an empty Qt4 project. " "Add files to it later on by using the other wizards.")); - addTargetsPage(); + addTargetSetupPage(); foreach (QWizardPage *p, extensionPages) addPage(p); diff --git a/src/plugins/qt4projectmanager/wizards/guiappwizarddialog.cpp b/src/plugins/qt4projectmanager/wizards/guiappwizarddialog.cpp index 0f3959b1883..2155af9da43 100644 --- a/src/plugins/qt4projectmanager/wizards/guiappwizarddialog.cpp +++ b/src/plugins/qt4projectmanager/wizards/guiappwizarddialog.cpp @@ -62,7 +62,7 @@ GuiAppWizardDialog::GuiAppWizardDialog(const QString &templateName, "and includes an empty widget.")); addModulesPage(); - addTargetsPage(); + addTargetSetupPage(); m_filesPage->setFormInputCheckable(true); m_filesPage->setClassTypeComboVisible(false); @@ -110,12 +110,11 @@ GuiAppParameters GuiAppWizardDialog::parameters() const rc.formFileName = m_filesPage->formFileName(); rc.designerForm = m_filesPage->formInputChecked(); rc.isMobileApplication = true; - QSet targets = selectedTargets(); - if (targets.contains(QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID))) { + if (isTargetSelected(QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID))) { rc.widgetWidth = 800; rc.widgetHeight = 480; - } else if (targets.contains(QLatin1String(Constants::S60_DEVICE_TARGET_ID)) || - targets.contains(QLatin1String(Constants::S60_EMULATOR_TARGET_ID))) { + } else if (isTargetSelected(QLatin1String(Constants::S60_DEVICE_TARGET_ID)) || + isTargetSelected(QLatin1String(Constants::S60_EMULATOR_TARGET_ID))) { rc.widgetWidth = 360; rc.widgetHeight = 640; } else { diff --git a/src/plugins/qt4projectmanager/wizards/librarywizarddialog.cpp b/src/plugins/qt4projectmanager/wizards/librarywizarddialog.cpp index 2f396f4c0a1..dad6cff56ad 100644 --- a/src/plugins/qt4projectmanager/wizards/librarywizarddialog.cpp +++ b/src/plugins/qt4projectmanager/wizards/librarywizarddialog.cpp @@ -146,7 +146,7 @@ LibraryWizardDialog::LibraryWizardDialog(const QString &templateName, // Use the intro page instead, set up initially setIntroDescription(tr("This wizard generates a C++ library project.")); - m_targetPageId = addTargetsPage(); + m_targetPageId = addTargetSetupPage(); m_modulesPageId = addModulesPage(); m_filesPage->setNamespacesEnabled(true); diff --git a/src/plugins/qt4projectmanager/wizards/qtwizard.cpp b/src/plugins/qt4projectmanager/wizards/qtwizard.cpp index 66f046304c1..3e84b864c99 100644 --- a/src/plugins/qt4projectmanager/wizards/qtwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/qtwizard.cpp @@ -30,10 +30,11 @@ #include "qtwizard.h" #include "qt4project.h" +#include "qt4projectmanager.h" #include "qt4projectmanagerconstants.h" #include "qt4target.h" #include "modulespage.h" -#include "targetspage.h" +#include "targetsetuppage.h" #include #include @@ -164,7 +165,7 @@ QWizard *CustomQt4ProjectWizard::createWizardDialog(QWidget *parent, initProjectWizardDialog(wizard, defaultPath, extensionPages); if (wizard->pageIds().contains(targetPageId)) qWarning("CustomQt4ProjectWizard: Unable to insert target page at %d", int(targetPageId)); - wizard->addTargetsPage(QSet(), targetPageId); + wizard->addTargetSetupPage(QSet(), targetPageId); return wizard; } @@ -182,7 +183,7 @@ void CustomQt4ProjectWizard::registerSelf() BaseQt4ProjectWizardDialog::BaseQt4ProjectWizardDialog(bool showModulesPage, QWidget *parent) : ProjectExplorer::BaseProjectWizardDialog(parent), m_modulesPage(0), - m_targetsPage(0) + m_targetSetupPage(0) { init(showModulesPage); } @@ -192,15 +193,15 @@ BaseQt4ProjectWizardDialog::BaseQt4ProjectWizardDialog(bool showModulesPage, int introId, QWidget *parent) : ProjectExplorer::BaseProjectWizardDialog(introPage, introId, parent), m_modulesPage(0), - m_targetsPage(0) + m_targetSetupPage(0) { init(showModulesPage); } BaseQt4ProjectWizardDialog::~BaseQt4ProjectWizardDialog() { - if (m_targetsPage && !m_targetsPage->parent()) - delete m_targetsPage; + if (m_targetSetupPage && !m_targetSetupPage->parent()) + delete m_targetSetupPage; if (m_modulesPage && !m_modulesPage->parent()) delete m_modulesPage; } @@ -209,7 +210,6 @@ void BaseQt4ProjectWizardDialog::init(bool showModulesPage) { if (showModulesPage) m_modulesPage = new ModulesPage; - m_targetsPage = new TargetsPage; } int BaseQt4ProjectWizardDialog::addModulesPage(int id) @@ -223,18 +223,26 @@ int BaseQt4ProjectWizardDialog::addModulesPage(int id) return addPage(m_modulesPage); } -int BaseQt4ProjectWizardDialog::addTargetsPage(QSet targets, int id) +int BaseQt4ProjectWizardDialog::addTargetSetupPage(QSet targets, int id) { - m_targetsPage->setValidTargets(targets); + m_targetSetupPage = new TargetSetupPage; + QList infos = TargetSetupPage::importInfosForKnownQtVersions(0); + if (!targets.isEmpty()) + infos = TargetSetupPage::filterImportInfos(targets, infos); + m_targetSetupPage->setImportDirectoryBrowsingEnabled(false); + m_targetSetupPage->setShowLocationInformation(false); - if (!m_targetsPage->needToDisplayPage()) + if (infos.count() <= 1) return -1; - if (id >= 0) { - setPage(id, m_targetsPage); - return id; - } - return addPage(m_targetsPage); + m_targetSetupPage->setImportInfos(infos); + + if (id >= 0) + setPage(id, m_targetSetupPage); + else + id = addPage(m_targetSetupPage); + + return id; } QString BaseQt4ProjectWizardDialog::selectedModules() const @@ -269,18 +277,30 @@ void BaseQt4ProjectWizardDialog::setDeselectedModules(const QString &modules) } } -void BaseQt4ProjectWizardDialog::writeUserFile(const QString &proFileName) const +bool BaseQt4ProjectWizardDialog::writeUserFile(const QString &proFileName) const { - if (m_targetsPage) - m_targetsPage->writeUserFile(proFileName); + if (!m_targetSetupPage) + return false; + + Qt4Manager *manager = ExtensionSystem::PluginManager::instance()->getObject(); + Q_ASSERT(manager); + + Qt4Project *pro = new Qt4Project(manager, proFileName); + bool success = m_targetSetupPage->setupProject(pro); + if (success) + pro->saveSettings(); + delete pro; + return success; } -QSet BaseQt4ProjectWizardDialog::selectedTargets() const +bool BaseQt4ProjectWizardDialog::setupProject(Qt4Project *project) const { - QSet targets; - if (m_targetsPage) - targets = m_targetsPage->selectedTargets(); - return targets; + return m_targetSetupPage->setupProject(project); +} + +bool BaseQt4ProjectWizardDialog::isTargetSelected(const QString &targetid) const +{ + return m_targetSetupPage->isTargetSelected(targetid); } QSet BaseQt4ProjectWizardDialog::desktopTarget() diff --git a/src/plugins/qt4projectmanager/wizards/qtwizard.h b/src/plugins/qt4projectmanager/wizards/qtwizard.h index 760a72095da..c5e0d9a72c1 100644 --- a/src/plugins/qt4projectmanager/wizards/qtwizard.h +++ b/src/plugins/qt4projectmanager/wizards/qtwizard.h @@ -39,10 +39,13 @@ #include namespace Qt4ProjectManager { + +class Qt4Project; + namespace Internal { class ModulesPage; -class TargetsPage; +class TargetSetupPage; /* Base class for wizard creating Qt projects using QtProjectParameters. * To implement a project wizard, overwrite: @@ -125,7 +128,7 @@ public: virtual ~BaseQt4ProjectWizardDialog(); int addModulesPage(int id = -1); - int addTargetsPage(QSet targets = QSet(), int id = -1); + int addTargetSetupPage(QSet targets = QSet(), int id = -1); static QSet desktopTarget(); @@ -135,14 +138,15 @@ public: QString deselectedModules() const; void setDeselectedModules(const QString &); - void writeUserFile(const QString &proFileName) const; - QSet selectedTargets() const; + bool writeUserFile(const QString &proFileName) const; + bool setupProject(Qt4Project *project) const; + bool isTargetSelected(const QString &targetid) const; private: inline void init(bool showModulesPage); ModulesPage *m_modulesPage; - TargetsPage *m_targetsPage; + TargetSetupPage *m_targetSetupPage; QString m_selectedModules; QString m_deselectedModules; }; diff --git a/src/plugins/qt4projectmanager/wizards/targetspage.cpp b/src/plugins/qt4projectmanager/wizards/targetspage.cpp deleted file mode 100644 index c4bf2c186e7..00000000000 --- a/src/plugins/qt4projectmanager/wizards/targetspage.cpp +++ /dev/null @@ -1,213 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** Commercial Usage -** -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Commercial License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Nokia. -** -** GNU Lesser General Public License Usage -** -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at http://qt.nokia.com/contact. -** -**************************************************************************/ - -#include "targetspage.h" - -#include "qt4projectmanager/qt4project.h" -#include "qt4projectmanager/qt4projectmanager.h" -#include "qt4projectmanager/qt4target.h" -#include "qt4projectmanager/qtversionmanager.h" -#include "qt4projectmanager/qt4projectmanagerconstants.h" - -#include - -#include -#include - -#include -#include -#include - -using namespace Qt4ProjectManager::Internal; - -TargetsPage::TargetsPage(QWidget *parent) - : QWizardPage(parent) -{ - setTitle(tr("Choose Qt versions")); - - QVBoxLayout *vbox = new QVBoxLayout(this); - - setTitle(tr("Select required Qt versions")); - QLabel *label = new QLabel(tr("Select the Qt versions to use in your project."), this); - label->setWordWrap(true); - vbox->addWidget(label); - - m_treeWidget = new QTreeWidget(this); - m_treeWidget->setHeaderHidden(true); - vbox->addWidget(m_treeWidget); - - QtVersionManager *vm = QtVersionManager::instance(); - QStringList targets = vm->supportedTargetIds().toList(); - qSort(targets.begin(), targets.end()); - - Qt4TargetFactory factory; - - foreach (const QString &t, targets) { - QTreeWidgetItem *targetItem = new QTreeWidgetItem(m_treeWidget); - targetItem->setText(0, factory.displayNameForId(t)); - targetItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); - targetItem->setData(0, Qt::UserRole, t); - targetItem->setExpanded(true); - - foreach (QtVersion *v, vm->versionsForTargetId(t)) { - QTreeWidgetItem *versionItem = new QTreeWidgetItem(targetItem); - versionItem->setText(0, v->displayName()); - versionItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable); - versionItem->setData(0, Qt::UserRole, v->uniqueId()); - versionItem->setCheckState(0, Qt::Unchecked); - } - } - - connect(m_treeWidget, SIGNAL(itemChanged(QTreeWidgetItem*,int)), - this, SLOT(itemWasChanged())); - - emit completeChanged(); -} - -void TargetsPage::setValidTargets(const QSet &targets) -{ - if (targets.isEmpty()) - return; - - for (int i = 0; i < m_treeWidget->topLevelItemCount(); ++i) { - QTreeWidgetItem *currentTargetItem = m_treeWidget->topLevelItem(i); - QString currentTarget = currentTargetItem->data(0, Qt::UserRole).toString(); - if (targets.contains(currentTarget)) - currentTargetItem->setHidden(false); - else - currentTargetItem->setHidden(true); - } - - // Make sure we have something checked! - if (selectedTargets().isEmpty()) { - for (int i = 0; i < m_treeWidget->topLevelItemCount(); ++i) { - QTreeWidgetItem *currentTargetItem = m_treeWidget->topLevelItem(i); - QString currentTarget = currentTargetItem->data(0, Qt::UserRole).toString(); - if (targets.contains(currentTarget) && currentTargetItem->childCount() >= 1) { - currentTargetItem->child(0)->setCheckState(0, Qt::Checked); - break; - } - } - } - emit completeChanged(); -} - -QSet TargetsPage::selectedTargets() const -{ - QSet result; - for (int i = 0; i < m_treeWidget->topLevelItemCount(); ++i) { - QTreeWidgetItem * targetItem = m_treeWidget->topLevelItem(i); - QString target = targetItem->data(0, Qt::UserRole).toString(); - - QList versions = selectedQtVersionIdsForTarget(target); - if (!versions.isEmpty()) - result.insert(target); - } - return result; -} - -QList TargetsPage::selectedQtVersionIdsForTarget(const QString &t) const -{ - QList result; - for (int i = 0; i < m_treeWidget->topLevelItemCount(); ++i) { - QTreeWidgetItem * current = m_treeWidget->topLevelItem(i); - QString target = current->data(0, Qt::UserRole).toString(); - if (t != target || current->isHidden()) - continue; - - for (int j = 0; j < current->childCount(); ++j) { - QTreeWidgetItem * child = current->child(j); - if (child->checkState(0) != Qt::Checked) - continue; - result.append(child->data(0, Qt::UserRole).toInt()); - } - } - return result; -} - -void TargetsPage::itemWasChanged() -{ - emit completeChanged(); -} - -bool TargetsPage::isComplete() const -{ - return !selectedTargets().isEmpty(); -} - -bool TargetsPage::needToDisplayPage() const -{ - int targetCount = 0; - for (int i = 0; i < m_treeWidget->topLevelItemCount(); ++i) { - QTreeWidgetItem * current = m_treeWidget->topLevelItem(i); - if (current->isHidden()) - continue; - ++targetCount; - if (targetCount > 1) - return true; - - if (current->childCount() > 1) - return true; - } - return false; -} - -void TargetsPage::writeUserFile(const QString &proFileName) const -{ - Qt4Manager *manager = ExtensionSystem::PluginManager::instance()->getObject(); - Q_ASSERT(manager); - - Qt4Project *pro = new Qt4Project(manager, proFileName); - if (setupProject(pro)) - pro->saveSettings(); - delete pro; -} - -bool TargetsPage::setupProject(Qt4ProjectManager::Qt4Project *project) const -{ - if (!project) - return false; - - // Generate user settings: - QSet targets = selectedTargets(); - if (targets.isEmpty()) - return false; - - QtVersionManager *vm = QtVersionManager::instance(); - - foreach (const QString &targetId, targets) { - QList versionIds = selectedQtVersionIdsForTarget(targetId); - QList versions; - foreach (int id, versionIds) - versions.append(vm->version(id)); - Qt4Target * target = project->targetFactory()->create(project, targetId, versions); - project->addTarget(target); - } - return true; -} diff --git a/src/plugins/qt4projectmanager/wizards/targetspage.h b/src/plugins/qt4projectmanager/wizards/targetspage.h deleted file mode 100644 index 15629d42e41..00000000000 --- a/src/plugins/qt4projectmanager/wizards/targetspage.h +++ /dev/null @@ -1,78 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** Commercial Usage -** -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Commercial License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Nokia. -** -** GNU Lesser General Public License Usage -** -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at http://qt.nokia.com/contact. -** -**************************************************************************/ - -#ifndef TARGETSPAGE_H -#define TARGETSPAGE_H - -#include -#include -#include - -#include - -QT_BEGIN_NAMESPACE -class QTreeWidget; -QT_END_NAMESPACE - -namespace Qt4ProjectManager { -class Qt4Project; - -namespace Internal { - -class TargetsPage : public QWizardPage -{ - Q_OBJECT - -public: - explicit TargetsPage(QWidget* parent = 0); - - void setValidTargets(const QSet &targets); - - QSet selectedTargets() const; - QList selectedQtVersionIdsForTarget(const QString &) const; - - bool isComplete() const; - - bool needToDisplayPage() const; - - void writeUserFile(const QString &proFileName) const; - bool setupProject(Qt4Project *project) const; - -private slots: - void itemWasChanged(); - -private: - QSet m_validTargets; - QTreeWidget * m_treeWidget; -}; - -} // namespace Internal -} // namespace Qt4ProjectManager - -#endif // TARGETSPAGE_H diff --git a/src/plugins/qt4projectmanager/wizards/testwizarddialog.cpp b/src/plugins/qt4projectmanager/wizards/testwizarddialog.cpp index 24b774060ab..2f4969a1767 100644 --- a/src/plugins/qt4projectmanager/wizards/testwizarddialog.cpp +++ b/src/plugins/qt4projectmanager/wizards/testwizarddialog.cpp @@ -60,7 +60,7 @@ TestWizardDialog::TestWizardDialog(const QString &templateName, setWindowIcon(icon); setWindowTitle(templateName); setSelectedModules(QLatin1String("core testlib"), true); - addTargetsPage(); + addTargetSetupPage(); m_testPageId = addPage(m_testPage); m_modulesPageId = addModulesPage(); foreach (QWizardPage *p, extensionPages) From deaa0cc137bcc00bee815ad3be9655b40c71c472 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Mon, 29 Mar 2010 17:59:27 +0200 Subject: [PATCH 07/19] Only build outputparser tester when compileing with tests --- src/plugins/projectexplorer/outputparser_test.cpp | 4 ++++ src/plugins/projectexplorer/outputparser_test.h | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/plugins/projectexplorer/outputparser_test.cpp b/src/plugins/projectexplorer/outputparser_test.cpp index 09dc063979e..7d9952c100a 100644 --- a/src/plugins/projectexplorer/outputparser_test.cpp +++ b/src/plugins/projectexplorer/outputparser_test.cpp @@ -29,6 +29,8 @@ #include "outputparser_test.h" +#if defined(WITH_TESTS) + #include using namespace ProjectExplorer; @@ -157,3 +159,5 @@ void OutputParserTester::reset() m_receivedTasks.clear(); m_receivedOutput = QString(); } + +#endif diff --git a/src/plugins/projectexplorer/outputparser_test.h b/src/plugins/projectexplorer/outputparser_test.h index 89b2292c383..58f51f2d32e 100644 --- a/src/plugins/projectexplorer/outputparser_test.h +++ b/src/plugins/projectexplorer/outputparser_test.h @@ -30,6 +30,8 @@ #ifndef OUTPUTPARSER_TESTER_H #define OUTPUTPARSER_TESTER_H +#if defined(WITH_TESTS) + #include "projectexplorer_export.h" #include "ioutputparser.h" @@ -86,4 +88,6 @@ private: Q_DECLARE_METATYPE(ProjectExplorer::OutputParserTester::Channel) +#endif + #endif // OUTPUTPARSER_TESTER_H From 64bba7eda0908eaa62288fe2b2d4356211c623c4 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Mon, 29 Mar 2010 17:59:58 +0200 Subject: [PATCH 08/19] Add simple unit tests for abld parser --- .../projectexplorer/outputparser_test.cpp | 1 - .../projectexplorer/outputparser_test.h | 1 + .../qt4projectmanager/qt-s60/abldparser.cpp | 50 +++++++++++++++++++ .../qt4projectmanager/qt4projectmanager.pro | 2 - .../qt4projectmanagerplugin.cpp | 5 -- .../qt4projectmanagerplugin.h | 4 +- 6 files changed, 54 insertions(+), 9 deletions(-) diff --git a/src/plugins/projectexplorer/outputparser_test.cpp b/src/plugins/projectexplorer/outputparser_test.cpp index 7d9952c100a..28a83b50011 100644 --- a/src/plugins/projectexplorer/outputparser_test.cpp +++ b/src/plugins/projectexplorer/outputparser_test.cpp @@ -134,7 +134,6 @@ void OutputParserTester::stdError(const QString &line) void OutputParserTester::appendOutputParser(IOutputParser *parser) { Q_ASSERT(!childParser()); - Q_ASSERT(!parser->childParser()); IOutputParser::appendOutputParser(parser); parser->appendOutputParser(this); diff --git a/src/plugins/projectexplorer/outputparser_test.h b/src/plugins/projectexplorer/outputparser_test.h index 58f51f2d32e..8241766bb5b 100644 --- a/src/plugins/projectexplorer/outputparser_test.h +++ b/src/plugins/projectexplorer/outputparser_test.h @@ -33,6 +33,7 @@ #if defined(WITH_TESTS) #include "projectexplorer_export.h" +#include "metatypedeclarations.h" #include "ioutputparser.h" namespace ProjectExplorer { diff --git a/src/plugins/qt4projectmanager/qt-s60/abldparser.cpp b/src/plugins/qt4projectmanager/qt-s60/abldparser.cpp index 9cc7595f3ef..692d7b30e83 100644 --- a/src/plugins/qt4projectmanager/qt-s60/abldparser.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/abldparser.cpp @@ -174,3 +174,53 @@ void AbldParser::stdError(const QString &line) } IOutputParser::stdError(line); } + +// Unit tests: + +#ifdef WITH_TESTS +# include + +# include "qt4projectmanagerplugin.h" + +# include "projectexplorer/outputparser_test.h" + +using namespace Qt4ProjectManager::Internal; + +void Qt4ProjectManagerPlugin::testAbldOutputParsers_data() +{ + QTest::addColumn("input"); + QTest::addColumn("inputChannel"); + QTest::addColumn("childStdOutLines"); + QTest::addColumn("childStdErrLines"); + QTest::addColumn >("tasks"); + QTest::addColumn("outputLines"); + + + QTest::newRow("pass-through stdout") + << QString::fromLatin1("Sometext") << OutputParserTester::STDOUT + << QString::fromLatin1("Sometext") << QString() + << QList() + << QString(); + QTest::newRow("pass-through stderr") + << QString::fromLatin1("Sometext") << OutputParserTester::STDERR + << QString() << QString::fromLatin1("Sometext") + << QList() + << QString(); +} + +void Qt4ProjectManagerPlugin::testAbldOutputParsers() +{ + OutputParserTester testbench; + testbench.appendOutputParser(new AbldParser); + QFETCH(QString, input); + QFETCH(OutputParserTester::Channel, inputChannel); + QFETCH(QList, tasks); + QFETCH(QString, childStdOutLines); + QFETCH(QString, childStdErrLines); + QFETCH(QString, outputLines); + + testbench.testParsing(input, inputChannel, + tasks, childStdOutLines, childStdErrLines, + outputLines); +} +#endif diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.pro b/src/plugins/qt4projectmanager/qt4projectmanager.pro index eb3b98f9893..b78f585a998 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanager.pro +++ b/src/plugins/qt4projectmanager/qt4projectmanager.pro @@ -27,7 +27,6 @@ HEADERS += qt4projectmanagerplugin.h \ wizards/modulespage.h \ wizards/filespage.h \ wizards/qtwizard.h \ - wizards/targetspage.h \ wizards/targetsetuppage.h \ qt4projectmanagerconstants.h \ makestep.h \ @@ -69,7 +68,6 @@ SOURCES += qt4projectmanagerplugin.cpp \ wizards/modulespage.cpp \ wizards/filespage.cpp \ wizards/qtwizard.cpp \ - wizards/targetspage.cpp \ wizards/targetsetuppage.cpp \ makestep.cpp \ qmakestep.cpp \ diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp index 096356267cd..674fb048559 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp +++ b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp @@ -266,11 +266,6 @@ void Qt4ProjectManagerPlugin::testBasicProjectLoading() QVERIFY(qt4project->rootProjectNode()->projectType() == ApplicationTemplate); QVERIFY(m_projectExplorer->currentProject() != 0); } - -void Qt4ProjectManagerPlugin::testNotYetImplemented() -{ - QCOMPARE(1+1, 2); -} #endif Q_EXPORT_PLUGIN(Qt4ProjectManagerPlugin) diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.h b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.h index 1fc0c9f43a5..b8af4ccf860 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.h +++ b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.h @@ -76,7 +76,9 @@ private slots: #ifdef WITH_TESTS void testBasicProjectLoading(); - void testNotYetImplemented(); + + void testAbldOutputParsers_data(); + void testAbldOutputParsers(); #endif private: From 40bae63c6c920373ce40184e67d3584f6df3ec4a Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Tue, 30 Mar 2010 10:27:45 +0200 Subject: [PATCH 09/19] Don't wait for the dependencyTable computation in the GUI thread. Done-with: Erik Verbruggen --- src/plugins/cpptools/cppfindreferences.cpp | 28 +++++++++++++--------- src/plugins/cpptools/cppfindreferences.h | 4 +++- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/plugins/cpptools/cppfindreferences.cpp b/src/plugins/cpptools/cppfindreferences.cpp index 6a6a048da72..ef442e45d49 100644 --- a/src/plugins/cpptools/cppfindreferences.cpp +++ b/src/plugins/cpptools/cppfindreferences.cpp @@ -157,6 +157,8 @@ CppFindReferences::CppFindReferences(CppTools::CppModelManagerInterface *modelMa connect(&m_watcher, SIGNAL(resultsReadyAt(int,int)), this, SLOT(displayResults(int,int))); connect(&m_watcher, SIGNAL(finished()), this, SLOT(searchFinished())); + connect(&m_watchDependencyTable, SIGNAL(finished()), this, SLOT(dependencyTableUpdated())); + m_updateDependencyTableTimer = new QTimer(this); m_updateDependencyTableTimer->setSingleShot(true); m_updateDependencyTableTimer->setInterval(2000); @@ -188,11 +190,10 @@ static void find_helper(QFutureInterface &future, const CppTools::CppModelManagerInterface::WorkingCopy workingCopy, Snapshot snapshot, Document::Ptr symbolDocument, - DependencyTable dependencyTable, + QFuture dependencyTableFuture, Symbol *symbol) { - QTime tm; - tm.start(); + const DependencyTable dependencyTable = dependencyTableFuture; const Identifier *symbolId = symbol->identifier(); Q_ASSERT(symbolId != 0); @@ -226,7 +227,7 @@ static void find_helper(QFutureInterface &future, future.setProgressValue(files.size()); } -static CPlusPlus::DependencyTable dependencyTable(DependencyTable previous, CPlusPlus::Snapshot snapshot) +static CPlusPlus::DependencyTable dependencyTable_helper(DependencyTable previous, CPlusPlus::Snapshot snapshot) { if (previous.isValidFor(snapshot)) return previous; @@ -238,8 +239,14 @@ static CPlusPlus::DependencyTable dependencyTable(DependencyTable previous, CPlu void CppFindReferences::updateDependencyTable() { - m_depsFuture.cancel(); - m_depsFuture = QtConcurrent::run(&dependencyTable, m_deps, _modelManager->snapshot()); + m_dependencyTableFuture.cancel(); + m_dependencyTableFuture = QtConcurrent::run(&dependencyTable_helper, m_deps, _modelManager->snapshot()); + m_watchDependencyTable.setFuture(m_dependencyTableFuture); +} + +void CppFindReferences::dependencyTableUpdated() +{ + m_deps = m_dependencyTableFuture; } void CppFindReferences::findUsages(Document::Ptr symbolDocument, Symbol *symbol) @@ -283,11 +290,10 @@ void CppFindReferences::findAll_helper(Document::Ptr symbolDocument, Symbol *sym Core::ProgressManager *progressManager = Core::ICore::instance()->progressManager(); updateDependencyTable(); // ensure the dependency table is updated - m_deps = m_depsFuture; QFuture result; - result = QtConcurrent::run(&find_helper, workingCopy, snapshot, symbolDocument, m_deps, symbol); + result = QtConcurrent::run(&find_helper, workingCopy, snapshot, symbolDocument, m_dependencyTableFuture, symbol); m_watcher.setFuture(result); Core::FutureProgress *progress = progressManager->addTask(result, tr("Searching"), @@ -405,9 +411,10 @@ public: static void findMacroUses_helper(QFutureInterface &future, const CppTools::CppModelManagerInterface::WorkingCopy workingCopy, const Snapshot snapshot, - DependencyTable dependencyTable, + QFuture dependencyTableFuture, const Macro macro) { + const DependencyTable dependencyTable = dependencyTableFuture; const QString& sourceFile = macro.fileName(); QStringList files(sourceFile); files += dependencyTable.filesDependingOn(sourceFile); @@ -443,10 +450,9 @@ void CppFindReferences::findMacroUses(const Macro ¯o) } updateDependencyTable(); // ensure the dependency table is updated - m_deps = m_depsFuture; QFuture result; - result = QtConcurrent::run(&findMacroUses_helper, workingCopy, snapshot, m_deps, macro); + result = QtConcurrent::run(&findMacroUses_helper, workingCopy, snapshot, m_dependencyTableFuture, macro); m_watcher.setFuture(result); Core::ProgressManager *progressManager = Core::ICore::instance()->progressManager(); diff --git a/src/plugins/cpptools/cppfindreferences.h b/src/plugins/cpptools/cppfindreferences.h index f37d2b6643d..2f53ac5e3ed 100644 --- a/src/plugins/cpptools/cppfindreferences.h +++ b/src/plugins/cpptools/cppfindreferences.h @@ -78,6 +78,7 @@ private Q_SLOTS: void openEditor(const Find::SearchResultItem &item); void onReplaceButtonClicked(const QString &text, const QList &items); void updateDependencyTable(); + void dependencyTableUpdated(); private: void findAll_helper(CPlusPlus::Document::Ptr symbolDocument, CPlusPlus::Symbol *symbol); @@ -86,8 +87,9 @@ private: QPointer _modelManager; Find::SearchResultWindow *_resultWindow; QFutureWatcher m_watcher; + QFutureWatcher m_watchDependencyTable; CPlusPlus::DependencyTable m_deps; - QFuture m_depsFuture; + QFuture m_dependencyTableFuture; QTimer *m_updateDependencyTableTimer; }; From 2295aa2871c1beeca9d388ccbc3d9568d00d21c9 Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Tue, 30 Mar 2010 10:33:58 +0200 Subject: [PATCH 10/19] Revert "Don't wait for the dependencyTable computation in the GUI thread." OK, it seems that this change is not necessary. This reverts commit 40bae63c6c920373ce40184e67d3584f6df3ec4a. --- src/plugins/cpptools/cppfindreferences.cpp | 28 +++++++++------------- src/plugins/cpptools/cppfindreferences.h | 4 +--- 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/src/plugins/cpptools/cppfindreferences.cpp b/src/plugins/cpptools/cppfindreferences.cpp index ef442e45d49..6a6a048da72 100644 --- a/src/plugins/cpptools/cppfindreferences.cpp +++ b/src/plugins/cpptools/cppfindreferences.cpp @@ -157,8 +157,6 @@ CppFindReferences::CppFindReferences(CppTools::CppModelManagerInterface *modelMa connect(&m_watcher, SIGNAL(resultsReadyAt(int,int)), this, SLOT(displayResults(int,int))); connect(&m_watcher, SIGNAL(finished()), this, SLOT(searchFinished())); - connect(&m_watchDependencyTable, SIGNAL(finished()), this, SLOT(dependencyTableUpdated())); - m_updateDependencyTableTimer = new QTimer(this); m_updateDependencyTableTimer->setSingleShot(true); m_updateDependencyTableTimer->setInterval(2000); @@ -190,10 +188,11 @@ static void find_helper(QFutureInterface &future, const CppTools::CppModelManagerInterface::WorkingCopy workingCopy, Snapshot snapshot, Document::Ptr symbolDocument, - QFuture dependencyTableFuture, + DependencyTable dependencyTable, Symbol *symbol) { - const DependencyTable dependencyTable = dependencyTableFuture; + QTime tm; + tm.start(); const Identifier *symbolId = symbol->identifier(); Q_ASSERT(symbolId != 0); @@ -227,7 +226,7 @@ static void find_helper(QFutureInterface &future, future.setProgressValue(files.size()); } -static CPlusPlus::DependencyTable dependencyTable_helper(DependencyTable previous, CPlusPlus::Snapshot snapshot) +static CPlusPlus::DependencyTable dependencyTable(DependencyTable previous, CPlusPlus::Snapshot snapshot) { if (previous.isValidFor(snapshot)) return previous; @@ -239,14 +238,8 @@ static CPlusPlus::DependencyTable dependencyTable_helper(DependencyTable previou void CppFindReferences::updateDependencyTable() { - m_dependencyTableFuture.cancel(); - m_dependencyTableFuture = QtConcurrent::run(&dependencyTable_helper, m_deps, _modelManager->snapshot()); - m_watchDependencyTable.setFuture(m_dependencyTableFuture); -} - -void CppFindReferences::dependencyTableUpdated() -{ - m_deps = m_dependencyTableFuture; + m_depsFuture.cancel(); + m_depsFuture = QtConcurrent::run(&dependencyTable, m_deps, _modelManager->snapshot()); } void CppFindReferences::findUsages(Document::Ptr symbolDocument, Symbol *symbol) @@ -290,10 +283,11 @@ void CppFindReferences::findAll_helper(Document::Ptr symbolDocument, Symbol *sym Core::ProgressManager *progressManager = Core::ICore::instance()->progressManager(); updateDependencyTable(); // ensure the dependency table is updated + m_deps = m_depsFuture; QFuture result; - result = QtConcurrent::run(&find_helper, workingCopy, snapshot, symbolDocument, m_dependencyTableFuture, symbol); + result = QtConcurrent::run(&find_helper, workingCopy, snapshot, symbolDocument, m_deps, symbol); m_watcher.setFuture(result); Core::FutureProgress *progress = progressManager->addTask(result, tr("Searching"), @@ -411,10 +405,9 @@ public: static void findMacroUses_helper(QFutureInterface &future, const CppTools::CppModelManagerInterface::WorkingCopy workingCopy, const Snapshot snapshot, - QFuture dependencyTableFuture, + DependencyTable dependencyTable, const Macro macro) { - const DependencyTable dependencyTable = dependencyTableFuture; const QString& sourceFile = macro.fileName(); QStringList files(sourceFile); files += dependencyTable.filesDependingOn(sourceFile); @@ -450,9 +443,10 @@ void CppFindReferences::findMacroUses(const Macro ¯o) } updateDependencyTable(); // ensure the dependency table is updated + m_deps = m_depsFuture; QFuture result; - result = QtConcurrent::run(&findMacroUses_helper, workingCopy, snapshot, m_dependencyTableFuture, macro); + result = QtConcurrent::run(&findMacroUses_helper, workingCopy, snapshot, m_deps, macro); m_watcher.setFuture(result); Core::ProgressManager *progressManager = Core::ICore::instance()->progressManager(); diff --git a/src/plugins/cpptools/cppfindreferences.h b/src/plugins/cpptools/cppfindreferences.h index 2f53ac5e3ed..f37d2b6643d 100644 --- a/src/plugins/cpptools/cppfindreferences.h +++ b/src/plugins/cpptools/cppfindreferences.h @@ -78,7 +78,6 @@ private Q_SLOTS: void openEditor(const Find::SearchResultItem &item); void onReplaceButtonClicked(const QString &text, const QList &items); void updateDependencyTable(); - void dependencyTableUpdated(); private: void findAll_helper(CPlusPlus::Document::Ptr symbolDocument, CPlusPlus::Symbol *symbol); @@ -87,9 +86,8 @@ private: QPointer _modelManager; Find::SearchResultWindow *_resultWindow; QFutureWatcher m_watcher; - QFutureWatcher m_watchDependencyTable; CPlusPlus::DependencyTable m_deps; - QFuture m_dependencyTableFuture; + QFuture m_depsFuture; QTimer *m_updateDependencyTableTimer; }; From b3ad65d89be33b3c61ea7a34c53ca9686dc00f2d Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Tue, 30 Mar 2010 10:49:47 +0200 Subject: [PATCH 11/19] Fixed property conversion. Again. --- .../qmldesigner/core/model/rewriterview.cpp | 2 +- .../core/model/texttomodelmerger.cpp | 21 +++++++++++++++---- .../core/model/texttomodelmerger.h | 2 +- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/plugins/qmldesigner/core/model/rewriterview.cpp b/src/plugins/qmldesigner/core/model/rewriterview.cpp index fc4f608af58..94c1244daf1 100644 --- a/src/plugins/qmldesigner/core/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/core/model/rewriterview.cpp @@ -538,7 +538,7 @@ void RewriterView::qmlTextChanged() default: { emitCustomNotification(StartRewriterAmend); ModelAmender differenceHandler(m_textToModelMerger.data()); - if (m_textToModelMerger->load(newQmlText.toUtf8(), differenceHandler)) { + if (m_textToModelMerger->load(newQmlText, differenceHandler)) { lastCorrectQmlSource = newQmlText; } emitCustomNotification(EndRewriterAmend); diff --git a/src/plugins/qmldesigner/core/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/core/model/texttomodelmerger.cpp index dd264fbfd75..2d214e82512 100644 --- a/src/plugins/qmldesigner/core/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/core/model/texttomodelmerger.cpp @@ -255,8 +255,10 @@ void TextToModelMerger::setupImports(const Document::Ptr &doc, differenceHandler.importAbsentInQMl(import); } -bool TextToModelMerger::load(const QByteArray &data, DifferenceHandler &differenceHandler) +bool TextToModelMerger::load(const QString &data, DifferenceHandler &differenceHandler) { +// qDebug() << "TextToModelMerger::load with data:" << data; + const QUrl url = m_rewriterView->model()->fileUrl(); const QStringList importPaths = m_rewriterView->textModifier()->importPaths(); setActive(true); @@ -266,7 +268,7 @@ bool TextToModelMerger::load(const QByteArray &data, DifferenceHandler &differen foreach (const QString &importPath, importPaths) engine.addImportPath(importPath); QDeclarativeComponent comp(&engine); - comp.setData(data, url); + comp.setData(data.toUtf8(), url); if (comp.status() == QDeclarativeComponent::Error) { QList errors; foreach (const QDeclarativeError &error, comp.errors()) @@ -288,7 +290,7 @@ bool TextToModelMerger::load(const QByteArray &data, DifferenceHandler &differen Snapshot snapshot = m_rewriterView->textModifier()->getSnapshot(); const QString fileName = url.toLocalFile(); Document::Ptr doc = Document::create(fileName.isEmpty() ? QLatin1String("") : fileName); - doc->setSource(QString::fromUtf8(data.constData())); + doc->setSource(data); doc->parseQml(); snapshot.insert(doc); ReadingContext ctxt(snapshot, doc, importPaths); @@ -671,7 +673,14 @@ QVariant TextToModelMerger::convertToVariant(const ModelNode &node, const PropertyMetaInfo propertyMetaInfo = nodeMetaInfo.property(astName, true); if (propertyMetaInfo.isValid()) { - return Internal::PropertyParser::read(propertyMetaInfo.variantTypeId(), cleanedValue); + QVariant::Type type = propertyMetaInfo.variantTypeId(); + if (type == QVariant::Invalid) { + const QString propType = propertyMetaInfo.type(); +// qDebug() << "converting" << cleanedValue << "to" << propType; + return Internal::PropertyParser::read(propType, cleanedValue, node.metaInfo().metaInfo()); + } else { + return Internal::PropertyParser::read(type, cleanedValue); + } } else if (node.type() == QLatin1String("Qt/PropertyChanges")) { // In the future, we should do the type resolving in a second pass, or delay setting properties until the full file has been parsed. return QVariant(cleanedValue); @@ -827,6 +836,10 @@ void ModelAmender::shouldBeNodeListProperty(AbstractProperty &modelProperty, void ModelAmender::variantValuesDiffer(VariantProperty &modelProperty, const QVariant &qmlVariantValue, const QString &dynamicType) { +// qDebug()<< "ModelAmender::variantValuesDiffer for property"< Date: Tue, 30 Mar 2010 11:16:25 +0200 Subject: [PATCH 12/19] QmlDesigner: Fix crash when changing the transform origin of an item Fixes crash when changing the transform origin of an item in the Property Editor. The fundamental problem is that the metatype system doesn't know about the enum. We used to return then an invalid QVariant when trying to convert the string to a QVariant. Now we instead return a valid QVariant, but with wrong type (QString). Task-number: BAUHAUS-522 Reviewed-by: Erik Verbruggen --- src/plugins/qmldesigner/core/model/propertyparser.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/core/model/propertyparser.cpp b/src/plugins/qmldesigner/core/model/propertyparser.cpp index ded2b374cc5..4043e81827a 100644 --- a/src/plugins/qmldesigner/core/model/propertyparser.cpp +++ b/src/plugins/qmldesigner/core/model/propertyparser.cpp @@ -63,10 +63,13 @@ QVariant read(const QString &typeStr, const QString &str, const MetaInfo &metaIn QVariant read(const QString &typeStr, const QString &str) { int type = QMetaType::type(typeStr.toAscii().constData()); - if (type == 0) + if (type == 0) { qWarning() << "Type " << typeStr << " is unknown to QMetaType system. Cannot create properly typed QVariant for value " << str; + // Fall back to a QVariant of type String + return QVariant(str); + } return read(type, str); } @@ -108,9 +111,9 @@ QVariant read(int variantType, const QString &str) } if (!conversionOk) { - value = QVariant(); qWarning() << "Could not convert" << str << "to" << QMetaType::typeName(variantType); + value = QVariant(str); } return value; From e499d7eb781b78f63ffbc0bca496f9e2053a4013 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 30 Mar 2010 12:01:10 +0200 Subject: [PATCH 13/19] QmlDesigner.autoTests: added testMetaInfoEnums() --- .../qml/qmldesigner/coretests/testcore.cpp | 24 +++++++++++++++++++ .../auto/qml/qmldesigner/coretests/testcore.h | 1 + 2 files changed, 25 insertions(+) diff --git a/tests/auto/qml/qmldesigner/coretests/testcore.cpp b/tests/auto/qml/qmldesigner/coretests/testcore.cpp index 037ce1ae1ae..7878667a1b3 100644 --- a/tests/auto/qml/qmldesigner/coretests/testcore.cpp +++ b/tests/auto/qml/qmldesigner/coretests/testcore.cpp @@ -3192,6 +3192,30 @@ void TestCore::testMetaInfo() // QVERIFY(graphicsWidgetInfo.hasProperty("enabled")); // from QGraphicsItem } +void TestCore::testMetaInfoEnums() +{ + QScopedPointer model(Model::create("Qt/Text")); + QVERIFY(model.data()); + + QScopedPointer view(new TestView); + QVERIFY(view.data()); + model->attachView(view.data()); + + QCOMPARE(view->rootModelNode().metaInfo().typeName(), QString("Qt/Text")); + + QVERIFY(view->rootModelNode().metaInfo().hasProperty("transformOrigin")); + + QVERIFY(view->rootModelNode().metaInfo().property("transformOrigin").isEnumType()); + QCOMPARE(view->rootModelNode().metaInfo().property("transformOrigin").type(), QLatin1String("TransformOrigin")); + QVERIFY(view->rootModelNode().metaInfo().property("transformOrigin").enumerator().elementNames().contains(QLatin1String("Bottom"))); + QVERIFY(view->rootModelNode().metaInfo().property("transformOrigin").enumerator().elementNames().contains(QLatin1String("Top"))); + + QVERIFY(view->rootModelNode().metaInfo().property("horizontalAlignment").isEnumType()); + QCOMPARE(view->rootModelNode().metaInfo().property("horizontalAlignment").type(), QLatin1String("HAlignment")); + QVERIFY(view->rootModelNode().metaInfo().property("horizontalAlignment").enumerator().elementNames().contains(QLatin1String("AlignLeft"))); + QVERIFY(view->rootModelNode().metaInfo().property("horizontalAlignment").enumerator().elementNames().contains(QLatin1String("AlignRight"))); +} + void TestCore::testMetaInfoDotProperties() { QScopedPointer model(Model::create("Qt/Text")); diff --git a/tests/auto/qml/qmldesigner/coretests/testcore.h b/tests/auto/qml/qmldesigner/coretests/testcore.h index 8a04fe3f18f..68e2f761e55 100644 --- a/tests/auto/qml/qmldesigner/coretests/testcore.h +++ b/tests/auto/qml/qmldesigner/coretests/testcore.h @@ -72,6 +72,7 @@ private slots: // unit tests MetaInfo, NodeMetaInfo, PropertyMetaInfo // void testMetaInfo(); + void testMetaInfoEnums(); void testMetaInfoDotProperties(); void testMetaInfoListProperties(); From 7c3caca03cb795985ab97bfae14d87da63c253a5 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 30 Mar 2010 12:05:24 +0200 Subject: [PATCH 14/19] CPaster: Introduce Proxy for QNetworkAccessManager that is shared and provides delayed creation. Add "Paste clipboard" option. --- src/plugins/cpaster/codepasterprotocol.cpp | 16 ++--- src/plugins/cpaster/codepasterprotocol.h | 7 +-- src/plugins/cpaster/cpasterplugin.cpp | 58 +++++++++++++------ src/plugins/cpaster/cpasterplugin.h | 8 ++- src/plugins/cpaster/pastebindotcaprotocol.cpp | 39 ++++++------- src/plugins/cpaster/pastebindotcaprotocol.h | 14 ++--- .../cpaster/pastebindotcomprotocol.cpp | 36 +++++------- src/plugins/cpaster/pastebindotcomprotocol.h | 11 +--- src/plugins/cpaster/protocol.cpp | 47 +++++++++++++++ src/plugins/cpaster/protocol.h | 54 ++++++++++++++++- 10 files changed, 195 insertions(+), 95 deletions(-) diff --git a/src/plugins/cpaster/codepasterprotocol.cpp b/src/plugins/cpaster/codepasterprotocol.cpp index 2e444dcf529..39b21af8e64 100644 --- a/src/plugins/cpaster/codepasterprotocol.cpp +++ b/src/plugins/cpaster/codepasterprotocol.cpp @@ -48,7 +48,8 @@ enum { debug = 0 }; namespace CodePaster { -CodePasterProtocol::CodePasterProtocol() : +CodePasterProtocol::CodePasterProtocol(const NetworkAccessManagerProxyPtr &nw) : + NetworkProtocol(nw), m_page(new CodePaster::CodePasterSettingsPage), m_pasteReply(0), m_fetchReply(0), @@ -98,10 +99,7 @@ void CodePasterProtocol::fetch(const QString &id) link.append(hostName); link.append("/?format=raw&id="); link.append(id); - QUrl url(link); - QNetworkRequest r(url); - - m_fetchReply = m_manager.get(r); + m_fetchReply = httpGet(link); connect(m_fetchReply, SIGNAL(finished()), this, SLOT(fetchFinished())); m_fetchId = id; } @@ -116,9 +114,7 @@ void CodePasterProtocol::list() QString link = QLatin1String("http://"); link += hostName; link += QLatin1String("/?command=browse&format=raw"); - QUrl url(link); - QNetworkRequest r(url); - m_listReply = m_manager.get(r); + m_listReply = httpGet(link); connect(m_listReply, SIGNAL(finished()), this, SLOT(listFinished())); } @@ -142,9 +138,7 @@ void CodePasterProtocol::paste(const QString &text, data += "&poster="; data += CGI::encodeURL(username).toLatin1(); - QUrl url(QLatin1String("http://") + hostName); - QNetworkRequest r(url); - m_pasteReply = m_manager.post(r, data); + m_pasteReply = httpPost(QLatin1String("http://") + hostName, data); connect(m_pasteReply, SIGNAL(finished()), this, SLOT(pasteFinished())); } diff --git a/src/plugins/cpaster/codepasterprotocol.h b/src/plugins/cpaster/codepasterprotocol.h index f6e6df058a8..554169fd194 100644 --- a/src/plugins/cpaster/codepasterprotocol.h +++ b/src/plugins/cpaster/codepasterprotocol.h @@ -32,8 +32,6 @@ #include "protocol.h" -#include - QT_BEGIN_NAMESPACE class QNetworkReply; QT_END_NAMESPACE @@ -42,11 +40,11 @@ namespace CodePaster { class CodePasterSettingsPage; -class CodePasterProtocol : public Protocol +class CodePasterProtocol : public NetworkProtocol { Q_OBJECT public: - CodePasterProtocol(); + explicit CodePasterProtocol(const NetworkAccessManagerProxyPtr &nw); ~CodePasterProtocol(); QString name() const; @@ -70,7 +68,6 @@ public slots: private: bool isValidHostName(const QString& hostName); CodePasterSettingsPage *m_page; - QNetworkAccessManager m_manager; QNetworkReply *m_pasteReply; QNetworkReply *m_fetchReply; QNetworkReply *m_listReply; diff --git a/src/plugins/cpaster/cpasterplugin.cpp b/src/plugins/cpaster/cpasterplugin.cpp index ea2dccc5173..2dba25ce13e 100644 --- a/src/plugins/cpaster/cpasterplugin.cpp +++ b/src/plugins/cpaster/cpasterplugin.cpp @@ -65,7 +65,9 @@ using namespace CodePaster; using namespace Core; using namespace TextEditor; -CodepasterPlugin::CodepasterPlugin() : m_settings(new Settings) +CodepasterPlugin::CodepasterPlugin() : + m_settings(new Settings), + m_postEditorAction(0), m_postClipboardAction(0), m_fetchAction(0) { } @@ -89,9 +91,10 @@ bool CodepasterPlugin::initialize(const QStringList &arguments, QString *error_m addAutoReleasedObject(settingsPage); // Create the protocols and append them to the Settings - Protocol *protos[] = { new CodePasterProtocol(), - new PasteBinDotComProtocol(), - new PasteBinDotCaProtocol(), + const QSharedPointer networkAccessMgrProxy(new NetworkAccessManagerProxy); + Protocol *protos[] = { new CodePasterProtocol(networkAccessMgrProxy), + new PasteBinDotComProtocol(networkAccessMgrProxy), + new PasteBinDotCaProtocol(networkAccessMgrProxy), 0}; for(int i=0; protos[i] != 0; ++i) { connect(protos[i], SIGNAL(pasteDone(QString)), this, SLOT(finishPost(QString))); @@ -116,10 +119,15 @@ bool CodepasterPlugin::initialize(const QStringList &arguments, QString *error_m Core::Command *command; - m_postAction = new QAction(tr("Paste Snippet..."), this); - command = actionManager->registerAction(m_postAction, "CodePaster.Post", globalcontext); + m_postEditorAction = new QAction(tr("Paste Snippet..."), this); + command = actionManager->registerAction(m_postEditorAction, "CodePaster.Post", globalcontext); command->setDefaultKeySequence(QKeySequence(tr("Alt+C,Alt+P"))); - connect(m_postAction, SIGNAL(triggered()), this, SLOT(post())); + connect(m_postEditorAction, SIGNAL(triggered()), this, SLOT(postEditor())); + cpContainer->addAction(command); + + m_postClipboardAction = new QAction(tr("Paste Clipboard..."), this); + command = actionManager->registerAction(m_postClipboardAction, "CodePaster.PostClipboard", globalcontext); + connect(m_postClipboardAction, SIGNAL(triggered()), this, SLOT(postClipboard())); cpContainer->addAction(command); m_fetchAction = new QAction(tr("Fetch Snippet..."), this); @@ -145,6 +153,28 @@ void CodepasterPlugin::shutdown() } } +void CodepasterPlugin::postEditor() +{ + const IEditor* editor = EditorManager::instance()->currentEditor(); + const BaseTextEditorEditable *textEditor = qobject_cast(editor); + if (!textEditor) + return; + + QString data = textEditor->selectedText(); + if (data.isEmpty()) + data = textEditor->contents(); + if (!data.isEmpty()) + post(data, textEditor->editor()->mimeType()); +} + +void CodepasterPlugin::postClipboard() +{ + QString subtype = QLatin1String("plain"); + const QString text = qApp->clipboard()->text(subtype, QClipboard::Clipboard); + if (!text.isEmpty()) + post(text, QString()); +} + static inline void fixSpecialCharacters(QString &data) { QChar *uc = data.data(); @@ -167,18 +197,8 @@ static inline void fixSpecialCharacters(QString &data) } } -void CodepasterPlugin::post() +void CodepasterPlugin::post(QString data, const QString &mimeType) { - const IEditor* editor = EditorManager::instance()->currentEditor(); - const BaseTextEditorEditable *textEditor = qobject_cast(editor); - if (!textEditor) - return; - - QString data = textEditor->selectedText(); - if (data.isEmpty()) - data = textEditor->contents(); - if (data.isEmpty()) - return; fixSpecialCharacters(data); FileDataList lst = splitDiffToFiles(data.toLatin1()); QString username = m_settings->username; @@ -199,7 +219,7 @@ void CodepasterPlugin::post() protocolName = view.protocol(); foreach(Protocol *protocol, m_protocols) { if (protocol->name() == protocolName) { - const Protocol::ContentType ct = Protocol::contentType(textEditor->editor()->mimeType()); + const Protocol::ContentType ct = Protocol::contentType(mimeType); protocol->paste(data, ct, username, comment, description); break; } diff --git a/src/plugins/cpaster/cpasterplugin.h b/src/plugins/cpaster/cpasterplugin.h index c07695c28aa..6278cd1473e 100644 --- a/src/plugins/cpaster/cpasterplugin.h +++ b/src/plugins/cpaster/cpasterplugin.h @@ -58,7 +58,8 @@ public: virtual void shutdown(); public slots: - void post(); + void postEditor(); + void postClipboard(); void fetch(); void finishPost(const QString &link); void finishFetch(const QString &titleDescription, @@ -66,8 +67,11 @@ public slots: bool error); private: + void post(QString data, const QString &mimeType); + const QSharedPointer m_settings; - QAction *m_postAction; + QAction *m_postEditorAction; + QAction *m_postClipboardAction; QAction *m_fetchAction; QList m_protocols; QStringList m_fetchedSnippets; diff --git a/src/plugins/cpaster/pastebindotcaprotocol.cpp b/src/plugins/cpaster/pastebindotcaprotocol.cpp index c40276cd169..7984ee64c8a 100644 --- a/src/plugins/cpaster/pastebindotcaprotocol.cpp +++ b/src/plugins/cpaster/pastebindotcaprotocol.cpp @@ -32,11 +32,13 @@ #include -using namespace Core; namespace CodePaster { -PasteBinDotCaProtocol::PasteBinDotCaProtocol() +PasteBinDotCaProtocol::PasteBinDotCaProtocol(const NetworkAccessManagerProxyPtr &nw) : + NetworkProtocol(nw), + m_fetchReply(0), + m_postId(-1) { - connect(&http, SIGNAL(requestFinished(int,bool)), + connect(&m_http, SIGNAL(requestFinished(int,bool)), this, SLOT(postRequestFinished(int,bool))); } @@ -44,12 +46,9 @@ void PasteBinDotCaProtocol::fetch(const QString &id) { QString link = QLatin1String("http://pastebin.ca/raw/"); link.append(id); - QUrl url(link); - QNetworkRequest r(url); - - reply = manager.get(r); - connect(reply, SIGNAL(finished()), this, SLOT(fetchFinished())); - fetchId = id; + m_fetchReply = httpGet(link); + connect(m_fetchReply, SIGNAL(finished()), this, SLOT(fetchFinished())); + m_fetchId = id; } void PasteBinDotCaProtocol::paste(const QString &text, @@ -69,20 +68,20 @@ void PasteBinDotCaProtocol::paste(const QString &text, QHttpRequestHeader header("POST", "/quiet-paste.php"); header.setValue("host", "pastebin.ca" ); header.setContentType("application/x-www-form-urlencoded"); - http.setHost("pastebin.ca", QHttp::ConnectionModeHttp); + m_http.setHost("pastebin.ca", QHttp::ConnectionModeHttp); header.setValue("User-Agent", "CreatorPastebin"); - postId = http.request(header, data.toAscii()); + m_postId = m_http.request(header, data.toAscii()); } void PasteBinDotCaProtocol::postRequestFinished(int id, bool error) { QString link; - if (id == postId) { + if (id == m_postId) { if (!error) { - QByteArray data = http.readAll(); + QByteArray data = m_http.readAll(); link = QString::fromLatin1("http://pastebin.ca/") + QString(data).remove("SUCCESS:"); } else - link = http.errorString(); + link = m_http.errorString(); emit pasteDone(link); } } @@ -91,15 +90,15 @@ void PasteBinDotCaProtocol::fetchFinished() { QString title; QString content; - bool error = reply->error(); + bool error = m_fetchReply->error(); if (error) { - content = reply->errorString(); + content = m_fetchReply->errorString(); } else { - title = QString::fromLatin1("Pastebin.ca: %1").arg(fetchId); - content = reply->readAll(); + title = QString::fromLatin1("Pastebin.ca: %1").arg(m_fetchId); + content = m_fetchReply->readAll(); } - reply->deleteLater(); - reply = 0; + m_fetchReply->deleteLater(); + m_fetchReply = 0; emit fetchDone(title, content, error); } } // namespace CodePaster diff --git a/src/plugins/cpaster/pastebindotcaprotocol.h b/src/plugins/cpaster/pastebindotcaprotocol.h index b1d0c07bd0c..4cc766d4b01 100644 --- a/src/plugins/cpaster/pastebindotcaprotocol.h +++ b/src/plugins/cpaster/pastebindotcaprotocol.h @@ -32,15 +32,14 @@ #include "protocol.h" -#include #include namespace CodePaster { -class PasteBinDotCaProtocol : public Protocol +class PasteBinDotCaProtocol : public NetworkProtocol { Q_OBJECT public: - PasteBinDotCaProtocol(); + explicit PasteBinDotCaProtocol(const NetworkAccessManagerProxyPtr &nw); QString name() const { return QLatin1String("Pastebin.Ca"); } bool hasSettings() const { return false; } @@ -58,12 +57,11 @@ public slots: void postRequestFinished(int id, bool error); private: - QNetworkAccessManager manager; - QNetworkReply *reply; - QString fetchId; + QNetworkReply *m_fetchReply; + QString m_fetchId; - QHttp http; - int postId; + QHttp m_http; + int m_postId; }; } // namespace CodePaster diff --git a/src/plugins/cpaster/pastebindotcomprotocol.cpp b/src/plugins/cpaster/pastebindotcomprotocol.cpp index 5e6f8498cb8..eb8d631f3f5 100644 --- a/src/plugins/cpaster/pastebindotcomprotocol.cpp +++ b/src/plugins/cpaster/pastebindotcomprotocol.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include @@ -47,7 +48,8 @@ static const char pastePhpScriptpC[] = "api_public.php"; static const char fetchPhpScriptpC[] = "raw.php"; namespace CodePaster { -PasteBinDotComProtocol::PasteBinDotComProtocol() : +PasteBinDotComProtocol::PasteBinDotComProtocol(const NetworkAccessManagerProxyPtr &nw) : + NetworkProtocol(nw), m_settings(new PasteBinDotComSettings), m_fetchReply(0), m_pasteReply(0), @@ -105,31 +107,29 @@ void PasteBinDotComProtocol::paste(const QString &text, QTC_ASSERT(!m_pasteReply, return;) // Format body - m_pasteData = format(ct); - if (!m_pasteData.isEmpty()) - m_pasteData.append('&'); - m_pasteData += "paste_name="; - m_pasteData += QUrl::toPercentEncoding(username); + QByteArray pasteData = format(ct); + if (!pasteData.isEmpty()) + pasteData.append('&'); + pasteData += "paste_name="; + pasteData += QUrl::toPercentEncoding(username); const QString subDomain = m_settings->hostPrefix(); if (!subDomain.isEmpty()) { - m_pasteData += "&paste_subdomain="; - m_pasteData += QUrl::toPercentEncoding(subDomain); + pasteData += "&paste_subdomain="; + pasteData += QUrl::toPercentEncoding(subDomain); } - m_pasteData += "&paste_code="; - m_pasteData += QUrl::toPercentEncoding(fixNewLines(text)); + pasteData += "&paste_code="; + pasteData += QUrl::toPercentEncoding(fixNewLines(text)); // fire request QString link; QTextStream(&link) << "http://" << hostName(false) << '/' << pastePhpScriptpC; - QUrl url(link); - QNetworkRequest r(url); - m_pasteReply = m_manager.post(r, m_pasteData); + m_pasteReply = httpPost(link, pasteData); connect(m_pasteReply, SIGNAL(finished()), this, SLOT(pasteFinished())); if (debug) - qDebug() << "paste: sending " << m_pasteReply << link << m_pasteData; + qDebug() << "paste: sending " << m_pasteReply << link << pasteData; } void PasteBinDotComProtocol::pasteFinished() @@ -164,10 +164,8 @@ void PasteBinDotComProtocol::fetch(const QString &id) if (debug) qDebug() << "fetch: sending " << link; - QUrl url(link); - QNetworkRequest r(url); - m_fetchReply = m_manager.get(r); + m_fetchReply = httpGet(link); connect(m_fetchReply, SIGNAL(finished()), this, SLOT(fetchFinished())); m_fetchId = id; } @@ -212,9 +210,7 @@ void PasteBinDotComProtocol::list() QTC_ASSERT(!m_listReply, return;) // fire request - QUrl url(QLatin1String("http://") + hostName(true)); - QNetworkRequest r(url); - m_listReply = m_manager.get(r); + m_listReply = httpGet(QLatin1String("http://") + hostName(true)); connect(m_listReply, SIGNAL(finished()), this, SLOT(listFinished())); if (debug) qDebug() << "list: sending " << m_listReply; diff --git a/src/plugins/cpaster/pastebindotcomprotocol.h b/src/plugins/cpaster/pastebindotcomprotocol.h index a7e2d305137..612fff7ac02 100644 --- a/src/plugins/cpaster/pastebindotcomprotocol.h +++ b/src/plugins/cpaster/pastebindotcomprotocol.h @@ -32,19 +32,14 @@ #include "protocol.h" -#include -#include - -#include - namespace CodePaster { class PasteBinDotComSettings; -class PasteBinDotComProtocol : public Protocol +class PasteBinDotComProtocol : public NetworkProtocol { Q_OBJECT public: - PasteBinDotComProtocol(); + explicit PasteBinDotComProtocol(const NetworkAccessManagerProxyPtr &nw); QString name() const { return QLatin1String("Pastebin.Com"); } @@ -69,11 +64,9 @@ private: QString hostName(bool withSubDomain) const; PasteBinDotComSettings *m_settings; - QNetworkAccessManager m_manager; QNetworkReply *m_fetchReply; QNetworkReply *m_pasteReply; QNetworkReply *m_listReply; - QByteArray m_pasteData; QString m_fetchId; int m_postId; diff --git a/src/plugins/cpaster/protocol.cpp b/src/plugins/cpaster/protocol.cpp index be649f06775..0f6e58a7e91 100644 --- a/src/plugins/cpaster/protocol.cpp +++ b/src/plugins/cpaster/protocol.cpp @@ -31,6 +31,11 @@ #include #include +#include +#include + +#include + namespace CodePaster { Protocol::Protocol() @@ -108,4 +113,46 @@ QString Protocol::textFromHtml(QString data) data.replace(QLatin1String("&"), QString(QLatin1Char('&'))); return data; } + +// ------------ NetworkAccessManagerProxy +NetworkAccessManagerProxy::NetworkAccessManagerProxy() +{ +} + +NetworkAccessManagerProxy::~NetworkAccessManagerProxy() +{ +} + +QNetworkReply *NetworkAccessManagerProxy::httpGet(const QString &link) +{ + QUrl url(link); + QNetworkRequest r(url); + return networkAccessManager()->get(r); +} + +QNetworkReply *NetworkAccessManagerProxy::httpPost(const QString &link, const QByteArray &data) +{ + QUrl url(link); + QNetworkRequest r(url); + return networkAccessManager()->post(r, data); +} + +QNetworkAccessManager *NetworkAccessManagerProxy::networkAccessManager() +{ + if (m_networkAccessManager.isNull()) + m_networkAccessManager.reset(new QNetworkAccessManager); + return m_networkAccessManager.data(); +} + +// --------- NetworkProtocol + +NetworkProtocol::NetworkProtocol(const NetworkAccessManagerProxyPtr &nw) : + m_networkAccessManager(nw) +{ +} + +NetworkProtocol::~NetworkProtocol() +{ +} + } //namespace CodePaster diff --git a/src/plugins/cpaster/protocol.h b/src/plugins/cpaster/protocol.h index 914a5748a4e..6ee95f9fdd6 100644 --- a/src/plugins/cpaster/protocol.h +++ b/src/plugins/cpaster/protocol.h @@ -31,6 +31,13 @@ #define PROTOCOL_H #include +#include +#include + +QT_BEGIN_NAMESPACE +class QNetworkAccessManager; +class QNetworkReply; +QT_END_NAMESPACE namespace Core { class IOptionsPage; @@ -50,7 +57,7 @@ public: PostCommentCapability = 0x2, PostDescriptionCapability = 0x4 }; - Protocol(); + virtual ~Protocol(); virtual QString name() const = 0; @@ -82,9 +89,54 @@ signals: void listDone(const QString &name, const QStringList &result); protected: + Protocol(); static QString textFromHtml(QString data); static QString fixNewLines(QString in); +}; +/* Proxy for NetworkAccessManager that can be shared with + * delayed initialization and conveniences + * for HTTP-requests. */ + +class NetworkAccessManagerProxy { + Q_DISABLE_COPY(NetworkAccessManagerProxy) +public: + NetworkAccessManagerProxy(); + ~NetworkAccessManagerProxy(); + + QNetworkReply *httpGet(const QString &url); + QNetworkReply *httpPost(const QString &link, const QByteArray &data); + QNetworkAccessManager *networkAccessManager(); + +private: + QScopedPointer m_networkAccessManager; +}; + +/* Network-based protocol: Provides access with delayed + * initialization to a QNetworkAccessManager and conveniences + * for HTTP-requests. */ + +class NetworkProtocol : public Protocol { + Q_OBJECT +public: + virtual ~NetworkProtocol(); + +protected: + typedef QSharedPointer NetworkAccessManagerProxyPtr; + + explicit NetworkProtocol(const NetworkAccessManagerProxyPtr &nw); + + inline QNetworkReply *httpGet(const QString &url) + { return m_networkAccessManager->httpGet(url); } + + inline QNetworkReply *httpPost(const QString &link, const QByteArray &data) + { return m_networkAccessManager->httpPost(link, data); } + + inline QNetworkAccessManager *networkAccessManager() + { return m_networkAccessManager->networkAccessManager(); } + +private: + const NetworkAccessManagerProxyPtr m_networkAccessManager; }; } //namespace CodePaster From 5398651c93b5054ca1895a4c2c7fbc70bbcf6913 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 30 Mar 2010 13:23:11 +0200 Subject: [PATCH 15/19] Make targetsettingspanel more robust Kudos to dt for spotting this --- .../projectexplorer/targetsettingspanel.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/plugins/projectexplorer/targetsettingspanel.cpp b/src/plugins/projectexplorer/targetsettingspanel.cpp index be6d51122c3..88e84c670ae 100644 --- a/src/plugins/projectexplorer/targetsettingspanel.cpp +++ b/src/plugins/projectexplorer/targetsettingspanel.cpp @@ -136,6 +136,16 @@ void TargetSettingsPanelWidget::currentTargetChanged(int targetIndex, int subInd if (subIndex < -1 || subIndex >= 2) return; + if (targetIndex == -1 || subIndex == -1) { // no more targets! + delete m_panelWidgets[0]; + m_panelWidgets[0] = 0; + delete m_panelWidgets[1]; + m_panelWidgets[1] = 0; + + m_centralWidget->setCurrentWidget(m_noTargetLabel); + return; + } + Target *target = m_targets.at(targetIndex); // Target was not actually changed: @@ -147,13 +157,8 @@ void TargetSettingsPanelWidget::currentTargetChanged(int targetIndex, int subInd return; } - m_currentTarget = target; - // Target has changed: - if (targetIndex == -1) { // no more targets! - m_centralWidget->setCurrentWidget(m_noTargetLabel); - return; - } + m_currentTarget = target; PanelsWidget *buildPanel = new PanelsWidget(m_centralWidget); PanelsWidget *runPanel = new PanelsWidget(m_centralWidget); From b74e80dc9095bf43294c4758783a602bab2e9548 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 30 Mar 2010 13:23:51 +0200 Subject: [PATCH 16/19] Make sure our active target is not changed accidentally * Adding a project to the project mode used to reset the active target. Make sure to restore the original one. --- src/plugins/projectexplorer/targetsettingspanel.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/plugins/projectexplorer/targetsettingspanel.cpp b/src/plugins/projectexplorer/targetsettingspanel.cpp index 88e84c670ae..c21ccf072c6 100644 --- a/src/plugins/projectexplorer/targetsettingspanel.cpp +++ b/src/plugins/projectexplorer/targetsettingspanel.cpp @@ -114,6 +114,9 @@ void TargetSettingsPanelWidget::setupUi() connect(m_selector, SIGNAL(currentChanged(int,int)), this, SLOT(currentTargetChanged(int,int))); + // Save active target now as it will change when targets are added: + Target *activeTarget = m_project->activeTarget(); + foreach (Target *t, m_project->targets()) targetAdded(t); @@ -122,11 +125,10 @@ void TargetSettingsPanelWidget::setupUi() connect(m_selector, SIGNAL(removeButtonClicked()), this, SLOT(removeTarget())); - if (m_project->activeTarget()) { - m_selector->setCurrentIndex(m_targets.indexOf(m_project->activeTarget())); - } - updateTargetAddAndRemoveButtons(); + + // Restore target originally set: + m_project->setActiveTarget(activeTarget); } void TargetSettingsPanelWidget::currentTargetChanged(int targetIndex, int subIndex) From ed74fdd5cebf13b308051e8ca40db2310f1990de Mon Sep 17 00:00:00 2001 From: mae Date: Tue, 30 Mar 2010 12:27:29 +0200 Subject: [PATCH 17/19] Have your debug button back --- src/plugins/coreplugin/fancyactionbar.cpp | 52 ----------------------- src/plugins/coreplugin/fancyactionbar.h | 10 ----- 2 files changed, 62 deletions(-) diff --git a/src/plugins/coreplugin/fancyactionbar.cpp b/src/plugins/coreplugin/fancyactionbar.cpp index b15a67b01d9..3e54c85cc2d 100644 --- a/src/plugins/coreplugin/fancyactionbar.cpp +++ b/src/plugins/coreplugin/fancyactionbar.cpp @@ -264,31 +264,8 @@ FancyActionBar::FancyActionBar(QWidget *parent) spacerLayout->setSpacing(0); setLayout(spacerLayout); setContentsMargins(0,2,0,0); - - m_runButton = m_debugButton = 0; - m_inDebugMode = false; - - connect(Core::ModeManager::instance(), SIGNAL(currentModeChanged(Core::IMode*)), - this, SLOT(modeChanged(Core::IMode*))); - -#ifdef Q_WS_MAC - qApp->installEventFilter(this); -#endif - } -#ifdef Q_WS_MAC -bool FancyActionBar::eventFilter(QObject *, QEvent *e) -{ - if (e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease) { - if (static_cast(e)->key() == Qt::Key_Alt) - updateRunDebug(); - } else if (e->type() == QEvent::WindowDeactivate) - updateRunDebug(); - return false; -} -#endif - void FancyActionBar::addProjectSelector(QAction *action) { FancyToolButton* toolButton = new FancyToolButton(this); @@ -300,40 +277,11 @@ void FancyActionBar::addProjectSelector(QAction *action) void FancyActionBar::insertAction(int index, QAction *action) { FancyToolButton *toolButton = new FancyToolButton(this); - if (action->objectName() == QLatin1String("ProjectExplorer.Run")) - m_runButton = toolButton; - if (action->objectName() == QLatin1String("ProjectExplorer.Debug")) - m_debugButton = toolButton; - toolButton->setDefaultAction(action); connect(action, SIGNAL(changed()), toolButton, SLOT(actionChanged())); m_actionsLayout->insertWidget(index, toolButton); } -void FancyActionBar::modeChanged(Core::IMode *mode) -{ - m_inDebugMode = (mode->id() == QLatin1String("Debugger.Mode.Debug")); - updateRunDebug(); -} - -void FancyActionBar::updateRunDebug() -{ - if (!m_runButton || !m_debugButton) - return; - - bool doDebug = m_inDebugMode; -#ifdef Q_WS_MAC - if (QApplication::keyboardModifiers() && Qt::AltModifier) - doDebug = !doDebug; -#endif - - layout()->setEnabled(false); - m_runButton->forceVisible(!doDebug); - m_debugButton->forceVisible(doDebug); - layout()->setEnabled(true); - -} - QLayout *FancyActionBar::actionsLayout() const { return m_actionsLayout; diff --git a/src/plugins/coreplugin/fancyactionbar.h b/src/plugins/coreplugin/fancyactionbar.h index eb1d5271099..1ec1eff4449 100644 --- a/src/plugins/coreplugin/fancyactionbar.h +++ b/src/plugins/coreplugin/fancyactionbar.h @@ -75,23 +75,13 @@ class FancyActionBar : public QWidget public: FancyActionBar(QWidget *parent = 0); -#ifdef Q_WS_MAC - bool eventFilter(QObject *, QEvent *); -#endif void paintEvent(QPaintEvent *event); void insertAction(int index, QAction *action); void addProjectSelector(QAction *action); QLayout *actionsLayout() const; -private slots: - void modeChanged(Core::IMode *mode); - private: - void updateRunDebug(); - bool m_inDebugMode; QVBoxLayout *m_actionsLayout; - FancyToolButton *m_runButton; - FancyToolButton *m_debugButton; }; } // namespace Internal From c3d7928ac88485e46ae92421c677fb33f3829ae6 Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Tue, 30 Mar 2010 12:34:17 +0200 Subject: [PATCH 18/19] Clone the TemplateArguments before caching the result. --- src/shared/cplusplus/Parser.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index f323241a187..11bef468c91 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -854,12 +854,19 @@ bool Parser::parseTemplateArgumentList(TemplateArgumentListAST *&node) } } + if (_pool != _translationUnit->memoryPool()) { + MemoryPool *pool = _translationUnit->memoryPool(); + TemplateArgumentListAST *template_argument_list = node; + for (TemplateArgumentListAST *iter = template_argument_list, **ast_iter = &node; + iter; iter = iter->next, ast_iter = &(*ast_iter)->next) + *ast_iter = new (pool) TemplateArgumentListAST((iter->value) ? iter->value->clone(pool) : 0); + } + _templateArgumentList.insert(std::make_pair(start, TemplateArgumentListEntry(start, cursor(), node))); return true; } _templateArgumentList.insert(std::make_pair(start, TemplateArgumentListEntry(start, cursor(), 0))); - return false; } From ce8b7f976a292e3fa504299f391e5167787b6f94 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 30 Mar 2010 13:48:33 +0200 Subject: [PATCH 19/19] Fix warning on windows --- src/plugins/coreplugin/dialogs/settingsdialog.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/coreplugin/dialogs/settingsdialog.cpp b/src/plugins/coreplugin/dialogs/settingsdialog.cpp index 7d0f8c4656f..51f12ac1e72 100644 --- a/src/plugins/coreplugin/dialogs/settingsdialog.cpp +++ b/src/plugins/coreplugin/dialogs/settingsdialog.cpp @@ -64,7 +64,8 @@ namespace Internal { // ----------- Category model -struct Category { +class Category { +public: QString id; QString displayName; QIcon icon;