diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index a48dde53ea6..86976b03400 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -1573,6 +1573,7 @@ static void indentCPPBlock(const CPPEditor::TabSettings &ts,
Indenter &indenter = Indenter::instance();
indenter.setIndentSize(ts.m_indentSize);
indenter.setTabSize(ts.m_tabSize);
+ indenter.setIndentBraces(ts.m_indentBraces);
const TextEditor::TextBlockIterator current(block);
const int indent = indenter.indentForBottomLine(current, programBegin, programEnd, typedChar);
diff --git a/src/plugins/texteditor/behaviorsettingspage.cpp b/src/plugins/texteditor/behaviorsettingspage.cpp
index 94d24b05979..563c0b5a4c3 100644
--- a/src/plugins/texteditor/behaviorsettingspage.cpp
+++ b/src/plugins/texteditor/behaviorsettingspage.cpp
@@ -163,6 +163,7 @@ void BehaviorSettingsPage::settingsFromUI(TabSettings &tabSettings,
tabSettings.m_smartBackspace = m_d->m_page.smartBackspace->isChecked();
tabSettings.m_tabSize = m_d->m_page.tabSize->value();
tabSettings.m_indentSize = m_d->m_page.indentSize->value();
+ tabSettings.m_indentBraces = m_d->m_page.indentBraces->isChecked();
tabSettings.m_tabKeyBehavior = (TabSettings::TabKeyBehavior)m_d->m_page.tabKeyBehavior->currentIndex();
storageSettings.m_cleanWhitespace = m_d->m_page.cleanWhitespace->isChecked();
@@ -182,6 +183,7 @@ void BehaviorSettingsPage::settingsToUI()
m_d->m_page.smartBackspace->setChecked(tabSettings.m_smartBackspace);
m_d->m_page.tabSize->setValue(tabSettings.m_tabSize);
m_d->m_page.indentSize->setValue(tabSettings.m_indentSize);
+ m_d->m_page.indentBraces->setChecked(tabSettings.m_indentBraces);
m_d->m_page.tabKeyBehavior->setCurrentIndex(tabSettings.m_tabKeyBehavior);
const StorageSettings &storageSettings = m_d->m_storageSettings;
diff --git a/src/plugins/texteditor/behaviorsettingspage.ui b/src/plugins/texteditor/behaviorsettingspage.ui
index 52bd0970c2a..31258741672 100644
--- a/src/plugins/texteditor/behaviorsettingspage.ui
+++ b/src/plugins/texteditor/behaviorsettingspage.ui
@@ -6,7 +6,7 @@
0
0
- 463
+ 615
421
@@ -107,7 +107,7 @@
- -
+
-
Qt::Horizontal
@@ -120,7 +120,7 @@
- -
+
-
Qt::Horizontal
@@ -133,6 +133,16 @@
+ -
+
+
+ Braces will be flush with indented block, except first indent level.
+
+
+ Indent brace&s
+
+
+
-
diff --git a/src/plugins/texteditor/tabsettings.cpp b/src/plugins/texteditor/tabsettings.cpp
index daa84307667..c15c8bceee8 100644
--- a/src/plugins/texteditor/tabsettings.cpp
+++ b/src/plugins/texteditor/tabsettings.cpp
@@ -40,6 +40,7 @@ static const char *smartBackspaceKey = "SmartBackspace";
static const char *autoIndentKey = "AutoIndent";
static const char *tabSizeKey = "TabSize";
static const char *indentSizeKey = "IndentSize";
+static const char *indentBracesKey = "IndentBraces";
static const char *tabKeyBehaviorKey = "TabKeyBehavior";
static const char *groupPostfix = "TabSettings";
@@ -51,6 +52,7 @@ TabSettings::TabSettings() :
m_smartBackspace(false),
m_tabSize(8),
m_indentSize(4),
+ m_indentBraces(false),
m_tabKeyBehavior(TabNeverIndents)
{
}
@@ -66,6 +68,7 @@ void TabSettings::toSettings(const QString &category, QSettings *s) const
s->setValue(QLatin1String(smartBackspaceKey), m_smartBackspace);
s->setValue(QLatin1String(tabSizeKey), m_tabSize);
s->setValue(QLatin1String(indentSizeKey), m_indentSize);
+ s->setValue(QLatin1String(indentBracesKey), m_indentBraces);
s->setValue(QLatin1String(tabKeyBehaviorKey), m_tabKeyBehavior);
s->endGroup();
}
@@ -84,6 +87,7 @@ void TabSettings::fromSettings(const QString &category, const QSettings *s)
m_smartBackspace = s->value(group + QLatin1String(smartBackspaceKey), m_smartBackspace).toBool();
m_tabSize = s->value(group + QLatin1String(tabSizeKey), m_tabSize).toInt();
m_indentSize = s->value(group + QLatin1String(indentSizeKey), m_indentSize).toInt();
+ m_indentBraces = s->value(group + QLatin1String(indentBracesKey), m_indentBraces).toBool();
m_tabKeyBehavior = (TabKeyBehavior)s->value(group + QLatin1String(tabKeyBehaviorKey), m_tabKeyBehavior).toInt();
}
@@ -296,6 +300,7 @@ bool TabSettings::equals(const TabSettings &ts) const
&& m_smartBackspace == ts.m_smartBackspace
&& m_tabSize == ts.m_tabSize
&& m_indentSize == ts.m_indentSize
+ && m_indentBraces == ts.m_indentBraces
&& m_tabKeyBehavior == ts.m_tabKeyBehavior;
}
diff --git a/src/plugins/texteditor/tabsettings.h b/src/plugins/texteditor/tabsettings.h
index ad6c1cd6d85..4f2b4785a68 100644
--- a/src/plugins/texteditor/tabsettings.h
+++ b/src/plugins/texteditor/tabsettings.h
@@ -80,6 +80,7 @@ struct TEXTEDITOR_EXPORT TabSettings
bool m_smartBackspace;
int m_tabSize;
int m_indentSize;
+ bool m_indentBraces;
TabKeyBehavior m_tabKeyBehavior;
bool equals(const TabSettings &ts) const;
diff --git a/src/shared/indenter/indenter.h b/src/shared/indenter/indenter.h
index 2ce3dca669c..cacb550e569 100644
--- a/src/shared/indenter/indenter.h
+++ b/src/shared/indenter/indenter.h
@@ -93,6 +93,7 @@ public:
void setIndentSize(int size);
void setTabSize(int size );
+ void setIndentBraces(bool indent);
/* Return indentation for the last line of the sequence
* based on the previous lines. */
@@ -123,6 +124,7 @@ private:
IndenterInternal::Constants m_constants;
int ppHardwareTabSize;
int ppIndentSize;
+ bool ppIndentBraces;
int ppContinuationIndentSize;
Iterator yyProgramBegin;
diff --git a/src/shared/indenter/indenter_impl.h b/src/shared/indenter/indenter_impl.h
index 728d4b609df..0131f25ec6b 100644
--- a/src/shared/indenter/indenter_impl.h
+++ b/src/shared/indenter/indenter_impl.h
@@ -95,6 +95,8 @@ namespace {
line.
* ppCommentOffset is the indentation within a C-style comment,
when it cannot be picked up.
+ * ppIndentBraces will indent braces flush with an indented code
+ block.
*/
@@ -105,6 +107,7 @@ template
Indenter::Indenter() :
ppHardwareTabSize(8),
ppIndentSize(4),
+ ppIndentBraces(false),
ppContinuationIndentSize(8),
yyLinizerState(new LinizerState),
yyLine(0),
@@ -138,6 +141,12 @@ void Indenter::setTabSize(int size )
{
ppHardwareTabSize = size;
}
+
+template
+void Indenter::setIndentBraces(bool indent)
+{
+ ppIndentBraces = indent;
+}
/*
Returns the first non-space character in the string t, or
QChar::null if the string is made only of white space.
@@ -1044,6 +1053,7 @@ int Indenter::indentForBottomLine(const Iterator ¤t,
int indent;
const QChar hash = QLatin1Char('#');
+ const QChar openingBrace = QLatin1Char('{');
const QChar closingBrace = QLatin1Char('}');
const QChar colon = QLatin1Char(':');
@@ -1070,7 +1080,9 @@ int Indenter::indentForBottomLine(const Iterator ¤t,
indent = indentForStandaloneLine();
}
- if ( firstCh == closingBrace ) {
+ if ( ppIndentBraces && firstCh == openingBrace ) {
+ indent += ppIndentSize;
+ } else if ( !ppIndentBraces && firstCh == closingBrace ) {
/*
A closing brace is one level more to the left than the
code it follows.
@@ -1098,6 +1110,10 @@ int Indenter::indentForBottomLine(const Iterator ¤t,
}
}
}
+ if ( ppIndentBraces && indent == ppIndentSize &&
+ (firstCh == openingBrace || firstCh == closingBrace ) ) {
+ indent = 0;
+ }
return qMax( 0, indent );
}