summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libs/cplusplus/CppDocument.cpp3
-rw-r--r--src/plugins/cpptools/cppmodelmanager.cpp43
-rw-r--r--src/plugins/cpptools/cppmodelmanager.h17
-rw-r--r--src/plugins/cpptools/cpptoolseditorsupport.cpp24
-rw-r--r--src/plugins/cpptools/cpptoolseditorsupport.h3
5 files changed, 83 insertions, 7 deletions
diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp
index 06655b0960..8c2d626590 100644
--- a/src/libs/cplusplus/CppDocument.cpp
+++ b/src/libs/cplusplus/CppDocument.cpp
@@ -240,6 +240,9 @@ void Document::startSkippingBlocks(unsigned start)
void Document::stopSkippingBlocks(unsigned stop)
{
+ if (_skippedBlocks.isEmpty())
+ return;
+
unsigned start = _skippedBlocks.back().begin();
if (start > stop)
_skippedBlocks.removeLast(); // Ignore this block, it's invalid.
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index c7e1d3fc5d..c28c216138 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -69,6 +69,7 @@
#include <QtCore/QDebug>
#include <QtCore/QMutexLocker>
#include <QtCore/QTime>
+#include <QtCore/QTimer>
using namespace CppTools;
using namespace CppTools::Internal;
@@ -454,6 +455,12 @@ CppModelManager::CppModelManager(QObject *parent)
ProjectExplorer::SessionManager *session = m_projectExplorer->session();
QTC_ASSERT(session, return);
+ m_updateEditorSelectionsTimer = new QTimer(this);
+ m_updateEditorSelectionsTimer->setInterval(500);
+ m_updateEditorSelectionsTimer->setSingleShot(true);
+ connect(m_updateEditorSelectionsTimer, SIGNAL(timeout()),
+ this, SLOT(updateEditorSelections()));
+
connect(session, SIGNAL(projectAdded(ProjectExplorer::Project*)),
this, SLOT(onProjectAdded(ProjectExplorer::Project*)));
@@ -717,8 +724,8 @@ void CppModelManager::onDocumentUpdated(Document::Ptr doc)
continue;
else if (lines.contains(m.line()))
continue;
- else if (lines.size() == MAX_SELECTION_COUNT)
- break; // we're done.
+ //else if (lines.size() == MAX_SELECTION_COUNT)
+ //break; // we're done.
lines.insert(m.line());
@@ -740,12 +747,42 @@ void CppModelManager::onDocumentUpdated(Document::Ptr doc)
sel.cursor = c;
selections.append(sel);
}
- ed->setExtraSelections(TextEditor::BaseTextEditor::CodeWarningsSelection, selections);
+
+ QList<Editor> todo;
+ foreach (Editor e, todo) {
+ if (e.widget != ed)
+ todo.append(e);
+ }
+
+ Editor e;
+ e.widget = ed;
+ e.selections = selections;
+ todo.append(e);
+ m_todo = todo;
+ postEditorUpdate();
break;
}
}
}
+void CppModelManager::postEditorUpdate()
+{
+ m_updateEditorSelectionsTimer->start(500);
+}
+
+void CppModelManager::updateEditorSelections()
+{
+ foreach (Editor ed, m_todo) {
+ if (! ed.widget)
+ continue;
+
+ ed.widget->setExtraSelections(TextEditor::BaseTextEditor::CodeWarningsSelection,
+ ed.selections);
+ }
+
+ m_todo.clear();
+}
+
void CppModelManager::onProjectAdded(ProjectExplorer::Project *)
{
QMutexLocker locker(&mutex);
diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h
index 361c714fee..4713c29d61 100644
--- a/src/plugins/cpptools/cppmodelmanager.h
+++ b/src/plugins/cpptools/cppmodelmanager.h
@@ -41,6 +41,8 @@
#include <QMap>
#include <QFutureInterface>
#include <QMutex>
+#include <QTimer>
+#include <QTextEdit>
namespace Core {
class ICore;
@@ -49,6 +51,7 @@ class IEditor;
namespace TextEditor {
class ITextEditor;
+class BaseTextEditor;
}
namespace ProjectExplorer {
@@ -86,6 +89,9 @@ public:
void emitDocumentUpdated(CPlusPlus::Document::Ptr doc);
+ void stopEditorSelectionsUpdate()
+ { m_updateEditorSelectionsTimer->stop(); }
+
Q_SIGNALS:
void projectPathChanged(const QString &projectPath);
@@ -102,6 +108,8 @@ private Q_SLOTS:
void onAboutToRemoveProject(ProjectExplorer::Project *project);
void onSessionUnloaded();
void onProjectAdded(ProjectExplorer::Project *project);
+ void postEditorUpdate();
+ void updateEditorSelections();
private:
QMap<QString, QByteArray> buildWorkingCopyList();
@@ -163,6 +171,15 @@ private:
enum {
MAX_SELECTION_COUNT = 5
};
+
+ struct Editor {
+ QPointer<TextEditor::BaseTextEditor> widget;
+ QList<QTextEdit::ExtraSelection> selections;
+ };
+
+ QList<Editor> m_todo;
+
+ QTimer *m_updateEditorSelectionsTimer;
};
} // namespace Internal
diff --git a/src/plugins/cpptools/cpptoolseditorsupport.cpp b/src/plugins/cpptools/cpptoolseditorsupport.cpp
index 5a907a2d17..ab6fe3532c 100644
--- a/src/plugins/cpptools/cpptoolseditorsupport.cpp
+++ b/src/plugins/cpptools/cpptoolseditorsupport.cpp
@@ -35,6 +35,7 @@
#include "cppmodelmanager.h"
#include <texteditor/itexteditor.h>
+#include <texteditor/basetexteditor.h>
#include <QTimer>
@@ -68,12 +69,14 @@ void CppEditorSupport::setTextEditor(TextEditor::ITextEditor *textEditor)
updateDocument();
}
-QString CppEditorSupport::contents() const
+QString CppEditorSupport::contents()
{
if (! _textEditor)
return QString();
+ else if (! _cachedContents.isEmpty())
+ _cachedContents = _textEditor->contents();
- return _textEditor->contents();
+ return _cachedContents;
}
int CppEditorSupport::updateDocumentInterval() const
@@ -83,7 +86,20 @@ void CppEditorSupport::setUpdateDocumentInterval(int updateDocumentInterval)
{ _updateDocumentInterval = updateDocumentInterval; }
void CppEditorSupport::updateDocument()
-{ _updateDocumentTimer->start(_updateDocumentInterval); }
+{
+ if (TextEditor::BaseTextEditor *edit = qobject_cast<TextEditor::BaseTextEditor*>(_textEditor->widget())) {
+ const QList<QTextEdit::ExtraSelection> selections =
+ edit->extraSelections(TextEditor::BaseTextEditor::CodeWarningsSelection);
+
+ if (! selections.isEmpty())
+ edit->setExtraSelections(TextEditor::BaseTextEditor::CodeWarningsSelection,
+ QList<QTextEdit::ExtraSelection>());
+
+ _modelManager->stopEditorSelectionsUpdate();
+ }
+
+ _updateDocumentTimer->start(_updateDocumentInterval);
+}
void CppEditorSupport::updateDocumentNow()
{
@@ -91,7 +107,9 @@ void CppEditorSupport::updateDocumentNow()
_updateDocumentTimer->start(_updateDocumentInterval);
} else {
_updateDocumentTimer->stop();
+
QStringList sourceFiles(_textEditor->file()->fileName());
+ _cachedContents = _textEditor->contents();
_documentParser = _modelManager->refreshSourceFiles(sourceFiles);
}
}
diff --git a/src/plugins/cpptools/cpptoolseditorsupport.h b/src/plugins/cpptools/cpptoolseditorsupport.h
index 2bce101e52..6e136c2d85 100644
--- a/src/plugins/cpptools/cpptoolseditorsupport.h
+++ b/src/plugins/cpptools/cpptoolseditorsupport.h
@@ -65,7 +65,7 @@ public:
int updateDocumentInterval() const;
void setUpdateDocumentInterval(int updateDocumentInterval);
- QString contents() const;
+ QString contents();
private Q_SLOTS:
void updateDocument();
@@ -79,6 +79,7 @@ private:
QTimer *_updateDocumentTimer;
int _updateDocumentInterval;
QFuture<void> _documentParser;
+ QString _cachedContents;
};
} // namespace Internal