diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index 2bdaa6445f6..9a9dd71ec3c 100644 --- a/src/plugins/cpptools/cppcodecompletion.cpp +++ b/src/plugins/cpptools/cppcodecompletion.cpp @@ -508,6 +508,9 @@ static int startOfOperator(TextEditor::ITextEditable *editor, return start; } +bool CppCodeCompletion::isValid(TextEditor::ITextEditable *editor) +{ return m_manager->isCppEditor(editor); } + bool CppCodeCompletion::triggersCompletion(TextEditor::ITextEditable *editor) { if (! m_manager->isCppEditor(editor)) // ### remove me diff --git a/src/plugins/cpptools/cppcodecompletion.h b/src/plugins/cpptools/cppcodecompletion.h index c37e09ea03e..174e5d994f4 100644 --- a/src/plugins/cpptools/cppcodecompletion.h +++ b/src/plugins/cpptools/cppcodecompletion.h @@ -58,6 +58,7 @@ class CppCodeCompletion : public TextEditor::ICompletionCollector public: explicit CppCodeCompletion(CppModelManager *manager); + bool isValid(TextEditor::ITextEditable *editor); bool triggersCompletion(TextEditor::ITextEditable *editor); int startCompletion(TextEditor::ITextEditable *editor); void completions(QList *completions); diff --git a/src/plugins/texteditor/completionsupport.cpp b/src/plugins/texteditor/completionsupport.cpp index 2e456193ad5..ef4834c8088 100644 --- a/src/plugins/texteditor/completionsupport.cpp +++ b/src/plugins/texteditor/completionsupport.cpp @@ -58,10 +58,11 @@ CompletionSupport::CompletionSupport() m_completionList(0), m_startPosition(0), m_checkCompletionTrigger(false), - m_editor(0) + m_editor(0), + m_completionCollector(0) { - m_completionCollector = ExtensionSystem::PluginManager::instance() - ->getObject(); + m_completionCollectors = ExtensionSystem::PluginManager::instance() + ->getObjects(); } void CompletionSupport::performCompletion(const CompletionItem &item) @@ -90,6 +91,15 @@ void CompletionSupport::cleanupCompletions() void CompletionSupport::autoComplete(ITextEditable *editor, bool forced) { + m_completionCollector = 0; + + foreach (ICompletionCollector *collector, m_completionCollectors) { + if (collector->isValid(editor)) { + m_completionCollector = collector; + break; + } + } + if (!m_completionCollector) return; diff --git a/src/plugins/texteditor/completionsupport.h b/src/plugins/texteditor/completionsupport.h index 7cbd5ece5b4..ebe9cbd70f3 100644 --- a/src/plugins/texteditor/completionsupport.h +++ b/src/plugins/texteditor/completionsupport.h @@ -69,6 +69,7 @@ private: int m_startPosition; bool m_checkCompletionTrigger; // Whether to check for completion trigger after cleanup ITextEditable *m_editor; + QList m_completionCollectors; ICompletionCollector *m_completionCollector; }; diff --git a/src/plugins/texteditor/icompletioncollector.h b/src/plugins/texteditor/icompletioncollector.h index 49d70f18288..a151e4cf41f 100644 --- a/src/plugins/texteditor/icompletioncollector.h +++ b/src/plugins/texteditor/icompletioncollector.h @@ -77,6 +77,11 @@ public: ICompletionCollector(QObject *parent = 0) : QObject(parent) {} virtual ~ICompletionCollector() {} + /* + * Returns true if this completion collector can be used with the given editor. + */ + virtual bool isValid(ITextEditable *editor) = 0; + /* This method should return whether the cursor is at a position which could * trigger an autocomplete. It will be called each time a character is typed in * the text editor.