summaryrefslogtreecommitdiff
path: root/src/plugins/texteditor
diff options
context:
space:
mode:
authorIvan Donchevskii <ivan.donchevskii@qt.io>2018-08-29 15:58:13 +0200
committerIvan Donchevskii <ivan.donchevskii@qt.io>2018-09-12 07:59:30 +0000
commitca84a51f867988cc4a6b3f4058ab6dc9f9badf84 (patch)
treeeaa86c03279048c99281be9046435c5df9d40c4b /src/plugins/texteditor
parentb95b675e41e6d7bba54733119f5f2e55c7d39133 (diff)
downloadqt-creator-ca84a51f867988cc4a6b3f4058ab6dc9f9badf84.tar.gz
Clang: Use clang-format for indentation
This is the new experimental plugin based on LibFormat. It replaces the default indenter for CppEditorDocument and applies clang-format after the CR or the set of 'electric' characters. Uses the global .clang-format kept in QtC settings or the one for current project. Both can be configured. For indentation some style modifications and code manipulations are done to prevent line shrinking when it's not expected. Manual indentation uses unmodified style from .clang-format file. Change-Id: I6279b805e418e1804b553efa615f5c843f395a58 Reviewed-by: Marco Bubke <marco.bubke@qt.io>
Diffstat (limited to 'src/plugins/texteditor')
-rw-r--r--src/plugins/texteditor/formattexteditor.cpp2
-rw-r--r--src/plugins/texteditor/indenter.cpp3
-rw-r--r--src/plugins/texteditor/indenter.h8
-rw-r--r--src/plugins/texteditor/textdocument.cpp69
-rw-r--r--src/plugins/texteditor/textdocument.h5
-rw-r--r--src/plugins/texteditor/texteditor.cpp35
6 files changed, 69 insertions, 53 deletions
diff --git a/src/plugins/texteditor/formattexteditor.cpp b/src/plugins/texteditor/formattexteditor.cpp
index d38c863cca..d3ad772eba 100644
--- a/src/plugins/texteditor/formattexteditor.cpp
+++ b/src/plugins/texteditor/formattexteditor.cpp
@@ -290,7 +290,7 @@ static void showError(const QString &error)
* Checks the state of @a task and if the formatting was successful calls updateEditorText() with
* the respective members of @a task.
*/
-void checkAndApplyTask(const FormatTask &task)
+static void checkAndApplyTask(const FormatTask &task)
{
if (!task.error.isEmpty()) {
showError(task.error);
diff --git a/src/plugins/texteditor/indenter.cpp b/src/plugins/texteditor/indenter.cpp
index 4f8b428a08..e5d939d29e 100644
--- a/src/plugins/texteditor/indenter.cpp
+++ b/src/plugins/texteditor/indenter.cpp
@@ -59,7 +59,8 @@ void Indenter::indentBlock(QTextDocument *doc,
void Indenter::indent(QTextDocument *doc,
const QTextCursor &cursor,
const QChar &typedChar,
- const TabSettings &tabSettings)
+ const TabSettings &tabSettings,
+ bool /*autoTriggered*/)
{
if (cursor.hasSelection()) {
QTextBlock block = doc->findBlock(cursor.selectionStart());
diff --git a/src/plugins/texteditor/indenter.h b/src/plugins/texteditor/indenter.h
index be78ea8541..5b5cdb6a55 100644
--- a/src/plugins/texteditor/indenter.h
+++ b/src/plugins/texteditor/indenter.h
@@ -27,6 +27,8 @@
#include "texteditor_global.h"
+#include "tabsettings.h"
+
#include <QMap>
QT_BEGIN_NAMESPACE
@@ -62,7 +64,8 @@ public:
virtual void indent(QTextDocument *doc,
const QTextCursor &cursor,
const QChar &typedChar,
- const TabSettings &tabSettings);
+ const TabSettings &tabSettings,
+ bool autoTriggered = true);
// Reindent at cursor. Selection will be adjusted according to the indentation
// change of the first block.
@@ -77,6 +80,9 @@ public:
// Expects a list of blocks in order of occurrence in the document.
virtual IndentationForBlock indentationForBlocks(const QVector<QTextBlock> &blocks,
const TextEditor::TabSettings &tabSettings);
+
+ virtual bool hasTabSettings() const { return false; }
+ virtual TabSettings tabSettings() const { return TabSettings(); }
};
} // namespace TextEditor
diff --git a/src/plugins/texteditor/textdocument.cpp b/src/plugins/texteditor/textdocument.cpp
index 63d29f1dcd..6293a747a7 100644
--- a/src/plugins/texteditor/textdocument.cpp
+++ b/src/plugins/texteditor/textdocument.cpp
@@ -83,6 +83,7 @@ public:
}
QTextCursor indentOrUnindent(const QTextCursor &textCursor, bool doIndent,
+ const TabSettings &tabSettings,
bool blockSelection = false, int column = 0,
int *offset = nullptr);
void resetRevisions();
@@ -110,17 +111,16 @@ public:
};
QTextCursor TextDocumentPrivate::indentOrUnindent(const QTextCursor &textCursor, bool doIndent,
+ const TabSettings &tabSettings,
bool blockSelection, int columnIn, int *offset)
{
QTextCursor cursor = textCursor;
cursor.beginEditBlock();
- TabSettings &ts = m_tabSettings;
-
// Indent or unindent the selected lines
int pos = cursor.position();
int column = blockSelection ? columnIn
- : ts.columnAt(cursor.block().text(), cursor.positionInBlock());
+ : tabSettings.columnAt(cursor.block().text(), cursor.positionInBlock());
int anchor = cursor.anchor();
int start = qMin(anchor, pos);
int end = qMax(anchor, pos);
@@ -140,12 +140,13 @@ QTextCursor TextDocumentPrivate::indentOrUnindent(const QTextCursor &textCursor,
if (cursor.hasSelection() && !blockSelection && !oneLinePartial) {
for (QTextBlock block = startBlock; block != endBlock; block = block.next()) {
const QString text = block.text();
- int indentPosition = ts.lineIndentPosition(text);
+ int indentPosition = tabSettings.lineIndentPosition(text);
if (!doIndent && !indentPosition)
- indentPosition = ts.firstNonSpace(text);
- int targetColumn = ts.indentedColumn(ts.columnAt(text, indentPosition), doIndent);
+ indentPosition = tabSettings.firstNonSpace(text);
+ int targetColumn = tabSettings.indentedColumn(
+ tabSettings.columnAt(text, indentPosition), doIndent);
cursor.setPosition(block.position() + indentPosition);
- cursor.insertText(ts.indentationString(0, targetColumn, 0, block));
+ cursor.insertText(tabSettings.indentationString(0, targetColumn, 0, block));
cursor.setPosition(block.position());
cursor.setPosition(block.position() + indentPosition, QTextCursor::KeepAnchor);
cursor.removeSelectedText();
@@ -170,27 +171,30 @@ QTextCursor TextDocumentPrivate::indentOrUnindent(const QTextCursor &textCursor,
for (QTextBlock block = startBlock; block != endBlock; block = block.next()) {
QString text = block.text();
- int blockColumn = ts.columnAt(text, text.size());
+ int blockColumn = tabSettings.columnAt(text, text.size());
if (blockColumn < column) {
cursor.setPosition(block.position() + text.size());
- cursor.insertText(ts.indentationString(blockColumn, column, 0, block));
+ cursor.insertText(tabSettings.indentationString(blockColumn, column, 0, block));
text = block.text();
}
- int indentPosition = ts.positionAtColumn(text, column, nullptr, true);
- int spaces = ts.spacesLeftFromPosition(text, indentPosition);
- int startColumn = ts.columnAt(text, indentPosition - spaces);
- int targetColumn = ts.indentedColumn(ts.columnAt(text, indentPosition), doIndent);
+ int indentPosition = tabSettings.positionAtColumn(text, column, nullptr, true);
+ int spaces = tabSettings.spacesLeftFromPosition(text, indentPosition);
+ int startColumn = tabSettings.columnAt(text, indentPosition - spaces);
+ int targetColumn = tabSettings.indentedColumn(
+ tabSettings.columnAt(text, indentPosition), doIndent);
cursor.setPosition(block.position() + indentPosition);
cursor.setPosition(block.position() + indentPosition - spaces, QTextCursor::KeepAnchor);
cursor.removeSelectedText();
- cursor.insertText(ts.indentationString(startColumn, targetColumn, 0, block));
+ cursor.insertText(tabSettings.indentationString(startColumn, targetColumn, 0, block));
}
// Preserve initial anchor of block selection
if (blockSelection) {
end = cursor.position();
- if (offset)
- *offset = ts.columnAt(cursor.block().text(), cursor.positionInBlock()) - column;
+ if (offset) {
+ *offset = tabSettings.columnAt(cursor.block().text(), cursor.positionInBlock())
+ - column;
+ }
cursor.setPosition(start);
cursor.setPosition(end, QTextCursor::KeepAnchor);
}
@@ -330,19 +334,19 @@ const StorageSettings &TextDocument::storageSettings() const
return d->m_storageSettings;
}
-void TextDocument::setTabSettings(const TabSettings &tabSettings)
+void TextDocument::setTabSettings(const TabSettings &newTabSettings)
{
- if (tabSettings == d->m_tabSettings)
+ if (newTabSettings == d->m_tabSettings)
return;
- d->m_tabSettings = tabSettings;
+ d->m_tabSettings = newTabSettings;
if (Highlighter *highlighter = qobject_cast<Highlighter *>(d->m_highlighter))
- highlighter->setTabSettings(tabSettings);
+ highlighter->setTabSettings(tabSettings());
emit tabSettingsChanged();
}
-const TabSettings &TextDocument::tabSettings() const
+TabSettings TextDocument::tabSettings() const
{
return d->m_tabSettings;
}
@@ -412,26 +416,26 @@ void TextDocument::setExtraEncodingSettings(const ExtraEncodingSettings &extraEn
d->m_extraEncodingSettings = extraEncodingSettings;
}
-void TextDocument::autoIndent(const QTextCursor &cursor, QChar typedChar)
+void TextDocument::autoIndent(const QTextCursor &cursor, QChar typedChar, bool autoTriggered)
{
- d->m_indenter->indent(&d->m_document, cursor, typedChar, d->m_tabSettings);
+ d->m_indenter->indent(&d->m_document, cursor, typedChar, tabSettings(), autoTriggered);
}
void TextDocument::autoReindent(const QTextCursor &cursor)
{
- d->m_indenter->reindent(&d->m_document, cursor, d->m_tabSettings);
+ d->m_indenter->reindent(&d->m_document, cursor, tabSettings());
}
QTextCursor TextDocument::indent(const QTextCursor &cursor, bool blockSelection, int column,
int *offset)
{
- return d->indentOrUnindent(cursor, true, blockSelection, column, offset);
+ return d->indentOrUnindent(cursor, true, tabSettings(), blockSelection, column, offset);
}
QTextCursor TextDocument::unindent(const QTextCursor &cursor, bool blockSelection, int column,
int *offset)
{
- return d->indentOrUnindent(cursor, false, blockSelection, column, offset);
+ return d->indentOrUnindent(cursor, false, tabSettings(), blockSelection, column, offset);
}
const ExtraEncodingSettings &TextDocument::extraEncodingSettings() const
@@ -814,23 +818,24 @@ void TextDocument::cleanWhitespace(QTextCursor &cursor, bool cleanIndentation, b
if (blocks.isEmpty())
return;
+ const TabSettings currentTabSettings = tabSettings();
const IndentationForBlock &indentations =
- d->m_indenter->indentationForBlocks(blocks, d->m_tabSettings);
+ d->m_indenter->indentationForBlocks(blocks, currentTabSettings);
foreach (block, blocks) {
QString blockText = block.text();
- d->m_tabSettings.removeTrailingWhitespace(cursor, block);
+ currentTabSettings.removeTrailingWhitespace(cursor, block);
const int indent = indentations[block.blockNumber()];
- if (cleanIndentation && !d->m_tabSettings.isIndentationClean(block, indent)) {
+ if (cleanIndentation && !currentTabSettings.isIndentationClean(block, indent)) {
cursor.setPosition(block.position());
- int firstNonSpace = d->m_tabSettings.firstNonSpace(blockText);
+ int firstNonSpace = currentTabSettings.firstNonSpace(blockText);
if (firstNonSpace == blockText.length()) {
cursor.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor);
cursor.removeSelectedText();
} else {
- int column = d->m_tabSettings.columnAt(blockText, firstNonSpace);
+ int column = currentTabSettings.columnAt(blockText, firstNonSpace);
cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, firstNonSpace);
- QString indentationString = d->m_tabSettings.indentationString(0, column, column - indent, block);
+ QString indentationString = currentTabSettings.indentationString(0, column, column - indent, block);
cursor.insertText(indentationString);
}
}
diff --git a/src/plugins/texteditor/textdocument.h b/src/plugins/texteditor/textdocument.h
index 3b526c24a7..e05d202ead 100644
--- a/src/plugins/texteditor/textdocument.h
+++ b/src/plugins/texteditor/textdocument.h
@@ -81,13 +81,14 @@ public:
const TypingSettings &typingSettings() const;
const StorageSettings &storageSettings() const;
- const TabSettings &tabSettings() const;
+ virtual TabSettings tabSettings() const;
const ExtraEncodingSettings &extraEncodingSettings() const;
const FontSettings &fontSettings() const;
void setIndenter(Indenter *indenter);
Indenter *indenter() const;
- void autoIndent(const QTextCursor &cursor, QChar typedChar = QChar::Null);
+ void autoIndent(const QTextCursor &cursor, QChar typedChar = QChar::Null,
+ bool autoTriggered = true);
void autoReindent(const QTextCursor &cursor);
QTextCursor indent(const QTextCursor &cursor, bool blockSelection = false, int column = 0,
int *offset = nullptr);
diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp
index 9e02bd440c..fbbdae1809 100644
--- a/src/plugins/texteditor/texteditor.cpp
+++ b/src/plugins/texteditor/texteditor.cpp
@@ -2451,7 +2451,7 @@ void TextEditorWidget::keyPressEvent(QKeyEvent *e)
}
QTextCursor cursor = textCursor();
- const TabSettings &ts = d->m_document->tabSettings();
+ const TabSettings ts = d->m_document->tabSettings();
const TypingSettings &tps = d->m_document->typingSettings();
cursor.beginEditBlock();
@@ -2474,6 +2474,7 @@ void TextEditorWidget::keyPressEvent(QKeyEvent *e)
e->accept();
if (extraBlocks > 0) {
+ const int cursorPosition = cursor.position();
QTextCursor ensureVisible = cursor;
while (extraBlocks > 0) {
--extraBlocks;
@@ -2491,6 +2492,7 @@ void TextEditorWidget::keyPressEvent(QKeyEvent *e)
}
}
setTextCursor(ensureVisible);
+ cursor.setPosition(cursorPosition);
}
setTextCursor(cursor);
@@ -3738,7 +3740,7 @@ QString TextEditorWidgetPrivate::copyBlockSelection()
if (!m_inBlockSelectionMode)
return QString();
QString selection;
- const TabSettings &ts = m_document->tabSettings();
+ const TabSettings ts = m_document->tabSettings();
QTextBlock block =
m_document->document()->findBlockByNumber(m_blockSelection.firstBlockNumber());
const QTextBlock &lastBlock =
@@ -3780,7 +3782,7 @@ QString TextEditorWidgetPrivate::copyBlockSelection()
void TextEditorWidgetPrivate::setCursorToColumn(QTextCursor &cursor, int column, QTextCursor::MoveMode moveMode)
{
- const TabSettings &ts = m_document->tabSettings();
+ const TabSettings ts = m_document->tabSettings();
int offset = 0;
const int cursorPosition = cursor.position();
const int pos = ts.positionAtColumn(cursor.block().text(), column, &offset);
@@ -3841,7 +3843,7 @@ void TextEditorWidgetPrivate::insertIntoBlockSelection(const QString &text)
- m_blockSelection.firstBlockNumber();
const int textNewLineCount = text.count(QLatin1Char('\n')) ;
QStringList textLines = text.split(QLatin1Char('\n'));
- const TabSettings &ts = m_document->tabSettings();
+ const TabSettings ts = m_document->tabSettings();
int textLength = 0;
const QStringList::const_iterator endLine = textLines.constEnd();
for (QStringList::const_iterator textLine = textLines.constBegin(); textLine != endLine; ++textLine)
@@ -3903,7 +3905,7 @@ void TextEditorWidgetPrivate::removeBlockSelection()
cursor.clearSelection();
cursor.beginEditBlock();
- const TabSettings &ts = m_document->tabSettings();
+ const TabSettings ts = m_document->tabSettings();
QTextBlock block = m_document->document()->findBlockByNumber(m_blockSelection.firstBlockNumber());
const QTextBlock &lastBlock = m_document->document()->findBlockByNumber(m_blockSelection.lastBlockNumber());
for (;;) {
@@ -3930,7 +3932,7 @@ void TextEditorWidgetPrivate::removeBlockSelection()
void TextEditorWidgetPrivate::enableBlockSelection(const QTextCursor &cursor)
{
- const TabSettings &ts = m_document->tabSettings();
+ const TabSettings ts = m_document->tabSettings();
const QTextBlock &positionTextBlock = cursor.block();
int positionBlock = positionTextBlock.blockNumber();
int positionColumn = ts.columnAt(positionTextBlock.text(),
@@ -4350,7 +4352,7 @@ void TextEditorWidgetPrivate::paintFindScope(const PaintEventData &data, QPainte
&& block.position() <= m_findScopeEnd.block().position()) {
QTextLayout *layout = block.layout();
QString text = block.text();
- const TabSettings &ts = m_document->tabSettings();
+ const TabSettings ts = m_document->tabSettings();
qreal spacew = QFontMetricsF(q->font()).width(QLatin1Char(' '));
int offset = 0;
@@ -4440,7 +4442,7 @@ void TextEditorWidgetPrivate::paintBlockSelection(const PaintEventData &data, QP
QTextLayout *layout = data.block.layout();
QRectF blockBoundingRect = q->blockBoundingRect(data.block).translated(data.offset);
QString text = data.block.text();
- const TabSettings &tabSettings = m_document->tabSettings();
+ const TabSettings tabSettings = m_document->tabSettings();
const qreal spacew = QFontMetricsF(q->font()).width(QLatin1Char(' '));
const int cursorw = q->overwriteMode() ? QFontMetrics(q->font()).width(QLatin1Char(' '))
: q->cursorWidth();
@@ -4726,7 +4728,7 @@ void TextEditorWidgetPrivate::setupSelections(const PaintEventData &data,
o.format = range.format;
if (i == data.blockSelectionIndex) {
QString text = data.block.text();
- const TabSettings &ts = m_document->tabSettings();
+ const TabSettings ts = m_document->tabSettings();
o.start = ts.positionAtColumn(text, m_blockSelection.firstVisualColumn());
o.length = ts.positionAtColumn(text, m_blockSelection.lastVisualColumn()) - o.start;
}
@@ -5511,12 +5513,13 @@ void TextEditorWidget::mouseMoveEvent(QMouseEvent *e)
QPlainTextEdit::mouseMoveEvent(e);
if (e->modifiers() & Qt::AltModifier) {
+ const TabSettings tabSettings = d->m_document->tabSettings();
if (!d->m_inBlockSelectionMode) {
if (textCursor().hasSelection()) {
d->enableBlockSelection(textCursor());
} else {
const QTextCursor &cursor = cursorForPosition(e->pos());
- int column = d->m_document->tabSettings().columnAt(
+ int column = tabSettings.columnAt(
cursor.block().text(), cursor.positionInBlock());
if (cursor.positionInBlock() == cursor.block().length()-1)
column += (e->pos().x() - cursorRect().center().x()) / QFontMetricsF(font()).width(QLatin1Char(' '));
@@ -5529,7 +5532,7 @@ void TextEditorWidget::mouseMoveEvent(QMouseEvent *e)
const QTextCursor &cursor = textCursor();
// get visual column
- int column = d->m_document->tabSettings().columnAt(
+ int column = tabSettings.columnAt(
cursor.block().text(), cursor.positionInBlock());
if (cursor.positionInBlock() == cursor.block().length()-1)
column += (e->pos().x() - cursorRect().center().x()) / QFontMetricsF(font()).width(QLatin1Char(' '));
@@ -6056,7 +6059,7 @@ void TextEditorWidgetPrivate::handleBackspaceKey()
cursorWithinSnippet = snippetCheckCursor(snippetCursor);
}
- const TabSettings &tabSettings = m_document->tabSettings();
+ const TabSettings tabSettings = m_document->tabSettings();
const TypingSettings &typingSettings = m_document->typingSettings();
if (typingSettings.m_autoIndent
@@ -7131,7 +7134,7 @@ void TextEditorWidget::format()
{
QTextCursor cursor = textCursor();
cursor.beginEditBlock();
- d->m_document->autoIndent(cursor);
+ d->m_document->autoIndent(cursor, QChar::Null, false);
cursor.endEditBlock();
}
@@ -8059,7 +8062,7 @@ QTextCursor TextBlockSelection::cursor(const TextDocument *baseTextDocument,
if (!baseTextDocument)
return QTextCursor();
QTextDocument *document = baseTextDocument->document();
- const TabSettings &ts = baseTextDocument->tabSettings();
+ const TabSettings ts = baseTextDocument->tabSettings();
int selectionAnchorColumn;
int selectionPositionColumn;
@@ -8119,7 +8122,7 @@ bool TextEditorWidget::inFindScope(int selectionStart, int selectionEnd)
if (block != document()->findBlock(selectionEnd))
return false;
QString text = block.text();
- const TabSettings &ts = d->m_document->tabSettings();
+ const TabSettings ts = d->m_document->tabSettings();
int startPosition = ts.positionAtColumn(text, d->m_findScopeVerticalBlockSelectionFirstColumn);
int endPosition = ts.positionAtColumn(text, d->m_findScopeVerticalBlockSelectionLastColumn);
if (selectionStart - block.position() < startPosition)
@@ -8246,7 +8249,7 @@ void TextEditorWidgetPrivate::transformSelection(TransformationMethod method)
void TextEditorWidgetPrivate::transformBlockSelection(TransformationMethod method)
{
QTextCursor cursor = q->textCursor();
- const TabSettings &ts = m_document->tabSettings();
+ const TabSettings ts = m_document->tabSettings();
// saved to restore the blockselection
const int positionColumn = m_blockSelection.positionColumn;