diff options
author | David Schulz <david.schulz@qt.io> | 2016-08-25 13:25:45 +0200 |
---|---|---|
committer | David Schulz <david.schulz@qt.io> | 2016-08-31 05:33:56 +0000 |
commit | 89ff2c1db5ee2068cf763ff1789b17b7f2afa118 (patch) | |
tree | e09226f489917c0263745f3e54858be6abaa8868 | |
parent | b97bc4016f90435fe9e82c3c2855804a34ca97de (diff) | |
download | qt-creator-89ff2c1db5ee2068cf763ff1789b17b7f2afa118.tar.gz |
Editor: Collect indentation for a list of text blocks
Allows the indenter to reuse code formatter structures.
Task-number: QTCREATORBUG-16420
Change-Id: Ie906d7fdcb50798da02ef5b750fb03ae752aadc1
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
-rw-r--r-- | src/plugins/cpptools/cppqtstyleindenter.cpp | 18 | ||||
-rw-r--r-- | src/plugins/cpptools/cppqtstyleindenter.h | 2 | ||||
-rw-r--r-- | src/plugins/glsleditor/glslindenter.cpp | 19 | ||||
-rw-r--r-- | src/plugins/glsleditor/glslindenter.h | 2 | ||||
-rw-r--r-- | src/plugins/qmljstools/qmljsindenter.cpp | 16 | ||||
-rw-r--r-- | src/plugins/qmljstools/qmljsindenter.h | 2 | ||||
-rw-r--r-- | src/plugins/texteditor/indenter.cpp | 9 | ||||
-rw-r--r-- | src/plugins/texteditor/indenter.h | 8 | ||||
-rw-r--r-- | src/plugins/texteditor/textdocument.cpp | 44 |
9 files changed, 101 insertions, 19 deletions
diff --git a/src/plugins/cpptools/cppqtstyleindenter.cpp b/src/plugins/cpptools/cppqtstyleindenter.cpp index e1596c60c6..8877d5b49c 100644 --- a/src/plugins/cpptools/cppqtstyleindenter.cpp +++ b/src/plugins/cpptools/cppqtstyleindenter.cpp @@ -186,3 +186,21 @@ CppCodeStyleSettings CppQtStyleIndenter::codeStyleSettings() const return m_cppCodeStylePreferences->currentCodeStyleSettings(); return CppCodeStyleSettings(); } + +TextEditor::IndentationForBlock +CppQtStyleIndenter::indentationForBlocks(const QVector<QTextBlock> &blocks, + const TextEditor::TabSettings &tabSettings) +{ + QtStyleCodeFormatter codeFormatter(tabSettings, codeStyleSettings()); + + codeFormatter.updateStateUntil(blocks.last()); + + TextEditor::IndentationForBlock ret; + foreach (QTextBlock block, blocks) { + int indent; + int padding; + codeFormatter.indentFor(block, &indent, &padding); + ret.insert(block.blockNumber(), indent); + } + return ret; +} diff --git a/src/plugins/cpptools/cppqtstyleindenter.h b/src/plugins/cpptools/cppqtstyleindenter.h index 35b26d60ac..c633717618 100644 --- a/src/plugins/cpptools/cppqtstyleindenter.h +++ b/src/plugins/cpptools/cppqtstyleindenter.h @@ -58,6 +58,8 @@ public: void setCodeStylePreferences(TextEditor::ICodeStylePreferences *preferences) override; void invalidateCache(QTextDocument *doc) override; int indentFor(const QTextBlock &block, const TextEditor::TabSettings &tabSettings) override; + TextEditor::IndentationForBlock indentationForBlocks(const QVector<QTextBlock> &blocks, + const TextEditor::TabSettings &tabSettings) override; private: CppCodeStyleSettings codeStyleSettings() const; CppCodeStylePreferences *m_cppCodeStylePreferences; diff --git a/src/plugins/glsleditor/glslindenter.cpp b/src/plugins/glsleditor/glslindenter.cpp index 33aa847064..3b229f0c90 100644 --- a/src/plugins/glsleditor/glslindenter.cpp +++ b/src/plugins/glsleditor/glslindenter.cpp @@ -124,5 +124,24 @@ int GlslIndenter::indentFor(const QTextBlock &block, const TextEditor::TabSettin return indent; } +TextEditor::IndentationForBlock +GlslIndenter::indentationForBlocks(const QVector<QTextBlock> &blocks, + const TextEditor::TabSettings &tabSettings) +{ + CppTools::QtStyleCodeFormatter codeFormatter(tabSettings, + CppTools::CppToolsSettings::instance()->cppCodeStyle()->codeStyleSettings()); + + codeFormatter.updateStateUntil(blocks.last()); + + TextEditor::IndentationForBlock ret; + foreach (QTextBlock block, blocks) { + int indent; + int padding; + codeFormatter.indentFor(block, &indent, &padding); + ret.insert(block.blockNumber(), indent); + } + return ret; +} + } // namespace Internal } // namespace GlslEditor diff --git a/src/plugins/glsleditor/glslindenter.h b/src/plugins/glsleditor/glslindenter.h index e52a024b10..42696f0d99 100644 --- a/src/plugins/glsleditor/glslindenter.h +++ b/src/plugins/glsleditor/glslindenter.h @@ -48,6 +48,8 @@ public: const TextEditor::TabSettings &tabSettings) override; int indentFor(const QTextBlock &block, const TextEditor::TabSettings &tabSettings) override; + TextEditor::IndentationForBlock indentationForBlocks(const QVector<QTextBlock> &blocks, + const TextEditor::TabSettings &tabSettings) override; }; } // namespace Internal diff --git a/src/plugins/qmljstools/qmljsindenter.cpp b/src/plugins/qmljstools/qmljsindenter.cpp index 71abf832b9..bcbff019b4 100644 --- a/src/plugins/qmljstools/qmljsindenter.cpp +++ b/src/plugins/qmljstools/qmljsindenter.cpp @@ -90,3 +90,19 @@ int Indenter::indentFor(const QTextBlock &block, codeFormatter.updateStateUntil(block); return codeFormatter.indentFor(block); } + + +TextEditor::IndentationForBlock +Indenter::indentationForBlocks(const QVector<QTextBlock> &blocks, + const TextEditor::TabSettings &tabSettings) +{ + QmlJSTools::CreatorCodeFormatter codeFormatter(tabSettings); + + + codeFormatter.updateStateUntil(blocks.last()); + + TextEditor::IndentationForBlock ret; + foreach (QTextBlock block, blocks) + ret.insert(block.blockNumber(), codeFormatter.indentFor(block)); + return ret; +} diff --git a/src/plugins/qmljstools/qmljsindenter.h b/src/plugins/qmljstools/qmljsindenter.h index fb3f30c74f..1c82a1b18c 100644 --- a/src/plugins/qmljstools/qmljsindenter.h +++ b/src/plugins/qmljstools/qmljsindenter.h @@ -46,6 +46,8 @@ public: void invalidateCache(QTextDocument *doc) override; int indentFor(const QTextBlock &block, const TextEditor::TabSettings &tabSettings) override; + TextEditor::IndentationForBlock indentationForBlocks(const QVector<QTextBlock> &blocks, + const TextEditor::TabSettings &tabSettings) override; }; } // Internal diff --git a/src/plugins/texteditor/indenter.cpp b/src/plugins/texteditor/indenter.cpp index 29e9f8e2a2..4f8b428a08 100644 --- a/src/plugins/texteditor/indenter.cpp +++ b/src/plugins/texteditor/indenter.cpp @@ -118,3 +118,12 @@ int Indenter::indentFor(const QTextBlock &block, const TabSettings &tabSettings) Q_UNUSED(tabSettings) return -1; } + +IndentationForBlock Indenter::indentationForBlocks(const QVector<QTextBlock> &blocks, + const TabSettings &tabSettings) +{ + IndentationForBlock ret; + foreach (QTextBlock block, blocks) + ret.insert(block.blockNumber(), indentFor(block, tabSettings)); + return ret; +} diff --git a/src/plugins/texteditor/indenter.h b/src/plugins/texteditor/indenter.h index 08286b33f5..be78ea8541 100644 --- a/src/plugins/texteditor/indenter.h +++ b/src/plugins/texteditor/indenter.h @@ -27,6 +27,8 @@ #include "texteditor_global.h" +#include <QMap> + QT_BEGIN_NAMESPACE class QTextDocument; class QTextCursor; @@ -39,6 +41,8 @@ namespace TextEditor { class ICodeStylePreferences; class TabSettings; +using IndentationForBlock = QMap<int, int>; + class TEXTEDITOR_EXPORT Indenter { public: @@ -69,6 +73,10 @@ public: virtual void invalidateCache(QTextDocument *doc); virtual int indentFor(const QTextBlock &block, const TextEditor::TabSettings &tabSettings); + + // Expects a list of blocks in order of occurrence in the document. + virtual IndentationForBlock indentationForBlocks(const QVector<QTextBlock> &blocks, + const TextEditor::TabSettings &tabSettings); }; } // namespace TextEditor diff --git a/src/plugins/texteditor/textdocument.cpp b/src/plugins/texteditor/textdocument.cpp index 07dd48ba8e..e3e7354644 100644 --- a/src/plugins/texteditor/textdocument.cpp +++ b/src/plugins/texteditor/textdocument.cpp @@ -764,29 +764,35 @@ void TextDocument::cleanWhitespace(QTextCursor &cursor, bool cleanIndentation, b if (cursor.hasSelection()) end = d->m_document.findBlock(cursor.selectionEnd()-1).next(); + QVector<QTextBlock> blocks; while (block.isValid() && block != end) { + if (inEntireDocument || block.revision() != documentLayout->lastSaveRevision) + blocks.append(block); + block = block.next(); + } + if (blocks.isEmpty()) + return; + + const IndentationForBlock &indentations = + d->m_indenter->indentationForBlocks(blocks, d->m_tabSettings); - if (inEntireDocument || block.revision() != documentLayout->lastSaveRevision) { - - QString blockText = block.text(); - d->m_tabSettings.removeTrailingWhitespace(cursor, block); - const int indent = d->m_indenter->indentFor(block, d->m_tabSettings); - if (cleanIndentation && !d->m_tabSettings.isIndentationClean(block, indent)) { - cursor.setPosition(block.position()); - int firstNonSpace = d->m_tabSettings.firstNonSpace(blockText); - if (firstNonSpace == blockText.length()) { - cursor.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor); - cursor.removeSelectedText(); - } else { - int column = d->m_tabSettings.columnAt(blockText, firstNonSpace); - cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, firstNonSpace); - QString indentationString = d->m_tabSettings.indentationString(0, column, column - indent, block); - cursor.insertText(indentationString); - } + foreach (block, blocks) { + QString blockText = block.text(); + d->m_tabSettings.removeTrailingWhitespace(cursor, block); + const int indent = indentations[block.blockNumber()]; + if (cleanIndentation && !d->m_tabSettings.isIndentationClean(block, indent)) { + cursor.setPosition(block.position()); + int firstNonSpace = d->m_tabSettings.firstNonSpace(blockText); + if (firstNonSpace == blockText.length()) { + cursor.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor); + cursor.removeSelectedText(); + } else { + int column = d->m_tabSettings.columnAt(blockText, firstNonSpace); + cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, firstNonSpace); + QString indentationString = d->m_tabSettings.indentationString(0, column, column - indent, block); + cursor.insertText(indentationString); } } - - block = block.next(); } } |