From f96246209dcfd10427a688fa7914b0d8224280c7 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Tue, 17 Sep 2013 13:25:39 +0200 Subject: [PATCH] TextEditor: Move isAsynchronous() up to IAssistProvider ...from CompletionAssistProvider, so other providers can be executed asynchronously, too. Change-Id: I6ec06f6d76bc2937bc272450b4e8dffd81ee868e Reviewed-by: Joerg Bornemann --- .../cppeditor/cppquickfixassistant.cpp | 5 +++ src/plugins/cppeditor/cppquickfixassistant.h | 1 + .../qmljseditor/qmljsquickfixassist.cpp | 5 +++ src/plugins/qmljseditor/qmljsquickfixassist.h | 1 + .../texteditor/circularclipboardassist.cpp | 5 +++ .../texteditor/circularclipboardassist.h | 1 + .../texteditor/codeassist/codeassistant.cpp | 38 +++++++++---------- .../texteditor/codeassist/iassistprovider.cpp | 6 +++ .../texteditor/codeassist/iassistprovider.h | 1 + 9 files changed, 44 insertions(+), 19 deletions(-) diff --git a/src/plugins/cppeditor/cppquickfixassistant.cpp b/src/plugins/cppeditor/cppquickfixassistant.cpp index 2c6d7e32178..4ca8d0e0a67 100644 --- a/src/plugins/cppeditor/cppquickfixassistant.cpp +++ b/src/plugins/cppeditor/cppquickfixassistant.cpp @@ -46,6 +46,11 @@ using namespace CPlusPlus; // ------------------------- // CppQuickFixAssistProvider // ------------------------- +bool CppQuickFixAssistProvider::isAsynchronous() const +{ + return false; +} + bool CppQuickFixAssistProvider::supportsEditor(const Core::Id &editorId) const { return editorId == CppEditor::Constants::CPPEDITOR_ID; diff --git a/src/plugins/cppeditor/cppquickfixassistant.h b/src/plugins/cppeditor/cppquickfixassistant.h index fbdea6d1de1..cfc921d00de 100644 --- a/src/plugins/cppeditor/cppquickfixassistant.h +++ b/src/plugins/cppeditor/cppquickfixassistant.h @@ -86,6 +86,7 @@ private: class CppQuickFixAssistProvider : public TextEditor::QuickFixAssistProvider { public: + virtual bool isAsynchronous() const; virtual bool supportsEditor(const Core::Id &editorId) const; virtual TextEditor::IAssistProcessor *createProcessor() const; diff --git a/src/plugins/qmljseditor/qmljsquickfixassist.cpp b/src/plugins/qmljseditor/qmljsquickfixassist.cpp index fef38fadd4a..29a1a861856 100644 --- a/src/plugins/qmljseditor/qmljsquickfixassist.cpp +++ b/src/plugins/qmljseditor/qmljsquickfixassist.cpp @@ -96,6 +96,11 @@ QmlJSQuickFixAssistProvider::QmlJSQuickFixAssistProvider() QmlJSQuickFixAssistProvider::~QmlJSQuickFixAssistProvider() {} +bool QmlJSQuickFixAssistProvider::isAsynchronous() const +{ + return false; +} + bool QmlJSQuickFixAssistProvider::supportsEditor(const Core::Id &editorId) const { return editorId == Constants::C_QMLJSEDITOR_ID; diff --git a/src/plugins/qmljseditor/qmljsquickfixassist.h b/src/plugins/qmljseditor/qmljsquickfixassist.h index 98a6fc8a85e..af2e51d1977 100644 --- a/src/plugins/qmljseditor/qmljsquickfixassist.h +++ b/src/plugins/qmljseditor/qmljsquickfixassist.h @@ -77,6 +77,7 @@ public: QmlJSQuickFixAssistProvider(); virtual ~QmlJSQuickFixAssistProvider(); + virtual bool isAsynchronous() const; virtual bool supportsEditor(const Core::Id &editorId) const; virtual TextEditor::IAssistProcessor *createProcessor() const; diff --git a/src/plugins/texteditor/circularclipboardassist.cpp b/src/plugins/texteditor/circularclipboardassist.cpp index e742ae01a88..046f1b836d9 100644 --- a/src/plugins/texteditor/circularclipboardassist.cpp +++ b/src/plugins/texteditor/circularclipboardassist.cpp @@ -112,6 +112,11 @@ public: } // namespace Internal } // namespace TextEditor +bool ClipboardAssistProvider::isAsynchronous() const +{ + return false; +} + bool ClipboardAssistProvider::supportsEditor(const Core::Id &/*editorId*/) const { return true; diff --git a/src/plugins/texteditor/circularclipboardassist.h b/src/plugins/texteditor/circularclipboardassist.h index ff495ff63cc..307f9f4ce73 100644 --- a/src/plugins/texteditor/circularclipboardassist.h +++ b/src/plugins/texteditor/circularclipboardassist.h @@ -38,6 +38,7 @@ namespace Internal { class ClipboardAssistProvider: public IAssistProvider { public: + bool isAsynchronous() const; virtual bool supportsEditor(const Core::Id &editorId) const; virtual IAssistProcessor *createProcessor() const; }; diff --git a/src/plugins/texteditor/codeassist/codeassistant.cpp b/src/plugins/texteditor/codeassist/codeassistant.cpp index 753c8e79453..36762e4e586 100644 --- a/src/plugins/texteditor/codeassist/codeassistant.cpp +++ b/src/plugins/texteditor/codeassist/codeassistant.cpp @@ -123,7 +123,7 @@ private: CompletionAssistProvider *m_completionProvider; QList m_quickFixProviders; Internal::ProcessorRunner *m_requestRunner; - CompletionAssistProvider *m_requestProvider; + IAssistProvider *m_requestProvider; AssistKind m_assistKind; IAssistProposalWidget *m_proposalWidget; QScopedPointer m_proposal; @@ -258,22 +258,18 @@ void CodeAssistantPrivate::requestProposal(AssistReason reason, if (!assistInterface) return; - if (kind == Completion) { - CompletionAssistProvider *completionProvider = - static_cast(provider); - if (completionProvider->isAsynchronous()) { - m_requestProvider = completionProvider; - m_requestRunner = new ProcessorRunner; - connect(m_requestRunner, SIGNAL(finished()), this, SLOT(proposalComputed())); - connect(m_requestRunner, SIGNAL(finished()), this, SLOT(finalizeRequest())); - connect(m_requestRunner, SIGNAL(finished()), this, SIGNAL(finished())); - assistInterface->prepareForAsyncUse(); - m_requestRunner->setReason(reason); - m_requestRunner->setProcessor(processor); - m_requestRunner->setAssistInterface(assistInterface); - m_requestRunner->start(); - return; - } + if (provider->isAsynchronous()) { + m_requestProvider = provider; + m_requestRunner = new ProcessorRunner; + connect(m_requestRunner, SIGNAL(finished()), this, SLOT(proposalComputed())); + connect(m_requestRunner, SIGNAL(finished()), this, SLOT(finalizeRequest())); + connect(m_requestRunner, SIGNAL(finished()), this, SIGNAL(finished())); + assistInterface->prepareForAsyncUse(); + m_requestRunner->setReason(reason); + m_requestRunner->setProcessor(processor); + m_requestRunner->setAssistInterface(assistInterface); + m_requestRunner->start(); + return; } if (IAssistProposal *newProposal = processor->perform(assistInterface)) @@ -502,12 +498,16 @@ bool CodeAssistantPrivate::eventFilter(QObject *o, QEvent *e) } else if (type == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast(e); const QString &keyText = keyEvent->text(); + + CompletionAssistProvider *completionProvider = 0; if ((keyText.isEmpty() && keyEvent->key() != Qt::LeftArrow && keyEvent->key() != Qt::RightArrow && keyEvent->key() != Qt::Key_Shift) - || (!keyText.isEmpty() && - !m_requestProvider->isContinuationChar(keyText.at(0)))) { + || (!keyText.isEmpty() + && (((completionProvider = dynamic_cast(m_requestProvider)) + ? !completionProvider->isContinuationChar(keyText.at(0)) + : false)))) { destroyContext(); } else if (!keyText.isEmpty() && !m_receivedContentWhileWaiting) { m_receivedContentWhileWaiting = true; diff --git a/src/plugins/texteditor/codeassist/iassistprovider.cpp b/src/plugins/texteditor/codeassist/iassistprovider.cpp index 2dac112c7f8..935cda9bf6f 100644 --- a/src/plugins/texteditor/codeassist/iassistprovider.cpp +++ b/src/plugins/texteditor/codeassist/iassistprovider.cpp @@ -49,6 +49,12 @@ using namespace TextEditor; \sa IAssistProposal, IAssistProcessor */ +/*! + \fn bool TextEditor::IAssistProvider::isAsynchronous() const; + + Returns whether this provider runs asynchronously. +*/ + /*! \fn bool TextEditor::IAssistProvider::supportsEditor(const Core::Id &editorId) const diff --git a/src/plugins/texteditor/codeassist/iassistprovider.h b/src/plugins/texteditor/codeassist/iassistprovider.h index 761b64a46ae..11a074273d2 100644 --- a/src/plugins/texteditor/codeassist/iassistprovider.h +++ b/src/plugins/texteditor/codeassist/iassistprovider.h @@ -46,6 +46,7 @@ class TEXTEDITOR_EXPORT IAssistProvider : public QObject public: IAssistProvider() {} + virtual bool isAsynchronous() const = 0; virtual bool supportsEditor(const Core::Id &editorId) const = 0; virtual IAssistProcessor *createProcessor() const = 0; };