diff options
author | nyamatongwe <devnull@localhost> | 2000-04-10 03:29:08 +0000 |
---|---|---|
committer | nyamatongwe <devnull@localhost> | 2000-04-10 03:29:08 +0000 |
commit | dba48e020c0a68a84f4f5f11d5600bba90598da3 (patch) | |
tree | fb20ac39661cf0f95e9f1f2cf696fd2dcf545d4f | |
parent | 78a323542a138be07f172742fcebce0eaf203a5d (diff) | |
download | scintilla-mirror-dba48e020c0a68a84f4f5f11d5600bba90598da3.tar.gz |
Tab size and indent size can now be different.
Indentation can contain either a mixture of tabs and spaces or only spaces.
-rw-r--r-- | doc/ScintillaDoc.html | 8 | ||||
-rw-r--r-- | include/Scintilla.h | 6 | ||||
-rw-r--r-- | src/Document.cxx | 90 | ||||
-rw-r--r-- | src/Document.h | 7 | ||||
-rw-r--r-- | src/Editor.cxx | 19 |
5 files changed, 109 insertions, 21 deletions
diff --git a/doc/ScintillaDoc.html b/doc/ScintillaDoc.html index fde329522..6678f3aac 100644 --- a/doc/ScintillaDoc.html +++ b/doc/ScintillaDoc.html @@ -408,10 +408,14 @@ SCI_SETBUFFEREDDRAW(bool isbuffered) </p> <pre> SCI_SETTABWIDTH(int widthinchars) +SCI_SETINDENT(int widthinchars) +SCI_SETUSETABS(bool usetabs) </pre> <p> - Sets the size of a tab as a multiple of the size of a space character in the style of the - first style definition + SCI_SETTABWIDTH sets the size of a tab as a multiple of the size of a space character in the style of the + first style definition. SCI_SETINDENT sets the size of indentation in terms of characters. + SCI_SETUSETABS determines whether indentation should be created out of a micture of tabs + and space or be based purely on spaces. </p> <pre> SCI_SETCODEPAGE(int codepage) diff --git a/include/Scintilla.h b/include/Scintilla.h index f39ce4535..58fc6777b 100644 --- a/include/Scintilla.h +++ b/include/Scintilla.h @@ -217,6 +217,12 @@ extern "C" { #define SCI_AUTOCCOMPLETE SCI_START + 104 #define SCI_AUTOCSTOPS SCI_START + 105 +#define SCI_GETTABWIDTH SCI_START + 121 +#define SCI_SETINDENT SCI_START + 122 +#define SCI_GETINDENT SCI_START + 123 +#define SCI_SETUSETABS SCI_START + 124 +#define SCI_GETUSETABS SCI_START + 125 + #define SCI_CALLTIPSHOW SCI_START + 200 #define SCI_CALLTIPCANCEL SCI_START + 201 #define SCI_CALLTIPACTIVE SCI_START + 202 diff --git a/src/Document.cxx b/src/Document.cxx index 44e55671f..7e4b888fc 100644 --- a/src/Document.cxx +++ b/src/Document.cxx @@ -34,6 +34,8 @@ Document::Document() { enteredCount = 0; enteredReadOnlyCount = 0; tabInChars = 8; + indentInChars = 0; + useTabs = true; watchers = 0; lenWatchers = 0; } @@ -501,26 +503,76 @@ int Document::DelCharBack(int pos) { } } -void Document::Indent(bool forwards, int lineBottom, int lineTop) { - if (forwards) { - // Indent by a tab - for (int line = lineBottom; line >= lineTop; line--) { - InsertChar(LineStart(line), '\t'); +static bool isindentchar(char ch) { + return (ch == ' ') || (ch == '\t'); +} + +static int NextTab(int pos, int tabSize) { + return ((pos / tabSize) + 1) * tabSize; +} + +static void CreateIndentation(char *linebuf, int length, int indent, int tabSize, bool insertSpaces) { + length--; // ensure space for \0 + if (!insertSpaces) { + while ((indent >= tabSize) && (length > 0)) { + *linebuf++ = '\t'; + indent -= tabSize; + length--; } - } else { - // Dedent - suck white space off the front of the line to dedent by equivalent of a tab - for (int line = lineBottom; line >= lineTop; line--) { - int ispc = 0; - while (ispc < tabInChars && cb.CharAt(LineStart(line) + ispc) == ' ') - ispc++; - int posStartLine = LineStart(line); - if (ispc == tabInChars) { - DeleteChars(posStartLine, ispc); - } else if (cb.CharAt(posStartLine + ispc) == '\t') { - DeleteChars(posStartLine, ispc + 1); - } else { // Hit a non-white - DeleteChars(posStartLine, ispc); - } + } + while ((indent > 0) && (length > 0)) { + *linebuf++ = ' '; + indent--; + length--; + } + *linebuf = '\0'; +} + +int Document::GetLineIndentation(int line) { + int indent = 0; + if (line >= 0) { + int lineStart = LineStart(line); + int length = Length(); + for (int i=lineStart;i<length;i++) { + char ch = cb.CharAt(i); + if (ch == ' ') + indent++; + else if (ch == '\t') + indent = NextTab(indent, tabInChars); + else + return indent; + } + } + return indent; +} + +int Document::GetLineIndentPosition(int line) { + int pos = LineStart(line); + int length = Length(); + while ((pos < length) && isindentchar(cb.CharAt(pos))) { + pos++; + } + return pos; +} + +void Document::Indent(bool forwards, int lineBottom, int lineTop) { + char linebuf[1000]; + // Dedent - suck white space off the front of the line to dedent by equivalent of a tab + for (int line = lineBottom; line >= lineTop; line--) { + int indentOfLine = GetLineIndentation(line); + int indentNew = indentOfLine; + if (forwards) + indentNew += IndentSize(); + else + indentNew -= IndentSize(); + if (indentNew < 0) + indentNew = 0; + if (indentNew != indentOfLine) { + CreateIndentation(linebuf, sizeof(linebuf), indentNew, tabInChars, !useTabs); + int thisLineStart = LineStart(line); + int indentPos = GetLineIndentPosition(line); + DeleteChars(thisLineStart, indentPos - thisLineStart); + InsertString(thisLineStart, linebuf); } } } diff --git a/src/Document.h b/src/Document.h index 2e00efee5..af449ac73 100644 --- a/src/Document.h +++ b/src/Document.h @@ -90,6 +90,8 @@ public: // dbcsCodePage can also be SC_CP_UTF8 to enable UTF-8 mode int dbcsCodePage; int tabInChars; + int indentInChars; + bool useTabs; Document(); virtual ~Document(); @@ -182,10 +184,15 @@ private: bool IsWordChar(unsigned char ch); bool IsWordAt(int start, int end); void ModifiedAt(int pos); + + int GetLineIndentation(int line); + int GetLineIndentPosition(int line); void NotifyModifyAttempt(); void NotifySavePoint(bool atSavePoint); void NotifyModified(DocModification mh); + + int IndentSize() { return indentInChars ? indentInChars : tabInChars; } }; // To optimise processing of document modifications by DocWatchers, a hint is passed indicating the diff --git a/src/Editor.cxx b/src/Editor.cxx index 677013a00..ef6b4b450 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -3365,6 +3365,25 @@ LRESULT Editor::WndProc(UINT iMessage, WPARAM wParam, LPARAM lParam) { InvalidateStyleRedraw(); break; + case SCI_GETTABWIDTH: + return pdoc->tabInChars; + + case SCI_SETINDENT: + pdoc->indentInChars = wParam; + InvalidateStyleRedraw(); + break; + + case SCI_GETINDENT: + return pdoc->indentInChars; + + case SCI_SETUSETABS: + pdoc->useTabs = wParam; + InvalidateStyleRedraw(); + break; + + case SCI_GETUSETABS: + return pdoc->useTabs; + case SCI_SETCODEPAGE: pdoc->dbcsCodePage = wParam; break; |