} else {
++_blocksTokenized;
- const QString blockText = _block.text();
+ QString blockText = _block.text();
+ _text.prepend(QLatin1Char('\n'));
_text.prepend(blockText);
QList<SimpleToken> adaptedTokens;
for (int i = 0; i < _tokens.size(); ++i) {
SimpleToken t = _tokens.at(i);
- t.setPosition(t.position() + blockText.length());
+ t.setPosition(t.position() + blockText.length() + 1);
t.setText(_text.midRef(t.position(), t.length()));
adaptedTokens.append(t);
}
return start;
}
-int BackwardsScanner::indentation(int index) const
+QString BackwardsScanner::indentationString(int index) const
{
- SimpleToken newline = operator[](startOfLine(index + 1));
- return newline.position();
+ const SimpleToken tokenAfterNewline = operator[](startOfLine(index + 1));
+ const int newlinePos = qMax(0, _text.lastIndexOf(QLatin1Char('\n'), tokenAfterNewline.position()));
+ return _text.mid(newlinePos, tokenAfterNewline.position() - newlinePos);
}
ts.indentLine(block, indent);
}
+static int indentationColumn(const TextEditor::TabSettings &tabSettings,
+ const BackwardsScanner &scanner,
+ int index)
+{
+ return tabSettings.indentationColumn(scanner.indentationString(index));
+}
+
void CPPEditor::indentBlock(QTextDocument *doc, QTextBlock block, QChar typedChar)
{
QTextCursor tc(block);
tc.movePosition(QTextCursor::EndOfBlock);
+ const TabSettings &ts = tabSettings();
+
BackwardsScanner tk(tc, QString(), 400);
const int tokenCount = tk.startToken();
- const int indentSize = tabSettings().m_indentSize;
if (tokenCount != 0) {
const SimpleToken firstToken = tk[0];
if (firstToken.is(T_COLON)) {
- const int indent = tk.indentation(-1) + // indentation of the previous newline
- indentSize;
- tabSettings().indentLine(block, indent);
+ const int previousLineIndent = indentationColumn(ts, tk, -1);
+ ts.indentLine(block, previousLineIndent + ts.m_indentSize);
return;
} else if ((firstToken.is(T_PUBLIC) || firstToken.is(T_PROTECTED) || firstToken.is(T_PRIVATE) ||
firstToken.is(T_Q_SIGNALS) || firstToken.is(T_Q_SLOTS)) &&
tk.size() > 1 && tk[1].is(T_COLON)) {
const int startOfBlock = tk.startOfBlock(0);
if (startOfBlock != 0) {
- const int indent = tk.indentation(startOfBlock);
- tabSettings().indentLine(block, indent);
+ const int indent = indentationColumn(ts, tk, startOfBlock);
+ ts.indentLine(block, indent);
return;
}
} else if (firstToken.is(T_CASE) || firstToken.is(T_DEFAULT)) {
const int startOfBlock = tk.startOfBlock(0);
if (startOfBlock != 0) {
- const int indent = tk.indentation(startOfBlock);
- tabSettings().indentLine(block, indent);
+ const int indent = indentationColumn(ts, tk, startOfBlock);
+ ts.indentLine(block, indent);
return;
}
return;
const QString spell = tk.text(tokenIndex);
if (tk[tokenIndex].followsNewline() && (spell.startsWith(QLatin1String("QT_")) ||
spell.startsWith(QLatin1String("Q_")))) {
- const int indent = tk.indentation(tokenIndex);
- tabSettings().indentLine(block, indent);
+ const int indent = indentationColumn(ts, tk, tokenIndex);
+ ts.indentLine(block, indent);
return;
}
}
const TextEditor::TextBlockIterator begin(doc->begin());
const TextEditor::TextBlockIterator end(block.next());
- indentCPPBlock(tabSettings(), block, begin, end, typedChar);
+ indentCPPBlock(ts, block, begin, end, typedChar);
}
bool CPPEditor::event(QEvent *e)
foreach (QAction *action, contextMenu->actions())
menu->addAction(action);
- const QList<QTextEdit::ExtraSelection> selections =
- extraSelections(BaseTextEditor::CodeSemanticsSelection);
-
appendStandardContextMenuActions(menu);
menu->exec(e->globalPos());