m_fileIsReadOnly = false;
m_isBinaryData = false;
m_codec = QTextCodec::codecForLocale();
- QSettings* settings = Core::ICore::instance()->settings();
+ QSettings *settings = Core::ICore::instance()->settings();
if (QTextCodec *candidate = QTextCodec::codecForName(
settings->value(QLatin1String("General/DefaultFileEncoding")).toByteArray()))
m_codec = candidate;
BaseTextDocument::~BaseTextDocument()
{
- QTextBlock block = m_document->begin();
- while (block.isValid()) {
- if (TextBlockUserData *data = static_cast<TextBlockUserData *>(block.userData()))
- data->documentClosing();
- block = block.next();
- }
+ documentClosing();
+
delete m_document;
m_document = 0;
}
void BaseTextDocument::reload()
{
emit aboutToReload();
+ documentClosing(); // removes text marks non-permanently
+
if (open(m_fileName))
emit reloaded();
}
copyCursor.endEditBlock();
}
-void BaseTextDocument::cleanWhitespace(QTextCursor& cursor, bool cleanIndentation, bool inEntireDocument)
+void BaseTextDocument::cleanWhitespace(QTextCursor &cursor, bool cleanIndentation, bool inEntireDocument)
{
-
BaseTextDocumentLayout *documentLayout = qobject_cast<BaseTextDocumentLayout*>(m_document->documentLayout());
QTextBlock block = m_document->findBlock(cursor.selectionStart());
cursor.insertText(QLatin1String("\n"));
}
}
+
+void BaseTextDocument::documentClosing()
+{
+ QTextBlock block = m_document->begin();
+ while (block.isValid()) {
+ if (TextBlockUserData *data = static_cast<TextBlockUserData *>(block.userData()))
+ data->documentClosing();
+ block = block.next();
+ }
+}
inline const StorageSettings &storageSettings() const { return m_storageSettings; }
inline const TabSettings &tabSettings() const { return m_tabSettings; }
- DocumentMarker *documentMarker() const {return m_documentMarker; }
+ DocumentMarker *documentMarker() const { return m_documentMarker; }
//IFile
virtual bool save(const QString &fileName = QString());
signals:
void titleChanged(QString title);
- void aboutToReload();
- void reloaded();
private:
QString m_fileName;
void cleanWhitespace(QTextCursor& cursor, bool cleanIndentation, bool inEntireDocument);
void ensureFinalNewLine(QTextCursor& cursor);
+ void documentClosing();
};
} // namespace TextEditor
#include "basetextmark.h"
+#include "basetextdocument.h"
+
#include <coreplugin/editormanager/editormanager.h>
#include <extensionsystem/pluginmanager.h>
using namespace TextEditor;
using namespace TextEditor::Internal;
-BaseTextMark::BaseTextMark()
- : m_markableInterface(0), m_internalMark(0), m_init(false)
-{
-}
-
BaseTextMark::BaseTextMark(const QString &filename, int line)
- : m_markableInterface(0), m_internalMark(0), m_fileName(filename), m_line(line), m_init(false)
+ : m_markableInterface(0)
+ , m_internalMark(0)
+ , m_fileName(filename)
+ , m_line(line)
+ , m_init(false)
{
// Why is this?
QTimer::singleShot(0, this, SLOT(init()));
}
+BaseTextMark::~BaseTextMark()
+{
+ // oha we are deleted
+ if (m_markableInterface)
+ m_markableInterface->removeMark(m_internalMark);
+ removeInternalMark();
+}
+
void BaseTextMark::init()
{
m_init = true;
m_markableInterface = textEditor->markableInterface();
m_internalMark = new InternalMark(this);
- if (!m_markableInterface->addMark(m_internalMark, m_line)) {
- delete m_internalMark;
- m_internalMark = 0;
- m_markableInterface = 0;
+ if (m_markableInterface->addMark(m_internalMark, m_line)) {
+ // Handle reload of text documents, readding the mark as necessary
+ connect(textEditor->file(), SIGNAL(reloaded()),
+ this, SLOT(documentReloaded()), Qt::UniqueConnection);
+ } else {
+ removeInternalMark();
}
}
}
}
+void BaseTextMark::documentReloaded()
+{
+ if (m_markableInterface)
+ return;
+
+ BaseTextDocument *doc = qobject_cast<BaseTextDocument*>(sender());
+ if (!doc)
+ return;
+
+ m_markableInterface = doc->documentMarker();
+ m_internalMark = new InternalMark(this);
+
+ if (!m_markableInterface->addMark(m_internalMark, m_line))
+ removeInternalMark();
+}
+
void BaseTextMark::childRemovedFromEditor(InternalMark *mark)
{
Q_UNUSED(mark)
// m_internalMark was removed from the editor
- delete m_internalMark;
- m_markableInterface = 0;
- m_internalMark = 0;
+ removeInternalMark();
removedFromEditor();
}
void BaseTextMark::documentClosingFor(InternalMark *mark)
{
Q_UNUSED(mark)
- // the document is closing
- delete m_internalMark;
- m_markableInterface = 0;
- m_internalMark = 0;
+ removeInternalMark();
}
-BaseTextMark::~BaseTextMark()
+void BaseTextMark::removeInternalMark()
{
- // oha we are deleted
- if (m_markableInterface)
- m_markableInterface->removeMark(m_internalMark);
delete m_internalMark;
m_internalMark = 0;
m_markableInterface = 0;
m_init = true;
}
-
if (m_markableInterface)
m_markableInterface->removeMark(m_internalMark);
- m_markableInterface = 0;
- // This is only necessary since m_internalMark is created in ediorOpened
- delete m_internalMark;
- m_internalMark = 0;
+ // This is only necessary since m_internalMark is created in editorOpened
+ removeInternalMark();
foreach (Core::IEditor *editor, em->openedEditors())
editorOpened(editor);
{
friend class Internal::InternalMark;
Q_OBJECT
+
public:
- BaseTextMark();
BaseTextMark(const QString &filename, int line);
~BaseTextMark();
int lineNumber() const { return m_line; }
void moveMark(const QString &filename, int line);
+
private slots:
- void editorOpened(Core::IEditor *editor);
void init();
+ void editorOpened(Core::IEditor *editor);
+ void documentReloaded();
+
private:
void childRemovedFromEditor(Internal::InternalMark *mark);
void documentClosingFor(Internal::InternalMark *mark);
+ void removeInternalMark();
ITextMarkable *m_markableInterface;
Internal::InternalMark *m_internalMark;