diff options
author | Leandro Melo <leandro.melo@nokia.com> | 2010-11-05 14:27:16 +0100 |
---|---|---|
committer | Leandro Melo <leandro.melo@nokia.com> | 2010-11-05 14:28:38 +0100 |
commit | 3a684586fabf103b8e09cef31a18ffae1fd9f0c7 (patch) | |
tree | ffa3f74bd66d01f3ed1aca89c5e0ed0e65b936b0 /src/plugins/texteditor | |
parent | 1afea78c7d0f6c37f5ff6c06bfc19f0445a34875 (diff) | |
download | qt-creator-3a684586fabf103b8e09cef31a18ffae1fd9f0c7.tar.gz |
Editors: Refactor indenters out of the editors for better reusability.
Reviewed-by: ckamm
Diffstat (limited to 'src/plugins/texteditor')
-rw-r--r-- | src/plugins/texteditor/basetexteditor.cpp | 63 | ||||
-rw-r--r-- | src/plugins/texteditor/basetexteditor.h | 12 | ||||
-rw-r--r-- | src/plugins/texteditor/basetexteditor_p.h | 3 | ||||
-rw-r--r-- | src/plugins/texteditor/indenter.cpp | 78 | ||||
-rw-r--r-- | src/plugins/texteditor/indenter.h | 26 | ||||
-rw-r--r-- | src/plugins/texteditor/normalindenter.cpp | 8 | ||||
-rw-r--r-- | src/plugins/texteditor/normalindenter.h | 6 | ||||
-rw-r--r-- | src/plugins/texteditor/plaintexteditor.cpp | 9 | ||||
-rw-r--r-- | src/plugins/texteditor/plaintexteditor.h | 2 |
9 files changed, 137 insertions, 70 deletions
diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp index 9e356311bc..7457634afd 100644 --- a/src/plugins/texteditor/basetexteditor.cpp +++ b/src/plugins/texteditor/basetexteditor.cpp @@ -42,6 +42,7 @@ #include "syntaxhighlighter.h" #include "tooltip.h" #include "tipcontents.h" +#include "indenter.h" #include <aggregation/aggregate.h> #include <coreplugin/actionmanager/actionmanager.h> @@ -1877,6 +1878,17 @@ int BaseTextEditor::visibleWrapColumn() const return d->m_visibleWrapColumn; } +void BaseTextEditor::setIndenter(Indenter *indenter) +{ + // clear out existing code formatter data + for (QTextBlock it = document()->begin(); it.isValid(); it = it.next()) { + TextEditor::TextBlockUserData *userData = BaseTextDocumentLayout::testUserData(it); + if (userData) + userData->setCodeFormatterData(0); + } + d->m_indenter.reset(indenter); +} + //--------- BaseTextEditorPrivate ----------- BaseTextEditorPrivate::BaseTextEditorPrivate() @@ -3995,8 +4007,10 @@ void BaseTextEditor::zoomReset() emit requestZoomReset(); } -bool BaseTextEditor::isElectricCharacter(QChar) const +bool BaseTextEditor::isElectricCharacter(QChar ch) const { + if (!d->m_indenter.isNull()) + return d->m_indenter->isElectricCharacter(ch); return false; } @@ -4256,59 +4270,26 @@ int BaseTextEditor::paragraphSeparatorAboutToBeInserted(QTextCursor &cursor) return 1; } -void BaseTextEditor::indentBlock(QTextDocument *, QTextBlock, QChar) +void BaseTextEditor::indentBlock(QTextDocument *doc, QTextBlock block, QChar ch) { + if (!d->m_indenter.isNull()) + d->m_indenter->indentBlock(doc, block, ch, this); } void BaseTextEditor::indent(QTextDocument *doc, const QTextCursor &cursor, QChar typedChar) { maybeClearSomeExtraSelections(cursor); - if (cursor.hasSelection()) { - QTextBlock block = doc->findBlock(cursor.selectionStart()); - const QTextBlock end = doc->findBlock(cursor.selectionEnd()).next(); - do { - indentBlock(doc, block, typedChar); - block = block.next(); - } while (block.isValid() && block != end); - } else { - indentBlock(doc, cursor.block(), typedChar); - } + if (!d->m_indenter.isNull()) + d->m_indenter->indent(doc, cursor, typedChar, this); } void BaseTextEditor::reindent(QTextDocument *doc, const QTextCursor &cursor) { maybeClearSomeExtraSelections(cursor); - if (cursor.hasSelection()) { - QTextBlock block = doc->findBlock(cursor.selectionStart()); - const QTextBlock end = doc->findBlock(cursor.selectionEnd()).next(); - - const TabSettings &ts = d->m_document->tabSettings(); - - // skip empty blocks - while (block.isValid() && block != end) { - QString bt = block.text(); - if (ts.firstNonSpace(bt) < bt.size()) - break; - indentBlock(doc, block, QChar::Null); - block = block.next(); - } - - int previousIndentation = ts.indentationColumn(block.text()); - indentBlock(doc, block, QChar::Null); - int currentIndentation = ts.indentationColumn(block.text()); - int delta = currentIndentation - previousIndentation; - - block = block.next(); - while (block.isValid() && block != end) { - ts.reindentLine(block, delta); - block = block.next(); - } - } else { - indentBlock(doc, cursor.block(), QChar::Null); - } + if (!d->m_indenter.isNull()) + d->m_indenter->reindent(doc, cursor, this); } - BaseTextEditor::Link BaseTextEditor::findLinkAt(const QTextCursor &, bool) { return Link(); diff --git a/src/plugins/texteditor/basetexteditor.h b/src/plugins/texteditor/basetexteditor.h index ec51a3f86b..77caa0ff1c 100644 --- a/src/plugins/texteditor/basetexteditor.h +++ b/src/plugins/texteditor/basetexteditor.h @@ -68,6 +68,7 @@ class BehaviorSettings; class CompletionSettings; class DisplaySettings; class StorageSettings; +class Indenter; class TEXTEDITOR_EXPORT BaseTextEditorAnimator : public QObject { @@ -222,6 +223,8 @@ public: QRegion translatedLineRegion(int lineStart, int lineEnd) const; + void setIndenter(Indenter *indenter); + public slots: void setDisplayName(const QString &title); @@ -409,17 +412,16 @@ protected: void dragEnterEvent(QDragEnterEvent *e); public: - // Returns true if key triggers an indent. - virtual bool isElectricCharacter(QChar ch) const; - - void indentInsertedText(const QTextCursor &tc); - // Returns the text to complete at the cursor position, or an empty string virtual QString autoComplete(QTextCursor &cursor, const QString &text) const; // Handles backspace. When returning true, backspace processing is stopped virtual bool autoBackspace(QTextCursor &cursor); // Hook to insert special characters on enter. Returns the number of extra blocks inserted. virtual int paragraphSeparatorAboutToBeInserted(QTextCursor &cursor); + + void indentInsertedText(const QTextCursor &tc); + // Returns true if key triggers an indent. + virtual bool isElectricCharacter(QChar ch) const; // Indent a text block based on previous line. Default does nothing virtual void indentBlock(QTextDocument *doc, QTextBlock block, QChar typedChar); // Indent at cursor. Calls indentBlock for selection or current line. diff --git a/src/plugins/texteditor/basetexteditor_p.h b/src/plugins/texteditor/basetexteditor_p.h index ccdae6c4d0..bc6a3365ea 100644 --- a/src/plugins/texteditor/basetexteditor_p.h +++ b/src/plugins/texteditor/basetexteditor_p.h @@ -42,6 +42,7 @@ #include <QtCore/QBasicTimer> #include <QtCore/QSharedData> #include <QtCore/QPointer> +#include <QtCore/QScopedPointer> #include <QtGui/QPixmap> #include <QtGui/QTextEdit> @@ -292,6 +293,8 @@ public: QPointer<BaseTextEditorAnimator> m_animator; int m_cursorBlockNumber; + + QScopedPointer<Indenter> m_indenter; }; } // namespace Internal diff --git a/src/plugins/texteditor/indenter.cpp b/src/plugins/texteditor/indenter.cpp index ee2edc642a..8007b4209e 100644 --- a/src/plugins/texteditor/indenter.cpp +++ b/src/plugins/texteditor/indenter.cpp @@ -28,6 +28,7 @@ **************************************************************************/ #include "indenter.h" +#include "basetexteditor.h" #include "tabsettings.h" using namespace TextEditor; @@ -38,10 +39,79 @@ Indenter::Indenter() Indenter::~Indenter() {} +bool Indenter::isElectricCharacter(const QChar &ch) const +{ + return doIsElectricalCharacter(ch); +} + void Indenter::indentBlock(QTextDocument *doc, - QTextBlock block, - QChar typedChar, - const TabSettings &ts) + const QTextBlock &block, + const QChar &typedChar, + BaseTextEditor *editor) +{ + doIndentBlock(doc, block, typedChar, editor); +} + +void Indenter::indent(QTextDocument *doc, + const QTextCursor &cursor, + const QChar &typedChar, + BaseTextEditor *editor) +{ + doIndent(doc, cursor, typedChar, editor); +} + +void Indenter::reindent(QTextDocument *doc, const QTextCursor &cursor, BaseTextEditor *editor) +{ + doReindent(doc, cursor, editor); +} + +bool Indenter::doIsElectricalCharacter(const QChar &) const +{ + return false; +} + +void Indenter::doIndent(QTextDocument *doc, const QTextCursor &cursor, const QChar &typedChar, BaseTextEditor *editor) { - doIndentBlock(doc, block, typedChar, ts); + if (cursor.hasSelection()) { + QTextBlock block = doc->findBlock(cursor.selectionStart()); + const QTextBlock end = doc->findBlock(cursor.selectionEnd()).next(); + do { + indentBlock(doc, block, typedChar, editor); + block = block.next(); + } while (block.isValid() && block != end); + } else { + indentBlock(doc, cursor.block(), typedChar, editor); + } +} + +void Indenter::doReindent(QTextDocument *doc, const QTextCursor &cursor, BaseTextEditor *editor) +{ + if (cursor.hasSelection()) { + QTextBlock block = doc->findBlock(cursor.selectionStart()); + const QTextBlock end = doc->findBlock(cursor.selectionEnd()).next(); + + const TabSettings &ts = editor->tabSettings(); + + // skip empty blocks + while (block.isValid() && block != end) { + QString bt = block.text(); + if (ts.firstNonSpace(bt) < bt.size()) + break; + indentBlock(doc, block, QChar::Null, editor); + block = block.next(); + } + + int previousIndentation = ts.indentationColumn(block.text()); + indentBlock(doc, block, QChar::Null, editor); + int currentIndentation = ts.indentationColumn(block.text()); + int delta = currentIndentation - previousIndentation; + + block = block.next(); + while (block.isValid() && block != end) { + ts.reindentLine(block, delta); + block = block.next(); + } + } else { + indentBlock(doc, cursor.block(), QChar::Null, editor); + } } diff --git a/src/plugins/texteditor/indenter.h b/src/plugins/texteditor/indenter.h index 51b2131b28..3a58f56912 100644 --- a/src/plugins/texteditor/indenter.h +++ b/src/plugins/texteditor/indenter.h @@ -37,11 +37,12 @@ QT_BEGIN_NAMESPACE class QTextDocument; +class QTextCursor; QT_END_NAMESPACE namespace TextEditor { -class TabSettings; +class BaseTextEditor; class TEXTEDITOR_EXPORT Indenter { @@ -49,13 +50,28 @@ public: Indenter(); virtual ~Indenter(); - void indentBlock(QTextDocument *doc, QTextBlock block, QChar typedChar, const TabSettings &ts); + bool isElectricCharacter(const QChar &ch) const; + void indentBlock(QTextDocument *doc, + const QTextBlock &block, + const QChar &typedChar, + BaseTextEditor *editor); + void indent(QTextDocument *doc, + const QTextCursor &cursor, + const QChar &typedChar, + BaseTextEditor *editor); + void reindent(QTextDocument *doc, const QTextCursor &cursor, BaseTextEditor *editor); private: + virtual bool doIsElectricalCharacter(const QChar &ch) const; virtual void doIndentBlock(QTextDocument *doc, - QTextBlock block, - QChar typedChar, - const TabSettings &ts) = 0; + const QTextBlock &block, + const QChar &typedChar, + BaseTextEditor *editor) = 0; + virtual void doIndent(QTextDocument *doc, + const QTextCursor &cursor, + const QChar &typedChar, + BaseTextEditor *editor); + virtual void doReindent(QTextDocument *doc, const QTextCursor &cursor, BaseTextEditor *editor); }; } // namespace TextEditor diff --git a/src/plugins/texteditor/normalindenter.cpp b/src/plugins/texteditor/normalindenter.cpp index 7a6eb1398c..d0c84b210f 100644 --- a/src/plugins/texteditor/normalindenter.cpp +++ b/src/plugins/texteditor/normalindenter.cpp @@ -29,6 +29,7 @@ #include "normalindenter.h" #include "tabsettings.h" +#include "basetexteditor.h" #include <QtGui/QTextDocument> @@ -60,9 +61,9 @@ NormalIndenter::~NormalIndenter() // to do in 2 steps (indenting/wrapping)} // void NormalIndenter::doIndentBlock(QTextDocument *doc, - QTextBlock block, - QChar typedChar, - const TextEditor::TabSettings &ts) + const QTextBlock &block, + const QChar &typedChar, + BaseTextEditor *editor) { Q_UNUSED(typedChar) @@ -78,6 +79,7 @@ void NormalIndenter::doIndentBlock(QTextDocument *doc, // Just use previous line. // Skip blank characters when determining the indentation + const TabSettings &ts = editor->tabSettings(); int i = 0; while (i < previousText.size()) { if (!previousText.at(i).isSpace()) { diff --git a/src/plugins/texteditor/normalindenter.h b/src/plugins/texteditor/normalindenter.h index 7014f9ce3a..f66bbaef0a 100644 --- a/src/plugins/texteditor/normalindenter.h +++ b/src/plugins/texteditor/normalindenter.h @@ -42,9 +42,9 @@ public: private: virtual void doIndentBlock(QTextDocument *doc, - QTextBlock block, - QChar typedChar, - const TabSettings &ts); + const QTextBlock &block, + const QChar &typedChar, + BaseTextEditor *editor); }; } // namespace TextEditor diff --git a/src/plugins/texteditor/plaintexteditor.cpp b/src/plugins/texteditor/plaintexteditor.cpp index ea1a0b0a2c..2a738b9cfa 100644 --- a/src/plugins/texteditor/plaintexteditor.cpp +++ b/src/plugins/texteditor/plaintexteditor.cpp @@ -63,13 +63,13 @@ PlainTextEditorEditable::PlainTextEditorEditable(PlainTextEditor *editor) PlainTextEditor::PlainTextEditor(QWidget *parent) : BaseTextEditor(parent), m_isMissingSyntaxDefinition(false), - m_ignoreMissingSyntaxDefinition(false), - m_indenter(new NormalIndenter) // Currently only "normal" indentation is supported. + m_ignoreMissingSyntaxDefinition(false) { setRevisionsVisible(true); setMarksVisible(true); setRequestMarkEnabled(false); setLineSeparatorsAllowed(true); + setIndenter(new NormalIndenter); // Currently only "normal" indentation is supported. setMimeType(QLatin1String(TextEditor::Constants::C_TEXTEDITOR_MIMETYPE_TEXT)); setDisplayName(tr(Core::Constants::K_DEFAULT_TEXT_EDITOR_DISPLAY_NAME)); @@ -230,11 +230,6 @@ QString PlainTextEditor::findDefinitionId(const Core::MimeType &mimeType, return definitionId; } -void PlainTextEditor::indentBlock(QTextDocument *doc, QTextBlock block, QChar typedChar) -{ - m_indenter->indentBlock(doc, block, typedChar, tabSettings()); -} - void PlainTextEditor::acceptMissingSyntaxDefinitionInfo() { Core::ICore::instance()->showOptionsDialog(Constants::TEXT_EDITOR_SETTINGS_CATEGORY, diff --git a/src/plugins/texteditor/plaintexteditor.h b/src/plugins/texteditor/plaintexteditor.h index 45ae953271..193bba6efd 100644 --- a/src/plugins/texteditor/plaintexteditor.h +++ b/src/plugins/texteditor/plaintexteditor.h @@ -89,14 +89,12 @@ signals: protected: virtual BaseTextEditorEditable *createEditableInterface() { return new PlainTextEditorEditable(this); } - virtual void indentBlock(QTextDocument *doc, QTextBlock block, QChar typedChar); private: QString findDefinitionId(const Core::MimeType &mimeType, bool considerParents) const; bool m_isMissingSyntaxDefinition; bool m_ignoreMissingSyntaxDefinition; - QScopedPointer<Indenter> m_indenter; Utils::CommentDefinition m_commentDefinition; }; |