diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp index f67d8f859fca28245ea4235ae4dc93d60dd039fa..8f37ac5e53ac73788aef625cd66c2159fa57386d 100644 --- a/src/plugins/cppeditor/cppeditor.cpp +++ b/src/plugins/cppeditor/cppeditor.cpp @@ -72,6 +72,7 @@ #include <projectexplorer/projectexplorerconstants.h> #include <texteditor/basetextdocument.h> #include <texteditor/fontsettings.h> +#include <texteditor/tabsettings.h> #include <texteditor/texteditorconstants.h> #include <QtCore/QDebug> diff --git a/src/plugins/debugger/debuggeragents.cpp b/src/plugins/debugger/debuggeragents.cpp index de89476e123a5e4f821e34868a59b029b1afbb09..6271963ac2315fbaff97cb67aa1c053ce5127492 100644 --- a/src/plugins/debugger/debuggeragents.cpp +++ b/src/plugins/debugger/debuggeragents.cpp @@ -56,6 +56,7 @@ #include <QtGui/QMessageBox> #include <QtGui/QPlainTextEdit> #include <QtGui/QTextCursor> +#include <QtGui/QIcon> #include <limits.h> diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp index 579fa1d5865fa2cc65640a2f195db40bf2be939b..e89de3845ec8aed3f14c60585d3831542d713636 100644 --- a/src/plugins/qmljseditor/qmljseditor.cpp +++ b/src/plugins/qmljseditor/qmljseditor.cpp @@ -59,6 +59,7 @@ #include <extensionsystem/pluginmanager.h> #include <texteditor/basetextdocument.h> #include <texteditor/fontsettings.h> +#include <texteditor/tabsettings.h> #include <texteditor/texteditorconstants.h> #include <texteditor/texteditorsettings.h> #include <texteditor/syntaxhighlighter.h> diff --git a/src/plugins/texteditor/basetextdocument.cpp b/src/plugins/texteditor/basetextdocument.cpp index f8463fef7ef301bb9e372459d26a7e6ed10e54e9..c4896d1702f8487bbbca966f9f3115953be135b5 100644 --- a/src/plugins/texteditor/basetextdocument.cpp +++ b/src/plugins/texteditor/basetextdocument.cpp @@ -32,6 +32,7 @@ #include "basetextdocumentlayout.h" #include "basetexteditor.h" #include "storagesettings.h" +#include "tabsettings.h" #include "syntaxhighlighter.h" #include <QtCore/QFile> @@ -48,7 +49,25 @@ #include <utils/qtcassert.h> #include <utils/reloadpromptutils.h> -using namespace TextEditor; +namespace TextEditor { +namespace Internal { + +class DocumentMarker : public ITextMarkable +{ + Q_OBJECT +public: + DocumentMarker(QTextDocument *); + + // ITextMarkable + bool addMark(ITextMark *mark, int line); + TextMarks marksAt(int line) const; + void removeMark(ITextMark *mark); + bool hasMark(ITextMark *mark) const; + void updateMark(ITextMark *mark); + +private: + QTextDocument *document; +}; DocumentMarker::DocumentMarker(QTextDocument *doc) : ITextMarkable(doc), document(doc) @@ -123,59 +142,188 @@ void DocumentMarker::updateMark(ITextMark *mark) documentLayout->requestUpdate(); } +} // namespace Internal + +class BaseTextDocumentPrivate { +public: + explicit BaseTextDocumentPrivate(BaseTextDocument *q); + + QString m_fileName; + QString m_defaultPath; + QString m_suggestedFileName; + QString m_mimeType; + StorageSettings m_storageSettings; + TabSettings m_tabSettings; + QTextDocument *m_document; + Internal::DocumentMarker *m_documentMarker; + SyntaxHighlighter *m_highlighter; + + enum LineTerminatorMode { + LFLineTerminator, + CRLFLineTerminator, + NativeLineTerminator = +#if defined (Q_OS_WIN) + CRLFLineTerminator +#else + LFLineTerminator +#endif + }; + LineTerminatorMode m_lineTerminatorMode; + QTextCodec *m_codec; + bool m_fileHasUtf8Bom; + + bool m_fileIsReadOnly; + bool m_isBinaryData; + bool m_hasDecodingError; + QByteArray m_decodingErrorSample; +}; + +BaseTextDocumentPrivate::BaseTextDocumentPrivate(BaseTextDocument *q) : + m_document(new QTextDocument(q)), + m_documentMarker(new Internal::DocumentMarker(m_document)), + m_highlighter(0), + m_lineTerminatorMode(NativeLineTerminator), + m_codec(Core::EditorManager::instance()->defaultTextEncoding()), + m_fileHasUtf8Bom(false), + m_fileIsReadOnly(false), + m_isBinaryData(false), + m_hasDecodingError(false) +{ +} -BaseTextDocument::BaseTextDocument() - : m_document(new QTextDocument(this)), - m_highlighter(0) +BaseTextDocument::BaseTextDocument() : d(new BaseTextDocumentPrivate(this)) { - m_documentMarker = new DocumentMarker(m_document); - m_lineTerminatorMode = NativeLineTerminator; - m_fileIsReadOnly = false; - m_isBinaryData = false; - m_codec = Core::EditorManager::instance()->defaultTextEncoding(); - m_fileHasUtf8Bom = false; - m_hasDecodingError = false; } BaseTextDocument::~BaseTextDocument() { documentClosing(); - - delete m_document; - m_document = 0; + delete d->m_document; + d->m_document = 0; + delete d; } QString BaseTextDocument::mimeType() const { - return m_mimeType; + return d->m_mimeType; } void BaseTextDocument::setMimeType(const QString &mt) { - m_mimeType = mt; + d->m_mimeType = mt; +} + +void BaseTextDocument::setStorageSettings(const StorageSettings &storageSettings) +{ + d->m_storageSettings = storageSettings; +} + +const StorageSettings &BaseTextDocument::storageSettings() const +{ + return d->m_storageSettings; +} + +void BaseTextDocument::setTabSettings(const TabSettings &tabSettings) +{ + d->m_tabSettings = tabSettings; +} + +const TabSettings &BaseTextDocument::tabSettings() const +{ + return d->m_tabSettings; +} + +QString BaseTextDocument::fileName() const +{ + return d->m_fileName; +} + +bool BaseTextDocument::isSaveAsAllowed() const +{ + return true; +} + +QString BaseTextDocument::defaultPath() const +{ + return d->m_defaultPath; +} + +QString BaseTextDocument::suggestedFileName() const +{ + return d->m_suggestedFileName; +} + +void BaseTextDocument::setDefaultPath(const QString &defaultPath) +{ + d->m_defaultPath = defaultPath; +} + +void BaseTextDocument::setSuggestedFileName(const QString &suggestedFileName) +{ + d->m_suggestedFileName = suggestedFileName; +} + +QTextDocument *BaseTextDocument::document() const +{ + return d->m_document; +} + +SyntaxHighlighter *BaseTextDocument::syntaxHighlighter() const +{ + return d->m_highlighter; +} + +bool BaseTextDocument::isBinaryData() const +{ + return d->m_isBinaryData; +} + +bool BaseTextDocument::hasDecodingError() const +{ + return d->m_hasDecodingError || d->m_isBinaryData; +} + +QTextCodec *BaseTextDocument::codec() const +{ + return d->m_codec; +} + +void BaseTextDocument::setCodec(QTextCodec *c) +{ + d->m_codec = c; +} + +QByteArray BaseTextDocument::decodingErrorSample() const +{ + return d->m_decodingErrorSample; +} + +ITextMarkable *BaseTextDocument::documentMarker() const +{ + return d->m_documentMarker; } bool BaseTextDocument::save(const QString &fileName) { - QTextCursor cursor(m_document); + QTextCursor cursor(d->m_document); // When saving the current editor, make sure to maintain the cursor position for undo Core::IEditor *currentEditor = Core::EditorManager::instance()->currentEditor(); if (BaseTextEditorEditable *editable = qobject_cast<BaseTextEditorEditable*>(currentEditor)) { - if (editable->file() == this) + if (editable->file() == this) cursor.setPosition(editable->editor()->textCursor().position()); } cursor.beginEditBlock(); cursor.movePosition(QTextCursor::Start); - if (m_storageSettings.m_cleanWhitespace) - cleanWhitespace(cursor, m_storageSettings.m_cleanIndentation, m_storageSettings.m_inEntireDocument); - if (m_storageSettings.m_addFinalNewLine) + if (d->m_storageSettings.m_cleanWhitespace) + cleanWhitespace(cursor, d->m_storageSettings.m_cleanIndentation, d->m_storageSettings.m_inEntireDocument); + if (d->m_storageSettings.m_addFinalNewLine) ensureFinalNewLine(cursor); cursor.endEditBlock(); - QString fName = m_fileName; + QString fName = d->m_fileName; if (!fileName.isEmpty()) fName = fileName; @@ -183,32 +331,32 @@ bool BaseTextDocument::save(const QString &fileName) if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return false; - QString plainText = m_document->toPlainText(); + QString plainText = d->m_document->toPlainText(); - if (m_lineTerminatorMode == CRLFLineTerminator) + if (d->m_lineTerminatorMode == BaseTextDocumentPrivate::CRLFLineTerminator) plainText.replace(QLatin1Char('\n'), QLatin1String("\r\n")); Core::IFile::Utf8BomSetting utf8bomSetting = Core::EditorManager::instance()->utf8BomSetting(); - if (m_codec->name() == "UTF-8" && - (utf8bomSetting == Core::IFile::AlwaysAdd || (utf8bomSetting == Core::IFile::OnlyKeep && m_fileHasUtf8Bom))) { + if (d->m_codec->name() == "UTF-8" && + (utf8bomSetting == Core::IFile::AlwaysAdd || (utf8bomSetting == Core::IFile::OnlyKeep && d->m_fileHasUtf8Bom))) { file.write("\xef\xbb\xbf", 3); } - file.write(m_codec->fromUnicode(plainText)); + file.write(d->m_codec->fromUnicode(plainText)); if (!file.flush()) return false; file.close(); const QFileInfo fi(fName); - m_fileName = QDir::cleanPath(fi.absoluteFilePath()); + d->m_fileName = QDir::cleanPath(fi.absoluteFilePath()); - m_document->setModified(false); + d->m_document->setModified(false); emit titleChanged(fi.fileName()); emit changed(); - m_isBinaryData = false; - m_hasDecodingError = false; - m_decodingErrorSample.clear(); + d->m_isBinaryData = false; + d->m_hasDecodingError = false; + d->m_decodingErrorSample.clear(); return true; } @@ -216,35 +364,35 @@ bool BaseTextDocument::save(const QString &fileName) void BaseTextDocument::rename(const QString &newName) { const QFileInfo fi(newName); - m_fileName = QDir::cleanPath(fi.absoluteFilePath()); + d->m_fileName = QDir::cleanPath(fi.absoluteFilePath()); emit titleChanged(fi.fileName()); emit changed(); } bool BaseTextDocument::isReadOnly() const { - if (m_isBinaryData || m_hasDecodingError) + if (d->m_isBinaryData || d->m_hasDecodingError) return true; - if (m_fileName.isEmpty()) //have no corresponding file, so editing is ok + if (d->m_fileName.isEmpty()) //have no corresponding file, so editing is ok return false; - return m_fileIsReadOnly; + return d->m_fileIsReadOnly; } bool BaseTextDocument::isModified() const { - return m_document->isModified(); + return d->m_document->isModified(); } void BaseTextDocument::checkPermissions() { - bool previousReadOnly = m_fileIsReadOnly; - if (!m_fileName.isEmpty()) { - const QFileInfo fi(m_fileName); - m_fileIsReadOnly = !fi.isWritable(); + bool previousReadOnly = d->m_fileIsReadOnly; + if (!d->m_fileName.isEmpty()) { + const QFileInfo fi(d->m_fileName); + d->m_fileIsReadOnly = !fi.isWritable(); } else { - m_fileIsReadOnly = false; + d->m_fileIsReadOnly = false; } - if (previousReadOnly != m_fileIsReadOnly) + if (previousReadOnly != d->m_fileIsReadOnly) emit changed(); } @@ -253,8 +401,8 @@ bool BaseTextDocument::open(const QString &fileName) QString title = tr("untitled"); if (!fileName.isEmpty()) { const QFileInfo fi(fileName); - m_fileIsReadOnly = !fi.isWritable(); - m_fileName = QDir::cleanPath(fi.absoluteFilePath()); + d->m_fileIsReadOnly = !fi.isWritable(); + d->m_fileName = QDir::cleanPath(fi.absoluteFilePath()); QFile file(fileName); if (!file.open(QIODevice::ReadOnly)) @@ -265,8 +413,8 @@ bool BaseTextDocument::open(const QString &fileName) QByteArray buf = file.readAll(); int bytesRead = buf.size(); - QTextCodec *codec = m_codec; - m_fileHasUtf8Bom = false; + QTextCodec *codec = d->m_codec; + d->m_fileHasUtf8Bom = false; // code taken from qtextstream if (bytesRead >= 4 && ((uchar(buf[0]) == 0xff && uchar(buf[1]) == 0xfe && uchar(buf[2]) == 0 && uchar(buf[3]) == 0) @@ -277,57 +425,57 @@ bool BaseTextDocument::open(const QString &fileName) codec = QTextCodec::codecForName("UTF-16"); } else if (bytesRead >= 3 && ((uchar(buf[0]) == 0xef && uchar(buf[1]) == 0xbb) && uchar(buf[2]) == 0xbf)) { codec = QTextCodec::codecForName("UTF-8"); - m_fileHasUtf8Bom = true; + d->m_fileHasUtf8Bom = true; } else if (!codec) { codec = QTextCodec::codecForLocale(); } // end code taken from qtextstream - m_codec = codec; + d->m_codec = codec; #if 0 // should work, but does not, Qt bug with "system" codec - QTextDecoder *decoder = m_codec->makeDecoder(); + QTextDecoder *decoder = d->m_codec->makeDecoder(); QString text = decoder->toUnicode(buf); - m_hasDecodingError = (decoder->hasFailure()); + d->m_hasDecodingError = (decoder->hasFailure()); delete decoder; #else - QString text = m_codec->toUnicode(buf); - QByteArray verifyBuf = m_codec->fromUnicode(text); // slow + QString text = d->m_codec->toUnicode(buf); + QByteArray verifyBuf = d->m_codec->fromUnicode(text); // slow // the minSize trick lets us ignore unicode headers int minSize = qMin(verifyBuf.size(), buf.size()); - m_hasDecodingError = (minSize < buf.size()- 4 + d->m_hasDecodingError = (minSize < buf.size()- 4 || memcmp(verifyBuf.constData() + verifyBuf.size() - minSize, buf.constData() + buf.size() - minSize, minSize)); #endif - if (m_hasDecodingError) { + if (d->m_hasDecodingError) { int p = buf.indexOf('\n', 16384); if (p < 0) - m_decodingErrorSample = buf; + d->m_decodingErrorSample = buf; else - m_decodingErrorSample = buf.left(p); + d->m_decodingErrorSample = buf.left(p); } else { - m_decodingErrorSample.clear(); + d->m_decodingErrorSample.clear(); } int lf = text.indexOf('\n'); if (lf > 0 && text.at(lf-1) == QLatin1Char('\r')) { - m_lineTerminatorMode = CRLFLineTerminator; + d->m_lineTerminatorMode = BaseTextDocumentPrivate::CRLFLineTerminator; } else if (lf >= 0) { - m_lineTerminatorMode = LFLineTerminator; + d->m_lineTerminatorMode = BaseTextDocumentPrivate::LFLineTerminator; } else { - m_lineTerminatorMode = NativeLineTerminator; + d->m_lineTerminatorMode = BaseTextDocumentPrivate::NativeLineTerminator; } - m_document->setModified(false); - if (m_isBinaryData) - m_document->setHtml(tr("<em>Binary data</em>")); + d->m_document->setModified(false); + if (d->m_isBinaryData) + d->m_document->setHtml(tr("<em>Binary data</em>")); else - m_document->setPlainText(text); - BaseTextDocumentLayout *documentLayout = qobject_cast<BaseTextDocumentLayout*>(m_document->documentLayout()); + d->m_document->setPlainText(text); + BaseTextDocumentLayout *documentLayout = qobject_cast<BaseTextDocumentLayout*>(d->m_document->documentLayout()); QTC_ASSERT(documentLayout, return true); - documentLayout->lastSaveRevision = m_document->revision(); - m_document->setModified(false); + documentLayout->lastSaveRevision = d->m_document->revision(); + d->m_document->setModified(false); emit titleChanged(title); emit changed(); } @@ -337,7 +485,7 @@ bool BaseTextDocument::open(const QString &fileName) void BaseTextDocument::reload(QTextCodec *codec) { QTC_ASSERT(codec, return); - m_codec = codec; + d->m_codec = codec; reload(); } @@ -346,7 +494,7 @@ void BaseTextDocument::reload() emit aboutToReload(); documentClosing(); // removes text marks non-permanently - if (open(m_fileName)) + if (open(d->m_fileName)) emit reloaded(); } @@ -375,11 +523,11 @@ void BaseTextDocument::reload(ReloadFlag flag, ChangeType type) void BaseTextDocument::setSyntaxHighlighter(SyntaxHighlighter *highlighter) { - if (m_highlighter) - delete m_highlighter; - m_highlighter = highlighter; - m_highlighter->setParent(this); - m_highlighter->setDocument(m_document); + if (d->m_highlighter) + delete d->m_highlighter; + d->m_highlighter = highlighter; + d->m_highlighter->setParent(this); + d->m_highlighter->setDocument(d->m_document); } @@ -398,34 +546,34 @@ void BaseTextDocument::cleanWhitespace(const QTextCursor &cursor) void BaseTextDocument::cleanWhitespace(QTextCursor &cursor, bool cleanIndentation, bool inEntireDocument) { - BaseTextDocumentLayout *documentLayout = qobject_cast<BaseTextDocumentLayout*>(m_document->documentLayout()); + BaseTextDocumentLayout *documentLayout = qobject_cast<BaseTextDocumentLayout*>(d->m_document->documentLayout()); Q_ASSERT(cursor.visualNavigation() == false); - QTextBlock block = m_document->findBlock(cursor.selectionStart()); + QTextBlock block = d->m_document->findBlock(cursor.selectionStart()); QTextBlock end; if (cursor.hasSelection()) - end = m_document->findBlock(cursor.selectionEnd()-1).next(); + end = d->m_document->findBlock(cursor.selectionEnd()-1).next(); while (block.isValid() && block != end) { if (inEntireDocument || block.revision() != documentLayout->lastSaveRevision) { QString blockText = block.text(); - if (int trailing = m_tabSettings.trailingWhitespaces(blockText)) { + if (int trailing = d->m_tabSettings.trailingWhitespaces(blockText)) { cursor.setPosition(block.position() + block.length() - 1); cursor.movePosition(QTextCursor::PreviousCharacter, QTextCursor::KeepAnchor, trailing); cursor.removeSelectedText(); } - if (cleanIndentation && !m_tabSettings.isIndentationClean(block)) { + if (cleanIndentation && !d->m_tabSettings.isIndentationClean(block)) { cursor.setPosition(block.position()); - int firstNonSpace = m_tabSettings.firstNonSpace(blockText); + int firstNonSpace = d->m_tabSettings.firstNonSpace(blockText); if (firstNonSpace == blockText.length()) { cursor.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor); cursor.removeSelectedText(); } else { - int column = m_tabSettings.columnAt(blockText, firstNonSpace); + int column = d->m_tabSettings.columnAt(blockText, firstNonSpace); cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, firstNonSpace); - QString indentationString = m_tabSettings.indentationString(0, column, block); + QString indentationString = d->m_tabSettings.indentationString(0, column, block); cursor.insertText(indentationString); } } @@ -449,10 +597,14 @@ void BaseTextDocument::ensureFinalNewLine(QTextCursor& cursor) void BaseTextDocument::documentClosing() { - QTextBlock block = m_document->begin(); + QTextBlock block = d->m_document->begin(); while (block.isValid()) { if (TextBlockUserData *data = static_cast<TextBlockUserData *>(block.userData())) data->documentClosing(); block = block.next(); } } + +} // namespace TextEditor + +#include "basetextdocument.moc" diff --git a/src/plugins/texteditor/basetextdocument.h b/src/plugins/texteditor/basetextdocument.h index dd9f93f5233a614228ba25097451191942444517..9b739e9f24517a8d98eea2f278ee91584456135b 100644 --- a/src/plugins/texteditor/basetextdocument.h +++ b/src/plugins/texteditor/basetextdocument.h @@ -31,9 +31,6 @@ #define BASETEXTDOCUMENT_H #include "texteditor_global.h" -#include "storagesettings.h" -#include "itexteditor.h" -#include "tabsettings.h" #include <coreplugin/ifile.h> @@ -43,26 +40,15 @@ class QTextDocument; QT_END_NAMESPACE namespace TextEditor { +namespace Internal { +class DocumentMarker; +} +class ITextMarkable; +class StorageSettings; +class TabSettings; class SyntaxHighlighter; - -class DocumentMarker : public ITextMarkable -{ - Q_OBJECT -public: - DocumentMarker(QTextDocument *); - - // ITextMarkable - bool addMark(ITextMark *mark, int line); - TextMarks marksAt(int line) const; - void removeMark(ITextMark *mark); - bool hasMark(ITextMark *mark) const; - void updateMark(ITextMark *mark); - -private: - QTextDocument *document; -}; - +class BaseTextDocumentPrivate; class TEXTEDITOR_EXPORT BaseTextDocument : public Core::IFile { @@ -70,21 +56,22 @@ class TEXTEDITOR_EXPORT BaseTextDocument : public Core::IFile public: BaseTextDocument(); - ~BaseTextDocument(); - void setStorageSettings(const StorageSettings &storageSettings) { m_storageSettings = storageSettings; } - void setTabSettings(const TabSettings &tabSettings) { m_tabSettings = tabSettings; } + virtual ~BaseTextDocument(); - inline const StorageSettings &storageSettings() const { return m_storageSettings; } - inline const TabSettings &tabSettings() const { return m_tabSettings; } + void setStorageSettings(const StorageSettings &storageSettings); + void setTabSettings(const TabSettings &tabSettings); - DocumentMarker *documentMarker() const { return m_documentMarker; } + const StorageSettings &storageSettings() const; + const TabSettings &tabSettings() const; + + ITextMarkable *documentMarker() const; //IFile virtual bool save(const QString &fileName = QString()); - virtual QString fileName() const { return m_fileName; } + virtual QString fileName() const; virtual bool isReadOnly() const; virtual bool isModified() const; - virtual bool isSaveAsAllowed() const { return true; } + virtual bool isSaveAsAllowed() const; virtual void checkPermissions(); ReloadBehavior reloadBehavior(ChangeTrigger state, ChangeType type) const; void reload(ReloadFlag flag, ChangeType type); @@ -92,25 +79,25 @@ public: void setMimeType(const QString &mt); virtual void rename(const QString &newName); - virtual QString defaultPath() const { return m_defaultPath; } - virtual QString suggestedFileName() const { return m_suggestedFileName; } + virtual QString defaultPath() const; + virtual QString suggestedFileName() const; - void setDefaultPath(const QString &defaultPath) { m_defaultPath = defaultPath; } - void setSuggestedFileName(const QString &suggestedFileName) { m_suggestedFileName = suggestedFileName; } + void setDefaultPath(const QString &defaultPath); + void setSuggestedFileName(const QString &suggestedFileName); virtual bool open(const QString &fileName = QString()); virtual void reload(); - QTextDocument *document() const { return m_document; } + QTextDocument *document() const; void setSyntaxHighlighter(SyntaxHighlighter *highlighter); - SyntaxHighlighter *syntaxHighlighter() const { return m_highlighter; } + SyntaxHighlighter *syntaxHighlighter() const; - inline bool isBinaryData() const { return m_isBinaryData; } - inline bool hasDecodingError() const { return m_hasDecodingError || m_isBinaryData; } - inline QTextCodec *codec() const { return m_codec; } - inline void setCodec(QTextCodec *c) { m_codec = c; } - inline QByteArray decodingErrorSample() const { return m_decodingErrorSample; } + bool isBinaryData() const; + bool hasDecodingError() const; + QTextCodec *codec() const; + void setCodec(QTextCodec *c); + QByteArray decodingErrorSample() const; void reload(QTextCodec *codec); @@ -120,38 +107,11 @@ signals: void titleChanged(QString title); private: - QString m_fileName; - QString m_defaultPath; - QString m_suggestedFileName; - QString m_mimeType; - StorageSettings m_storageSettings; - TabSettings m_tabSettings; - QTextDocument *m_document; - DocumentMarker *m_documentMarker; - SyntaxHighlighter *m_highlighter; - - enum LineTerminatorMode { - LFLineTerminator, - CRLFLineTerminator, - NativeLineTerminator = -#if defined (Q_OS_WIN) - CRLFLineTerminator -#else - LFLineTerminator -#endif - }; - LineTerminatorMode m_lineTerminatorMode; - QTextCodec *m_codec; - bool m_fileHasUtf8Bom; - - bool m_fileIsReadOnly; - bool m_isBinaryData; - bool m_hasDecodingError; - QByteArray m_decodingErrorSample; - void cleanWhitespace(QTextCursor& cursor, bool cleanIndentation, bool inEntireDocument); void ensureFinalNewLine(QTextCursor& cursor); void documentClosing(); + + BaseTextDocumentPrivate *d; }; } // namespace TextEditor diff --git a/src/plugins/texteditor/basetextmark.cpp b/src/plugins/texteditor/basetextmark.cpp index fb425cb8906178d8593bd7983569c2cf9b0a056c..b6b638f42ca7f3d7272c191da3be75ad4f909666 100644 --- a/src/plugins/texteditor/basetextmark.cpp +++ b/src/plugins/texteditor/basetextmark.cpp @@ -28,16 +28,52 @@ **************************************************************************/ #include "basetextmark.h" - +#include "itexteditor.h" #include "basetextdocument.h" #include <coreplugin/editormanager/editormanager.h> #include <extensionsystem/pluginmanager.h> #include <QtCore/QTimer> +#include <QtGui/QIcon> + +namespace TextEditor { +namespace Internal { + +class InternalMark : public TextEditor::ITextMark +{ +public: + explicit InternalMark(BaseTextMark *parent) : m_parent(parent) {} + + virtual QIcon icon() const + { + return m_parent->icon(); + } + + virtual void updateLineNumber(int lineNumber) + { + return m_parent->updateLineNumber(lineNumber); + } + + virtual void updateBlock(const QTextBlock &block) + { + return m_parent->updateBlock(block); + } + + virtual void removedFromEditor() + { + m_parent->childRemovedFromEditor(this); + } + + virtual void documentClosing() + { + m_parent->documentClosingFor(this); + } +private: + BaseTextMark *m_parent; +}; -using namespace TextEditor; -using namespace TextEditor::Internal; +} // namespace Internal BaseTextMark::BaseTextMark(const QString &filename, int line) : m_markableInterface(0) @@ -80,7 +116,7 @@ void BaseTextMark::editorOpened(Core::IEditor *editor) if (ITextEditor *textEditor = qobject_cast<ITextEditor *>(editor)) { if (m_markableInterface == 0) { // We aren't added to something m_markableInterface = textEditor->markableInterface(); - m_internalMark = new InternalMark(this); + m_internalMark = new Internal::InternalMark(this); if (m_markableInterface->addMark(m_internalMark, m_line)) { // Handle reload of text documents, readding the mark as necessary @@ -103,13 +139,13 @@ void BaseTextMark::documentReloaded() return; m_markableInterface = doc->documentMarker(); - m_internalMark = new InternalMark(this); + m_internalMark = new Internal::InternalMark(this); if (!m_markableInterface->addMark(m_internalMark, m_line)) removeInternalMark(); } -void BaseTextMark::childRemovedFromEditor(InternalMark *mark) +void BaseTextMark::childRemovedFromEditor(Internal::InternalMark *mark) { Q_UNUSED(mark) // m_internalMark was removed from the editor @@ -117,7 +153,7 @@ void BaseTextMark::childRemovedFromEditor(InternalMark *mark) removedFromEditor(); } -void BaseTextMark::documentClosingFor(InternalMark *mark) +void BaseTextMark::documentClosingFor(Internal::InternalMark *mark) { Q_UNUSED(mark) removeInternalMark(); @@ -155,3 +191,4 @@ void BaseTextMark::moveMark(const QString & /* filename */, int /* line */) foreach (Core::IEditor *editor, em->openedEditors()) editorOpened(editor); } +} // namespace TextEditor diff --git a/src/plugins/texteditor/basetextmark.h b/src/plugins/texteditor/basetextmark.h index ad40b7571f537802ce129fd717a9edf2b1681424..909ca2681da15d9dc8f7868b64468d2704dc0294 100644 --- a/src/plugins/texteditor/basetextmark.h +++ b/src/plugins/texteditor/basetextmark.h @@ -30,8 +30,17 @@ #ifndef BASETEXTMARK_H #define BASETEXTMARK_H -#include "itexteditor.h" -#include <QtGui/QIcon> +#include "texteditor_global.h" +#include <QtCore/QObject> + +QT_BEGIN_NAMESPACE +class QIcon; +class QTextBlock; +QT_END_NAMESPACE + +namespace Core { +class IEditor; +} namespace TextEditor { @@ -47,8 +56,8 @@ class TEXTEDITOR_EXPORT BaseTextMark : public QObject Q_OBJECT public: - BaseTextMark(const QString &filename, int line); - ~BaseTextMark(); + explicit BaseTextMark(const QString &filename, int line); + virtual ~BaseTextMark(); // return your icon here virtual QIcon icon() const = 0; @@ -88,49 +97,6 @@ private: bool m_init; }; -namespace Internal { - -class InternalMark : public ITextMark -{ -public: - InternalMark(BaseTextMark *parent) - : m_parent(parent) - { - } - - ~InternalMark() - { - } - - virtual QIcon icon() const - { - return m_parent->icon(); - } - - virtual void updateLineNumber(int lineNumber) - { - return m_parent->updateLineNumber(lineNumber); - } - - virtual void updateBlock(const QTextBlock &block) - { - return m_parent->updateBlock(block); - } - - virtual void removedFromEditor() - { - m_parent->childRemovedFromEditor(this); - } - - virtual void documentClosing() - { - m_parent->documentClosingFor(this); - } -private: - BaseTextMark *m_parent; -}; - -} // namespace Internal } // namespace TextEditor #endif // BASETEXTMARK_H