From c44d65d3c6e6361d300a05dabcc0687032ac7201 Mon Sep 17 00:00:00 2001 From: Daniel Teske <daniel.teske@nokia.com> Date: Wed, 15 Feb 2012 13:06:16 +0100 Subject: [PATCH] Move DocumentMarker to BaseTextDocumentLayout Centralizing the markhandling in BaseTextDocumentLayout Change-Id: I16633db8aba72e81f724aaccc2596f5fff81761d Reviewed-by: Eike Ziller <eike.ziller@nokia.com> --- src/plugins/texteditor/basetextdocument.cpp | 115 +-------------- .../texteditor/basetextdocumentlayout.cpp | 133 +++++++++++++++++- .../texteditor/basetextdocumentlayout.h | 5 +- 3 files changed, 136 insertions(+), 117 deletions(-) diff --git a/src/plugins/texteditor/basetextdocument.cpp b/src/plugins/texteditor/basetextdocument.cpp index 61644a1b94f..c9641d3f2c7 100644 --- a/src/plugins/texteditor/basetextdocument.cpp +++ b/src/plugins/texteditor/basetextdocument.cpp @@ -60,112 +60,6 @@ #include <utils/reloadpromptutils.h> namespace TextEditor { -namespace Internal { - -class DocumentMarker : public ITextMarkable -{ - Q_OBJECT -public: - DocumentMarker(QTextDocument *); - - TextMarks marks() const { return m_marksCache; } - - // ITextMarkable - bool addMark(ITextMark *mark, int line); - TextMarks marksAt(int line) const; - void removeMark(ITextMark *mark); - void updateMark(ITextMark *mark); - -private: - double recalculateMaxMarkWidthFactor() const; - - TextMarks m_marksCache; // not owned - QTextDocument *document; -}; - -DocumentMarker::DocumentMarker(QTextDocument *doc) - : ITextMarkable(doc), document(doc) -{ -} - -bool DocumentMarker::addMark(TextEditor::ITextMark *mark, int line) -{ - QTC_ASSERT(line >= 1, return false); - int blockNumber = line - 1; - BaseTextDocumentLayout *documentLayout = - qobject_cast<BaseTextDocumentLayout*>(document->documentLayout()); - QTC_ASSERT(documentLayout, return false); - QTextBlock block = document->findBlockByNumber(blockNumber); - - if (block.isValid()) { - TextBlockUserData *userData = BaseTextDocumentLayout::userData(block); - userData->addMark(mark); - m_marksCache.append(mark); - mark->updateLineNumber(blockNumber + 1); - mark->updateBlock(block); - documentLayout->hasMarks = true; - documentLayout->maxMarkWidthFactor = qMax(mark->widthFactor(), - documentLayout->maxMarkWidthFactor); - documentLayout->requestUpdate(); - return true; - } - return false; -} - -double DocumentMarker::recalculateMaxMarkWidthFactor() const -{ - double maxWidthFactor = 1.0; - foreach (const ITextMark *mark, marks()) - maxWidthFactor = qMax(mark->widthFactor(), maxWidthFactor); - return maxWidthFactor; -} - -TextEditor::TextMarks DocumentMarker::marksAt(int line) const -{ - QTC_ASSERT(line >= 1, return TextMarks()); - int blockNumber = line - 1; - QTextBlock block = document->findBlockByNumber(blockNumber); - - if (block.isValid()) { - if (TextBlockUserData *userData = BaseTextDocumentLayout::testUserData(block)) - return userData->marks(); - } - return TextMarks(); -} - -void DocumentMarker::removeMark(TextEditor::ITextMark *mark) -{ - BaseTextDocumentLayout *documentLayout = - qobject_cast<BaseTextDocumentLayout*>(document->documentLayout()); - QTC_ASSERT(documentLayout, return) - - bool needUpdate = false; - QTextBlock block = document->begin(); - while (block.isValid()) { - if (TextBlockUserData *data = static_cast<TextBlockUserData *>(block.userData())) { - needUpdate |= data->removeMark(mark); - } - block = block.next(); - } - m_marksCache.removeAll(mark); - - if (needUpdate) { - documentLayout->maxMarkWidthFactor = recalculateMaxMarkWidthFactor(); - updateMark(0); - } -} - -void DocumentMarker::updateMark(ITextMark *mark) -{ - Q_UNUSED(mark) - BaseTextDocumentLayout *documentLayout = - qobject_cast<BaseTextDocumentLayout*>(document->documentLayout()); - QTC_ASSERT(documentLayout, return); - documentLayout->requestUpdate(); -} - -} // namespace Internal - class BaseTextDocumentPrivate { public: @@ -180,7 +74,6 @@ public: TabSettings m_tabSettings; ExtraEncodingSettings m_extraEncodingSettings; QTextDocument *m_document; - Internal::DocumentMarker *m_documentMarker; SyntaxHighlighter *m_highlighter; bool m_fileIsReadOnly; @@ -191,7 +84,6 @@ public: BaseTextDocumentPrivate::BaseTextDocumentPrivate(BaseTextDocument *q) : m_document(new QTextDocument(q)), - m_documentMarker(new Internal::DocumentMarker(m_document)), m_highlighter(0), m_fileIsReadOnly(false), m_hasHighlightWarning(false), @@ -303,7 +195,10 @@ SyntaxHighlighter *BaseTextDocument::syntaxHighlighter() const ITextMarkable *BaseTextDocument::documentMarker() const { - return d->m_documentMarker; + BaseTextDocumentLayout *documentLayout = + qobject_cast<BaseTextDocumentLayout *>(d->m_document->documentLayout()); + QTC_ASSERT(documentLayout, return 0) + return documentLayout->markableInterface(); } bool BaseTextDocument::save(QString *errorString, const QString &fileName, bool autoSave) @@ -597,5 +492,3 @@ void BaseTextDocument::setHighlightWarning(bool has) } } // namespace TextEditor - -#include "basetextdocument.moc" diff --git a/src/plugins/texteditor/basetextdocumentlayout.cpp b/src/plugins/texteditor/basetextdocumentlayout.cpp index 2327b49029e..46bede5c716 100644 --- a/src/plugins/texteditor/basetextdocumentlayout.cpp +++ b/src/plugins/texteditor/basetextdocumentlayout.cpp @@ -31,9 +31,122 @@ **************************************************************************/ #include "basetextdocumentlayout.h" +#include <utils/qtcassert.h> using namespace TextEditor; +namespace Internal { + +class DocumentMarker : public ITextMarkable +{ + Q_OBJECT +public: + DocumentMarker(QTextDocument *); + ~DocumentMarker(); + + TextMarks marks() const { return m_marksCache; } + + // ITextMarkable + bool addMark(ITextMark *mark, int line); + TextMarks marksAt(int line) const; + void removeMark(ITextMark *mark); + void updateMark(ITextMark *mark); + +private: + double recalculateMaxMarkWidthFactor() const; + + TextMarks m_marksCache; // not owned + QTextDocument *document; +}; + +DocumentMarker::DocumentMarker(QTextDocument *doc) + : ITextMarkable(doc), document(doc) +{ +} + +DocumentMarker::~DocumentMarker() +{ + +} + +bool DocumentMarker::addMark(TextEditor::ITextMark *mark, int line) +{ + QTC_ASSERT(line >= 1, return false); + int blockNumber = line - 1; + BaseTextDocumentLayout *documentLayout = + qobject_cast<BaseTextDocumentLayout*>(document->documentLayout()); + QTC_ASSERT(documentLayout, return false); + QTextBlock block = document->findBlockByNumber(blockNumber); + + if (block.isValid()) { + TextBlockUserData *userData = BaseTextDocumentLayout::userData(block); + userData->addMark(mark); + m_marksCache.append(mark); + mark->updateLineNumber(blockNumber + 1); + mark->updateBlock(block); + documentLayout->hasMarks = true; + documentLayout->maxMarkWidthFactor = qMax(mark->widthFactor(), + documentLayout->maxMarkWidthFactor); + documentLayout->requestUpdate(); + return true; + } + return false; +} + +double DocumentMarker::recalculateMaxMarkWidthFactor() const +{ + double maxWidthFactor = 1.0; + foreach (const ITextMark *mark, marks()) + maxWidthFactor = qMax(mark->widthFactor(), maxWidthFactor); + return maxWidthFactor; +} + +TextEditor::TextMarks DocumentMarker::marksAt(int line) const +{ + QTC_ASSERT(line >= 1, return TextMarks()); + int blockNumber = line - 1; + QTextBlock block = document->findBlockByNumber(blockNumber); + + if (block.isValid()) { + if (TextBlockUserData *userData = BaseTextDocumentLayout::testUserData(block)) + return userData->marks(); + } + return TextMarks(); +} + +void DocumentMarker::removeMark(TextEditor::ITextMark *mark) +{ + BaseTextDocumentLayout *documentLayout = + qobject_cast<BaseTextDocumentLayout*>(document->documentLayout()); + QTC_ASSERT(documentLayout, return) + + bool needUpdate = false; + QTextBlock block = document->begin(); + while (block.isValid()) { + if (TextBlockUserData *data = static_cast<TextBlockUserData *>(block.userData())) { + needUpdate |= data->removeMark(mark); + } + block = block.next(); + } + m_marksCache.removeAll(mark); + + if (needUpdate) { + documentLayout->maxMarkWidthFactor = recalculateMaxMarkWidthFactor(); + updateMark(0); + } +} + +void DocumentMarker::updateMark(ITextMark *mark) +{ + Q_UNUSED(mark) + BaseTextDocumentLayout *documentLayout = + qobject_cast<BaseTextDocumentLayout*>(document->documentLayout()); + QTC_ASSERT(documentLayout, return); + documentLayout->requestUpdate(); +} + +} // namespace Internal + CodeFormatterData::~CodeFormatterData() { } @@ -391,11 +504,14 @@ void TextBlockUserData::addMark(ITextMark *mark) BaseTextDocumentLayout::BaseTextDocumentLayout(QTextDocument *doc) - :QPlainTextDocumentLayout(doc) { - lastSaveRevision = 0; - hasMarks = 0; - maxMarkWidthFactor = 1.0; - m_requiredWidth = 0; + : QPlainTextDocumentLayout(doc), + lastSaveRevision(0), + hasMarks(false), + maxMarkWidthFactor(1.0), + m_requiredWidth(0), + m_documentMarker(new Internal::DocumentMarker(doc)) +{ + } BaseTextDocumentLayout::~BaseTextDocumentLayout() @@ -537,6 +653,11 @@ void BaseTextDocumentLayout::setFolded(const QTextBlock &block, bool folded) } } +ITextMarkable *BaseTextDocumentLayout::markableInterface() +{ + return m_documentMarker; +} + void BaseTextDocumentLayout::doFoldOrUnfold(const QTextBlock& block, bool unfold) { if (!canFold(block)) @@ -664,3 +785,5 @@ void BaseTextDocumentLayout::FoldValidator::finalize() m_layout->emitDocumentSizeChanged(); } } + +#include "basetextdocumentlayout.moc" diff --git a/src/plugins/texteditor/basetextdocumentlayout.h b/src/plugins/texteditor/basetextdocumentlayout.h index 88b32dda113..80d614190b4 100644 --- a/src/plugins/texteditor/basetextdocumentlayout.h +++ b/src/plugins/texteditor/basetextdocumentlayout.h @@ -41,7 +41,6 @@ #include <QPlainTextDocumentLayout> namespace TextEditor { - struct Parenthesis; typedef QVector<Parenthesis> Parentheses; @@ -202,11 +201,15 @@ public: void emitDocumentSizeChanged() { emit documentSizeChanged(documentSize()); } + ITextMarkable *markableInterface(); + int lastSaveRevision; bool hasMarks; double maxMarkWidthFactor; int m_requiredWidth; + ITextMarkable *m_documentMarker; + void setRequiredWidth(int width); QSizeF documentSize() const; -- GitLab