diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp index 3db56ab32cec83c28d7120453a8467cf545baea3..ac826bda32bcf0a33190a4c65dae08189a80dd42 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 bc00864224c91761812f5ef5aff871fb20d2e1fe..16bf04f94ecf8b0e991017697ea14f4677f0ea23 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 85d02021251984a1eacf6120e4e53b1ba8b06e71..d115bcf162bdc98e8d1d731016b4c8bb6f967d43 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 b93408df19013ba46d46739dc83822471604b08c..6b3a05b187a840d4b52e9a3cd1f1ef6b56231a90 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 7e8ea29b678be49db6e351775dbb81191a9d9fbd..305aaa804666a03a2d2d9210203878647b823ec5 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 f5b43c0a9babe7d29fdfd4c9d92d3264627113a2..410f8dbb15f616a7087f837c3b4500dc0681317c 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 a9f1b8c90001d433cfcd6035c914df68ce9a89c9..41377fae511ccea138e25aa89332b62fb4424223 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;