From d9a5385aa55892c171dea333989e086b8e526008 Mon Sep 17 00:00:00 2001 From: Daniel Teske Date: Wed, 2 May 2012 14:33:28 +0200 Subject: [PATCH] BaseTextMark: Use (explicit) two phase initilization Fixes a bug where the text in the bookmarks view is missing on initial adding a bookmark. Change-Id: Iefbf05e6124c0b4e911aa8d67beaa82ceeac8e21 Reviewed-by: hjk Reviewed-by: Eike Ziller --- src/plugins/bookmarks/bookmarkmanager.cpp | 2 ++ src/plugins/debugger/breakhandler.cpp | 4 +++- src/plugins/projectexplorer/taskhub.cpp | 1 + src/plugins/texteditor/basetextmark.cpp | 14 ++++++++++++-- src/plugins/texteditor/basetextmark.h | 3 ++- src/plugins/valgrind/callgrindtool.cpp | 4 +++- 6 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/plugins/bookmarks/bookmarkmanager.cpp b/src/plugins/bookmarks/bookmarkmanager.cpp index a7b8d7fed70..ade3717c580 100644 --- a/src/plugins/bookmarks/bookmarkmanager.cpp +++ b/src/plugins/bookmarks/bookmarkmanager.cpp @@ -410,6 +410,7 @@ void BookmarkManager::toggleBookmark(const QString &fileName, int lineNumber) // Add a new bookmark if no bookmark existed on this line Bookmark *bookmark = new Bookmark(fi.filePath(), editorLine, this); + bookmark->init(); addBookmark(bookmark); } @@ -716,6 +717,7 @@ void BookmarkManager::addBookmark(const QString &s) if (!filePath.isEmpty() && !findBookmark(fi.path(), fi.fileName(), lineNumber)) { Bookmark *b = new Bookmark(filePath, lineNumber, this); + b->init(); addBookmark(b, false); } } else { diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp index 3820148f21c..f4d467b7465 100644 --- a/src/plugins/debugger/breakhandler.cpp +++ b/src/plugins/debugger/breakhandler.cpp @@ -1439,8 +1439,10 @@ void BreakHandler::BreakpointItem::updateMarker(BreakpointModelId id) if (marker && (file != marker->fileName() || line != marker->lineNumber())) destroyMarker(); - if (!marker && !file.isEmpty() && line > 0) + if (!marker && !file.isEmpty() && line > 0) { marker = new BreakpointMarker(id, file, line); + marker->init(); + } } QIcon BreakHandler::BreakpointItem::icon() const diff --git a/src/plugins/projectexplorer/taskhub.cpp b/src/plugins/projectexplorer/taskhub.cpp index 1223b46b205..a7fdde564a5 100644 --- a/src/plugins/projectexplorer/taskhub.cpp +++ b/src/plugins/projectexplorer/taskhub.cpp @@ -114,6 +114,7 @@ void TaskHub::addTask(Task task) TaskMark *mark = new TaskMark(task.taskId, task.file.toString(), task.line, visible); mark->setIcon(taskTypeIcon(task.type)); mark->setPriority(TextEditor::ITextMark::LowPriority); + mark->init(); task.addMark(mark); } emit taskAdded(task); diff --git a/src/plugins/texteditor/basetextmark.cpp b/src/plugins/texteditor/basetextmark.cpp index 6f5898a532f..bed33e3fcc8 100644 --- a/src/plugins/texteditor/basetextmark.cpp +++ b/src/plugins/texteditor/basetextmark.cpp @@ -38,6 +38,7 @@ #include #include #include +#include using namespace TextEditor; using namespace TextEditor::Internal; @@ -70,7 +71,7 @@ void BaseTextMarkRegistry::add(BaseTextMark *mark) } } -void BaseTextMarkRegistry::remove(BaseTextMark *mark) +bool BaseTextMarkRegistry::remove(BaseTextMark *mark) { m_marks[Utils::FileName::fromString(mark->fileName())].remove(mark); } @@ -131,6 +132,13 @@ void BaseTextMarkRegistry::allDocumentsRenamed(const QString &oldName, const QSt BaseTextMark::BaseTextMark(const QString &fileName, int lineNumber) : ITextMark(lineNumber), m_fileName(fileName) +{ +} + +// we need two phase initilization, since we are calling virtual methods +// of BaseTextMark in add() and also accessing widthFactor +// which might be set in the derived constructor +void BaseTextMark::init() { Internal::TextEditorPlugin::instance()->baseTextMarkRegistry()->add(this); } @@ -138,7 +146,9 @@ BaseTextMark::BaseTextMark(const QString &fileName, int lineNumber) BaseTextMark::~BaseTextMark() { // oha we are deleted - Internal::TextEditorPlugin::instance()->baseTextMarkRegistry()->remove(this); + bool b = Internal::TextEditorPlugin::instance()->baseTextMarkRegistry()->remove(this); + // If you get a assertion in this line, init() was never called + QTC_CHECK(b) } void BaseTextMark::updateFileName(const QString &fileName) diff --git a/src/plugins/texteditor/basetextmark.h b/src/plugins/texteditor/basetextmark.h index 1b31724f2f4..c3c8808bca0 100644 --- a/src/plugins/texteditor/basetextmark.h +++ b/src/plugins/texteditor/basetextmark.h @@ -60,6 +60,7 @@ class TEXTEDITOR_EXPORT BaseTextMark : public TextEditor::ITextMark public: BaseTextMark(const QString &fileName, int lineNumber); + void init(); virtual ~BaseTextMark(); /// called if the filename of the document changed @@ -80,7 +81,7 @@ public: BaseTextMarkRegistry(QObject *parent); void add(BaseTextMark *mark); - void remove(BaseTextMark *mark); + bool remove(BaseTextMark *mark); private slots: void editorOpened(Core::IEditor *editor); void documentRenamed(Core::IDocument *document, const QString &oldName, const QString &newName); diff --git a/src/plugins/valgrind/callgrindtool.cpp b/src/plugins/valgrind/callgrindtool.cpp index 7d0f18dbace..ae1d8379c5a 100644 --- a/src/plugins/valgrind/callgrindtool.cpp +++ b/src/plugins/valgrind/callgrindtool.cpp @@ -999,7 +999,9 @@ void CallgrindToolPrivate::createTextMarks() continue; locations << location; - m_textMarks.append(new CallgrindTextMark(index, fileName, lineNumber)); + CallgrindTextMark *mark = new CallgrindTextMark(index, fileName, lineNumber); + mark->init(); + m_textMarks.append(mark); } }