From bab8c94f1397862fe2fd64fd2efcedcdf65d529a Mon Sep 17 00:00:00 2001 From: Roberto Raggi <roberto.raggi@nokia.com> Date: Mon, 23 Nov 2009 16:55:04 +0100 Subject: [PATCH] Show the quickfixes in the context menu. --- src/plugins/cppeditor/cppeditor.cpp | 32 ++++++++++++++++++++++ src/plugins/cppeditor/cppeditor.h | 4 +++ src/plugins/cppeditor/cppeditorconstants.h | 1 + src/plugins/cppeditor/cppplugin.cpp | 8 +++++- src/plugins/cppeditor/cppplugin.h | 5 ++++ src/plugins/cppeditor/cppquickfix.cpp | 9 ++++-- src/plugins/cppeditor/cppquickfix.h | 5 ++++ 7 files changed, 61 insertions(+), 3 deletions(-) diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp index 3db56ab32ce..ac826bda32b 100644 --- a/src/plugins/cppeditor/cppeditor.cpp +++ b/src/plugins/cppeditor/cppeditor.cpp @@ -31,6 +31,7 @@ #include "cppeditorconstants.h" #include "cppplugin.h" #include "cpphighlighter.h" +#include "cppquickfix.h" #include <cpptools/cpptoolsplugin.h> #include <AST.h> @@ -81,6 +82,7 @@ #include <QtCore/QTimer> #include <QtCore/QStack> #include <QtCore/QSettings> +#include <QtCore/QSignalMapper> #include <QtGui/QAction> #include <QtGui/QApplication> #include <QtGui/QHeaderView> @@ -1675,6 +1677,13 @@ bool CPPEditor::event(QEvent *e) return BaseTextEditor::event(e); } +void CPPEditor::performQuickFix(int index) +{ + CPPQuickFixCollector *quickFixCollector = CppPlugin::instance()->quickFixCollector(); + QuickFixOperationPtr op = m_quickFixes.at(index); + quickFixCollector->perform(op); +} + void CPPEditor::contextMenuEvent(QContextMenuEvent *e) { // ### enable @@ -1686,12 +1695,35 @@ void CPPEditor::contextMenuEvent(QContextMenuEvent *e) Core::ActionContainer *mcontext = am->actionContainer(CppEditor::Constants::M_CONTEXT); QMenu *contextMenu = mcontext->menu(); + CPPQuickFixCollector *quickFixCollector = CppPlugin::instance()->quickFixCollector(); + + QSignalMapper mapper; + connect(&mapper, SIGNAL(mapped(int)), this, SLOT(performQuickFix(int))); + + if (! isOutdated()) { + if (quickFixCollector->startCompletion(editableInterface()) != -1) { + m_quickFixes = quickFixCollector->quickFixes(); + + for (int index = 0; index < m_quickFixes.size(); ++index) { + QuickFixOperationPtr op = m_quickFixes.at(index); + QAction *action = menu->addAction(op->description()); + mapper.setMapping(action, index); + connect(action, SIGNAL(triggered()), &mapper, SLOT(map())); + } + + if (! m_quickFixes.isEmpty()) + menu->addSeparator(); + } + } + foreach (QAction *action, contextMenu->actions()) menu->addAction(action); appendStandardContextMenuActions(menu); menu->exec(e->globalPos()); + quickFixCollector->cleanup(); + m_quickFixes.clear(); delete menu; } diff --git a/src/plugins/cppeditor/cppeditor.h b/src/plugins/cppeditor/cppeditor.h index bc00864224c..16bf04f94ec 100644 --- a/src/plugins/cppeditor/cppeditor.h +++ b/src/plugins/cppeditor/cppeditor.h @@ -31,6 +31,7 @@ #define CPPEDITOR_H #include "cppeditorenums.h" +#include "cppquickfix.h" #include <cplusplus/CppDocument.h> #include <texteditor/basetexteditor.h> @@ -235,6 +236,8 @@ private Q_SLOTS: void semanticRehighlight(); void updateSemanticInfo(const SemanticInfo &semanticInfo); + void performQuickFix(int index); + private: bool showWarningMessage() const; void setShowWarningMessage(bool showWarningMessage); @@ -292,6 +295,7 @@ private: SemanticHighlighter *m_semanticHighlighter; SemanticInfo m_lastSemanticInfo; + QList<QuickFixOperationPtr> m_quickFixes; bool m_initialized; }; diff --git a/src/plugins/cppeditor/cppeditorconstants.h b/src/plugins/cppeditor/cppeditorconstants.h index 85d02021251..d115bcf162b 100644 --- a/src/plugins/cppeditor/cppeditorconstants.h +++ b/src/plugins/cppeditor/cppeditorconstants.h @@ -40,6 +40,7 @@ const char * const CPPEDITOR_KIND = QT_TRANSLATE_NOOP("OpenWith::Editors", "C++ const char * const SWITCH_DECLARATION_DEFINITION = "CppEditor.SwitchDeclarationDefinition"; const char * const RENAME_SYMBOL_UNDER_CURSOR = "CppEditor.RenameSymbolUnderCursor"; const char * const FIND_USAGES = "CppEditor.FindUsages"; +const char * const REFACTOR_MENU = "CppEditor.RefactorMenu"; const char * const SEPARATOR = "CppEditor.Separator"; const char * const SEPARATOR2 = "CppEditor.Separator2"; const char * const FIND_REFERENCES = "CppEditor.FindReferences"; diff --git a/src/plugins/cppeditor/cppplugin.cpp b/src/plugins/cppeditor/cppplugin.cpp index b93408df190..6b3a05b187a 100644 --- a/src/plugins/cppeditor/cppplugin.cpp +++ b/src/plugins/cppeditor/cppplugin.cpp @@ -137,6 +137,7 @@ CppPlugin::CppPlugin() : { m_instance = this; + m_quickFixCollector = 0; m_quickFixTimer = new QTimer(this); m_quickFixTimer->setInterval(20); m_quickFixTimer->setSingleShot(true); @@ -184,6 +185,9 @@ bool CppPlugin::sortedMethodOverview() const return m_sortedMethodOverview; } +CPPQuickFixCollector *CppPlugin::quickFixCollector() const +{ return m_quickFixCollector; } + bool CppPlugin::initialize(const QStringList & /*arguments*/, QString *errorMessage) { Core::ICore *core = Core::ICore::instance(); @@ -193,7 +197,9 @@ bool CppPlugin::initialize(const QStringList & /*arguments*/, QString *errorMess addAutoReleasedObject(new CppEditorFactory(this)); addAutoReleasedObject(new CppHoverHandler); - addAutoReleasedObject(new CPPQuickFixCollector); + + m_quickFixCollector = new CPPQuickFixCollector; + addAutoReleasedObject(m_quickFixCollector); CppFileWizard::BaseFileWizardParameters wizardParameters(Core::IWizard::FileWizard); diff --git a/src/plugins/cppeditor/cppplugin.h b/src/plugins/cppeditor/cppplugin.h index 7e8ea29b678..305aaa80466 100644 --- a/src/plugins/cppeditor/cppplugin.h +++ b/src/plugins/cppeditor/cppplugin.h @@ -46,6 +46,7 @@ namespace CppEditor { namespace Internal { class CPPEditor; +class CPPQuickFixCollector; class CppPlugin : public ExtensionSystem::IPlugin { @@ -66,6 +67,8 @@ public: bool sortedMethodOverview() const; + CPPQuickFixCollector *quickFixCollector() const; + signals: void methodOverviewSortingChanged(bool sort); @@ -95,6 +98,8 @@ private: QAction *m_findUsagesAction; QAction *m_updateCodeModelAction; + CPPQuickFixCollector *m_quickFixCollector; + QTimer *m_quickFixTimer; QPointer<TextEditor::ITextEditable> m_currentTextEditable; }; diff --git a/src/plugins/cppeditor/cppquickfix.cpp b/src/plugins/cppeditor/cppquickfix.cpp index f5b43c0a9ba..410f8dbb15f 100644 --- a/src/plugins/cppeditor/cppquickfix.cpp +++ b/src/plugins/cppeditor/cppquickfix.cpp @@ -858,11 +858,16 @@ void CPPQuickFixCollector::complete(const TextEditor::CompletionItem &item) if (index < _quickFixes.size()) { QuickFixOperationPtr quickFix = _quickFixes.at(index); - quickFix->setTextCursor(_editor->textCursor()); - quickFix->apply(); + perform(quickFix); } } +void CPPQuickFixCollector::perform(QuickFixOperationPtr op) +{ + op->setTextCursor(_editor->textCursor()); + op->apply(); +} + void CPPQuickFixCollector::cleanup() { _quickFixes.clear(); diff --git a/src/plugins/cppeditor/cppquickfix.h b/src/plugins/cppeditor/cppquickfix.h index a9f1b8c9000..41377fae511 100644 --- a/src/plugins/cppeditor/cppquickfix.h +++ b/src/plugins/cppeditor/cppquickfix.h @@ -126,6 +126,8 @@ public: CPPQuickFixCollector(); virtual ~CPPQuickFixCollector(); + QList<QuickFixOperationPtr> quickFixes() const { return _quickFixes; } + virtual bool supportsEditor(TextEditor::ITextEditable *editor); virtual bool triggersCompletion(TextEditor::ITextEditable *editor); virtual int startCompletion(TextEditor::ITextEditable *editor); @@ -133,6 +135,9 @@ public: virtual void complete(const TextEditor::CompletionItem &item); virtual void cleanup(); +public Q_SLOTS: + void perform(QuickFixOperationPtr op); + private: CppTools::CppModelManagerInterface *_modelManager; CPPEditor *_editor; -- GitLab