Editor: Fix whitespace cleaning.

Task-number: QTCREATORBUG-7994
Change-Id: I6c197ccc3a148555018e8f8184d116c88d7ea400
Reviewed-by: Christian Stenger <christian.stenger@theqtcompany.com>
Reviewed-by: Eike Ziller <eike.ziller@theqtcompany.com>
This commit is contained in:
David Schulz
2016-01-13 14:32:23 +01:00
parent bc921b46a2
commit 9aa51d4857
22 changed files with 346 additions and 200 deletions

View File

@@ -24,6 +24,7 @@
****************************************************************************/
#include "tabsettings.h"
#include "texteditorplugin.h"
#include <utils/settingsutils.h>
@@ -42,12 +43,16 @@ static const char paddingModeKey[] = "PaddingMode";
namespace TextEditor {
TabSettings::TabSettings() :
m_tabPolicy(SpacesOnlyTabPolicy),
m_tabSize(8),
m_indentSize(4),
m_continuationAlignBehavior(ContinuationAlignWithSpaces)
TabSettings::TabSettings(TabSettings::TabPolicy tabPolicy,
int tabSize,
int indentSize,
TabSettings::ContinuationAlignBehavior continuationAlignBehavior)
: m_tabPolicy(tabPolicy)
, m_tabSize(tabSize)
, m_indentSize(indentSize)
, m_continuationAlignBehavior(continuationAlignBehavior)
{
}
void TabSettings::toSettings(const QString &category, QSettings *s) const
@@ -157,7 +162,7 @@ void TabSettings::removeTrailingWhitespace(QTextCursor cursor, QTextBlock &block
}
}
bool TabSettings::isIndentationClean(const QTextBlock &block) const
bool TabSettings::isIndentationClean(const QTextBlock &block, const int indent) const
{
int i = 0;
int spaceCount = 0;
@@ -170,10 +175,16 @@ bool TabSettings::isIndentationClean(const QTextBlock &block) const
if (c == QLatin1Char(' ')) {
++spaceCount;
if (!spacesForTabs && spaceCount == m_tabSize)
if (spaceCount == m_tabSize)
if (!spacesForTabs)
if ((m_continuationAlignBehavior != ContinuationAlignWithSpaces) || (i < indent))
return false;
if (spaceCount > indent && m_continuationAlignBehavior == NoContinuationAlign)
return false;
} else if (c == QLatin1Char('\t')) {
if (spacesForTabs || spaceCount != 0)
if (spacesForTabs || (spaceCount != 0))
return false;
if ((m_continuationAlignBehavior != ContinuationAlignWithIndent) && ((i + 1) * m_tabSize > indent))
return false;
}
++i;
@@ -275,23 +286,29 @@ bool TabSettings::guessSpacesForTabs(const QTextBlock &_block) const
return m_tabPolicy != TabsOnlyTabPolicy;
}
QString TabSettings::indentationString(int startColumn, int targetColumn, const QTextBlock &block) const
QString TabSettings::indentationString(int startColumn, int targetColumn, int padding,
const QTextBlock &block) const
{
targetColumn = qMax(startColumn, targetColumn);
if (guessSpacesForTabs(block))
return QString(targetColumn - startColumn, QLatin1Char(' '));
QString s;
int alignedStart = startColumn - (startColumn % m_tabSize) + m_tabSize;
int alignedStart = startColumn == 0 ? 0 : startColumn - (startColumn % m_tabSize) + m_tabSize;
if (alignedStart > startColumn && alignedStart <= targetColumn) {
s += QLatin1Char('\t');
startColumn = alignedStart;
}
if (int columns = targetColumn - startColumn) {
int tabs = columns / m_tabSize;
s += QString(tabs, QLatin1Char('\t'));
s += QString(columns - tabs * m_tabSize, QLatin1Char(' '));
if (m_continuationAlignBehavior == NoContinuationAlign) {
targetColumn -= padding;
padding = 0;
} else if (m_continuationAlignBehavior == ContinuationAlignWithIndent) {
padding = 0;
}
const int columns = targetColumn - padding - startColumn;
const int tabs = columns / m_tabSize;
s += QString(tabs, QLatin1Char('\t'));
s += QString(targetColumn - startColumn - tabs * m_tabSize, QLatin1Char(' '));
return s;
}
@@ -313,15 +330,7 @@ void TabSettings::indentLine(QTextBlock block, int newIndent, int padding) const
// if (indentationColumn(text) == newIndent)
// return;
QString indentString;
if (m_tabPolicy == TabsOnlyTabPolicy) {
// user likes tabs for spaces and uses tabs for indentation, preserve padding
indentString = indentationString(0, newIndent - padding, block);
indentString += QString(padding, QLatin1Char(' '));
} else {
indentString = indentationString(0, newIndent, block);
}
const QString indentString = indentationString(0, newIndent, padding, block);
if (oldBlockLength == indentString.length() && text == indentString)
return;
@@ -346,15 +355,11 @@ void TabSettings::reindentLine(QTextBlock block, int delta) const
if (oldIndent == newIndent)
return;
QString indentString;
if (m_tabPolicy == TabsOnlyTabPolicy && m_tabSize == m_indentSize) {
// user likes tabs for spaces and uses tabs for indentation, preserve padding
int padding = qMin(maximumPadding(text), newIndent);
indentString = indentationString(0, newIndent - padding, block);
indentString += QString(padding, QLatin1Char(' '));
} else {
indentString = indentationString(0, newIndent, block);
}
int padding = 0;
// user likes tabs for spaces and uses tabs for indentation, preserve padding
if (m_tabPolicy == TabsOnlyTabPolicy && m_tabSize == m_indentSize)
padding = qMin(maximumPadding(text), newIndent);
const QString indentString = indentationString(0, newIndent, padding, block);
if (oldBlockLength == indentString.length() && text == indentString)
return;