diff --git a/src/plugins/texteditor/codeassist/codeassistant.cpp b/src/plugins/texteditor/codeassist/codeassistant.cpp index 30597a37fe9281f8830966b740e6cab1a351668b..c07aed724889215b7df77919df6420b2a26b35ed 100644 --- a/src/plugins/texteditor/codeassist/codeassistant.cpp +++ b/src/plugins/texteditor/codeassist/codeassistant.cpp @@ -40,6 +40,7 @@ #include <texteditor/basetexteditor.h> #include <texteditor/texteditorsettings.h> #include <texteditor/completionsettings.h> +#include <coreplugin/editormanager/editormanager.h> #include <extensionsystem/pluginmanager.h> #include <utils/qtcassert.h> @@ -113,6 +114,8 @@ private slots: void finalizeProposal(); void automaticProposalTimeout(); void updateCompletionSettings(const TextEditor::CompletionSettings &settings); + void explicitlyAborted(); + void clearAbortedPosition(); private: CodeAssistant *m_q; @@ -127,6 +130,7 @@ private: bool m_receivedContentWhileWaiting; QTimer m_automaticProposalTimer; CompletionSettings m_settings; + int m_abortedBasePosition; static const QChar m_null; }; @@ -148,6 +152,7 @@ CodeAssistantPrivate::CodeAssistantPrivate(CodeAssistant *assistant) , m_proposalWidget(0) , m_receivedContentWhileWaiting(false) , m_settings(TextEditorSettings::instance()->completionSettings()) + , m_abortedBasePosition(-1) { m_automaticProposalTimer.setSingleShot(true); m_automaticProposalTimer.setInterval(AutomaticProposalTimerInterval); @@ -157,6 +162,8 @@ CodeAssistantPrivate::CodeAssistantPrivate(CodeAssistant *assistant) SIGNAL(completionSettingsChanged(TextEditor::CompletionSettings)), this, SLOT(updateCompletionSettings(TextEditor::CompletionSettings))); + connect(Core::EditorManager::instance(), SIGNAL(currentEditorChanged(Core::IEditor*)), + this, SLOT(clearAbortedPosition())); } CodeAssistantPrivate::~CodeAssistantPrivate() @@ -307,33 +314,41 @@ void CodeAssistantPrivate::displayProposal(IAssistProposal *newProposal, AssistR destroyContext(); } - if (m_textEditor->position() < proposalCandidate->basePosition()) + int basePosition = proposalCandidate->basePosition(); + if (m_textEditor->position() < basePosition) return; + if (m_abortedBasePosition == basePosition && reason != ExplicitlyInvoked) + return; + + clearAbortedPosition(); m_proposal.reset(proposalCandidate.take()); if (m_proposal->isCorrective()) m_proposal->makeCorrection(m_textEditor); + basePosition = m_proposal->basePosition(); m_proposalWidget = m_proposal->createWidget(); connect(m_proposalWidget, SIGNAL(destroyed()), this, SLOT(finalizeProposal())); connect(m_proposalWidget, SIGNAL(prefixExpanded(QString)), this, SLOT(handlePrefixExpansion(QString))); connect(m_proposalWidget, SIGNAL(proposalItemActivated(IAssistProposalItem*)), this, SLOT(processProposalItem(IAssistProposalItem*))); + connect(m_proposalWidget, SIGNAL(explicitlyAborted()), + this, SLOT(explicitlyAborted())); m_proposalWidget->setAssistant(m_q); m_proposalWidget->setReason(reason); m_proposalWidget->setKind(m_assistKind); m_proposalWidget->setUnderlyingWidget(m_textEditor->widget()); m_proposalWidget->setModel(m_proposal->model()); - m_proposalWidget->setDisplayRect(m_textEditor->cursorRect(m_proposal->basePosition())); + m_proposalWidget->setDisplayRect(m_textEditor->cursorRect(basePosition)); if (m_receivedContentWhileWaiting) m_proposalWidget->setIsSynchronized(false); else m_proposalWidget->setIsSynchronized(true); m_proposalWidget->showProposal(m_textEditor->textDocument()->textAt( - m_proposal->basePosition(), - m_textEditor->position() - m_proposal->basePosition())); + basePosition, + m_textEditor->position() - basePosition)); } void CodeAssistantPrivate::processProposalItem(IAssistProposalItem *proposalItem) @@ -465,6 +480,17 @@ void CodeAssistantPrivate::updateCompletionSettings(const TextEditor::Completion m_settings = settings; } +void CodeAssistantPrivate::explicitlyAborted() +{ + QTC_ASSERT(m_proposal, return); + m_abortedBasePosition = m_proposal->basePosition(); +} + +void CodeAssistantPrivate::clearAbortedPosition() +{ + m_abortedBasePosition = -1; +} + bool CodeAssistantPrivate::eventFilter(QObject *o, QEvent *e) { Q_UNUSED(o); diff --git a/src/plugins/texteditor/codeassist/functionhintproposalwidget.cpp b/src/plugins/texteditor/codeassist/functionhintproposalwidget.cpp index 5cd0a136af0b44455fb84ea1524c20a3e99802f4..e0023976c0e184baa49518876b416ac6d6d35816 100644 --- a/src/plugins/texteditor/codeassist/functionhintproposalwidget.cpp +++ b/src/plugins/texteditor/codeassist/functionhintproposalwidget.cpp @@ -215,6 +215,7 @@ bool FunctionHintProposalWidget::eventFilter(QObject *obj, QEvent *e) case QEvent::KeyRelease: if (static_cast<QKeyEvent*>(e)->key() == Qt::Key_Escape && d->m_escapePressed) { abort(); + emit explicitlyAborted(); return false; } d->m_assistant->notifyChange(); diff --git a/src/plugins/texteditor/codeassist/genericproposalwidget.cpp b/src/plugins/texteditor/codeassist/genericproposalwidget.cpp index cd8f631f20068c8ff5302103f56a9f654d624a2f..057837e73908c745a4ed4de43b16bfc7cdf8af2d 100644 --- a/src/plugins/texteditor/codeassist/genericproposalwidget.cpp +++ b/src/plugins/texteditor/codeassist/genericproposalwidget.cpp @@ -571,6 +571,7 @@ bool GenericProposalWidget::eventFilter(QObject *o, QEvent *e) switch (ke->key()) { case Qt::Key_Escape: abort(); + emit explicitlyAborted(); e->accept(); return true; diff --git a/src/plugins/texteditor/codeassist/iassistproposalwidget.h b/src/plugins/texteditor/codeassist/iassistproposalwidget.h index ed25929e6a92f5376acdd0e4cf44790c9e77b35a..e97ac8062afebf2b2d326dbc7d5fb16099019738 100644 --- a/src/plugins/texteditor/codeassist/iassistproposalwidget.h +++ b/src/plugins/texteditor/codeassist/iassistproposalwidget.h @@ -65,6 +65,7 @@ public: signals: void prefixExpanded(const QString &newPrefix); void proposalItemActivated(IAssistProposalItem *proposalItem); + void explicitlyAborted(); }; } // TextEditor