From df99d5447f2c4d678ab793783e78aac2daeeccb9 Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Mon, 8 Jun 2009 14:32:42 +0200 Subject: [PATCH] Initial work on "Quick Fix". --- src/plugins/texteditor/basetexteditor.cpp | 5 +++++ src/plugins/texteditor/basetexteditor.h | 4 ++++ src/plugins/texteditor/completionsupport.cpp | 20 ++++++++++++++++++- src/plugins/texteditor/completionsupport.h | 2 ++ src/plugins/texteditor/completionwidget.cpp | 8 +++++++- src/plugins/texteditor/completionwidget.h | 2 ++ src/plugins/texteditor/icompletioncollector.h | 13 ++++++++++++ src/plugins/texteditor/itexteditor.h | 1 + src/plugins/texteditor/texteditorconstants.h | 1 + src/plugins/texteditor/texteditorplugin.cpp | 15 ++++++++++++++ src/plugins/texteditor/texteditorplugin.h | 1 + 11 files changed, 70 insertions(+), 2 deletions(-) diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp index 60d6269bfff..5f8873d728d 100644 --- a/src/plugins/texteditor/basetexteditor.cpp +++ b/src/plugins/texteditor/basetexteditor.cpp @@ -561,6 +561,11 @@ void BaseTextEditor::triggerCompletions() emit requestAutoCompletion(editableInterface(), true); } +void BaseTextEditor::triggerQuickFix() +{ + emit requestQuickFix(editableInterface()); +} + bool BaseTextEditor::createNew(const QString &contents) { setPlainText(contents); diff --git a/src/plugins/texteditor/basetexteditor.h b/src/plugins/texteditor/basetexteditor.h index dd1c0eaa695..8d454140568 100644 --- a/src/plugins/texteditor/basetexteditor.h +++ b/src/plugins/texteditor/basetexteditor.h @@ -310,6 +310,7 @@ public: ITextMarkable *markableInterface() const; virtual void triggerCompletions(); + virtual void triggerQuickFix(); QChar characterAt(int pos) const; @@ -512,6 +513,7 @@ protected slots: signals: void requestBlockUpdate(const QTextBlock &); void requestAutoCompletion(ITextEditable *editor, bool forced); + void requestQuickFix(ITextEditable *editor); private: void indentOrUnindent(bool doIndent); @@ -586,6 +588,8 @@ public: inline QChar characterAt(int pos) const { return e->characterAt(pos); } inline void triggerCompletions() { e->triggerCompletions(); } // slot? + inline void triggerQuickFix() { e->triggerQuickFix(); } // slot? + inline ITextMarkable *markableInterface() { return e->markableInterface(); } void setContextHelpId(const QString &id) { m_contextHelpId = id; } diff --git a/src/plugins/texteditor/completionsupport.cpp b/src/plugins/texteditor/completionsupport.cpp index 0cc1918e645..3750f6b88a8 100644 --- a/src/plugins/texteditor/completionsupport.cpp +++ b/src/plugins/texteditor/completionsupport.cpp @@ -90,11 +90,28 @@ void CompletionSupport::cleanupCompletions() } void CompletionSupport::autoComplete(ITextEditable *editor, bool forced) +{ + autoComplete_helper(editor, forced, /*quickFix = */ false); +} + +void CompletionSupport::quickFix(ITextEditable *editor) +{ + qDebug() << Q_FUNC_INFO; + autoComplete_helper(editor, + /*forced = */ true, + /*quickFix = */ true); +} + +void CompletionSupport::autoComplete_helper(ITextEditable *editor, bool forced, + bool quickFix) { m_completionCollector = 0; foreach (ICompletionCollector *collector, m_completionCollectors) { - if (collector->supportsEditor(editor)) { + if (quickFix) + collector = qobject_cast(collector); + + if (collector && collector->supportsEditor(editor)) { m_completionCollector = collector; break; } @@ -121,6 +138,7 @@ void CompletionSupport::autoComplete(ITextEditable *editor, bool forced) } m_completionList = new CompletionWidget(this, editor); + m_completionList->setQuickFix(quickFix); connect(m_completionList, SIGNAL(itemSelected(TextEditor::CompletionItem)), this, SLOT(performCompletion(TextEditor::CompletionItem))); diff --git a/src/plugins/texteditor/completionsupport.h b/src/plugins/texteditor/completionsupport.h index ebe9cbd70f3..5c09dee5e32 100644 --- a/src/plugins/texteditor/completionsupport.h +++ b/src/plugins/texteditor/completionsupport.h @@ -57,6 +57,7 @@ public: static CompletionSupport *instance(); public slots: void autoComplete(ITextEditable *editor, bool forced); + void quickFix(ITextEditable *editor); private slots: void performCompletion(const TextEditor::CompletionItem &item); @@ -64,6 +65,7 @@ private slots: private: QList getCompletions() const; + void autoComplete_helper(ITextEditable *editor, bool forced, bool quickFix); CompletionWidget *m_completionList; int m_startPosition; diff --git a/src/plugins/texteditor/completionwidget.cpp b/src/plugins/texteditor/completionwidget.cpp index a7d0c231297..149ed9d10f1 100644 --- a/src/plugins/texteditor/completionwidget.cpp +++ b/src/plugins/texteditor/completionwidget.cpp @@ -100,6 +100,7 @@ QVariant AutoCompletionModel::data(const QModelIndex &index, int role) const CompletionWidget::CompletionWidget(CompletionSupport *support, ITextEditable *editor) : QListView(), m_blockFocusOut(false), + m_quickFix(false), m_editor(editor), m_editorWidget(editor->widget()), m_model(0), @@ -165,7 +166,7 @@ bool CompletionWidget::event(QEvent *e) break; } - if (forwardKeys) { + if (forwardKeys && ! m_quickFix) { m_blockFocusOut = true; QApplication::sendEvent(m_editorWidget, e); m_blockFocusOut = false; @@ -201,6 +202,11 @@ void CompletionWidget::closeList(const QModelIndex &index) m_blockFocusOut = false; } +void CompletionWidget::setQuickFix(bool quickFix) +{ + m_quickFix = quickFix; +} + void CompletionWidget::setCompletionItems(const QList &completionItems) { if (!m_model) { diff --git a/src/plugins/texteditor/completionwidget.h b/src/plugins/texteditor/completionwidget.h index d149eda5dc3..ecd7ab41b57 100644 --- a/src/plugins/texteditor/completionwidget.h +++ b/src/plugins/texteditor/completionwidget.h @@ -54,6 +54,7 @@ class CompletionWidget : public QListView public: CompletionWidget(CompletionSupport *support, ITextEditable *editor); + void setQuickFix(bool quickFix); void setCompletionItems(const QList &completionitems); void showCompletions(int startPos); void keyboardSearch(const QString &search); @@ -74,6 +75,7 @@ private: QPointer m_popupFrame; bool m_blockFocusOut; + bool m_quickFix; ITextEditable *m_editor; QWidget *m_editorWidget; AutoCompletionModel *m_model; diff --git a/src/plugins/texteditor/icompletioncollector.h b/src/plugins/texteditor/icompletioncollector.h index f9e58721105..eb4836f40cb 100644 --- a/src/plugins/texteditor/icompletioncollector.h +++ b/src/plugins/texteditor/icompletioncollector.h @@ -113,6 +113,19 @@ public: virtual void cleanup() = 0; }; +class TEXTEDITOR_EXPORT IQuickFixCollector : public ICompletionCollector +{ + Q_OBJECT + +public: + IQuickFixCollector(QObject *parent = 0) : ICompletionCollector(parent) {} + virtual ~IQuickFixCollector() {} + + virtual bool partiallyComplete(const QList &) + { return false; } +}; + + } // namespace TextEditor #endif // COMPLETIONCOLLECTORINTERFACE_H diff --git a/src/plugins/texteditor/itexteditor.h b/src/plugins/texteditor/itexteditor.h index eec90a176ec..a77b9e08918 100644 --- a/src/plugins/texteditor/itexteditor.h +++ b/src/plugins/texteditor/itexteditor.h @@ -109,6 +109,7 @@ public: virtual QChar characterAt(int pos) const = 0; virtual void triggerCompletions() = 0; + virtual void triggerQuickFix() = 0; virtual ITextMarkable *markableInterface() = 0; diff --git a/src/plugins/texteditor/texteditorconstants.h b/src/plugins/texteditor/texteditorconstants.h index 2545fc66a34..e2cd64b2164 100644 --- a/src/plugins/texteditor/texteditorconstants.h +++ b/src/plugins/texteditor/texteditorconstants.h @@ -35,6 +35,7 @@ namespace Constants { const char * const C_TEXTEDITOR = "Text Editor"; const char * const COMPLETE_THIS = "TextEditor.CompleteThis"; +const char * const QUICKFIX_THIS = "TextEditor.QuickFix"; const char * const VISUALIZE_WHITESPACE = "TextEditor.VisualizeWhitespace"; const char * const CLEAN_WHITESPACE = "TextEditor.CleanWhitespace"; const char * const TEXT_WRAPPING = "TextEditor.TextWrapping"; diff --git a/src/plugins/texteditor/texteditorplugin.cpp b/src/plugins/texteditor/texteditorplugin.cpp index b6bf55025bf..50ab05417cd 100644 --- a/src/plugins/texteditor/texteditorplugin.cpp +++ b/src/plugins/texteditor/texteditorplugin.cpp @@ -131,6 +131,13 @@ bool TextEditorPlugin::initialize(const QStringList &arguments, QString *errorMe #endif connect(completionShortcut, SIGNAL(activated()), this, SLOT(invokeCompletion())); + // Add shortcut for invoking automatic completion + QShortcut *quickFixShortcut = new QShortcut(core->mainWindow()); + quickFixShortcut->setWhatsThis(tr("Triggers a quick fix in this scope")); + // Make sure the shortcut still works when the quick fix widget is active + quickFixShortcut->setContext(Qt::ApplicationShortcut); + Core::Command *quickFixCommand = am->registerShortcut(quickFixShortcut, Constants::QUICKFIX_THIS, context); + connect(quickFixShortcut, SIGNAL(activated()), this, SLOT(invokeQuickFix())); return true; } @@ -168,6 +175,14 @@ void TextEditorPlugin::invokeCompletion() editor->triggerCompletions(); } +void TextEditorPlugin::invokeQuickFix() +{ + Core::IEditor *iface = Core::EditorManager::instance()->currentEditor(); + ITextEditor *editor = qobject_cast(iface); + if (editor) + editor->triggerQuickFix(); +} + void TextEditorPlugin::updateSearchResultsFont(const FontSettings &settings) { if (m_searchResultWindow) diff --git a/src/plugins/texteditor/texteditorplugin.h b/src/plugins/texteditor/texteditorplugin.h index 17f601dd24c..833ac855eef 100644 --- a/src/plugins/texteditor/texteditorplugin.h +++ b/src/plugins/texteditor/texteditorplugin.h @@ -69,6 +69,7 @@ public: private slots: void invokeCompletion(); + void invokeQuickFix(); void updateSearchResultsFont(const TextEditor::FontSettings &); private: