diff options
author | hjk <hjk121@nokiamail.com> | 2014-07-19 11:27:28 +0200 |
---|---|---|
committer | hjk <hjk121@nokiamail.com> | 2014-07-23 10:38:31 +0200 |
commit | cf8a614419fe07912ca959410cebf995a5ff9b4d (patch) | |
tree | f98c0cb436d2fcaf127e12e981e1ab4b6b17bd1e /src/plugins/texteditor | |
parent | 53bfd5285de2633f560ed5a2c5d5bd42b78a1c99 (diff) |
Merge ITextMark and BaseTextMark
Turns out we don't even need two-phase initialization,
by transparently postponing registration until we get
a non-empty file name, either at constuction, or at
file name change times.
Change-Id: I3e87e47c820066e6707e946fc474ab9c1993e61f
Reviewed-by: Eike Ziller <eike.ziller@digia.com>
Diffstat (limited to 'src/plugins/texteditor')
-rw-r--r-- | src/plugins/texteditor/basetextdocument.cpp | 12 | ||||
-rw-r--r-- | src/plugins/texteditor/basetextdocument.h | 14 | ||||
-rw-r--r-- | src/plugins/texteditor/basetextdocumentlayout.cpp | 10 | ||||
-rw-r--r-- | src/plugins/texteditor/basetextdocumentlayout.h | 7 | ||||
-rw-r--r-- | src/plugins/texteditor/basetexteditor.cpp | 6 | ||||
-rw-r--r-- | src/plugins/texteditor/basetextmark.h | 60 | ||||
-rw-r--r-- | src/plugins/texteditor/itexteditor.h | 4 | ||||
-rw-r--r-- | src/plugins/texteditor/itextmark.cpp | 143 | ||||
-rw-r--r-- | src/plugins/texteditor/texteditor.pro | 8 | ||||
-rw-r--r-- | src/plugins/texteditor/texteditor.qbs | 8 | ||||
-rw-r--r-- | src/plugins/texteditor/texteditorplugin.cpp | 6 | ||||
-rw-r--r-- | src/plugins/texteditor/texteditorplugin.h | 6 | ||||
-rw-r--r-- | src/plugins/texteditor/textmark.cpp (renamed from src/plugins/texteditor/basetextmark.cpp) | 205 | ||||
-rw-r--r-- | src/plugins/texteditor/textmark.h (renamed from src/plugins/texteditor/itextmark.h) | 29 | ||||
-rw-r--r-- | src/plugins/texteditor/textmarkregistry.h (renamed from src/plugins/texteditor/basetextmarkregistry.h) | 12 |
15 files changed, 217 insertions, 313 deletions
diff --git a/src/plugins/texteditor/basetextdocument.cpp b/src/plugins/texteditor/basetextdocument.cpp index c7b5da4605..7a21699628 100644 --- a/src/plugins/texteditor/basetextdocument.cpp +++ b/src/plugins/texteditor/basetextdocument.cpp @@ -683,7 +683,7 @@ TextMarks BaseTextDocument::marks() const return d->m_marksCache; } -bool BaseTextDocument::addMark(ITextMark *mark) +bool BaseTextDocument::addMark(TextMark *mark) { if (mark->baseTextDocument()) return false; @@ -730,7 +730,7 @@ TextMarks BaseTextDocument::marksAt(int line) const return TextMarks(); } -void BaseTextDocument::removeMarkFromMarksCache(ITextMark *mark) +void BaseTextDocument::removeMarkFromMarksCache(TextMark *mark) { auto documentLayout = qobject_cast<BaseTextDocumentLayout*>(d->m_document->documentLayout()); QTC_ASSERT(documentLayout, return); @@ -753,7 +753,7 @@ void BaseTextDocument::removeMarkFromMarksCache(ITextMark *mark) documentLayout->requestExtraAreaUpdate(); } else { double maxWidthFactor = 1.0; - foreach (const ITextMark *mark, marks()) { + foreach (const TextMark *mark, marks()) { if (!mark->isVisible()) continue; maxWidthFactor = qMax(mark->widthFactor(), maxWidthFactor); @@ -770,7 +770,7 @@ void BaseTextDocument::removeMarkFromMarksCache(ITextMark *mark) } } -void BaseTextDocument::removeMark(ITextMark *mark) +void BaseTextDocument::removeMark(TextMark *mark) { QTextBlock block = d->m_document->findBlockByNumber(mark->lineNumber() - 1); if (TextBlockUserData *data = static_cast<TextBlockUserData *>(block.userData())) { @@ -782,7 +782,7 @@ void BaseTextDocument::removeMark(ITextMark *mark) mark->setBaseTextDocument(0); } -void BaseTextDocument::updateMark(ITextMark *mark) +void BaseTextDocument::updateMark(TextMark *mark) { Q_UNUSED(mark) auto documentLayout = qobject_cast<BaseTextDocumentLayout*>(d->m_document->documentLayout()); @@ -790,7 +790,7 @@ void BaseTextDocument::updateMark(ITextMark *mark) documentLayout->requestUpdate(); } -void BaseTextDocument::moveMark(ITextMark *mark, int previousLine) +void BaseTextDocument::moveMark(TextMark *mark, int previousLine) { QTextBlock block = d->m_document->findBlockByNumber(previousLine - 1); if (TextBlockUserData *data = BaseTextDocumentLayout::testUserData(block)) { diff --git a/src/plugins/texteditor/basetextdocument.h b/src/plugins/texteditor/basetextdocument.h index 0154bb21c1..c371d145ad 100644 --- a/src/plugins/texteditor/basetextdocument.h +++ b/src/plugins/texteditor/basetextdocument.h @@ -33,6 +33,7 @@ #include "texteditor_global.h" #include "itexteditor.h" +#include "itexteditor.h" #include <QList> @@ -50,9 +51,10 @@ class Indenter; class StorageSettings; class SyntaxHighlighter; class TabSettings; +class TextMark; class TypingSettings; -typedef QList<ITextMark *> TextMarks; +typedef QList<TextMark *> TextMarks; class TEXTEDITOR_EXPORT BaseTextDocument : public ITextEditorDocument { @@ -85,12 +87,12 @@ public: QTextCursor unindent(const QTextCursor &cursor); TextMarks marks() const; - bool addMark(ITextMark *mark); + bool addMark(TextMark *mark); TextMarks marksAt(int line) const; - void removeMark(ITextMark *mark); - void updateMark(ITextMark *mark); - void moveMark(ITextMark *mark, int previousLine); - void removeMarkFromMarksCache(TextEditor::ITextMark *mark); + void removeMark(TextMark *mark); + void updateMark(TextMark *mark); + void moveMark(TextMark *mark, int previousLine); + void removeMarkFromMarksCache(TextEditor::TextMark *mark); // IDocument implementation. bool save(QString *errorString, const QString &fileName, bool autoSave); diff --git a/src/plugins/texteditor/basetextdocumentlayout.cpp b/src/plugins/texteditor/basetextdocumentlayout.cpp index 0ef8232dce..09d6104623 100644 --- a/src/plugins/texteditor/basetextdocumentlayout.cpp +++ b/src/plugins/texteditor/basetextdocumentlayout.cpp @@ -40,7 +40,7 @@ CodeFormatterData::~CodeFormatterData() TextBlockUserData::~TextBlockUserData() { - foreach (ITextMark *mrk, m_marks) { + foreach (TextMark *mrk, m_marks) { mrk->baseTextDocument()->removeMarkFromMarksCache(mrk); mrk->setBaseTextDocument(0); mrk->removedFromEditor(); @@ -376,7 +376,7 @@ void TextBlockUserData::setCodeFormatterData(CodeFormatterData *data) m_codeFormatterData = data; } -void TextBlockUserData::addMark(ITextMark *mark) +void TextBlockUserData::addMark(TextMark *mark) { int i = 0; for ( ; i < m_marks.size(); ++i) { @@ -593,7 +593,7 @@ TextMarks BaseTextDocumentLayout::documentClosing() void BaseTextDocumentLayout::documentReloaded(TextMarks marks, BaseTextDocument *baseTextDocument) { - foreach (ITextMark *mark, marks) { + foreach (TextMark *mark, marks) { int blockNumber = mark->lineNumber() - 1; QTextBlock block = document()->findBlockByNumber(blockNumber); if (block.isValid()) { @@ -618,7 +618,7 @@ void BaseTextDocumentLayout::updateMarksLineNumber() int blockNumber = 0; while (block.isValid()) { if (const TextBlockUserData *userData = testUserData(block)) - foreach (ITextMark *mrk, userData->marks()) + foreach (TextMark *mrk, userData->marks()) mrk->updateLineNumber(blockNumber + 1); block = block.next(); ++blockNumber; @@ -628,7 +628,7 @@ void BaseTextDocumentLayout::updateMarksLineNumber() void BaseTextDocumentLayout::updateMarksBlock(const QTextBlock &block) { if (const TextBlockUserData *userData = testUserData(block)) - foreach (ITextMark *mrk, userData->marks()) + foreach (TextMark *mrk, userData->marks()) mrk->updateBlock(block); } diff --git a/src/plugins/texteditor/basetextdocumentlayout.h b/src/plugins/texteditor/basetextdocumentlayout.h index 11dcc0ede9..cf7e85066f 100644 --- a/src/plugins/texteditor/basetextdocumentlayout.h +++ b/src/plugins/texteditor/basetextdocumentlayout.h @@ -33,6 +33,7 @@ #include "texteditor_global.h" #include "basetexteditor.h" +#include "textmark.h" #include <QTextBlockUserData> #include <QPlainTextDocumentLayout> @@ -75,12 +76,12 @@ public: ~TextBlockUserData(); inline TextMarks marks() const { return m_marks; } - void addMark(ITextMark *mark); - inline bool removeMark(ITextMark *mark) { return m_marks.removeAll(mark); } + void addMark(TextMark *mark); + inline bool removeMark(TextMark *mark) { return m_marks.removeAll(mark); } inline TextMarks documentClosing() { TextMarks marks = m_marks; - foreach (ITextMark *mrk, m_marks) + foreach (TextMark *mrk, m_marks) mrk->setBaseTextDocument(0); m_marks.clear(); return marks; diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp index 7e5671bd87..e316a4584b 100644 --- a/src/plugins/texteditor/basetexteditor.cpp +++ b/src/plugins/texteditor/basetexteditor.cpp @@ -3933,7 +3933,7 @@ void BaseTextEditorWidget::extraAreaPaintEvent(QPaintEvent *e) } TextMarks::const_iterator end = marks.constEnd(); for ( ; it != end; ++it) { - ITextMark *mark = *it; + TextMark *mark = *it; if (!mark->isVisible()) continue; const int height = fmLineSpacing - 1; @@ -4605,7 +4605,7 @@ void BaseTextEditorWidget::extraAreaMouseEvent(QMouseEvent *e) if (TextBlockUserData *data = static_cast<TextBlockUserData *>(block.userData())) { TextMarks marks = data->marks(); for (int i = marks.size(); --i >= 0; ) { - ITextMark *mark = marks.at(i); + TextMark *mark = marks.at(i); if (mark->isDraggable()) { d->m_markDragStart = e->pos(); break; @@ -4653,7 +4653,7 @@ void BaseTextEditorWidget::extraAreaMouseEvent(QMouseEvent *e) if (TextBlockUserData *data = static_cast<TextBlockUserData *>(block.userData())) { TextMarks marks = data->marks(); for (int i = marks.size(); --i >= 0; ) { - ITextMark *mark = marks.at(i); + TextMark *mark = marks.at(i); if (sameLine) { if (mark->isClickable()) { mark->clicked(); diff --git a/src/plugins/texteditor/basetextmark.h b/src/plugins/texteditor/basetextmark.h deleted file mode 100644 index bca051739b..0000000000 --- a/src/plugins/texteditor/basetextmark.h +++ /dev/null @@ -1,60 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef BASETEXTMARK_H -#define BASETEXTMARK_H - -#include "texteditor_global.h" -#include "itextmark.h" - -namespace TextEditor { -namespace Internal { class BaseTextMarkRegistry; } - -class TEXTEDITOR_EXPORT BaseTextMark : public TextEditor::ITextMark -{ - friend class Internal::BaseTextMarkRegistry; - -public: - BaseTextMark(const QString &fileName, int lineNumber); - void init(); - virtual ~BaseTextMark(); - - /// called if the filename of the document changed - virtual void updateFileName(const QString &fileName); - - // access to internal data - QString fileName() const { return m_fileName; } - -private: - QString m_fileName; -}; - -} // namespace TextEditor - -#endif // BASETEXTMARK_H diff --git a/src/plugins/texteditor/itexteditor.h b/src/plugins/texteditor/itexteditor.h index 213a0c38f2..60a10a522b 100644 --- a/src/plugins/texteditor/itexteditor.h +++ b/src/plugins/texteditor/itexteditor.h @@ -32,17 +32,13 @@ #include "texteditor_global.h" -#include "itextmark.h" - #include <coreplugin/textdocument.h> #include <coreplugin/editormanager/editormanager.h> #include <coreplugin/editormanager/ieditor.h> #include <QMap> -#include <QIcon> QT_BEGIN_NAMESPACE -class QIcon; class QMenu; class QPainter; class QPoint; diff --git a/src/plugins/texteditor/itextmark.cpp b/src/plugins/texteditor/itextmark.cpp deleted file mode 100644 index 658bb23bb7..0000000000 --- a/src/plugins/texteditor/itextmark.cpp +++ /dev/null @@ -1,143 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include "itextmark.h" -#include "basetextdocument.h" - -using namespace TextEditor; - -ITextMark::~ITextMark() -{ - if (m_baseTextDocument) - m_baseTextDocument->removeMark(this); - m_baseTextDocument = 0; -} - -int ITextMark::lineNumber() const -{ - return m_lineNumber; -} - -void ITextMark::paint(QPainter *painter, const QRect &rect) const -{ - m_icon.paint(painter, rect, Qt::AlignCenter); -} - -void ITextMark::updateLineNumber(int lineNumber) -{ - m_lineNumber = lineNumber; -} - -void ITextMark::move(int line) -{ - if (line == m_lineNumber) - return; - const int previousLine = m_lineNumber; - m_lineNumber = line; - if (m_baseTextDocument) - m_baseTextDocument->moveMark(this, previousLine); -} - -void ITextMark::updateBlock(const QTextBlock &) -{} - -void ITextMark::removedFromEditor() -{} - -void ITextMark::setIcon(const QIcon &icon) -{ - m_icon = icon; -} - -void ITextMark::updateMarker() -{ - if (m_baseTextDocument) - m_baseTextDocument->updateMark(this); -} - -void ITextMark::setPriority(Priority priority) -{ - m_priority = priority; -} - -ITextMark::Priority ITextMark::priority() const -{ - return m_priority; -} - -bool ITextMark::isVisible() const -{ - return m_visible; -} - -void ITextMark::setVisible(bool visible) -{ - m_visible = visible; - if (m_baseTextDocument) - m_baseTextDocument->updateMark(this); -} - -double ITextMark::widthFactor() const -{ - return m_widthFactor; -} - -void ITextMark::setWidthFactor(double factor) -{ - m_widthFactor = factor; -} - -bool ITextMark::isClickable() const -{ - return false; -} - -void ITextMark::clicked() -{} - -bool ITextMark::isDraggable() const -{ - return false; -} - -void ITextMark::dragToLine(int lineNumber) -{ - Q_UNUSED(lineNumber); -} - -BaseTextDocument *ITextMark::baseTextDocument() const -{ - return m_baseTextDocument; -} - -void ITextMark::setBaseTextDocument(BaseTextDocument *baseTextDocument) -{ - m_baseTextDocument = baseTextDocument; -} - diff --git a/src/plugins/texteditor/texteditor.pro b/src/plugins/texteditor/texteditor.pro index 8e226aec20..3c6c9f0b80 100644 --- a/src/plugins/texteditor/texteditor.pro +++ b/src/plugins/texteditor/texteditor.pro @@ -21,7 +21,6 @@ SOURCES += texteditorplugin.cpp \ displaysettingspage.cpp \ fontsettings.cpp \ linenumberfilter.cpp \ - basetextmark.cpp \ findinfiles.cpp \ basefilefind.cpp \ texteditorsettings.cpp \ @@ -106,7 +105,7 @@ SOURCES += texteditorplugin.cpp \ codestyleeditor.cpp \ circularclipboard.cpp \ circularclipboardassist.cpp \ - itextmark.cpp \ + textmark.cpp \ codeassist/keywordscompletionassist.cpp \ marginsettings.cpp @@ -130,7 +129,6 @@ HEADERS += texteditorplugin.h \ itexteditor.h \ linenumberfilter.h \ texteditor_global.h \ - basetextmark.h \ findinfiles.h \ basefilefind.h \ texteditorsettings.h \ @@ -223,9 +221,9 @@ HEADERS += texteditorplugin.h \ basefilefind_p.h \ circularclipboard.h \ circularclipboardassist.h \ - itextmark.h \ + textmark.h \ codeassist/keywordscompletionassist.h \ - basetextmarkregistry.h \ + textmarkregistry.h \ marginsettings.h FORMS += \ diff --git a/src/plugins/texteditor/texteditor.qbs b/src/plugins/texteditor/texteditor.qbs index c630ae0715..800d632bc5 100644 --- a/src/plugins/texteditor/texteditor.qbs +++ b/src/plugins/texteditor/texteditor.qbs @@ -28,9 +28,6 @@ QtcPlugin { "basetexteditor.cpp", "basetexteditor.h", "basetexteditor_p.h", - "basetextmark.cpp", - "basetextmark.h", - "basetextmarkregistry.h", "behaviorsettings.cpp", "behaviorsettings.h", "behaviorsettingspage.cpp", @@ -93,8 +90,6 @@ QtcPlugin { "ioutlinewidget.h", "itexteditor.cpp", "itexteditor.h", - "itextmark.cpp", - "itextmark.h", "linenumberfilter.cpp", "linenumberfilter.h", "marginsettings.cpp", @@ -144,6 +139,9 @@ QtcPlugin { "texteditorsettings.h", "textfilewizard.cpp", "textfilewizard.h", + "textmark.cpp", + "textmark.h", + "textmarkregistry.h", "typingsettings.cpp", "typingsettings.h", ] diff --git a/src/plugins/texteditor/texteditorplugin.cpp b/src/plugins/texteditor/texteditorplugin.cpp index ab4fb99389..a390183e13 100644 --- a/src/plugins/texteditor/texteditorplugin.cpp +++ b/src/plugins/texteditor/texteditorplugin.cpp @@ -40,7 +40,7 @@ #include "plaintexteditor.h" #include "outlinefactory.h" #include "snippets/plaintextsnippetprovider.h" -#include "basetextmarkregistry.h" +#include "textmarkregistry.h" #include <texteditor/generichighlighter/manager.h> #include <coreplugin/icore.h> @@ -190,7 +190,7 @@ bool TextEditorPlugin::initialize(const QStringList &arguments, QString *errorMe m_outlineFactory = new OutlineFactory; addAutoReleasedObject(m_outlineFactory); - m_baseTextMarkRegistry = new BaseTextMarkRegistry(this); + m_baseTextMarkRegistry = new TextMarkRegistry(this); return true; } @@ -271,7 +271,7 @@ LineNumberFilter *TextEditorPlugin::lineNumberFilter() return m_instance->m_lineNumberFilter; } -BaseTextMarkRegistry *TextEditorPlugin::baseTextMarkRegistry() +TextMarkRegistry *TextEditorPlugin::baseTextMarkRegistry() { return m_instance->m_baseTextMarkRegistry; } diff --git a/src/plugins/texteditor/texteditorplugin.h b/src/plugins/texteditor/texteditorplugin.h index 82075b989c..66d5e8711e 100644 --- a/src/plugins/texteditor/texteditorplugin.h +++ b/src/plugins/texteditor/texteditorplugin.h @@ -45,7 +45,7 @@ namespace Internal { class LineNumberFilter; class PlainTextEditorFactory; class OutlineFactory; -class BaseTextMarkRegistry; +class TextMarkRegistry; class TextEditorPlugin : public ExtensionSystem::IPlugin { @@ -62,7 +62,7 @@ public: static PlainTextEditorFactory *editorFactory(); static LineNumberFilter *lineNumberFilter(); - static BaseTextMarkRegistry *baseTextMarkRegistry(); + static TextMarkRegistry *baseTextMarkRegistry(); private slots: void invokeCompletion(); @@ -76,7 +76,7 @@ private: LineNumberFilter *m_lineNumberFilter; Core::SearchResultWindow *m_searchResultWindow; OutlineFactory *m_outlineFactory; - BaseTextMarkRegistry *m_baseTextMarkRegistry; + TextMarkRegistry *m_baseTextMarkRegistry; #ifdef WITH_TESTS diff --git a/src/plugins/texteditor/basetextmark.cpp b/src/plugins/texteditor/textmark.cpp index 7606337bf8..e46dea0bd8 100644 --- a/src/plugins/texteditor/basetextmark.cpp +++ b/src/plugins/texteditor/textmark.cpp @@ -27,24 +27,163 @@ ** ****************************************************************************/ -#include "basetextmarkregistry.h" -#include "basetextmark.h" +#include "textmark.h" +#include "basetextdocument.h" +#include "textmarkregistry.h" #include "itexteditor.h" #include "basetextdocument.h" #include "texteditorplugin.h" #include <coreplugin/editormanager/editormanager.h> #include <coreplugin/documentmanager.h> -#include <extensionsystem/pluginmanager.h> #include <utils/qtcassert.h> using namespace Core; using namespace Utils; +using namespace TextEditor::Internal; namespace TextEditor { -namespace Internal { -BaseTextMarkRegistry::BaseTextMarkRegistry(QObject *parent) +TextMark::TextMark(const QString &fileName, int lineNumber) + : m_baseTextDocument(0), + m_fileName(fileName), + m_lineNumber(lineNumber), + m_priority(NormalPriority), + m_visible(true), + m_widthFactor(1.0) +{ + if (!m_fileName.isEmpty()) + TextEditorPlugin::baseTextMarkRegistry()->add(this); +} + +TextMark::~TextMark() +{ + TextEditorPlugin::baseTextMarkRegistry()->remove(this); + if (m_baseTextDocument) + m_baseTextDocument->removeMark(this); + m_baseTextDocument = 0; +} + +QString TextMark::fileName() const +{ + return m_fileName; +} + +void TextMark::updateFileName(const QString &fileName) +{ + if (fileName == m_fileName) + return; + if (!m_fileName.isEmpty()) + TextEditorPlugin::baseTextMarkRegistry()->remove(this); + m_fileName = fileName; + if (!m_fileName.isEmpty()) + TextEditorPlugin::baseTextMarkRegistry()->add(this); +} + +int TextMark::lineNumber() const +{ + return m_lineNumber; +} + +void TextMark::paint(QPainter *painter, const QRect &rect) const +{ + m_icon.paint(painter, rect, Qt::AlignCenter); +} + +void TextMark::updateLineNumber(int lineNumber) +{ + m_lineNumber = lineNumber; +} + +void TextMark::move(int line) +{ + if (line == m_lineNumber) + return; + const int previousLine = m_lineNumber; + m_lineNumber = line; + if (m_baseTextDocument) + m_baseTextDocument->moveMark(this, previousLine); +} + +void TextMark::updateBlock(const QTextBlock &) +{} + +void TextMark::removedFromEditor() +{} + +void TextMark::setIcon(const QIcon &icon) +{ + m_icon = icon; +} + +void TextMark::updateMarker() +{ + if (m_baseTextDocument) + m_baseTextDocument->updateMark(this); +} + +void TextMark::setPriority(Priority priority) +{ + m_priority = priority; +} + +TextMark::Priority TextMark::priority() const +{ + return m_priority; +} + +bool TextMark::isVisible() const +{ + return m_visible; +} + +void TextMark::setVisible(bool visible) +{ + m_visible = visible; + if (m_baseTextDocument) + m_baseTextDocument->updateMark(this); +} + +double TextMark::widthFactor() const +{ + return m_widthFactor; +} + +void TextMark::setWidthFactor(double factor) +{ + m_widthFactor = factor; +} + +bool TextMark::isClickable() const +{ + return false; +} + +void TextMark::clicked() +{} + +bool TextMark::isDraggable() const +{ + return false; +} + +void TextMark::dragToLine(int lineNumber) +{ + Q_UNUSED(lineNumber); +} + +BaseTextDocument *TextMark::baseTextDocument() const +{ + return m_baseTextDocument; +} + +void TextMark::setBaseTextDocument(BaseTextDocument *baseTextDocument) +{ + m_baseTextDocument = baseTextDocument; +} + + +TextMarkRegistry::TextMarkRegistry(QObject *parent) : QObject(parent) { connect(EditorManager::instance(), SIGNAL(editorOpened(Core::IEditor*)), @@ -56,7 +195,7 @@ BaseTextMarkRegistry::BaseTextMarkRegistry(QObject *parent) this, SLOT(documentRenamed(Core::IDocument*,QString,QString))); } -void BaseTextMarkRegistry::add(BaseTextMark *mark) +void TextMarkRegistry::add(TextMark *mark) { m_marks[FileName::fromString(mark->fileName())].insert(mark); auto document = qobject_cast<BaseTextDocument*>(DocumentModel::documentForFilePath(mark->fileName())); @@ -65,12 +204,12 @@ void BaseTextMarkRegistry::add(BaseTextMark *mark) document->addMark(mark); } -bool BaseTextMarkRegistry::remove(BaseTextMark *mark) +bool TextMarkRegistry::remove(TextMark *mark) { return m_marks[FileName::fromString(mark->fileName())].remove(mark); } -void BaseTextMarkRegistry::editorOpened(Core::IEditor *editor) +void TextMarkRegistry::editorOpened(Core::IEditor *editor) { auto document = qobject_cast<BaseTextDocument *>(editor ? editor->document() : 0); if (!document) @@ -78,15 +217,14 @@ void BaseTextMarkRegistry::editorOpened(Core::IEditor *editor) if (!m_marks.contains(FileName::fromString(document->filePath()))) return; - foreach (BaseTextMark *mark, m_marks.value(FileName::fromString(document->filePath()))) + foreach (TextMark *mark, m_marks.value(FileName::fromString(document->filePath()))) document->addMark(mark); } -void BaseTextMarkRegistry::documentRenamed(IDocument *document, const +void TextMarkRegistry::documentRenamed(IDocument *document, const QString &oldName, const QString &newName) { - TextEditor::BaseTextDocument *baseTextDocument - = qobject_cast<TextEditor::BaseTextDocument *>(document); + BaseTextDocument *baseTextDocument = qobject_cast<BaseTextDocument *>(document); if (!document) return; FileName oldFileName = FileName::fromString(oldName); @@ -94,60 +232,31 @@ void BaseTextMarkRegistry::documentRenamed(IDocument *document, const if (!m_marks.contains(oldFileName)) return; - QSet<BaseTextMark *> toBeMoved; - foreach (ITextMark *mark, baseTextDocument->marks()) - if (BaseTextMark *baseTextMark = dynamic_cast<BaseTextMark *>(mark)) - toBeMoved.insert(baseTextMark); + QSet<TextMark *> toBeMoved; + foreach (TextMark *mark, baseTextDocument->marks()) + toBeMoved.insert(mark); m_marks[oldFileName].subtract(toBeMoved); m_marks[newFileName].unite(toBeMoved); - foreach (BaseTextMark *mark, toBeMoved) + foreach (TextMark *mark, toBeMoved) mark->updateFileName(newName); } -void BaseTextMarkRegistry::allDocumentsRenamed(const QString &oldName, const QString &newName) +void TextMarkRegistry::allDocumentsRenamed(const QString &oldName, const QString &newName) { FileName oldFileName = FileName::fromString(oldName); FileName newFileName = FileName::fromString(newName); if (!m_marks.contains(oldFileName)) return; - QSet<BaseTextMark *> oldFileNameMarks = m_marks.value(oldFileName); + QSet<TextMark *> oldFileNameMarks = m_marks.value(oldFileName); m_marks[newFileName].unite(oldFileNameMarks); m_marks[oldFileName].clear(); - foreach (BaseTextMark *mark, oldFileNameMarks) + foreach (TextMark *mark, oldFileNameMarks) mark->updateFileName(newName); } -} // namespace Internal - -BaseTextMark::BaseTextMark(const QString &fileName, int lineNumber) - : ITextMark(lineNumber), m_fileName(fileName) -{ -} - -// we need two phase initialization, since we are calling virtual functions -// of BaseTextMark in add() and also accessing widthFactor -// which might be set in the derived constructor -void BaseTextMark::init() -{ - Internal::TextEditorPlugin::baseTextMarkRegistry()->add(this); -} - -BaseTextMark::~BaseTextMark() -{ - // oha we are deleted - bool b = Internal::TextEditorPlugin::baseTextMarkRegistry()->remove(this); - // If you get a assertion in this line, init() was never called - QTC_CHECK(b); -} - -void BaseTextMark::updateFileName(const QString &fileName) -{ - m_fileName = fileName; -} - } // namespace TextEditor diff --git a/src/plugins/texteditor/itextmark.h b/src/plugins/texteditor/textmark.h index 402ca3d974..60d63fb96f 100644 --- a/src/plugins/texteditor/itextmark.h +++ b/src/plugins/texteditor/textmark.h @@ -27,8 +27,8 @@ ** ****************************************************************************/ -#ifndef ITEXTMARK_H -#define ITEXTMARK_H +#ifndef TextMark_H +#define TextMark_H #include "texteditor_global.h" @@ -46,17 +46,13 @@ namespace TextEditor { class ITextEditor; class BaseTextDocument; -class TEXTEDITOR_EXPORT ITextMark +namespace Internal { class TextMarkRegistry; } + +class TEXTEDITOR_EXPORT TextMark { public: - ITextMark(int line) - : m_baseTextDocument(0), - m_lineNumber(line), - m_priority(NormalPriority), - m_visible(true), - m_widthFactor(1.0) - {} - virtual ~ITextMark(); + TextMark(const QString &fileName, int lineNumber); + virtual ~TextMark(); // determine order on markers on the same line. enum Priority @@ -66,8 +62,12 @@ public: HighPriority // shown on top. }; + QString fileName() const; int lineNumber() const; + virtual void paint(QPainter *painter, const QRect &rect) const; + /// called if the filename of the document changed + virtual void updateFileName(const QString &fileName); virtual void updateLineNumber(int lineNumber); virtual void updateBlock(const QTextBlock &block); virtual void move(int line); @@ -91,8 +91,11 @@ public: void setBaseTextDocument(BaseTextDocument *baseTextDocument); private: - Q_DISABLE_COPY(ITextMark) + Q_DISABLE_COPY(TextMark) + friend class Internal::TextMarkRegistry; + BaseTextDocument *m_baseTextDocument; + QString m_fileName; int m_lineNumber; Priority m_priority; bool m_visible; @@ -102,4 +105,4 @@ private: } // namespace TextEditor -#endif // ITEXTMARK_H +#endif // TextMark_H diff --git a/src/plugins/texteditor/basetextmarkregistry.h b/src/plugins/texteditor/textmarkregistry.h index ad1174fb63..8e1bb02877 100644 --- a/src/plugins/texteditor/basetextmarkregistry.h +++ b/src/plugins/texteditor/textmarkregistry.h @@ -42,23 +42,23 @@ class IDocument; } namespace TextEditor { -class BaseTextMark; +class TextMark; namespace Internal { -class BaseTextMarkRegistry : public QObject +class TextMarkRegistry : public QObject { Q_OBJECT public: - BaseTextMarkRegistry(QObject *parent); + TextMarkRegistry(QObject *parent); - void add(BaseTextMark *mark); - bool remove(BaseTextMark *mark); + void add(TextMark *mark); + bool remove(TextMark *mark); private slots: void editorOpened(Core::IEditor *editor); void documentRenamed(Core::IDocument *document, const QString &oldName, const QString &newName); void allDocumentsRenamed(const QString &oldName, const QString &newName); private: - QHash<Utils::FileName, QSet<BaseTextMark *> > m_marks; + QHash<Utils::FileName, QSet<TextMark *> > m_marks; }; } // namespace Internal |