SF.net SVN: geany:[5521] trunk
ntrel at users.sourceforge.net
ntrel at xxxxx
Mon Jan 10 17:21:50 UTC 2011
Revision: 5521
http://geany.svn.sourceforge.net/geany/?rev=5521&view=rev
Author: ntrel
Date: 2011-01-10 17:21:48 +0000 (Mon, 10 Jan 2011)
Log Message:
-----------
Merge unstable branch:
- src/utils.c:
Fix detecting non-lowercase self-closing tags e.g. <BR> (#2226117).
- src/notebook.c:
Add 'Open in New Window' command in the notebook tab menu (based on
patch by Matthew Brush, thanks - #3118059).
- data/filetypes.cpp, data/filetypes.vala, data/filetypes.glsl,
data/filetypes.cs, data/filetypes.c:
Disable preprocessor #define tracking for the CPP lexer
(enabled by default in Scintilla).
- scintilla/*, wscript:
Update Scintilla to version 2.22.
Use Scintilla's directory structure mostly and only remove
unused lexers.
Modified Paths:
--------------
trunk/ChangeLog
trunk/data/filetypes.c
trunk/data/filetypes.cpp
trunk/data/filetypes.cs
trunk/data/filetypes.glsl
trunk/data/filetypes.vala
trunk/scintilla/Makefile.am
trunk/scintilla/include/Makefile.am
trunk/scintilla/include/SciLexer.h
trunk/scintilla/include/Scintilla.h
trunk/scintilla/include/Scintilla.iface
trunk/scintilla/include/ScintillaWidget.h
trunk/scintilla/makefile.win32
trunk/scintilla/scintilla_changes.patch
trunk/src/notebook.c
trunk/src/utils.c
trunk/wscript
Added Paths:
-----------
trunk/scintilla/gtk/
trunk/scintilla/gtk/Converter.h
trunk/scintilla/gtk/PlatGTK.cxx
trunk/scintilla/gtk/ScintillaGTK.cxx
trunk/scintilla/gtk/scintilla-marshal.c
trunk/scintilla/gtk/scintilla-marshal.h
trunk/scintilla/gtk/scintilla-marshal.list
trunk/scintilla/include/ILexer.h
trunk/scintilla/lexers/
trunk/scintilla/lexers/LexAda.cxx
trunk/scintilla/lexers/LexAsm.cxx
trunk/scintilla/lexers/LexBash.cxx
trunk/scintilla/lexers/LexBasic.cxx
trunk/scintilla/lexers/LexCPP.cxx
trunk/scintilla/lexers/LexCSS.cxx
trunk/scintilla/lexers/LexCaml.cxx
trunk/scintilla/lexers/LexCmake.cxx
trunk/scintilla/lexers/LexD.cxx
trunk/scintilla/lexers/LexErlang.cxx
trunk/scintilla/lexers/LexForth.cxx
trunk/scintilla/lexers/LexFortran.cxx
trunk/scintilla/lexers/LexHTML.cxx
trunk/scintilla/lexers/LexHaskell.cxx
trunk/scintilla/lexers/LexLisp.cxx
trunk/scintilla/lexers/LexLua.cxx
trunk/scintilla/lexers/LexMarkdown.cxx
trunk/scintilla/lexers/LexMatlab.cxx
trunk/scintilla/lexers/LexNsis.cxx
trunk/scintilla/lexers/LexOthers.cxx
trunk/scintilla/lexers/LexPascal.cxx
trunk/scintilla/lexers/LexPerl.cxx
trunk/scintilla/lexers/LexPython.cxx
trunk/scintilla/lexers/LexR.cxx
trunk/scintilla/lexers/LexRuby.cxx
trunk/scintilla/lexers/LexSQL.cxx
trunk/scintilla/lexers/LexTCL.cxx
trunk/scintilla/lexers/LexTxt2tags.cxx
trunk/scintilla/lexers/LexVHDL.cxx
trunk/scintilla/lexers/LexVerilog.cxx
trunk/scintilla/lexers/LexYAML.cxx
trunk/scintilla/lexlib/
trunk/scintilla/lexlib/Accessor.cxx
trunk/scintilla/lexlib/Accessor.h
trunk/scintilla/lexlib/CharacterSet.cxx
trunk/scintilla/lexlib/CharacterSet.h
trunk/scintilla/lexlib/LexAccessor.h
trunk/scintilla/lexlib/LexerBase.cxx
trunk/scintilla/lexlib/LexerBase.h
trunk/scintilla/lexlib/LexerModule.cxx
trunk/scintilla/lexlib/LexerModule.h
trunk/scintilla/lexlib/LexerNoExceptions.cxx
trunk/scintilla/lexlib/LexerNoExceptions.h
trunk/scintilla/lexlib/LexerSimple.cxx
trunk/scintilla/lexlib/LexerSimple.h
trunk/scintilla/lexlib/OptionSet.h
trunk/scintilla/lexlib/PropSetSimple.cxx
trunk/scintilla/lexlib/PropSetSimple.h
trunk/scintilla/lexlib/StyleContext.cxx
trunk/scintilla/lexlib/StyleContext.h
trunk/scintilla/lexlib/WordList.cxx
trunk/scintilla/lexlib/WordList.h
trunk/scintilla/src/
trunk/scintilla/src/AutoComplete.cxx
trunk/scintilla/src/AutoComplete.h
trunk/scintilla/src/CallTip.cxx
trunk/scintilla/src/CallTip.h
trunk/scintilla/src/Catalogue.cxx
trunk/scintilla/src/Catalogue.h
trunk/scintilla/src/CellBuffer.cxx
trunk/scintilla/src/CellBuffer.h
trunk/scintilla/src/CharClassify.cxx
trunk/scintilla/src/CharClassify.h
trunk/scintilla/src/ContractionState.cxx
trunk/scintilla/src/ContractionState.h
trunk/scintilla/src/Decoration.cxx
trunk/scintilla/src/Decoration.h
trunk/scintilla/src/Document.cxx
trunk/scintilla/src/Document.h
trunk/scintilla/src/Editor.cxx
trunk/scintilla/src/Editor.h
trunk/scintilla/src/ExternalLexer.cxx
trunk/scintilla/src/ExternalLexer.h
trunk/scintilla/src/FontQuality.h
trunk/scintilla/src/Indicator.cxx
trunk/scintilla/src/Indicator.h
trunk/scintilla/src/KeyMap.cxx
trunk/scintilla/src/KeyMap.h
trunk/scintilla/src/LineMarker.cxx
trunk/scintilla/src/LineMarker.h
trunk/scintilla/src/Partitioning.h
trunk/scintilla/src/PerLine.cxx
trunk/scintilla/src/PerLine.h
trunk/scintilla/src/PositionCache.cxx
trunk/scintilla/src/PositionCache.h
trunk/scintilla/src/RESearch.cxx
trunk/scintilla/src/RESearch.h
trunk/scintilla/src/RunStyles.cxx
trunk/scintilla/src/RunStyles.h
trunk/scintilla/src/SVector.h
trunk/scintilla/src/ScintillaBase.cxx
trunk/scintilla/src/ScintillaBase.h
trunk/scintilla/src/Selection.cxx
trunk/scintilla/src/Selection.h
trunk/scintilla/src/SplitVector.h
trunk/scintilla/src/Style.cxx
trunk/scintilla/src/Style.h
trunk/scintilla/src/UniConversion.cxx
trunk/scintilla/src/UniConversion.h
trunk/scintilla/src/ViewStyle.cxx
trunk/scintilla/src/ViewStyle.h
trunk/scintilla/src/XPM.cxx
trunk/scintilla/src/XPM.h
Removed Paths:
-------------
trunk/scintilla/AutoComplete.cxx
trunk/scintilla/AutoComplete.h
trunk/scintilla/CallTip.cxx
trunk/scintilla/CallTip.h
trunk/scintilla/CellBuffer.cxx
trunk/scintilla/CellBuffer.h
trunk/scintilla/CharClassify.cxx
trunk/scintilla/CharClassify.h
trunk/scintilla/CharacterSet.h
trunk/scintilla/ContractionState.cxx
trunk/scintilla/ContractionState.h
trunk/scintilla/Converter.h
trunk/scintilla/Decoration.cxx
trunk/scintilla/Decoration.h
trunk/scintilla/Document.cxx
trunk/scintilla/Document.h
trunk/scintilla/DocumentAccessor.cxx
trunk/scintilla/DocumentAccessor.h
trunk/scintilla/Editor.cxx
trunk/scintilla/Editor.h
trunk/scintilla/ExternalLexer.cxx
trunk/scintilla/ExternalLexer.h
trunk/scintilla/Indicator.cxx
trunk/scintilla/Indicator.h
trunk/scintilla/KeyMap.cxx
trunk/scintilla/KeyMap.h
trunk/scintilla/KeyWords.cxx
trunk/scintilla/LexAda.cxx
trunk/scintilla/LexAsm.cxx
trunk/scintilla/LexBash.cxx
trunk/scintilla/LexBasic.cxx
trunk/scintilla/LexCPP.cxx
trunk/scintilla/LexCSS.cxx
trunk/scintilla/LexCaml.cxx
trunk/scintilla/LexCmake.cxx
trunk/scintilla/LexD.cxx
trunk/scintilla/LexErlang.cxx
trunk/scintilla/LexForth.cxx
trunk/scintilla/LexFortran.cxx
trunk/scintilla/LexHTML.cxx
trunk/scintilla/LexHaskell.cxx
trunk/scintilla/LexLisp.cxx
trunk/scintilla/LexLua.cxx
trunk/scintilla/LexMarkdown.cxx
trunk/scintilla/LexMatlab.cxx
trunk/scintilla/LexNsis.cxx
trunk/scintilla/LexOthers.cxx
trunk/scintilla/LexPascal.cxx
trunk/scintilla/LexPerl.cxx
trunk/scintilla/LexPython.cxx
trunk/scintilla/LexR.cxx
trunk/scintilla/LexRuby.cxx
trunk/scintilla/LexSQL.cxx
trunk/scintilla/LexTCL.cxx
trunk/scintilla/LexTxt2tags.cxx
trunk/scintilla/LexVHDL.cxx
trunk/scintilla/LexVerilog.cxx
trunk/scintilla/LexYAML.cxx
trunk/scintilla/LineMarker.cxx
trunk/scintilla/LineMarker.h
trunk/scintilla/Partitioning.h
trunk/scintilla/PerLine.cxx
trunk/scintilla/PerLine.h
trunk/scintilla/PlatGTK.cxx
trunk/scintilla/PositionCache.cxx
trunk/scintilla/PositionCache.h
trunk/scintilla/PropSet.cxx
trunk/scintilla/PropSetSimple.h
trunk/scintilla/RESearch.cxx
trunk/scintilla/RESearch.h
trunk/scintilla/RunStyles.cxx
trunk/scintilla/RunStyles.h
trunk/scintilla/SVector.h
trunk/scintilla/ScintillaBase.cxx
trunk/scintilla/ScintillaBase.h
trunk/scintilla/ScintillaGTK.cxx
trunk/scintilla/Selection.cxx
trunk/scintilla/Selection.h
trunk/scintilla/SplitVector.h
trunk/scintilla/Style.cxx
trunk/scintilla/Style.h
trunk/scintilla/StyleContext.cxx
trunk/scintilla/StyleContext.h
trunk/scintilla/UniConversion.cxx
trunk/scintilla/UniConversion.h
trunk/scintilla/ViewStyle.cxx
trunk/scintilla/ViewStyle.h
trunk/scintilla/WindowAccessor.cxx
trunk/scintilla/XPM.cxx
trunk/scintilla/XPM.h
trunk/scintilla/gtk/Converter.h
trunk/scintilla/gtk/PlatGTK.cxx
trunk/scintilla/gtk/ScintillaGTK.cxx
trunk/scintilla/gtk/scintilla-marshal.c
trunk/scintilla/gtk/scintilla-marshal.h
trunk/scintilla/gtk/scintilla-marshal.list
trunk/scintilla/include/Accessor.h
trunk/scintilla/include/KeyWords.h
trunk/scintilla/include/PropSet.h
trunk/scintilla/include/SString.h
trunk/scintilla/include/WindowAccessor.h
trunk/scintilla/lexers/LexAda.cxx
trunk/scintilla/lexers/LexAsm.cxx
trunk/scintilla/lexers/LexBash.cxx
trunk/scintilla/lexers/LexBasic.cxx
trunk/scintilla/lexers/LexCPP.cxx
trunk/scintilla/lexers/LexCSS.cxx
trunk/scintilla/lexers/LexCaml.cxx
trunk/scintilla/lexers/LexCmake.cxx
trunk/scintilla/lexers/LexD.cxx
trunk/scintilla/lexers/LexErlang.cxx
trunk/scintilla/lexers/LexForth.cxx
trunk/scintilla/lexers/LexFortran.cxx
trunk/scintilla/lexers/LexHTML.cxx
trunk/scintilla/lexers/LexHaskell.cxx
trunk/scintilla/lexers/LexLisp.cxx
trunk/scintilla/lexers/LexLua.cxx
trunk/scintilla/lexers/LexMarkdown.cxx
trunk/scintilla/lexers/LexMatlab.cxx
trunk/scintilla/lexers/LexNsis.cxx
trunk/scintilla/lexers/LexOthers.cxx
trunk/scintilla/lexers/LexPascal.cxx
trunk/scintilla/lexers/LexPerl.cxx
trunk/scintilla/lexers/LexPython.cxx
trunk/scintilla/lexers/LexR.cxx
trunk/scintilla/lexers/LexRuby.cxx
trunk/scintilla/lexers/LexSQL.cxx
trunk/scintilla/lexers/LexTCL.cxx
trunk/scintilla/lexers/LexTxt2tags.cxx
trunk/scintilla/lexers/LexVHDL.cxx
trunk/scintilla/lexers/LexVerilog.cxx
trunk/scintilla/lexers/LexYAML.cxx
trunk/scintilla/lexlib/Accessor.cxx
trunk/scintilla/lexlib/Accessor.h
trunk/scintilla/lexlib/CharacterSet.cxx
trunk/scintilla/lexlib/CharacterSet.h
trunk/scintilla/lexlib/LexAccessor.h
trunk/scintilla/lexlib/LexerBase.cxx
trunk/scintilla/lexlib/LexerBase.h
trunk/scintilla/lexlib/LexerModule.cxx
trunk/scintilla/lexlib/LexerModule.h
trunk/scintilla/lexlib/LexerNoExceptions.cxx
trunk/scintilla/lexlib/LexerNoExceptions.h
trunk/scintilla/lexlib/LexerSimple.cxx
trunk/scintilla/lexlib/LexerSimple.h
trunk/scintilla/lexlib/OptionSet.h
trunk/scintilla/lexlib/PropSetSimple.cxx
trunk/scintilla/lexlib/PropSetSimple.h
trunk/scintilla/lexlib/StyleContext.cxx
trunk/scintilla/lexlib/StyleContext.h
trunk/scintilla/lexlib/WordList.cxx
trunk/scintilla/lexlib/WordList.h
trunk/scintilla/scintilla-marshal.c
trunk/scintilla/scintilla-marshal.h
trunk/scintilla/scintilla-marshal.list
trunk/scintilla/src/AutoComplete.cxx
trunk/scintilla/src/AutoComplete.h
trunk/scintilla/src/CallTip.cxx
trunk/scintilla/src/CallTip.h
trunk/scintilla/src/Catalogue.cxx
trunk/scintilla/src/Catalogue.h
trunk/scintilla/src/CellBuffer.cxx
trunk/scintilla/src/CellBuffer.h
trunk/scintilla/src/CharClassify.cxx
trunk/scintilla/src/CharClassify.h
trunk/scintilla/src/ContractionState.cxx
trunk/scintilla/src/ContractionState.h
trunk/scintilla/src/Decoration.cxx
trunk/scintilla/src/Decoration.h
trunk/scintilla/src/Document.cxx
trunk/scintilla/src/Document.h
trunk/scintilla/src/Editor.cxx
trunk/scintilla/src/Editor.h
trunk/scintilla/src/ExternalLexer.cxx
trunk/scintilla/src/ExternalLexer.h
trunk/scintilla/src/FontQuality.h
trunk/scintilla/src/Indicator.cxx
trunk/scintilla/src/Indicator.h
trunk/scintilla/src/KeyMap.cxx
trunk/scintilla/src/KeyMap.h
trunk/scintilla/src/LineMarker.cxx
trunk/scintilla/src/LineMarker.h
trunk/scintilla/src/Partitioning.h
trunk/scintilla/src/PerLine.cxx
trunk/scintilla/src/PerLine.h
trunk/scintilla/src/PositionCache.cxx
trunk/scintilla/src/PositionCache.h
trunk/scintilla/src/RESearch.cxx
trunk/scintilla/src/RESearch.h
trunk/scintilla/src/RunStyles.cxx
trunk/scintilla/src/RunStyles.h
trunk/scintilla/src/SVector.h
trunk/scintilla/src/ScintillaBase.cxx
trunk/scintilla/src/ScintillaBase.h
trunk/scintilla/src/Selection.cxx
trunk/scintilla/src/Selection.h
trunk/scintilla/src/SplitVector.h
trunk/scintilla/src/Style.cxx
trunk/scintilla/src/Style.h
trunk/scintilla/src/UniConversion.cxx
trunk/scintilla/src/UniConversion.h
trunk/scintilla/src/ViewStyle.cxx
trunk/scintilla/src/ViewStyle.h
trunk/scintilla/src/XPM.cxx
trunk/scintilla/src/XPM.h
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2011-01-10 13:58:12 UTC (rev 5520)
+++ trunk/ChangeLog 2011-01-10 17:21:48 UTC (rev 5521)
@@ -3,6 +3,23 @@
* src/toolbar.c, src/ui_utils.c, src/about.c, THANKS:
Add Save As toolbar button option (patch by Matthew Brush, thanks;
#3153490).
+ * scintilla/*, src/utils.c, src/notebook.c,
+ data/filetypes.cpp, data/filetypes.vala, data/filetypes.glsl,
+ data/filetypes.cs, data/filetypes.c, wscript:
+ Merge unstable branch:
+ - src/utils.c:
+ Fix detecting non-lowercase self-closing tags e.g. <BR> (#2226117).
+ - src/notebook.c:
+ Add 'Open in New Window' command in the notebook tab menu (based on
+ patch by Matthew Brush, thanks - #3118059).
+ - data/filetypes.cpp, data/filetypes.vala, data/filetypes.glsl,
+ data/filetypes.cs, data/filetypes.c:
+ Disable preprocessor #define tracking for the CPP lexer
+ (enabled by default in Scintilla).
+ - scintilla/*, wscript:
+ Update Scintilla to version 2.22.
+ Use Scintilla's directory structure mostly and only remove
+ unused lexers.
2011-01-05 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
Modified: trunk/data/filetypes.c
===================================================================
--- trunk/data/filetypes.c 2011-01-10 13:58:12 UTC (rev 5520)
+++ trunk/data/filetypes.c 2011-01-10 17:21:48 UTC (rev 5521)
@@ -33,6 +33,7 @@
[lexer_properties]
styling.within.preprocessor=1
+lexer.cpp.track.preprocessor=0
preprocessor.symbol.$(file.patterns.cpp)=#
preprocessor.start.$(file.patterns.cpp)=if ifdef ifndef
preprocessor.middle.$(file.patterns.cpp)=else elif
Modified: trunk/data/filetypes.cpp
===================================================================
--- trunk/data/filetypes.cpp 2011-01-10 13:58:12 UTC (rev 5520)
+++ trunk/data/filetypes.cpp 2011-01-10 17:21:48 UTC (rev 5521)
@@ -33,6 +33,7 @@
[lexer_properties]
styling.within.preprocessor=1
+lexer.cpp.track.preprocessor=0
preprocessor.symbol.$(file.patterns.cpp)=#
preprocessor.start.$(file.patterns.cpp)=if ifdef ifndef
preprocessor.middle.$(file.patterns.cpp)=else elif
Modified: trunk/data/filetypes.cs
===================================================================
--- trunk/data/filetypes.cs 2011-01-10 13:58:12 UTC (rev 5520)
+++ trunk/data/filetypes.cs 2011-01-10 17:21:48 UTC (rev 5521)
@@ -33,6 +33,7 @@
[lexer_properties]
styling.within.preprocessor=1
+lexer.cpp.track.preprocessor=0
preprocessor.symbol.$(file.patterns.cpp)=#
preprocessor.start.$(file.patterns.cpp)=if
preprocessor.middle.$(file.patterns.cpp)=else elif
Modified: trunk/data/filetypes.glsl
===================================================================
--- trunk/data/filetypes.glsl 2011-01-10 13:58:12 UTC (rev 5520)
+++ trunk/data/filetypes.glsl 2011-01-10 17:21:48 UTC (rev 5521)
@@ -36,6 +36,7 @@
[lexer_properties]
styling.within.preprocessor=1
+lexer.cpp.track.preprocessor=0
preprocessor.symbol.$(file.patterns.cpp)=#
preprocessor.start.$(file.patterns.cpp)=if ifdef ifndef
preprocessor.middle.$(file.patterns.cpp)=else elif
Modified: trunk/data/filetypes.vala
===================================================================
--- trunk/data/filetypes.vala 2011-01-10 13:58:12 UTC (rev 5520)
+++ trunk/data/filetypes.vala 2011-01-10 17:21:48 UTC (rev 5521)
@@ -33,6 +33,7 @@
[lexer_properties]
styling.within.preprocessor=1
+lexer.cpp.track.preprocessor=0
preprocessor.symbol.$(file.patterns.cpp)=#
preprocessor.start.$(file.patterns.cpp)=if
preprocessor.middle.$(file.patterns.cpp)=else elif
Deleted: trunk/scintilla/AutoComplete.cxx
===================================================================
--- trunk/scintilla/AutoComplete.cxx 2011-01-10 13:58:12 UTC (rev 5520)
+++ trunk/scintilla/AutoComplete.cxx 2011-01-10 17:21:48 UTC (rev 5521)
@@ -1,178 +0,0 @@
-// Scintilla source code edit control
-/** @file AutoComplete.cxx
- ** Defines the auto completion list box.
- **/
-// Copyright 1998-2003 by Neil Hodgson <neilh at scintilla.org>
-// The License.txt file describes the conditions under which this software may be distributed.
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-
-#include "Platform.h"
-
-#include "CharClassify.h"
-#include "AutoComplete.h"
-
-#ifdef SCI_NAMESPACE
-using namespace Scintilla;
-#endif
-
-AutoComplete::AutoComplete() :
- active(false),
- separator(' '),
- typesep('?'),
- ignoreCase(false),
- chooseSingle(false),
- lb(0),
- posStart(0),
- startLen(0),
- cancelAtStartPos(true),
- autoHide(true),
- dropRestOfWord(false) {
- lb = ListBox::Allocate();
- stopChars[0] = '\0';
- fillUpChars[0] = '\0';
-}
-
-AutoComplete::~AutoComplete() {
- if (lb) {
- lb->Destroy();
- delete lb;
- lb = 0;
- }
-}
-
-bool AutoComplete::Active() const {
- return active;
-}
-
-void AutoComplete::Start(Window &parent, int ctrlID,
- int position, Point location, int startLen_,
- int lineHeight, bool unicodeMode) {
- if (active) {
- Cancel();
- }
- lb->Create(parent, ctrlID, location, lineHeight, unicodeMode);
- lb->Clear();
- active = true;
- startLen = startLen_;
- posStart = position;
-}
-
-void AutoComplete::SetStopChars(const char *stopChars_) {
- strncpy(stopChars, stopChars_, sizeof(stopChars));
- stopChars[sizeof(stopChars) - 1] = '\0';
-}
-
-bool AutoComplete::IsStopChar(char ch) {
- return ch && strchr(stopChars, ch);
-}
-
-void AutoComplete::SetFillUpChars(const char *fillUpChars_) {
- strncpy(fillUpChars, fillUpChars_, sizeof(fillUpChars));
- fillUpChars[sizeof(fillUpChars) - 1] = '\0';
-}
-
-bool AutoComplete::IsFillUpChar(char ch) {
- return ch && strchr(fillUpChars, ch);
-}
-
-void AutoComplete::SetSeparator(char separator_) {
- separator = separator_;
-}
-
-char AutoComplete::GetSeparator() const {
- return separator;
-}
-
-void AutoComplete::SetTypesep(char separator_) {
- typesep = separator_;
-}
-
-char AutoComplete::GetTypesep() const {
- return typesep;
-}
-
-void AutoComplete::SetList(const char *list) {
- lb->SetList(list, separator, typesep);
-}
-
-void AutoComplete::Show(bool show) {
- lb->Show(show);
- if (show)
- lb->Select(0);
-}
-
-void AutoComplete::Cancel() {
- if (lb->Created()) {
- lb->Clear();
- lb->Destroy();
- active = false;
- }
-}
-
-
-void AutoComplete::Move(int delta) {
- int count = lb->Length();
- int current = lb->GetSelection();
- current += delta;
- if (current >= count)
- current = count - 1;
- if (current < 0)
- current = 0;
- lb->Select(current);
-}
-
-void AutoComplete::Select(const char *word) {
- size_t lenWord = strlen(word);
- int location = -1;
- const int maxItemLen=1000;
- char item[maxItemLen];
- int start = 0; // lower bound of the api array block to search
- int end = lb->Length() - 1; // upper bound of the api array block to search
- while ((start <= end) && (location == -1)) { // Binary searching loop
- int pivot = (start + end) / 2;
- lb->GetValue(pivot, item, maxItemLen);
- int cond;
- if (ignoreCase)
- cond = CompareNCaseInsensitive(word, item, lenWord);
- else
- cond = strncmp(word, item, lenWord);
- if (!cond) {
- // Find first match
- while (pivot > start) {
- lb->GetValue(pivot-1, item, maxItemLen);
- if (ignoreCase)
- cond = CompareNCaseInsensitive(word, item, lenWord);
- else
- cond = strncmp(word, item, lenWord);
- if (0 != cond)
- break;
- --pivot;
- }
- location = pivot;
- if (ignoreCase) {
- // Check for exact-case match
- for (; pivot <= end; pivot++) {
- lb->GetValue(pivot, item, maxItemLen);
- if (!strncmp(word, item, lenWord)) {
- location = pivot;
- break;
- }
- if (CompareNCaseInsensitive(word, item, lenWord))
- break;
- }
- }
- } else if (cond < 0) {
- end = pivot - 1;
- } else if (cond > 0) {
- start = pivot + 1;
- }
- }
- if (location == -1 && autoHide)
- Cancel();
- else
- lb->Select(location);
-}
-
Deleted: trunk/scintilla/AutoComplete.h
===================================================================
--- trunk/scintilla/AutoComplete.h 2011-01-10 13:58:12 UTC (rev 5520)
+++ trunk/scintilla/AutoComplete.h 2011-01-10 17:21:48 UTC (rev 5521)
@@ -1,78 +0,0 @@
-// Scintilla source code edit control
-/** @file AutoComplete.h
- ** Defines the auto completion list box.
- **/
-// Copyright 1998-2003 by Neil Hodgson <neilh at scintilla.org>
-// The License.txt file describes the conditions under which this software may be distributed.
-
-#ifndef AUTOCOMPLETE_H
-#define AUTOCOMPLETE_H
-
-#ifdef SCI_NAMESPACE
-namespace Scintilla {
-#endif
-
-/**
- */
-class AutoComplete {
- bool active;
- char stopChars[256];
- char fillUpChars[256];
- char separator;
- char typesep; // Type seperator
-
-public:
- bool ignoreCase;
- bool chooseSingle;
- ListBox *lb;
- int posStart;
- int startLen;
- /// Should autocompletion be canceled if editor's currentPos <= startPos?
- bool cancelAtStartPos;
- bool autoHide;
- bool dropRestOfWord;
-
- AutoComplete();
- ~AutoComplete();
-
- /// Is the auto completion list displayed?
- bool Active() const;
-
- /// Display the auto completion list positioned to be near a character position
- void Start(Window &parent, int ctrlID, int position, Point location,
- int startLen_, int lineHeight, bool unicodeMode);
-
- /// The stop chars are characters which, when typed, cause the auto completion list to disappear
- void SetStopChars(const char *stopChars_);
- bool IsStopChar(char ch);
-
- /// The fillup chars are characters which, when typed, fill up the selected word
- void SetFillUpChars(const char *fillUpChars_);
- bool IsFillUpChar(char ch);
-
- /// The separator character is used when interpreting the list in SetList
- void SetSeparator(char separator_);
- char GetSeparator() const;
-
- /// The typesep character is used for seperating the word from the type
- void SetTypesep(char separator_);
- char GetTypesep() const;
-
- /// The list string contains a sequence of words separated by the separator character
- void SetList(const char *list);
-
- void Show(bool show);
- void Cancel();
-
- /// Move the current list element by delta, scrolling appropriately
- void Move(int delta);
-
- /// Select a list element that starts with word as the current element
- void Select(const char *word);
-};
-
-#ifdef SCI_NAMESPACE
-}
-#endif
-
-#endif
Deleted: trunk/scintilla/CallTip.cxx
===================================================================
--- trunk/scintilla/CallTip.cxx 2011-01-10 13:58:12 UTC (rev 5520)
+++ trunk/scintilla/CallTip.cxx 2011-01-10 17:21:48 UTC (rev 5521)
@@ -1,327 +0,0 @@
-// Scintilla source code edit control
-/** @file CallTip.cxx
- ** Code for displaying call tips.
- **/
-// Copyright 1998-2001 by Neil Hodgson <neilh at scintilla.org>
-// The License.txt file describes the conditions under which this software may be distributed.
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "Platform.h"
-
-#include "Scintilla.h"
-#include "CallTip.h"
-#include <stdio.h>
-
-#ifdef SCI_NAMESPACE
-using namespace Scintilla;
-#endif
-
-static const int insetX = 5; // text inset in x from calltip border
-static const int widthArrow = 14;
-
-CallTip::CallTip() {
- wCallTip = 0;
- inCallTipMode = false;
- posStartCallTip = 0;
- val = 0;
- rectUp = PRectangle(0,0,0,0);
- rectDown = PRectangle(0,0,0,0);
- lineHeight = 1;
- startHighlight = 0;
- endHighlight = 0;
- tabSize = 0;
- useStyleCallTip = false; // for backwards compatibility
-
-#ifdef __APPLE__
- // proper apple colours for the default
- colourBG.desired = ColourDesired(0xff, 0xff, 0xc6);
- colourUnSel.desired = ColourDesired(0, 0, 0);
-#else
- colourBG.desired = ColourDesired(0xff, 0xff, 0xff);
- colourUnSel.desired = ColourDesired(0x80, 0x80, 0x80);
-#endif
- colourSel.desired = ColourDesired(0, 0, 0x80);
- colourShade.desired = ColourDesired(0, 0, 0);
- colourLight.desired = ColourDesired(0xc0, 0xc0, 0xc0);
-}
-
-CallTip::~CallTip() {
- font.Release();
- wCallTip.Destroy();
- delete []val;
- val = 0;
-}
-
-void CallTip::RefreshColourPalette(Palette &pal, bool want) {
- pal.WantFind(colourBG, want);
- pal.WantFind(colourUnSel, want);
- pal.WantFind(colourSel, want);
- pal.WantFind(colourShade, want);
- pal.WantFind(colourLight, want);
-}
-
-// Although this test includes 0, we should never see a \0 character.
-static bool IsArrowCharacter(char ch) {
- return (ch == 0) || (ch == '\001') || (ch == '\002');
-}
-
-// We ignore tabs unless a tab width has been set.
-bool CallTip::IsTabCharacter(char ch) const {
- return (tabSize > 0) && (ch == '\t');
-}
-
-int CallTip::NextTabPos(int x) {
- if (tabSize > 0) { // paranoia... not called unless this is true
- x -= insetX; // position relative to text
- x = (x + tabSize) / tabSize; // tab "number"
- return tabSize*x + insetX; // position of next tab
- } else {
- return x + 1; // arbitrary
- }
-}
-
-// Draw a section of the call tip that does not include \n in one colour.
-// The text may include up to numEnds tabs or arrow characters.
-void CallTip::DrawChunk(Surface *surface, int &x, const char *s,
- int posStart, int posEnd, int ytext, PRectangle rcClient,
- bool highlight, bool draw) {
- s += posStart;
- int len = posEnd - posStart;
-
- // Divide the text into sections that are all text, or that are
- // single arrows or single tab characters (if tabSize > 0).
- int maxEnd = 0;
- const int numEnds = 10;
- int ends[numEnds + 2];
- for (int i=0; i<len; i++) {
- if ((maxEnd < numEnds) &&
- (IsArrowCharacter(s[i]) || IsTabCharacter(s[i])) ) {
- if (i > 0)
- ends[maxEnd++] = i;
- ends[maxEnd++] = i+1;
- }
- }
- ends[maxEnd++] = len;
- int startSeg = 0;
- int xEnd;
- for (int seg = 0; seg<maxEnd; seg++) {
- int endSeg = ends[seg];
- if (endSeg > startSeg) {
- if (IsArrowCharacter(s[startSeg])) {
- bool upArrow = s[startSeg] == '\001';
- rcClient.left = x;
- rcClient.right = rcClient.left + widthArrow;
- if (draw) {
- const int halfWidth = widthArrow / 2 - 3;
- const int centreX = rcClient.left + widthArrow / 2 - 1;
- const int centreY = (rcClient.top + rcClient.bottom) / 2;
- surface->FillRectangle(rcClient, colourBG.allocated);
- PRectangle rcClientInner(rcClient.left + 1, rcClient.top + 1,
- rcClient.right - 2, rcClient.bottom - 1);
- surface->FillRectangle(rcClientInner, colourUnSel.allocated);
-
- if (upArrow) { // Up arrow
- Point pts[] = {
- Point(centreX - halfWidth, centreY + halfWidth / 2),
- Point(centreX + halfWidth, centreY + halfWidth / 2),
- Point(centreX, centreY - halfWidth + halfWidth / 2),
- };
- surface->Polygon(pts, sizeof(pts) / sizeof(pts[0]),
- colourBG.allocated, colourBG.allocated);
- } else { // Down arrow
- Point pts[] = {
- Point(centreX - halfWidth, centreY - halfWidth / 2),
- Point(centreX + halfWidth, centreY - halfWidth / 2),
- Point(centreX, centreY + halfWidth - halfWidth / 2),
- };
- surface->Polygon(pts, sizeof(pts) / sizeof(pts[0]),
- colourBG.allocated, colourBG.allocated);
- }
- }
- xEnd = rcClient.right;
- offsetMain = xEnd;
- if (upArrow) {
- rectUp = rcClient;
- } else {
- rectDown = rcClient;
- }
- } else if (IsTabCharacter(s[startSeg])) {
- xEnd = NextTabPos(x);
- } else {
- xEnd = x + surface->WidthText(font, s + startSeg, endSeg - startSeg);
- if (draw) {
- rcClient.left = x;
- rcClient.right = xEnd;
- surface->DrawTextTransparent(rcClient, font, ytext,
- s+startSeg, endSeg - startSeg,
- highlight ? colourSel.allocated : colourUnSel.allocated);
- }
- }
- x = xEnd;
- startSeg = endSeg;
- }
- }
-}
-
-int CallTip::PaintContents(Surface *surfaceWindow, bool draw) {
- PRectangle rcClientPos = wCallTip.GetClientPosition();
- PRectangle rcClientSize(0, 0, rcClientPos.right - rcClientPos.left,
- rcClientPos.bottom - rcClientPos.top);
- PRectangle rcClient(1, 1, rcClientSize.right - 1, rcClientSize.bottom - 1);
-
- // To make a nice small call tip window, it is only sized to fit most normal characters without accents
- int ascent = surfaceWindow->Ascent(font) - surfaceWindow->InternalLeading(font);
-
- // For each line...
- // Draw the definition in three parts: before highlight, highlighted, after highlight
- int ytext = rcClient.top + ascent + 1;
- rcClient.bottom = ytext + surfaceWindow->Descent(font) + 1;
- char *chunkVal = val;
- bool moreChunks = true;
- int maxWidth = 0;
-
- while (moreChunks) {
- char *chunkEnd = strchr(chunkVal, '\n');
- if (chunkEnd == NULL) {
- chunkEnd = chunkVal + strlen(chunkVal);
- moreChunks = false;
- }
- int chunkOffset = chunkVal - val;
- int chunkLength = chunkEnd - chunkVal;
- int chunkEndOffset = chunkOffset + chunkLength;
- int thisStartHighlight = Platform::Maximum(startHighlight, chunkOffset);
- thisStartHighlight = Platform::Minimum(thisStartHighlight, chunkEndOffset);
- thisStartHighlight -= chunkOffset;
- int thisEndHighlight = Platform::Maximum(endHighlight, chunkOffset);
- thisEndHighlight = Platform::Minimum(thisEndHighlight, chunkEndOffset);
- thisEndHighlight -= chunkOffset;
- rcClient.top = ytext - ascent - 1;
-
- int x = insetX; // start each line at this inset
-
- DrawChunk(surfaceWindow, x, chunkVal, 0, thisStartHighlight,
- ytext, rcClient, false, draw);
- DrawChunk(surfaceWindow, x, chunkVal, thisStartHighlight, thisEndHighlight,
- ytext, rcClient, true, draw);
- DrawChunk(surfaceWindow, x, chunkVal, thisEndHighlight, chunkLength,
- ytext, rcClient, false, draw);
-
- chunkVal = chunkEnd + 1;
- ytext += lineHeight;
- rcClient.bottom += lineHeight;
- maxWidth = Platform::Maximum(maxWidth, x);
- }
- return maxWidth;
-}
-
-void CallTip::PaintCT(Surface *surfaceWindow) {
- if (!val)
- return;
- PRectangle rcClientPos = wCallTip.GetClientPosition();
- PRectangle rcClientSize(0, 0, rcClientPos.right - rcClientPos.left,
- rcClientPos.bottom - rcClientPos.top);
- PRectangle rcClient(1, 1, rcClientSize.right - 1, rcClientSize.bottom - 1);
-
- surfaceWindow->FillRectangle(rcClient, colourBG.allocated);
-
- offsetMain = insetX; // initial alignment assuming no arrows
- PaintContents(surfaceWindow, true);
-
-#ifndef __APPLE__
- // OSX doesn't put borders on "help tags"
- // Draw a raised border around the edges of the window
- surfaceWindow->MoveTo(0, rcClientSize.bottom - 1);
- surfaceWindow->PenColour(colourShade.allocated);
- surfaceWindow->LineTo(rcClientSize.right - 1, rcClientSize.bottom - 1);
- surfaceWindow->LineTo(rcClientSize.right - 1, 0);
- surfaceWindow->PenColour(colourLight.allocated);
- surfaceWindow->LineTo(0, 0);
- surfaceWindow->LineTo(0, rcClientSize.bottom - 1);
-#endif
-}
-
-void CallTip::MouseClick(Point pt) {
- clickPlace = 0;
- if (rectUp.Contains(pt))
- clickPlace = 1;
- if (rectDown.Contains(pt))
- clickPlace = 2;
-}
-
-PRectangle CallTip::CallTipStart(int pos, Point pt, const char *defn,
- const char *faceName, int size,
- int codePage_, int characterSet, Window &wParent) {
- clickPlace = 0;
- delete []val;
- val = 0;
- val = new char[strlen(defn) + 1];
- strcpy(val, defn);
- codePage = codePage_;
- Surface *surfaceMeasure = Surface::Allocate();
- if (!surfaceMeasure)
- return PRectangle();
- surfaceMeasure->Init(wParent.GetID());
- surfaceMeasure->SetUnicodeMode(SC_CP_UTF8 == codePage);
- surfaceMeasure->SetDBCSMode(codePage);
- startHighlight = 0;
- endHighlight = 0;
- inCallTipMode = true;
- posStartCallTip = pos;
- int deviceHeight = surfaceMeasure->DeviceHeightFont(size);
- font.Create(faceName, characterSet, deviceHeight, false, false);
- // Look for multiple lines in the text
- // Only support \n here - simply means container must avoid \r!
- int numLines = 1;
- const char *newline;
- const char *look = val;
- rectUp = PRectangle(0,0,0,0);
- rectDown = PRectangle(0,0,0,0);
- offsetMain = insetX; // changed to right edge of any arrows
- int width = PaintContents(surfaceMeasure, false) + insetX;
- while ((newline = strchr(look, '\n')) != NULL) {
- look = newline + 1;
- numLines++;
- }
- lineHeight = surfaceMeasure->Height(font);
-
- // Extra line for border and an empty line at top and bottom. The returned
- // rectangle is aligned to the right edge of the last arrow encountered in
- // the tip text, else to the tip text left edge.
- int height = lineHeight * numLines - surfaceMeasure->InternalLeading(font) + 2 + 2;
- delete surfaceMeasure;
- return PRectangle(pt.x - offsetMain, pt.y + 1, pt.x + width - offsetMain, pt.y + 1 + height);
-}
-
-void CallTip::CallTipCancel() {
- inCallTipMode = false;
- if (wCallTip.Created()) {
- wCallTip.Destroy();
- }
-}
-
-void CallTip::SetHighlight(int start, int end) {
- // Avoid flashing by checking something has really changed
- if ((start != startHighlight) || (end != endHighlight)) {
- startHighlight = start;
- endHighlight = end;
- if (wCallTip.Created()) {
- wCallTip.InvalidateAll();
- }
- }
-}
-
-// Set the tab size (sizes > 0 enable the use of tabs). This also enables the
-// use of the STYLE_CALLTIP.
-void CallTip::SetTabSize(int tabSz) {
- tabSize = tabSz;
- useStyleCallTip = true;
-}
-
-// It might be better to have two access functions for this and to use
-// them for all settings of colours.
-void CallTip::SetForeBack(const ColourPair &fore, const ColourPair &back) {
- colourBG = back;
- colourUnSel = fore;
-}
Deleted: trunk/scintilla/CallTip.h
===================================================================
--- trunk/scintilla/CallTip.h 2011-01-10 13:58:12 UTC (rev 5520)
+++ trunk/scintilla/CallTip.h 2011-01-10 17:21:48 UTC (rev 5521)
@@ -1,87 +0,0 @@
-// Scintilla source code edit control
-/** @file CallTip.h
- ** Interface to the call tip control.
- **/
-// Copyright 1998-2001 by Neil Hodgson <neilh at scintilla.org>
-// The License.txt file describes the conditions under which this software may be distributed.
-
-#ifndef CALLTIP_H
-#define CALLTIP_H
-
-#ifdef SCI_NAMESPACE
-namespace Scintilla {
-#endif
-
-/**
- */
-class CallTip {
- int startHighlight; // character offset to start and...
- int endHighlight; // ...end of highlighted text
- char *val;
- Font font;
- PRectangle rectUp; // rectangle of last up angle in the tip
- PRectangle rectDown; // rectangle of last down arrow in the tip
- int lineHeight; // vertical line spacing
- int offsetMain; // The alignment point of the call tip
- int tabSize; // Tab size in pixels, <=0 no TAB expand
- bool useStyleCallTip; // if true, STYLE_CALLTIP should be used
-
- // Private so CallTip objects can not be copied
- CallTip(const CallTip &);
- CallTip &operator=(const CallTip &);
- void DrawChunk(Surface *surface, int &x, const char *s,
- int posStart, int posEnd, int ytext, PRectangle rcClient,
- bool highlight, bool draw);
- int PaintContents(Surface *surfaceWindow, bool draw);
- bool IsTabCharacter(char c) const;
- int NextTabPos(int x);
-
-public:
- Window wCallTip;
- Window wDraw;
- bool inCallTipMode;
- int posStartCallTip;
- ColourPair colourBG;
- ColourPair colourUnSel;
- ColourPair colourSel;
- ColourPair colourShade;
- ColourPair colourLight;
- int codePage;
- int clickPlace;
-
- CallTip();
- ~CallTip();
-
- /// Claim or accept palette entries for the colours required to paint a calltip.
- void RefreshColourPalette(Palette &pal, bool want);
-
- void PaintCT(Surface *surfaceWindow);
-
- void MouseClick(Point pt);
-
- /// Setup the calltip and return a rectangle of the area required.
- PRectangle CallTipStart(int pos, Point pt, const char *defn,
- const char *faceName, int size, int codePage_,
- int characterSet, Window &wParent);
-
- void CallTipCancel();
-
- /// Set a range of characters to be displayed in a highlight style.
- /// Commonly used to highlight the current parameter.
- void SetHighlight(int start, int end);
-
- /// Set the tab size in pixels for the call tip. 0 or -ve means no tab expand.
- void SetTabSize(int tabSz);
-
- /// Used to determine which STYLE_xxxx to use for call tip information
- bool UseStyleCallTip() const { return useStyleCallTip;}
-
- // Modify foreground and background colours
- void SetForeBack(const ColourPair &fore, const ColourPair &back);
-};
-
-#ifdef SCI_NAMESPACE
-}
-#endif
-
-#endif
Deleted: trunk/scintilla/CellBuffer.cxx
===================================================================
--- trunk/scintilla/CellBuffer.cxx 2011-01-10 13:58:12 UTC (rev 5520)
+++ trunk/scintilla/CellBuffer.cxx 2011-01-10 17:21:48 UTC (rev 5521)
@@ -1,656 +0,0 @@
-// Scintilla source code edit control
-/** @file CellBuffer.cxx
- ** Manages a buffer of cells.
- **/
-// Copyright 1998-2001 by Neil Hodgson <neilh at scintilla.org>
-// The License.txt file describes the conditions under which this software may be distributed.
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdarg.h>
-
-#include "Platform.h"
-
-#include "Scintilla.h"
-#include "SplitVector.h"
-#include "Partitioning.h"
-#include "CellBuffer.h"
-
-#ifdef SCI_NAMESPACE
-using namespace Scintilla;
-#endif
-
-LineVector::LineVector() : starts(256), perLine(0) {
- Init();
-}
-
-LineVector::~LineVector() {
- starts.DeleteAll();
-}
-
-void LineVector::Init() {
- starts.DeleteAll();
- if (perLine) {
- perLine->Init();
- }
-}
-
-void LineVector::SetPerLine(PerLine *pl) {
- perLine = pl;
-}
-
-void LineVector::InsertText(int line, int delta) {
- starts.InsertText(line, delta);
-}
-
-void LineVector::InsertLine(int line, int position, bool lineStart) {
- starts.InsertPartition(line, position);
- if (perLine) {
- if ((line > 0) && lineStart)
- line--;
- perLine->InsertLine(line);
- }
-}
-
-void LineVector::SetLineStart(int line, int position) {
- starts.SetPartitionStartPosition(line, position);
-}
-
-void LineVector::RemoveLine(int line) {
- starts.RemovePartition(line);
- if (perLine) {
- perLine->RemoveLine(line);
- }
-}
-
-int LineVector::LineFromPosition(int pos) const {
- return starts.PartitionFromPosition(pos);
-}
-
-Action::Action() {
- at = startAction;
- position = 0;
- data = 0;
- lenData = 0;
- mayCoalesce = false;
-}
-
-Action::~Action() {
- Destroy();
-}
-
-void Action::Create(actionType at_, int position_, char *data_, int lenData_, bool mayCoalesce_) {
- delete []data;
- position = position_;
- at = at_;
- data = data_;
- lenData = lenData_;
- mayCoalesce = mayCoalesce_;
-}
-
-void Action::Destroy() {
- delete []data;
- data = 0;
-}
-
-void Action::Grab(Action *source) {
- delete []data;
-
- position = source->position;
- at = source->at;
- data = source->data;
- lenData = source->lenData;
- mayCoalesce = source->mayCoalesce;
-
- // Ownership of source data transferred to this
- source->position = 0;
- source->at = startAction;
- source->data = 0;
- source->lenData = 0;
- source->mayCoalesce = true;
-}
-
-// The undo history stores a sequence of user operations that represent the user's view of the
-// commands executed on the text.
-// Each user operation contains a sequence of text insertion and text deletion actions.
-// All the user operations are stored in a list of individual actions with 'start' actions used
-// as delimiters between user operations.
-// Initially there is one start action in the history.
-// As each action is performed, it is recorded in the history. The action may either become
-// part of the current user operation or may start a new user operation. If it is to be part of the
-// current operation, then it overwrites the current last action. If it is to be part of a new
-// operation, it is appended after the current last action.
-// After writing the new action, a new start action is appended at the end of the history.
-// The decision of whether to start a new user operation is based upon two factors. If a
-// compound operation has been explicitly started by calling BeginUndoAction and no matching
-// EndUndoAction (these calls nest) has been called, then the action is coalesced into the current
-// operation. If there is no outstanding BeginUndoAction call then a new operation is started
-// unless it looks as if the new action is caused by the user typing or deleting a stream of text.
-// Sequences that look like typing or deletion are coalesced into a single user operation.
-
-UndoHistory::UndoHistory() {
-
- lenActions = 100;
- actions = new Action[lenActions];
- maxAction = 0;
- currentAction = 0;
- undoSequenceDepth = 0;
- savePoint = 0;
-
- actions[currentAction].Create(startAction);
-}
-
-UndoHistory::~UndoHistory() {
- delete []actions;
- actions = 0;
-}
-
-void UndoHistory::EnsureUndoRoom() {
- // Have to test that there is room for 2 more actions in the array
- // as two actions may be created by the calling function
- if (currentAction >= (lenActions - 2)) {
- // Run out of undo nodes so extend the array
- int lenActionsNew = lenActions * 2;
- Action *actionsNew = new Action[lenActionsNew];
- for (int act = 0; act <= currentAction; act++)
- actionsNew[act].Grab(&actions[act]);
- delete []actions;
- lenActions = lenActionsNew;
- actions = actionsNew;
- }
-}
-
-void UndoHistory::AppendAction(actionType at, int position, char *data, int lengthData,
- bool &startSequence, bool mayCoalesce) {
- EnsureUndoRoom();
- //Platform::DebugPrintf("%% %d action %d %d %d\n", at, position, lengthData, currentAction);
- //Platform::DebugPrintf("^ %d action %d %d\n", actions[currentAction - 1].at,
- // actions[currentAction - 1].position, actions[currentAction - 1].lenData);
- if (currentAction < savePoint) {
- savePoint = -1;
- }
- int oldCurrentAction = currentAction;
- if (currentAction >= 1) {
- if (0 == undoSequenceDepth) {
- // Top level actions may not always be coalesced
- int targetAct = -1;
- const Action *actPrevious = &(actions[currentAction + targetAct]);
- // Container actions may forward the coalesce state of Scintilla Actions.
- while ((actPrevious->at == containerAction) && actPrevious->mayCoalesce) {
- targetAct--;
- actPrevious = &(actions[currentAction + targetAct]);
- }
- // See if current action can be coalesced into previous action
- // Will work if both are inserts or deletes and position is same
- if (currentAction == savePoint) {
- currentAction++;
- } else if (!actions[currentAction].mayCoalesce) {
- // Not allowed to coalesce if this set
- currentAction++;
- } else if (!mayCoalesce || !actPrevious->mayCoalesce) {
- currentAction++;
- } else if (at == containerAction || actions[currentAction].at == containerAction) {
- ; // A coalescible containerAction
- } else if ((at != actPrevious->at) && (actPrevious->at != startAction)) {
- currentAction++;
- } else if ((at == insertAction) &&
- (position != (actPrevious->position + actPrevious->lenData))) {
- // Insertions must be immediately after to coalesce
- currentAction++;
- } else if (at == removeAction) {
- if ((lengthData == 1) || (lengthData == 2)) {
- if ((position + lengthData) == actPrevious->position) {
- ; // Backspace -> OK
- } else if (position == actPrevious->position) {
- ; // Delete -> OK
- } else {
- // Removals must be at same position to coalesce
- currentAction++;
- }
- } else {
- // Removals must be of one character to coalesce
- currentAction++;
- }
- } else {
- // Action coalesced.
- }
-
- } else {
- // Actions not at top level are always coalesced unless this is after return to top level
- if (!actions[currentAction].mayCoalesce)
- currentAction++;
- }
- } else {
- currentAction++;
- }
- startSequence = oldCurrentAction != currentAction;
- actions[currentAction].Create(at, position, data, lengthData, mayCoalesce);
- currentAction++;
- actions[currentAction].Create(startAction);
- maxAction = currentAction;
-}
-
-void UndoHistory::BeginUndoAction() {
- EnsureUndoRoom();
- if (undoSequenceDepth == 0) {
- if (actions[currentAction].at != startAction) {
- currentAction++;
- actions[currentAction].Create(startAction);
- maxAction = currentAction;
- }
- actions[currentAction].mayCoalesce = false;
- }
- undoSequenceDepth++;
-}
-
-void UndoHistory::EndUndoAction() {
- PLATFORM_ASSERT(undoSequenceDepth > 0);
- EnsureUndoRoom();
- undoSequenceDepth--;
- if (0 == undoSequenceDepth) {
- if (actions[currentAction].at != startAction) {
- currentAction++;
- actions[currentAction].Create(startAction);
- maxAction = currentAction;
- }
- actions[currentAction].mayCoalesce = false;
- }
-}
-
-void UndoHistory::DropUndoSequence() {
- undoSequenceDepth = 0;
-}
-
-void UndoHistory::DeleteUndoHistory() {
- for (int i = 1; i < maxAction; i++)
- actions[i].Destroy();
- maxAction = 0;
- currentAction = 0;
- actions[currentAction].Create(startAction);
- savePoint = 0;
-}
-
-void UndoHistory::SetSavePoint() {
- savePoint = currentAction;
-}
-
-bool UndoHistory::IsSavePoint() const {
- return savePoint == currentAction;
-}
-
-bool UndoHistory::CanUndo() const {
- return (currentAction > 0) && (maxAction > 0);
-}
-
-int UndoHistory::StartUndo() {
- // Drop any trailing startAction
- if (actions[currentAction].at == startAction && currentAction > 0)
- currentAction--;
-
- // Count the steps in this action
- int act = currentAction;
- while (actions[act].at != startAction && act > 0) {
- act--;
- }
- return currentAction - act;
-}
-
-const Action &UndoHistory::GetUndoStep() const {
- return actions[currentAction];
-}
-
-void UndoHistory::CompletedUndoStep() {
- currentAction--;
-}
-
-bool UndoHistory::CanRedo() const {
- return maxAction > currentAction;
-}
-
-int UndoHistory::StartRedo() {
- // Drop any leading startAction
- if (actions[currentAction].at == startAction && currentAction < maxAction)
- currentAction++;
-
- // Count the steps in this action
- int act = currentAction;
- while (actions[act].at != startAction && act < maxAction) {
- act++;
- }
- return act - currentAction;
-}
-
-const Action &UndoHistory::GetRedoStep() const {
- return actions[currentAction];
-}
-
-void UndoHistory::CompletedRedoStep() {
- currentAction++;
-}
-
-CellBuffer::CellBuffer() {
- readOnly = false;
- collectingUndo = true;
-}
-
-CellBuffer::~CellBuffer() {
-}
-
-char CellBuffer::CharAt(int position) const {
- return substance.ValueAt(position);
-}
-
-void CellBuffer::GetCharRange(char *buffer, int position, int lengthRetrieve) const {
- if (lengthRetrieve < 0)
- return;
- if (position < 0)
- return;
- if ((position + lengthRetrieve) > substance.Length()) {
- Platform::DebugPrintf("Bad GetCharRange %d for %d of %d\n", position,
- lengthRetrieve, substance.Length());
- return;
- }
-
- for (int i=0; i<lengthRetrieve; i++) {
- *buffer++ = substance.ValueAt(position + i);
- }
-}
-
-char CellBuffer::StyleAt(int position) const {
- return style.ValueAt(position);
-}
-
-const char *CellBuffer::BufferPointer() {
- return substance.BufferPointer();
-}
-
-// The char* returned is to an allocation owned by the undo history
-const char *CellBuffer::InsertString(int position, const char *s, int insertLength, bool &startSequence) {
- char *data = 0;
- // InsertString and DeleteChars are the bottleneck though which all changes occur
- if (!readOnly) {
- if (collectingUndo) {
- // Save into the undo/redo stack, but only the characters - not the formatting
- // This takes up about half load time
- data = new char[insertLength];
- for (int i = 0; i < insertLength; i++) {
- data[i] = s[i];
- }
- uh.AppendAction(insertAction, position, data, insertLength, startSequence);
- }
-
- BasicInsertString(position, s, insertLength);
- }
- return data;
-}
-
-bool CellBuffer::SetStyleAt(int position, char styleValue, char mask) {
- styleValue &= mask;
- char curVal = style.ValueAt(position);
- if ((curVal & mask) != styleValue) {
- style.SetValueAt(position, static_cast<char>((curVal & ~mask) | styleValue));
- return true;
- } else {
- return false;
- }
-}
-
-bool CellBuffer::SetStyleFor(int position, int lengthStyle, char styleValue, char mask) {
- bool changed = false;
- PLATFORM_ASSERT(lengthStyle == 0 ||
- (lengthStyle > 0 && lengthStyle + position <= style.Length()));
- while (lengthStyle--) {
- char curVal = style.ValueAt(position);
- if ((curVal & mask) != styleValue) {
- style.SetValueAt(position, static_cast<char>((curVal & ~mask) | styleValue));
- changed = true;
- }
- position++;
- }
- return changed;
-}
-
-// The char* returned is to an allocation owned by the undo history
-const char *CellBuffer::DeleteChars(int position, int deleteLength, bool &startSequence) {
- // InsertString and DeleteChars are the bottleneck though which all changes occur
- PLATFORM_ASSERT(deleteLength > 0);
- char *data = 0;
- if (!readOnly) {
- if (collectingUndo) {
- // Save into the undo/redo stack, but only the characters - not the formatting
- data = new char[deleteLength];
- for (int i = 0; i < deleteLength; i++) {
- data[i] = substance.ValueAt(position + i);
- }
- uh.AppendAction(removeAction, position, data, deleteLength, startSequence);
- }
-
- BasicDeleteChars(position, deleteLength);
- }
- return data;
-}
-
-int CellBuffer::Length() const {
- return substance.Length();
-}
-
-void CellBuffer::Allocate(int newSize) {
- substance.ReAllocate(newSize);
- style.ReAllocate(newSize);
-}
-
-void CellBuffer::SetPerLine(PerLine *pl) {
- lv.SetPerLine(pl);
-}
-
-int CellBuffer::Lines() const {
- return lv.Lines();
-}
-
-int CellBuffer::LineStart(int line) const {
- if (line < 0)
- return 0;
- else if (line >= Lines())
- return Length();
- else
- return lv.LineStart(line);
-}
-
-bool CellBuffer::IsReadOnly() const {
- return readOnly;
-}
-
-void CellBuffer::SetReadOnly(bool set) {
- readOnly = set;
-}
-
-void CellBuffer::SetSavePoint() {
- uh.SetSavePoint();
-}
-
-bool CellBuffer::IsSavePoint() {
- return uh.IsSavePoint();
-}
-
-// Without undo
-
-void CellBuffer::InsertLine(int line, int position, bool lineStart) {
- lv.InsertLine(line, position, lineStart);
-}
-
-void CellBuffer::RemoveLine(int line) {
- lv.RemoveLine(line);
-}
-
-void CellBuffer::BasicInsertString(int position, const char *s, int insertLength) {
- if (insertLength == 0)
- return;
- PLATFORM_ASSERT(insertLength > 0);
-
- substance.InsertFromArray(position, s, 0, insertLength);
- style.InsertValue(position, insertLength, 0);
-
- int lineInsert = lv.LineFromPosition(position) + 1;
- bool atLineStart = lv.LineStart(lineInsert-1) == position;
- // Point all the lines after the insertion point further along in the buffer
- lv.InsertText(lineInsert-1, insertLength);
- char chPrev = substance.ValueAt(position - 1);
- char chAfter = substance.ValueAt(position + insertLength);
- if (chPrev == '\r' && chAfter == '\n') {
- // Splitting up a crlf pair at position
- InsertLine(lineInsert, position, false);
- lineInsert++;
- }
- char ch = ' ';
- for (int i = 0; i < insertLength; i++) {
- ch = s[i];
- if (ch == '\r') {
- InsertLine(lineInsert, (position + i) + 1, atLineStart);
- lineInsert++;
- } else if (ch == '\n') {
- if (chPrev == '\r') {
- // Patch up what was end of line
- lv.SetLineStart(lineInsert - 1, (position + i) + 1);
- } else {
- InsertLine(lineInsert, (position + i) + 1, atLineStart);
- lineInsert++;
- }
- }
- chPrev = ch;
- }
- // Joining two lines where last insertion is cr and following substance starts with lf
- if (chAfter == '\n') {
- if (ch == '\r') {
- // End of line already in buffer so drop the newly created one
- RemoveLine(lineInsert - 1);
- }
- }
-}
-
-void CellBuffer::BasicDeleteChars(int position, int deleteLength) {
- if (deleteLength == 0)
- return;
-
- if ((position == 0) && (deleteLength == substance.Length())) {
- // If whole buffer is being deleted, faster to reinitialise lines data
- // than to delete each line.
- lv.Init();
- } else {
- // Have to fix up line positions before doing deletion as looking at text in buffer
- // to work out which lines have been removed
-
- int lineRemove = lv.LineFromPosition(position) + 1;
- lv.InsertText(lineRemove-1, - (deleteLength));
- char chPrev = substance.ValueAt(position - 1);
- char chBefore = chPrev;
- char chNext = substance.ValueAt(position);
- bool ignoreNL = false;
- if (chPrev == '\r' && chNext == '\n') {
- // Move back one
- lv.SetLineStart(lineRemove, position);
- lineRemove++;
- ignoreNL = true; // First \n is not real deletion
- }
-
- char ch = chNext;
- for (int i = 0; i < deleteLength; i++) {
- chNext = substance.ValueAt(position + i + 1);
- if (ch == '\r') {
- if (chNext != '\n') {
- RemoveLine(lineRemove);
- }
- } else if (ch == '\n') {
- if (ignoreNL) {
- ignoreNL = false; // Further \n are real deletions
- } else {
- RemoveLine(lineRemove);
- }
- }
-
- ch = chNext;
- }
- // May have to fix up end if last deletion causes cr to be next to lf
- // or removes one of a crlf pair
- char chAfter = substance.ValueAt(position + deleteLength);
- if (chBefore == '\r' && chAfter == '\n') {
- // Using lineRemove-1 as cr ended line before start of deletion
- RemoveLine(lineRemove - 1);
- lv.SetLineStart(lineRemove - 1, position + 1);
- }
- }
- substance.DeleteRange(position, deleteLength);
- style.DeleteRange(position, deleteLength);
-}
-
-bool CellBuffer::SetUndoCollection(bool collectUndo) {
- collectingUndo = collectUndo;
- uh.DropUndoSequence();
- return collectingUndo;
-}
-
-bool CellBuffer::IsCollectingUndo() const {
- return collectingUndo;
-}
-
-void CellBuffer::BeginUndoAction() {
- uh.BeginUndoAction();
-}
-
-void CellBuffer::EndUndoAction() {
- uh.EndUndoAction();
-}
-
-void CellBuffer::AddUndoAction(int token, bool mayCoalesce) {
- bool startSequence;
- uh.AppendAction(containerAction, token, 0, 0, startSequence, mayCoalesce);
-}
-
-void CellBuffer::DeleteUndoHistory() {
- uh.DeleteUndoHistory();
-}
-
-bool CellBuffer::CanUndo() {
- return uh.CanUndo();
-}
-
-int CellBuffer::StartUndo() {
- return uh.StartUndo();
-}
-
-const Action &CellBuffer::GetUndoStep() const {
- return uh.GetUndoStep();
-}
-
-void CellBuffer::PerformUndoStep() {
- const Action &actionStep = uh.GetUndoStep();
- if (actionStep.at == insertAction) {
- BasicDeleteChars(actionStep.position, actionStep.lenData);
- } else if (actionStep.at == removeAction) {
- BasicInsertString(actionStep.position, actionStep.data, actionStep.lenData);
- }
- uh.CompletedUndoStep();
-}
-
-bool CellBuffer::CanRedo() {
- return uh.CanRedo();
-}
-
-int CellBuffer::StartRedo() {
- return uh.StartRedo();
-}
-
-const Action &CellBuffer::GetRedoStep() const {
- return uh.GetRedoStep();
-}
-
-void CellBuffer::PerformRedoStep() {
- const Action &actionStep = uh.GetRedoStep();
- if (actionStep.at == insertAction) {
- BasicInsertString(actionStep.position, actionStep.data, actionStep.lenData);
- } else if (actionStep.at == removeAction) {
- BasicDeleteChars(actionStep.position, actionStep.lenData);
- }
- uh.CompletedRedoStep();
-}
-
Deleted: trunk/scintilla/CellBuffer.h
===================================================================
--- trunk/scintilla/CellBuffer.h 2011-01-10 13:58:12 UTC (rev 5520)
+++ trunk/scintilla/CellBuffer.h 2011-01-10 17:21:48 UTC (rev 5521)
@@ -1,208 +0,0 @@
-// Scintilla source code edit control
-/** @file CellBuffer.h
- ** Manages the text of the document.
- **/
-// Copyright 1998-2004 by Neil Hodgson <neilh at scintilla.org>
-// The License.txt file describes the conditions under which this software may be distributed.
-
-#ifndef CELLBUFFER_H
-#define CELLBUFFER_H
-
-#ifdef SCI_NAMESPACE
-namespace Scintilla {
-#endif
-
-// Interface to per-line data that wants to see each line insertion and deletion
-class PerLine {
-public:
- virtual ~PerLine() {}
- virtual void Init()=0;
- virtual void InsertLine(int)=0;
- virtual void RemoveLine(int)=0;
-};
-
-/**
- * The line vector contains information about each of the lines in a cell buffer.
- */
-class LineVector {
-
- Partitioning starts;
- PerLine *perLine;
-
-public:
-
- LineVector();
- ~LineVector();
- void Init();
- void SetPerLine(PerLine *pl);
-
- void InsertText(int line, int delta);
- void InsertLine(int line, int position, bool lineStart);
- void SetLineStart(int line, int position);
- void RemoveLine(int line);
- int Lines() const {
- return starts.Partitions();
- }
- int LineFromPosition(int pos) const;
- int LineStart(int line) const {
- return starts.PositionFromPartition(line);
- }
-
- int MarkValue(int line);
- int AddMark(int line, int marker);
- void MergeMarkers(int pos);
- void DeleteMark(int line, int markerNum, bool all);
- void DeleteMarkFromHandle(int markerHandle);
- int LineFromHandle(int markerHandle);
-
- void ClearLevels();
- int SetLevel(int line, int level);
- int GetLevel(int line);
-
- int SetLineState(int line, int state);
- int GetLineState(int line);
- int GetMaxLineState();
-
-};
-
-enum actionType { insertAction, removeAction, startAction, containerAction };
-
-/**
- * Actions are used to store all the information required to perform one undo/redo step.
- */
-class Action {
-public:
- actionType at;
- int position;
- char *data;
- int lenData;
- bool mayCoalesce;
-
- Action();
- ~Action();
- void Create(actionType at_, int position_=0, char *data_=0, int lenData_=0, bool mayCoalesce_=true);
- void Destroy();
- void Grab(Action *source);
-};
-
-/**
- *
- */
-class UndoHistory {
- Action *actions;
- int lenActions;
- int maxAction;
- int currentAction;
- int undoSequenceDepth;
- int savePoint;
-
- void EnsureUndoRoom();
-
-public:
- UndoHistory();
- ~UndoHistory();
-
- void AppendAction(actionType at, int position, char *data, int length, bool &startSequence, bool mayCoalesce=true);
-
- void BeginUndoAction();
- void EndUndoAction();
- void DropUndoSequence();
- void DeleteUndoHistory();
-
- /// The save point is a marker in the undo stack where the container has stated that
- /// the buffer was saved. Undo and redo can move over the save point.
- void SetSavePoint();
- bool IsSavePoint() const;
-
- /// To perform an undo, StartUndo is called to retrieve the number of steps, then UndoStep is
- /// called that many times. Similarly for redo.
- bool CanUndo() const;
- int StartUndo();
- const Action &GetUndoStep() const;
- void CompletedUndoStep();
- bool CanRedo() const;
- int StartRedo();
- const Action &GetRedoStep() const;
- void CompletedRedoStep();
-};
-
-/**
- * Holder for an expandable array of characters that supports undo and line markers.
- * Based on article "Data Structures in a Bit-Mapped Text Editor"
- * by Wilfred J. Hansen, Byte January 1987, page 183.
- */
-class CellBuffer {
-private:
- SplitVector<char> substance;
- SplitVector<char> style;
- bool readOnly;
-
- bool collectingUndo;
- UndoHistory uh;
-
- LineVector lv;
-
-public:
-
- CellBuffer();
- ~CellBuffer();
-
- /// Retrieving positions outside the range of the buffer works and returns 0
- char CharAt(int position) const;
- void GetCharRange(char *buffer, int position, int lengthRetrieve) const;
- char StyleAt(int position) const;
- const char *BufferPointer();
-
- int Length() const;
- void Allocate(int newSize);
- void SetPerLine(PerLine *pl);
- int Lines() const;
- int LineStart(int line) const;
- int LineFromPosition(int pos) const { return lv.LineFromPosition(pos); }
- void InsertLine(int line, int position, bool lineStart);
- void RemoveLine(int line);
- const char *InsertString(int position, const char *s, int insertLength, bool &startSequence);
-
- /// Setting styles for positions outside the range of the buffer is safe and has no effect.
- /// @return true if the style of a character is changed.
- bool SetStyleAt(int position, char styleValue, char mask='\377');
- bool SetStyleFor(int position, int length, char styleValue, char mask);
-
- const char *DeleteChars(int position, int deleteLength, bool &startSequence);
-
- bool IsReadOnly() const;
- void SetReadOnly(bool set);
-
- /// The save point is a marker in the undo stack where the container has stated that
- /// the buffer was saved. Undo and redo can move over the save point.
- void SetSavePoint();
- bool IsSavePoint();
-
- /// Actions without undo
- void BasicInsertString(int position, const char *s, int insertLength);
- void BasicDeleteChars(int position, int deleteLength);
-
- bool SetUndoCollection(bool collectUndo);
- bool IsCollectingUndo() const;
- void BeginUndoAction();
- void EndUndoAction();
- void AddUndoAction(int token, bool mayCoalesce);
- void DeleteUndoHistory();
-
- /// To perform an undo, StartUndo is called to retrieve the number of steps, then UndoStep is
- /// called that many times. Similarly for redo.
- bool CanUndo();
- int StartUndo();
- const Action &GetUndoStep() const;
- void PerformUndoStep();
- bool CanRedo();
- int StartRedo();
- const Action &GetRedoStep() const;
- void PerformRedoStep();
-};
-
-#ifdef SCI_NAMESPACE
-}
-#endif
-
-#endif
Deleted: trunk/scintilla/CharClassify.cxx
===================================================================
--- trunk/scintilla/CharClassify.cxx 2011-01-10 13:58:12 UTC (rev 5520)
+++ trunk/scintilla/CharClassify.cxx 2011-01-10 17:21:48 UTC (rev 5521)
@@ -1,78 +0,0 @@
-// Scintilla source code edit control
-/** @file CharClassify.cxx
- ** Character classifications used by Document and RESearch.
- **/
-// Copyright 2006 by Neil Hodgson <neilh at scintilla.org>
-// The License.txt file describes the conditions under which this software may be distributed.
-
-#include <stdlib.h>
-#include <ctype.h>
-
-#include "CharClassify.h"
-
-// Shut up annoying Visual C++ warnings:
-#ifdef _MSC_VER
-#pragma warning(disable: 4514)
-#endif
-
-CharClassify::CharClassify() {
- SetDefaultCharClasses(true);
-}
-
-void CharClassify::SetDefaultCharClasses(bool includeWordClass) {
- // Initialize all char classes to default values
- for (int ch = 0; ch < 256; ch++) {
- if (ch == '\r' || ch == '\n')
- charClass[ch] = ccNewLine;
- else if (ch < 0x20 || ch == ' ')
- charClass[ch] = ccSpace;
- else if (includeWordClass && (ch >= 0x80 || isalnum(ch) || ch == '_'))
- charClass[ch] = ccWord;
- else
- charClass[ch] = ccPunctuation;
- }
-}
-
-void CharClassify::SetCharClasses(const unsigned char *chars, cc newCharClass) {
- // Apply the newCharClass to the specifed chars
- if (chars) {
- while (*chars) {
- charClass[*chars] = static_cast<unsigned char>(newCharClass);
- chars++;
- }
- }
-}
-
-int CompareCaseInsensitive(const char *a, const char *b) {
- while (*a && *b) {
- if (*a != *b) {
- char upperA = MakeUpperCase(*a);
- char upperB = MakeUpperCase(*b);
- if (upperA != upperB)
- return upperA - upperB;
- }
- a++;
- b++;
- }
- // Either *a or *b is nul
- return *a - *b;
-}
-
-int CompareNCaseInsensitive(const char *a, const char *b, size_t len) {
- while (*a && *b && len) {
- if (*a != *b) {
- char upperA = MakeUpperCase(*a);
- char upperB = MakeUpperCase(*b);
- if (upperA != upperB)
- return upperA - upperB;
- }
- a++;
- b++;
- len--;
- }
- if (len == 0)
- return 0;
- else
- // Either *a or *b is nul
- return *a - *b;
-}
Deleted: trunk/scintilla/CharClassify.h
===================================================================
--- trunk/scintilla/CharClassify.h 2011-01-10 13:58:12 UTC (rev 5520)
+++ trunk/scintilla/CharClassify.h 2011-01-10 17:21:48 UTC (rev 5521)
@@ -1,37 +0,0 @@
-// Scintilla source code edit control
-/** @file CharClassify.h
- ** Character classifications used by Document and RESearch.
- **/
-// Copyright 2006-2009 by Neil Hodgson <neilh at scintilla.org>
-// The License.txt file describes the conditions under which this software may be distributed.
-
-#ifndef CHARCLASSIFY_H
-#define CHARCLASSIFY_H
-
-class CharClassify {
-public:
- CharClassify();
-
- enum cc { ccSpace, ccNewLine, ccWord, ccPunctuation };
- void SetDefaultCharClasses(bool includeWordClass);
- void SetCharClasses(const unsigned char *chars, cc newCharClass);
- cc GetClass(unsigned char ch) const { return static_cast<cc>(charClass[ch]);}
- bool IsWord(unsigned char ch) const { return static_cast<cc>(charClass[ch]) == ccWord;}
-
-private:
- enum { maxChar=256 };
- unsigned char charClass[maxChar]; // not type cc to save space
-};
-
-// These functions are implemented because each platform calls them something different.
-int CompareCaseInsensitive(const char *a, const char *b);
-int CompareNCaseInsensitive(const char *a, const char *b, size_t len);
-
-inline char MakeUpperCase(char ch) {
- if (ch < 'a' || ch > 'z')
- return ch;
- else
- return static_cast<char>(ch - 'a' + 'A');
-}
-
-#endif
Deleted: trunk/scintilla/CharacterSet.h
===================================================================
--- trunk/scintilla/CharacterSet.h 2011-01-10 13:58:12 UTC (rev 5520)
+++ trunk/scintilla/CharacterSet.h 2011-01-10 17:21:48 UTC (rev 5521)
@@ -1,59 +0,0 @@
-// Scintilla source code edit control
-/** @file CharacterSet.h
- ** Encapsulates a set of characters. Used to test if a character is within a set.
- **/
-// Copyright 2007 by Neil Hodgson <neilh at scintilla.org>
-// The License.txt file describes the conditions under which this software may be distributed.
-
-class CharacterSet {
- int size;
- bool valueAfter;
- bool *bset;
-public:
- enum setBase {
- setNone=0,
- setLower=1,
- setUpper=2,
- setDigits=4,
- setAlpha=setLower|setUpper,
- setAlphaNum=setAlpha|setDigits
- };
- CharacterSet(setBase base=setNone, const char *initialSet="", int size_=0x80, bool valueAfter_=false) {
- size = size_;
- valueAfter = valueAfter_;
- bset = new bool[size];
- for (int i=0; i < size; i++) {
- bset[i] = false;
- }
- AddString(initialSet);
- if (base & setLower)
- AddString("abcdefghijklmnopqrstuvwxyz");
- if (base & setUpper)
- AddString("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
- if (base & setDigits)
- AddString("0123456789");
- }
- ~CharacterSet() {
- delete []bset;
- bset = 0;
- size = 0;
- }
- void Add(int val) {
- PLATFORM_ASSERT(val >= 0);
- PLATFORM_ASSERT(val < size);
- bset[val] = true;
- }
- void AddString(const char *CharacterSet) {
- for (const char *cp=CharacterSet; *cp; cp++) {
- int val = static_cast<unsigned char>(*cp);
- PLATFORM_ASSERT(val >= 0);
- PLATFORM_ASSERT(val < size);
- bset[val] = true;
- }
- }
- bool Contains(int val) const {
- PLATFORM_ASSERT(val >= 0);
- if (val < 0) return false;
- return (val < size) ? bset[val] : valueAfter;
- }
-};
Deleted: trunk/scintilla/ContractionState.cxx
===================================================================
--- trunk/scintilla/ContractionState.cxx 2011-01-10 13:58:12 UTC (rev 5520)
+++ trunk/scintilla/ContractionState.cxx 2011-01-10 17:21:48 UTC (rev 5521)
@@ -1,251 +0,0 @@
-// Scintilla source code edit control
-/** @file ContractionState.cxx
- ** Manages visibility of lines for folding and wrapping.
- **/
-// Copyright 1998-2007 by Neil Hodgson <neilh at scintilla.org>
-// The License.txt file describes the conditions under which this software may be distributed.
-
-#include <string.h>
-
-#include "Platform.h"
-
-#include "SplitVector.h"
-#include "Partitioning.h"
-#include "RunStyles.h"
-#include "ContractionState.h"
-
-#ifdef SCI_NAMESPACE
-using namespace Scintilla;
-#endif
-
-ContractionState::ContractionState() : visible(0), expanded(0), heights(0), displayLines(0), linesInDocument(1) {
- //InsertLine(0);
-}
-
-ContractionState::~ContractionState() {
- Clear();
-}
-
-void ContractionState::EnsureData() {
- if (OneToOne()) {
- visible = new RunStyles();
- expanded = new RunStyles();
- heights = new RunStyles();
- displayLines = new Partitioning(4);
- InsertLines(0, linesInDocument);
- }
-}
-
-void ContractionState::Clear() {
- delete visible;
- visible = 0;
- delete expanded;
- expanded = 0;
- delete heights;
- heights = 0;
- delete displayLines;
- displayLines = 0;
- linesInDocument = 1;
-}
-
-int ContractionState::LinesInDoc() const {
- if (OneToOne()) {
- return linesInDocument;
- } else {
- return displayLines->Partitions() - 1;
- }
-}
-
-int ContractionState::LinesDisplayed() const {
- if (OneToOne()) {
- return linesInDocument;
- } else {
- return displayLines->PositionFromPartition(LinesInDoc());
- }
-}
-
-int ContractionState::DisplayFromDoc(int lineDoc) const {
- if (OneToOne()) {
- return lineDoc;
- } else {
- if (lineDoc > displayLines->Partitions())
- lineDoc = displayLines->Partitions();
- return displayLines->PositionFromPartition(lineDoc);
- }
-}
-
-int ContractionState::DocFromDisplay(int lineDisplay) const {
- if (OneToOne()) {
- return lineDisplay;
- } else {
- if (lineDisplay <= 0) {
- return 0;
- }
- if (lineDisplay > LinesDisplayed()) {
- return displayLines->PartitionFromPosition(LinesDisplayed());
- }
- int lineDoc = displayLines->PartitionFromPosition(lineDisplay);
- PLATFORM_ASSERT(GetVisible(lineDoc));
- return lineDoc;
- }
-}
-
-void ContractionState::InsertLine(int lineDoc) {
- if (OneToOne()) {
- linesInDocument++;
- } else {
- visible->InsertSpace(lineDoc, 1);
- visible->SetValueAt(lineDoc, 1);
- expanded->InsertSpace(lineDoc, 1);
- expanded->SetValueAt(lineDoc, 1);
- heights->InsertSpace(lineDoc, 1);
- heights->SetValueAt(lineDoc, 1);
- int lineDisplay = DisplayFromDoc(lineDoc);
- displayLines->InsertPartition(lineDoc, lineDisplay);
- displayLines->InsertText(lineDoc, 1);
- }
-}
-
-void ContractionState::InsertLines(int lineDoc, int lineCount) {
- for (int l = 0; l < lineCount; l++) {
- InsertLine(lineDoc + l);
- }
- Check();
-}
-
-void ContractionState::DeleteLine(int lineDoc) {
- if (OneToOne()) {
- linesInDocument--;
- } else {
- if (GetVisible(lineDoc)) {
- displayLines->InsertText(lineDoc, -heights->ValueAt(lineDoc));
- }
- displayLines->RemovePartition(lineDoc);
- visible->DeleteRange(lineDoc, 1);
- expanded->DeleteRange(lineDoc, 1);
- heights->DeleteRange(lineDoc, 1);
- }
-}
-
-void ContractionState::DeleteLines(int lineDoc, int lineCount) {
- for (int l = 0; l < lineCount; l++) {
- DeleteLine(lineDoc);
- }
- Check();
-}
-
-bool ContractionState::GetVisible(int lineDoc) const {
- if (OneToOne()) {
- return true;
- } else {
- if (lineDoc >= visible->Length())
- return true;
- return visible->ValueAt(lineDoc) == 1;
- }
-}
-
-bool ContractionState::SetVisible(int lineDocStart, int lineDocEnd, bool visible_) {
- if (OneToOne() && visible_) {
- return false;
- } else {
- EnsureData();
- int delta = 0;
- Check();
- if ((lineDocStart <= lineDocEnd) && (lineDocStart >= 0) && (lineDocEnd < LinesInDoc())) {
- for (int line = lineDocStart; line <= lineDocEnd; line++) {
- if (GetVisible(line) != visible_) {
- int difference = visible_ ? heights->ValueAt(line) : -heights->ValueAt(line);
- visible->SetValueAt(line, visible_ ? 1 : 0);
- displayLines->InsertText(line, difference);
- delta += difference;
- }
- }
- } else {
- return false;
- }
- Check();
- return delta != 0;
- }
-}
-
-bool ContractionState::GetExpanded(int lineDoc) const {
- if (OneToOne()) {
- return true;
- } else {
- Check();
- return expanded->ValueAt(lineDoc) == 1;
- }
-}
-
-bool ContractionState::SetExpanded(int lineDoc, bool expanded_) {
- if (OneToOne() && expanded_) {
- return false;
- } else {
- EnsureData();
- if (expanded_ != (expanded->ValueAt(lineDoc) == 1)) {
- expanded->SetValueAt(lineDoc, expanded_ ? 1 : 0);
- Check();
- return true;
- } else {
- Check();
- return false;
- }
- }
-}
-
-int ContractionState::GetHeight(int lineDoc) const {
- if (OneToOne()) {
- return 1;
- } else {
- return heights->ValueAt(lineDoc);
- }
-}
-
-// Set the number of display lines needed for this line.
-// Return true if this is a change.
-bool ContractionState::SetHeight(int lineDoc, int height) {
- if (OneToOne() && (height == 1)) {
- return false;
- } else {
- EnsureData();
- if (GetHeight(lineDoc) != height) {
- if (GetVisible(lineDoc)) {
- displayLines->InsertText(lineDoc, height - GetHeight(lineDoc));
- }
- heights->SetValueAt(lineDoc, height);
- Check();
- return true;
- } else {
- Check();
- return false;
- }
- }
-}
-
-void ContractionState::ShowAll() {
- int lines = LinesInDoc();
- Clear();
- linesInDocument = lines;
-}
-
-// Debugging checks
-
-void ContractionState::Check() const {
-#ifdef CHECK_CORRECTNESS
- for (int vline = 0; vline < LinesDisplayed(); vline++) {
- const int lineDoc = DocFromDisplay(vline);
- PLATFORM_ASSERT(GetVisible(lineDoc));
- }
- for (int lineDoc = 0; lineDoc < LinesInDoc(); lineDoc++) {
- const int displayThis = DisplayFromDoc(lineDoc);
- const int displayNext = DisplayFromDoc(lineDoc + 1);
- const int height = displayNext - displayThis;
- PLATFORM_ASSERT(height >= 0);
- if (GetVisible(lineDoc)) {
- PLATFORM_ASSERT(GetHeight(lineDoc) == height);
- } else {
- PLATFORM_ASSERT(0 == height);
- }
- }
-#endif
-}
Deleted: trunk/scintilla/ContractionState.h
===================================================================
--- trunk/scintilla/ContractionState.h 2011-01-10 13:58:12 UTC (rev 5520)
+++ trunk/scintilla/ContractionState.h 2011-01-10 17:21:48 UTC (rev 5521)
@@ -1,66 +0,0 @@
-// Scintilla source code edit control
-/** @file ContractionState.h
- ** Manages visibility of lines for folding and wrapping.
- **/
-// Copyright 1998-2007 by Neil Hodgson <neilh at scintilla.org>
-// The License.txt file describes the conditions under which this software may be distributed.
-
-#ifndef CONTRACTIONSTATE_H
-#define CONTRACTIONSTATE_H
-
-#ifdef SCI_NAMESPACE
-namespace Scintilla {
-#endif
-
-/**
- */
-class ContractionState {
- // These contain 1 element for every document line.
- RunStyles *visible;
- RunStyles *expanded;
- RunStyles *heights;
- Partitioning *displayLines;
- int linesInDocument;
-
- void EnsureData();
-
- bool OneToOne() const {
- // True when each document line is exactly one display line so need for
- // complex data structures.
- return visible == 0;
- }
-
-public:
- ContractionState();
- virtual ~ContractionState();
-
- void Clear();
-
- int LinesInDoc() const;
- int LinesDisplayed() const;
- int DisplayFromDoc(int lineDoc) const;
- int DocFromDisplay(int lineDisplay) const;
-
- void InsertLine(int lineDoc);
- void InsertLines(int lineDoc, int lineCount);
- void DeleteLine(int lineDoc);
- void DeleteLines(int lineDoc, int lineCount);
-
- bool GetVisible(int lineDoc) const;
- bool SetVisible(int lineDocStart, int lineDocEnd, bool visible);
-
- bool GetExpanded(int lineDoc) const;
- bool SetExpanded(int lineDoc, bool expanded);
-
- int GetHeight(int lineDoc) const;
- bool SetHeight(int lineDoc, int height);
-
- void ShowAll();
- void Check() const;
-};
-
-#ifdef SCI_NAMESPACE
-}
-#endif
-
-#endif
Deleted: trunk/scintilla/Converter.h
===================================================================
--- trunk/scintilla/Converter.h 2011-01-10 13:58:12 UTC (rev 5520)
+++ trunk/scintilla/Converter.h 2011-01-10 17:21:48 UTC (rev 5521)
@@ -1,70 +0,0 @@
-// Scintilla source code edit control
-// Converter.h - Encapsulation of iconv
-// Copyright 2004 by Neil Hodgson <neilh at scintilla.org>
-// The License.txt file describes the conditions under which this software may be distributed.
-
-typedef GIConv ConverterHandle;
-const ConverterHandle iconvhBad = (ConverterHandle)(-1);
-// Since various versions of iconv can not agree on whether the src argument
-// is char ** or const char ** provide a templatised adaptor.
-template<typename T>
-size_t iconv_adaptor(size_t(*f_iconv)(ConverterHandle, T, size_t *, char **, size_t *),
- ConverterHandle cd, char** src, size_t *srcleft,
- char **dst, size_t *dstleft) {
- return f_iconv(cd, (T)src, srcleft, dst, dstleft);
-}
-/**
- * Encapsulate iconv safely and avoid iconv_adaptor complexity in client code.
- */
-class Converter {
- ConverterHandle iconvh;
- void OpenHandle(const char *fullDestination, const char *charSetSource) {
- iconvh = g_iconv_open(fullDestination, charSetSource);
- }
- bool Succeeded() const {
- return iconvh != iconvhBad;
- }
-public:
- Converter() {
- iconvh = iconvhBad;
- }
- Converter(const char *charSetDestination, const char *charSetSource, bool transliterations) {
- iconvh = iconvhBad;
- Open(charSetDestination, charSetSource, transliterations);
- }
- ~Converter() {
- Close();
- }
- operator bool() const {
- return Succeeded();
- }
- void Open(const char *charSetDestination, const char *charSetSource, bool transliterations=true) {
- Close();
- if (*charSetSource) {
- // Try allowing approximate transliterations
- if (transliterations) {
- char fullDest[200];
- strcpy(fullDest, charSetDestination);
- strcat(fullDest, "//TRANSLIT");
- OpenHandle(fullDest, charSetSource);
- }
- if (!Succeeded()) {
- // Transliterations failed so try basic name
- OpenHandle(charSetDestination, charSetSource);
- }
- }
- }
- void Close() {
- if (Succeeded()) {
- g_iconv_close(iconvh);
- iconvh = iconvhBad;
- }
- }
- size_t Convert(char** src, size_t *srcleft, char **dst, size_t *dstleft) const {
- if (!Succeeded()) {
- return (size_t)(-1);
- } else {
- return iconv_adaptor(g_iconv, iconvh, src, srcleft, dst, dstleft);
- }
- }
-};
Deleted: trunk/scintilla/Decoration.cxx
===================================================================
--- trunk/scintilla/Decoration.cxx 2011-01-10 13:58:12 UTC (rev 5520)
+++ trunk/scintilla/Decoration.cxx 2011-01-10 17:21:48 UTC (rev 5521)
@@ -1,188 +0,0 @@
-/** @file Decoration.cxx
- ** Visual elements added over text.
- **/
-// Copyright 1998-2007 by Neil Hodgson <neilh at scintilla.org>
-// The License.txt file describes the conditions under which this software may be distributed.
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdarg.h>
-
-#include "Platform.h"
-
-#include "Scintilla.h"
-#include "SplitVector.h"
-#include "Partitioning.h"
-#include "RunStyles.h"
-#include "Decoration.h"
-
-#ifdef SCI_NAMESPACE
-using namespace Scintilla;
-#endif
-
-Decoration::Decoration(int indicator_) : next(0), indicator(indicator_) {
-}
-
-Decoration::~Decoration() {
-}
-
-bool Decoration::Empty() {
- return rs.starts->Partitions() == 1;
-}
-
-DecorationList::DecorationList() : currentIndicator(0), currentValue(1), current(0),
- lengthDocument(0), root(0), clickNotified(false) {
-}
-
-DecorationList::~DecorationList() {
- Decoration *deco = root;
- while (deco) {
- Decoration *decoNext = deco->next;
- delete deco;
- deco = decoNext;
- }
- root = 0;
- current = 0;
-}
-
-Decoration *DecorationList::DecorationFromIndicator(int indicator) {
- for (Decoration *deco=root; deco; deco = deco->next) {
- if (deco->indicator == indicator) {
- return deco;
- }
- }
- return 0;
-}
-
-Decoration *DecorationList::Create(int indicator, int length) {
- currentIndicator = indicator;
- Decoration *decoNew = new Decoration(indicator);
- decoNew->rs.InsertSpace(0, length);
-
- Decoration *decoPrev = 0;
- Decoration *deco = root;
-
- while (deco && (deco->indicator < indicator)) {
- decoPrev = deco;
- deco = deco->next;
- }
- if (decoPrev == 0) {
- decoNew->next = root;
- root = decoNew;
- } else {
- decoNew->next = deco;
- decoPrev->next = decoNew;
- }
- return decoNew;
-}
-
-void DecorationList::Delete(int indicator) {
- Decoration *decoToDelete = 0;
- if (root) {
- if (root->indicator == indicator) {
- decoToDelete = root;
- root = root->next;
- } else {
- Decoration *deco=root;
- while (deco->next && !decoToDelete) {
- if (deco->next && deco->next->indicator == indicator) {
- decoToDelete = deco->next;
- deco->next = decoToDelete->next;
- } else {
- deco = deco->next;
- }
- }
- }
- }
- if (decoToDelete) {
- delete decoToDelete;
- current = 0;
- }
-}
-
-void DecorationList::SetCurrentIndicator(int indicator) {
- currentIndicator = indicator;
- current = DecorationFromIndicator(indicator);
- currentValue = 1;
-}
-
-void DecorationList::SetCurrentValue(int value) {
- currentValue = value ? value : 1;
-}
-
-bool DecorationList::FillRange(int &position, int value, int &fillLength) {
- if (!current) {
- current = DecorationFromIndicator(currentIndicator);
- if (!current) {
- current = Create(currentIndicator, lengthDocument);
- }
- }
- bool changed = current->rs.FillRange(position, value, fillLength);
- if (current->Empty()) {
- Delete(currentIndicator);
- }
- return changed;
-}
-
-void DecorationList::InsertSpace(int position, int insertLength) {
- lengthDocument += insertLength;
- for (Decoration *deco=root; deco; deco = deco->next) {
- deco->rs.InsertSpace(position, insertLength);
- }
-}
-
-void DecorationList::DeleteRange(int position, int deleteLength) {
- lengthDocument -= deleteLength;
- Decoration *deco;
- for (deco=root; deco; deco = deco->next) {
- deco->rs.DeleteRange(position, deleteLength);
- }
- DeleteAnyEmpty();
-}
-
-void DecorationList::DeleteAnyEmpty() {
- Decoration *deco = root;
- while (deco) {
- if (deco->Empty()) {
- Delete(deco->indicator);
- deco = root;
- } else {
- deco = deco->next;
- }
- }
-}
-
-int DecorationList::AllOnFor(int position) {
- int mask = 0;
- for (Decoration *deco=root; deco; deco = deco->next) {
- if (deco->rs.ValueAt(position)) {
- mask |= 1 << deco->indicator;
- }
- }
- return mask;
-}
-
-int DecorationList::ValueAt(int indicator, int position) {
- Decoration *deco = DecorationFromIndicator(indicator);
- if (deco) {
- return deco->rs.ValueAt(position);
- }
- return 0;
-}
-
-int DecorationList::Start(int indicator, int position) {
- Decoration *deco = DecorationFromIndicator(indicator);
- if (deco) {
- return deco->rs.StartRun(position);
- }
- return 0;
-}
-
-int DecorationList::End(int indicator, int position) {
- Decoration *deco = DecorationFromIndicator(indicator);
- if (deco) {
- return deco->rs.EndRun(position);
- }
- return 0;
-}
Deleted: trunk/scintilla/Decoration.h
===================================================================
--- trunk/scintilla/Decoration.h 2011-01-10 13:58:12 UTC (rev 5520)
+++ trunk/scintilla/Decoration.h 2011-01-10 17:21:48 UTC (rev 5521)
@@ -1,64 +0,0 @@
-/** @file Decoration.h
- ** Visual elements added over text.
- **/
-// Copyright 1998-2007 by Neil Hodgson <neilh at scintilla.org>
-// The License.txt file describes the conditions under which this software may be distributed.
-
-#ifndef DECORATION_H
-#define DECORATION_H
-
-#ifdef SCI_NAMESPACE
-namespace Scintilla {
-#endif
-
-class Decoration {
-public:
- Decoration *next;
- RunStyles rs;
- int indicator;
-
- Decoration(int indicator_);
- ~Decoration();
-
- bool Empty();
-};
-
-class DecorationList {
- int currentIndicator;
- int currentValue;
- Decoration *current;
- int lengthDocument;
- Decoration *DecorationFromIndicator(int indicator);
- Decoration *Create(int indicator, int length);
- void Delete(int indicator);
- void DeleteAnyEmpty();
-public:
- Decoration *root;
- bool clickNotified;
-
- DecorationList();
- ~DecorationList();
-
- void SetCurrentIndicator(int indicator);
- int GetCurrentIndicator() const { return currentIndicator; }
-
- void SetCurrentValue(int value);
- int GetCurrentValue() const { return currentValue; }
-
- // Returns true if some values may have changed
- bool FillRange(int &position, int value, int &fillLength);
-
- void InsertSpace(int position, int insertLength);
- void DeleteRange(int position, int deleteLength);
-
- int AllOnFor(int position);
- int ValueAt(int indicator, int position);
- int Start(int indicator, int position);
- int End(int indicator, int position);
-};
-
-#ifdef SCI_NAMESPACE
-}
-#endif
-
-#endif
Deleted: trunk/scintilla/Document.cxx
===================================================================
--- trunk/scintilla/Document.cxx 2011-01-10 13:58:12 UTC (rev 5520)
+++ trunk/scintilla/Document.cxx 2011-01-10 17:21:48 UTC (rev 5521)
@@ -1,1920 +0,0 @@
-// Scintilla source code edit control
-/** @file Document.cxx
- ** Text document that handles notifications, DBCS, styling, words and end of line.
- **/
-// Copyright 1998-2003 by Neil Hodgson <neilh at scintilla.org>
-// The License.txt file describes the conditions under which this software may be distributed.
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <ctype.h>
-
-#include <string>
-#include <vector>
-
-// With Borland C++ 5.5, including <string> includes Windows.h leading to defining
-// FindText to FindTextA which makes calls here to Document::FindText fail.
-#ifdef __BORLANDC__
-#ifdef FindText
-#undef FindText
-#endif
-#endif
-
-#include "Platform.h"
-
-#include "Scintilla.h"
-#include "SplitVector.h"
-#include "Partitioning.h"
-#include "RunStyles.h"
-#include "CellBuffer.h"
-#include "PerLine.h"
-#include "CharClassify.h"
-#include "Decoration.h"
-#include "Document.h"
-#include "RESearch.h"
-#include "UniConversion.h"
-
-#ifdef SCI_NAMESPACE
-using namespace Scintilla;
-#endif
-
-// This is ASCII specific but is safe with chars >= 0x80
-static inline bool isspacechar(unsigned char ch) {
- return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d));
-}
-
-static inline bool IsPunctuation(char ch) {
- return isascii(ch) && ispunct(ch);
-}
-
-static inline bool IsADigit(char ch) {
- return isascii(ch) && isdigit(ch);
-}
-
-static inline bool IsLowerCase(char ch) {
- return isascii(ch) && islower(ch);
-}
-
-static inline bool IsUpperCase(char ch) {
- return isascii(ch) && isupper(ch);
-}
-
-Document::Document() {
- refCount = 0;
-#ifdef unix
- eolMode = SC_EOL_LF;
-#else
- eolMode = SC_EOL_CRLF;
-#endif
- dbcsCodePage = 0;
- stylingBits = 5;
- stylingBitsMask = 0x1F;
- stylingMask = 0;
- endStyled = 0;
- styleClock = 0;
- enteredModification = 0;
- enteredStyling = 0;
- enteredReadOnlyCount = 0;
- tabInChars = 8;
- indentInChars = 0;
- actualIndentInChars = 8;
- useTabs = true;
- tabIndents = true;
- backspaceUnindents = false;
- watchers = 0;
- lenWatchers = 0;
-
- matchesValid = false;
- regex = 0;
-
- perLineData[ldMarkers] = new LineMarkers();
- perLineData[ldLevels] = new LineLevels();
- perLineData[ldState] = new LineState();
- perLineData[ldMargin] = new LineAnnotation();
- perLineData[ldAnnotation] = new LineAnnotation();
-
- cb.SetPerLine(this);
-}
-
-Document::~Document() {
- for (int i = 0; i < lenWatchers; i++) {
- watchers[i].watcher->NotifyDeleted(this, watchers[i].userData);
- }
- delete []watchers;
- for (int j=0; j<ldSize; j++) {
- delete perLineData[j];
- perLineData[j] = 0;
- }
- watchers = 0;
- lenWatchers = 0;
- delete regex;
- regex = 0;
-}
-
-void Document::Init() {
- for (int j=0; j<ldSize; j++) {
- if (perLineData[j])
- perLineData[j]->Init();
- }
-}
-
-void Document::InsertLine(int line) {
- for (int j=0; j<ldSize; j++) {
- if (perLineData[j])
- perLineData[j]->InsertLine(line);
- }
-}
-
-void Document::RemoveLine(int line) {
- for (int j=0; j<ldSize; j++) {
- if (perLineData[j])
- perLineData[j]->RemoveLine(line);
- }
-}
-
-// Increase reference count and return its previous value.
-int Document::AddRef() {
- return refCount++;
-}
-
-// Decrease reference count and return its previous value.
-// Delete the document if reference count reaches zero.
-int Document::Release() {
- int curRefCount = --refCount;
- if (curRefCount == 0)
- delete this;
- return curRefCount;
-}
-
-void Document::SetSavePoint() {
- cb.SetSavePoint();
- NotifySavePoint(true);
-}
-
-int Document::GetMark(int line) {
- return static_cast<LineMarkers *>(perLineData[ldMarkers])->MarkValue(line);
-}
-
-int Document::AddMark(int line, int markerNum) {
- if (line <= LinesTotal()) {
- int prev = static_cast<LineMarkers *>(perLineData[ldMarkers])->
- AddMark(line, markerNum, LinesTotal());
- DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line);
- NotifyModified(mh);
- return prev;
- } else {
- return 0;
- }
-}
-
-void Document::AddMarkSet(int line, int valueSet) {
- unsigned int m = valueSet;
- for (int i = 0; m; i++, m >>= 1)
- if (m & 1)
- static_cast<LineMarkers *>(perLineData[ldMarkers])->
- AddMark(line, i, LinesTotal());
- DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line);
- NotifyModified(mh);
-}
-
-void Document::DeleteMark(int line, int markerNum) {
- static_cast<LineMarkers *>(perLineData[ldMarkers])->DeleteMark(line, markerNum, false);
- DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line);
- NotifyModified(mh);
-}
-
-void Document::DeleteMarkFromHandle(int markerHandle) {
- static_cast<LineMarkers *>(perLineData[ldMarkers])->DeleteMarkFromHandle(markerHandle);
- DocModification mh(SC_MOD_CHANGEMARKER, 0, 0, 0, 0);
- mh.line = -1;
- NotifyModified(mh);
-}
-
-void Document::DeleteAllMarks(int markerNum) {
- for (int line = 0; line < LinesTotal(); line++) {
- static_cast<LineMarkers *>(perLineData[ldMarkers])->DeleteMark(line, markerNum, true);
- }
- DocModification mh(SC_MOD_CHANGEMARKER, 0, 0, 0, 0);
- mh.line = -1;
- NotifyModified(mh);
-}
-
-int Document::LineFromHandle(int markerHandle) {
- return static_cast<LineMarkers *>(perLineData[ldMarkers])->LineFromHandle(markerHandle);
-}
-
-int Document::LineStart(int line) const {
- return cb.LineStart(line);
-}
-
-int Document::LineEnd(int line) const {
- if (line == LinesTotal() - 1) {
- return LineStart(line + 1);
- } else {
- int position = LineStart(line + 1) - 1;
- // When line terminator is CR+LF, may need to go back one more
- if ((position > LineStart(line)) && (cb.CharAt(position - 1) == '\r')) {
- position--;
- }
- return position;
- }
-}
-
-int Document::LineFromPosition(int pos) const {
- return cb.LineFromPosition(pos);
-}
-
-int Document::LineEndPosition(int position) const {
- return LineEnd(LineFromPosition(position));
-}
-
-bool Document::IsLineEndPosition(int position) const {
- return LineEnd(LineFromPosition(position)) == position;
-}
-
-int Document::VCHomePosition(int position) const {
- int line = LineFromPosition(position);
- int startPosition = LineStart(line);
- int endLine = LineEnd(line);
- int startText = startPosition;
- while (startText < endLine && (cb.CharAt(startText) == ' ' || cb.CharAt(startText) == '\t'))
- startText++;
- if (position == startText)
- return startPosition;
- else
- return startText;
-}
-
-int Document::SetLevel(int line, int level) {
- int prev = static_cast<LineLevels *>(perLineData[ldLevels])->SetLevel(line, level, LinesTotal());
- if (prev != level) {
- DocModification mh(SC_MOD_CHANGEFOLD | SC_MOD_CHANGEMARKER,
- LineStart(line), 0, 0, 0, line);
- mh.foldLevelNow = level;
- mh.foldLevelPrev = prev;
- NotifyModified(mh);
- }
- return prev;
-}
-
-int Document::GetLevel(int line) const {
- return static_cast<LineLevels *>(perLineData[ldLevels])->GetLevel(line);
-}
-
-void Document::ClearLevels() {
- static_cast<LineLevels *>(perLineData[ldLevels])->ClearLevels();
-}
-
-static bool IsSubordinate(int levelStart, int levelTry) {
- if (levelTry & SC_FOLDLEVELWHITEFLAG)
- return true;
- else
- return (levelStart & SC_FOLDLEVELNUMBERMASK) < (levelTry & SC_FOLDLEVELNUMBERMASK);
-}
-
-int Document::GetLastChild(int lineParent, int level) {
- if (level == -1)
- level = GetLevel(lineParent) & SC_FOLDLEVELNUMBERMASK;
- int maxLine = LinesTotal();
- int lineMaxSubord = lineParent;
- while (lineMaxSubord < maxLine - 1) {
- EnsureStyledTo(LineStart(lineMaxSubord + 2));
- if (!IsSubordinate(level, GetLevel(lineMaxSubord + 1)))
- break;
- lineMaxSubord++;
- }
- if (lineMaxSubord > lineParent) {
- if (level > (GetLevel(lineMaxSubord + 1) & SC_FOLDLEVELNUMBERMASK)) {
- // Have chewed up some whitespace that belongs to a parent so seek back
- if (GetLevel(lineMaxSubord) & SC_FOLDLEVELWHITEFLAG) {
- lineMaxSubord--;
- }
- }
- }
- return lineMaxSubord;
-}
-
-int Document::GetFoldParent(int line) {
- int level = GetLevel(line) & SC_FOLDLEVELNUMBERMASK;
- int lineLook = line - 1;
- while ((lineLook > 0) && (
- (!(GetLevel(lineLook) & SC_FOLDLEVELHEADERFLAG)) ||
- ((GetLevel(lineLook) & SC_FOLDLEVELNUMBERMASK) >= level))
- ) {
- lineLook--;
- }
- if ((GetLevel(lineLook) & SC_FOLDLEVELHEADERFLAG) &&
- ((GetLevel(lineLook) & SC_FOLDLEVELNUMBERMASK) < level)) {
- return lineLook;
- } else {
- return -1;
- }
-}
-
-int Document::ClampPositionIntoDocument(int pos) {
- return Platform::Clamp(pos, 0, Length());
-}
-
-bool Document::IsCrLf(int pos) {
- if (pos < 0)
- return false;
- if (pos >= (Length() - 1))
- return false;
- return (cb.CharAt(pos) == '\r') && (cb.CharAt(pos + 1) == '\n');
-}
-
-static const int maxBytesInDBCSCharacter=5;
-
-int Document::LenChar(int pos) {
- if (pos < 0) {
- return 1;
- } else if (IsCrLf(pos)) {
- return 2;
- } else if (SC_CP_UTF8 == dbcsCodePage) {
- unsigned char ch = static_cast<unsigned char>(cb.CharAt(pos));
- if (ch < 0x80)
- return 1;
- int len = 2;
- if (ch >= (0x80 + 0x40 + 0x20 + 0x10))
- len = 4;
- else if (ch >= (0x80 + 0x40 + 0x20))
- len = 3;
- int lengthDoc = Length();
- if ((pos + len) > lengthDoc)
- return lengthDoc -pos;
- else
- return len;
- } else if (dbcsCodePage) {
- char mbstr[maxBytesInDBCSCharacter+1];
- int i;
- for (i=0; i<Platform::DBCSCharMaxLength(); i++) {
- mbstr[i] = cb.CharAt(pos+i);
- }
- mbstr[i] = '\0';
- return Platform::DBCSCharLength(dbcsCodePage, mbstr);
- } else {
- return 1;
- }
-}
-
-static bool IsTrailByte(int ch) {
- return (ch >= 0x80) && (ch < (0x80 + 0x40));
-}
-
-static int BytesFromLead(int leadByte) {
- if (leadByte > 0xF4) {
- // Characters longer than 4 bytes not possible in current UTF-8
- return 0;
- } else if (leadByte >= 0xF0) {
- return 4;
- } else if (leadByte >= 0xE0) {
- return 3;
- } else if (leadByte >= 0xC2) {
- return 2;
- }
- return 0;
-}
-
-bool Document::InGoodUTF8(int pos, int &start, int &end) {
- int lead = pos;
- while ((lead>0) && (pos-lead < 4) && IsTrailByte(static_cast<unsigned char>(cb.CharAt(lead-1))))
- lead--;
- start = 0;
- if (lead > 0) {
- start = lead-1;
- }
- int leadByte = static_cast<unsigned char>(cb.CharAt(start));
- int bytes = BytesFromLead(leadByte);
- if (bytes == 0) {
- return false;
- } else {
- int trailBytes = bytes - 1;
- int len = pos - lead + 1;
- if (len > trailBytes)
- // pos too far from lead
- return false;
- // Check that there are enough trails for this lead
- int trail = pos + 1;
- while ((trail-lead<trailBytes) && (trail < Length())) {
- if (!IsTrailByte(static_cast<unsigned char>(cb.CharAt(trail)))) {
- return false;
- }
- trail++;
- }
- end = start + bytes;
- return true;
- }
-}
-
-// Normalise a position so that it is not halfway through a two byte character.
-// This can occur in two situations -
-// When lines are terminated with \r\n pairs which should be treated as one character.
-// When displaying DBCS text such as Japanese.
-// If moving, move the position in the indicated direction.
-int Document::MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd) {
- //Platform::DebugPrintf("NoCRLF %d %d\n", pos, moveDir);
- // If out of range, just return minimum/maximum value.
- if (pos <= 0)
- return 0;
- if (pos >= Length())
- return Length();
-
- // PLATFORM_ASSERT(pos > 0 && pos < Length());
- if (checkLineEnd && IsCrLf(pos - 1)) {
- if (moveDir > 0)
- return pos + 1;
- else
- return pos - 1;
- }
-
- // Not between CR and LF
-
- if (dbcsCodePage) {
- if (SC_CP_UTF8 == dbcsCodePage) {
- unsigned char ch = static_cast<unsigned char>(cb.CharAt(pos));
- int startUTF = pos;
- int endUTF = pos;
- if (IsTrailByte(ch) && InGoodUTF8(pos, startUTF, endUTF)) {
- // ch is a trail byte within a UTF-8 character
- if (moveDir > 0)
- pos = endUTF;
- else
- pos = startUTF;
- }
- } else {
- // Anchor DBCS calculations at start of line because start of line can
- // not be a DBCS trail byte.
- int posCheck = LineStart(LineFromPosition(pos));
- while (posCheck < pos) {
- char mbstr[maxBytesInDBCSCharacter+1];
- int i;
- for (i=0; i<Platform::DBCSCharMaxLength(); i++) {
- mbstr[i] = cb.CharAt(posCheck+i);
- }
- mbstr[i] = '\0';
-
- int mbsize = Platform::DBCSCharLength(dbcsCodePage, mbstr);
- if (posCheck + mbsize == pos) {
- return pos;
- } else if (posCheck + mbsize > pos) {
- if (moveDir > 0) {
- return posCheck + mbsize;
- } else {
- return posCheck;
- }
- }
- posCheck += mbsize;
- }
- }
- }
-
- return pos;
-}
-
-void Document::ModifiedAt(int pos) {
- if (endStyled > pos)
- endStyled = pos;
-}
-
-void Document::CheckReadOnly() {
- if (cb.IsReadOnly() && enteredReadOnlyCount == 0) {
- enteredReadOnlyCount++;
- NotifyModifyAttempt();
- enteredReadOnlyCount--;
- }
-}
-
-// Document only modified by gateways DeleteChars, InsertString, Undo, Redo, and SetStyleAt.
-// SetStyleAt does not change the persistent state of a document
-
-bool Document::DeleteChars(int pos, int len) {
- if (len == 0)
- return false;
- if ((pos + len) > Length())
- return false;
- CheckReadOnly();
- if (enteredModification != 0) {
- return false;
- } else {
- enteredModification++;
- if (!cb.IsReadOnly()) {
- NotifyModified(
- DocModification(
- SC_MOD_BEFOREDELETE | SC_PERFORMED_USER,
- pos, len,
- 0, 0));
- int prevLinesTotal = LinesTotal();
- bool startSavePoint = cb.IsSavePoint();
- bool startSequence = false;
- const char *text = cb.DeleteChars(pos, len, startSequence);
- if (startSavePoint && cb.IsCollectingUndo())
- NotifySavePoint(!startSavePoint);
- if ((pos < Length()) || (pos == 0))
- ModifiedAt(pos);
- else
- ModifiedAt(pos-1);
- NotifyModified(
- DocModification(
- SC_MOD_DELETETEXT | SC_PERFORMED_USER | (startSequence?SC_STARTACTION:0),
- pos, len,
- LinesTotal() - prevLinesTotal, text));
- }
- enteredModification--;
- }
- return !cb.IsReadOnly();
-}
-
-/**
- * Insert a string with a length.
- */
-bool Document::InsertString(int position, const char *s, int insertLength) {
- if (insertLength <= 0) {
- return false;
- }
- CheckReadOnly();
- if (enteredModification != 0) {
- return false;
- } else {
- enteredModification++;
- if (!cb.IsReadOnly()) {
- NotifyModified(
- DocModification(
- SC_MOD_BEFOREINSERT | SC_PERFORMED_USER,
- position, insertLength,
- 0, s));
- int prevLinesTotal = LinesTotal();
- bool startSavePoint = cb.IsSavePoint();
- bool startSequence = false;
- const char *text = cb.InsertString(position, s, insertLength, startSequence);
- if (startSavePoint && cb.IsCollectingUndo())
- NotifySavePoint(!startSavePoint);
- ModifiedAt(position);
- NotifyModified(
- DocModification(
- SC_MOD_INSERTTEXT | SC_PERFORMED_USER | (startSequence?SC_STARTACTION:0),
- position, insertLength,
- LinesTotal() - prevLinesTotal, text));
- }
- enteredModification--;
- }
- return !cb.IsReadOnly();
-}
-
-int Document::Undo() {
- int newPos = -1;
- CheckReadOnly();
- if (enteredModification == 0) {
- enteredModification++;
- if (!cb.IsReadOnly()) {
- bool startSavePoint = cb.IsSavePoint();
- bool multiLine = false;
- int steps = cb.StartUndo();
- //Platform::DebugPrintf("Steps=%d\n", steps);
- for (int step = 0; step < steps; step++) {
- const int prevLinesTotal = LinesTotal();
- const Action &action = cb.GetUndoStep();
- if (action.at == removeAction) {
- NotifyModified(DocModification(
- SC_MOD_BEFOREINSERT | SC_PERFORMED_UNDO, action));
- } else if (action.at == containerAction) {
- DocModification dm(SC_MOD_CONTAINER | SC_PERFORMED_UNDO);
- dm.token = action.position;
- NotifyModified(dm);
- } else {
- NotifyModified(DocModification(
- SC_MOD_BEFOREDELETE | SC_PERFORMED_UNDO, action));
- }
- cb.PerformUndoStep();
- int cellPosition = action.position;
- if (action.at != containerAction) {
- ModifiedAt(cellPosition);
- newPos = cellPosition;
- }
-
- int modFlags = SC_PERFORMED_UNDO;
- // With undo, an insertion action becomes a deletion notification
- if (action.at == removeAction) {
- newPos += action.lenData;
- modFlags |= SC_MOD_INSERTTEXT;
- } else if (action.at == insertAction) {
- modFlags |= SC_MOD_DELETETEXT;
- }
- if (steps > 1)
- modFlags |= SC_MULTISTEPUNDOREDO;
- const int linesAdded = LinesTotal() - prevLinesTotal;
- if (linesAdded != 0)
- multiLine = true;
- if (step == steps - 1) {
- modFlags |= SC_LASTSTEPINUNDOREDO;
- if (multiLine)
- modFlags |= SC_MULTILINEUNDOREDO;
- }
- NotifyModified(DocModification(modFlags, cellPosition, action.lenData,
- linesAdded, action.data));
- }
-
- bool endSavePoint = cb.IsSavePoint();
- if (startSavePoint != endSavePoint)
- NotifySavePoint(endSavePoint);
- }
- enteredModification--;
- }
- return newPos;
-}
-
-int Document::Redo() {
- int newPos = -1;
- CheckReadOnly();
- if (enteredModification == 0) {
- enteredModification++;
- if (!cb.IsReadOnly()) {
- bool startSavePoint = cb.IsSavePoint();
- bool multiLine = false;
- int steps = cb.StartRedo();
- for (int step = 0; step < steps; step++) {
- const int prevLinesTotal = LinesTotal();
- const Action &action = cb.GetRedoStep();
- if (action.at == insertAction) {
- NotifyModified(DocModification(
- SC_MOD_BEFOREINSERT | SC_PERFORMED_REDO, action));
- } else if (action.at == containerAction) {
- DocModification dm(SC_MOD_CONTAINER | SC_PERFORMED_REDO);
- dm.token = action.position;
- NotifyModified(dm);
- } else {
- NotifyModified(DocModification(
- SC_MOD_BEFOREDELETE | SC_PERFORMED_REDO, action));
- }
- cb.PerformRedoStep();
- if (action.at != containerAction) {
- ModifiedAt(action.position);
- newPos = action.position;
- }
-
- int modFlags = SC_PERFORMED_REDO;
- if (action.at == insertAction) {
- newPos += action.lenData;
- modFlags |= SC_MOD_INSERTTEXT;
- } else if (action.at == removeAction) {
- modFlags |= SC_MOD_DELETETEXT;
- }
- if (steps > 1)
- modFlags |= SC_MULTISTEPUNDOREDO;
- const int linesAdded = LinesTotal() - prevLinesTotal;
- if (linesAdded != 0)
- multiLine = true;
- if (step == steps - 1) {
- modFlags |= SC_LASTSTEPINUNDOREDO;
- if (multiLine)
- modFlags |= SC_MULTILINEUNDOREDO;
- }
- NotifyModified(
- DocModification(modFlags, action.position, action.lenData,
- linesAdded, action.data));
- }
-
- bool endSavePoint = cb.IsSavePoint();
- if (startSavePoint != endSavePoint)
- NotifySavePoint(endSavePoint);
- }
- enteredModification--;
- }
- return newPos;
-}
-
-/**
- * Insert a single character.
- */
-bool Document::InsertChar(int pos, char ch) {
- char chs[1];
- chs[0] = ch;
- return InsertString(pos, chs, 1);
-}
-
-/**
- * Insert a null terminated string.
- */
-bool Document::InsertCString(int position, const char *s) {
- return InsertString(position, s, strlen(s));
-}
-
-void Document::ChangeChar(int pos, char ch) {
- DeleteChars(pos, 1);
- InsertChar(pos, ch);
-}
-
-void Document::DelChar(int pos) {
- DeleteChars(pos, LenChar(pos));
-}
-
-void Document::DelCharBack(int pos) {
- if (pos <= 0) {
- return;
- } else if (IsCrLf(pos - 2)) {
- DeleteChars(pos - 2, 2);
- } else if (dbcsCodePage) {
- int startChar = MovePositionOutsideChar(pos - 1, -1, false);
- DeleteChars(startChar, pos - startChar);
- } else {
- DeleteChars(pos - 1, 1);
- }
-}
-
-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--;
- }
- }
- while ((indent > 0) && (length > 0)) {
- *linebuf++ = ' ';
- indent--;
- length--;
- }
- *linebuf = '\0';
-}
-
-int Document::GetLineIndentation(int line) {
- int indent = 0;
- if ((line >= 0) && (line < LinesTotal())) {
- 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;
-}
-
-void Document::SetLineIndentation(int line, int indent) {
- int indentOfLine = GetLineIndentation(line);
- if (indent < 0)
- indent = 0;
- if (indent != indentOfLine) {
- char linebuf[1000];
- CreateIndentation(linebuf, sizeof(linebuf), indent, tabInChars, !useTabs);
- int thisLineStart = LineStart(line);
- int indentPos = GetLineIndentPosition(line);
- UndoGroup ug(this);
- DeleteChars(thisLineStart, indentPos - thisLineStart);
- InsertCString(thisLineStart, linebuf);
- }
-}
-
-int Document::GetLineIndentPosition(int line) const {
- if (line < 0)
- return 0;
- int pos = LineStart(line);
- int length = Length();
- while ((pos < length) && isindentchar(cb.CharAt(pos))) {
- pos++;
- }
- return pos;
-}
-
-int Document::GetColumn(int pos) {
- int column = 0;
- int line = LineFromPosition(pos);
- if ((line >= 0) && (line < LinesTotal())) {
- for (int i = LineStart(line); i < pos;) {
- char ch = cb.CharAt(i);
- if (ch == '\t') {
- column = NextTab(column, tabInChars);
- i++;
- } else if (ch == '\r') {
- return column;
- } else if (ch == '\n') {
- return column;
- } else if (i >= Length()) {
- return column;
- } else {
- column++;
- i = MovePositionOutsideChar(i + 1, 1, false);
- }
- }
- }
- return column;
-}
-
-int Document::FindColumn(int line, int column) {
- int position = LineStart(line);
- if ((line >= 0) && (line < LinesTotal())) {
- int columnCurrent = 0;
- while ((columnCurrent < column) && (position < Length())) {
- char ch = cb.CharAt(position);
- if (ch == '\t') {
- columnCurrent = NextTab(columnCurrent, tabInChars);
- position++;
- } else if (ch == '\r') {
- return position;
- } else if (ch == '\n') {
- return position;
- } else {
- columnCurrent++;
- position = MovePositionOutsideChar(position + 1, 1, false);
- }
- }
- }
- return position;
-}
-
-void Document::Indent(bool forwards, int lineBottom, int lineTop) {
- // 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);
- if (forwards) {
- if (LineStart(line) < LineEnd(line)) {
- SetLineIndentation(line, indentOfLine + IndentSize());
- }
- } else {
- SetLineIndentation(line, indentOfLine - IndentSize());
- }
- }
-}
-
-// Convert line endings for a piece of text to a particular mode.
-// Stop at len or when a NUL is found.
-// Caller must delete the returned pointer.
-char *Document::TransformLineEnds(int *pLenOut, const char *s, size_t len, int eolMode) {
- char *dest = new char[2 * len + 1];
- const char *sptr = s;
- char *dptr = dest;
- for (size_t i = 0; (i < len) && (*sptr != '\0'); i++) {
- if (*sptr == '\n' || *sptr == '\r') {
- if (eolMode == SC_EOL_CR) {
- *dptr++ = '\r';
- } else if (eolMode == SC_EOL_LF) {
- *dptr++ = '\n';
- } else { // eolMode == SC_EOL_CRLF
- *dptr++ = '\r';
- *dptr++ = '\n';
- }
- if ((*sptr == '\r') && (i+1 < len) && (*(sptr+1) == '\n')) {
- i++;
- sptr++;
- }
- sptr++;
- } else {
- *dptr++ = *sptr++;
- }
- }
- *dptr++ = '\0';
- *pLenOut = (dptr - dest) - 1;
- return dest;
-}
-
-void Document::ConvertLineEnds(int eolModeSet) {
- UndoGroup ug(this);
-
- for (int pos = 0; pos < Length(); pos++) {
- if (cb.CharAt(pos) == '\r') {
- if (cb.CharAt(pos + 1) == '\n') {
- // CRLF
- if (eolModeSet == SC_EOL_CR) {
- DeleteChars(pos + 1, 1); // Delete the LF
- } else if (eolModeSet == SC_EOL_LF) {
- DeleteChars(pos, 1); // Delete the CR
- } else {
- pos++;
- }
- } else {
- // CR
- if (eolModeSet == SC_EOL_CRLF) {
- InsertString(pos + 1, "\n", 1); // Insert LF
- pos++;
- } else if (eolModeSet == SC_EOL_LF) {
- InsertString(pos, "\n", 1); // Insert LF
- DeleteChars(pos + 1, 1); // Delete CR
- }
- }
- } else if (cb.CharAt(pos) == '\n') {
- // LF
- if (eolModeSet == SC_EOL_CRLF) {
- InsertString(pos, "\r", 1); // Insert CR
- pos++;
- } else if (eolModeSet == SC_EOL_CR) {
- InsertString(pos, "\r", 1); // Insert CR
- DeleteChars(pos + 1, 1); // Delete LF
- }
- }
- }
-
-}
-
-bool Document::IsWhiteLine(int line) const {
- int currentChar = LineStart(line);
- int endLine = LineEnd(line);
- while (currentChar < endLine) {
- if (cb.CharAt(currentChar) != ' ' && cb.CharAt(currentChar) != '\t') {
- return false;
- }
- ++currentChar;
- }
- return true;
-}
-
-int Document::ParaUp(int pos) {
- int line = LineFromPosition(pos);
- line--;
- while (line >= 0 && IsWhiteLine(line)) { // skip empty lines
- line--;
- }
- while (line >= 0 && !IsWhiteLine(line)) { // skip non-empty lines
- line--;
- }
- line++;
- return LineStart(line);
-}
-
-int Document::ParaDown(int pos) {
- int line = LineFromPosition(pos);
- while (line < LinesTotal() && !IsWhiteLine(line)) { // skip non-empty lines
- line++;
- }
- while (line < LinesTotal() && IsWhiteLine(line)) { // skip empty lines
- line++;
- }
- if (line < LinesTotal())
- return LineStart(line);
- else // end of a document
- return LineEnd(line-1);
-}
-
-CharClassify::cc Document::WordCharClass(unsigned char ch) {
- if ((SC_CP_UTF8 == dbcsCodePage) && (ch >= 0x80))
- return CharClassify::ccWord;
- return charClass.GetClass(ch);
-}
-
-/**
- * Used by commmands that want to select whole words.
- * Finds the start of word at pos when delta < 0 or the end of the word when delta >= 0.
- */
-int Document::ExtendWordSelect(int pos, int delta, bool onlyWordCharacters) {
- CharClassify::cc ccStart = CharClassify::ccWord;
- if (delta < 0) {
- if (!onlyWordCharacters)
- ccStart = WordCharClass(cb.CharAt(pos-1));
- while (pos > 0 && (WordCharClass(cb.CharAt(pos - 1)) == ccStart))
- pos--;
- } else {
- if (!onlyWordCharacters && pos < Length())
- ccStart = WordCharClass(cb.CharAt(pos));
- while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == ccStart))
- pos++;
- }
- return MovePositionOutsideChar(pos, delta, true);
-}
-
-/**
- * Find the start of the next word in either a forward (delta >= 0) or backwards direction
- * (delta < 0).
- * This is looking for a transition between character classes although there is also some
- * additional movement to transit white space.
- * Used by cursor movement by word commands.
- */
-int Document::NextWordStart(int pos, int delta) {
- if (delta < 0) {
- while (pos > 0 && (WordCharClass(cb.CharAt(pos - 1)) == CharClassify::ccSpace))
- pos--;
- if (pos > 0) {
- CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos-1));
- while (pos > 0 && (WordCharClass(cb.CharAt(pos - 1)) == ccStart)) {
- pos--;
- }
- }
- } else {
- CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos));
- while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == ccStart))
- pos++;
- while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == CharClassify::ccSpace))
- pos++;
- }
- return pos;
-}
-
-/**
- * Find the end of the next word in either a forward (delta >= 0) or backwards direction
- * (delta < 0).
- * This is looking for a transition between character classes although there is also some
- * additional movement to transit white space.
- * Used by cursor movement by word commands.
- */
-int Document::NextWordEnd(int pos, int delta) {
- if (delta < 0) {
- if (pos > 0) {
- CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos-1));
- if (ccStart != CharClassify::ccSpace) {
- while (pos > 0 && WordCharClass(cb.CharAt(pos - 1)) == ccStart) {
- pos--;
- }
- }
- while (pos > 0 && WordCharClass(cb.CharAt(pos - 1)) == CharClassify::ccSpace) {
- pos--;
- }
- }
- } else {
- while (pos < Length() && WordCharClass(cb.CharAt(pos)) == CharClassify::ccSpace) {
- pos++;
- }
- if (pos < Length()) {
- CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos));
- while (pos < Length() && WordCharClass(cb.CharAt(pos)) == ccStart) {
- pos++;
- }
- }
- }
- return pos;
-}
-
-/**
- * Check that the character at the given position is a word or punctuation character and that
- * the previous character is of a different character class.
- */
-bool Document::IsWordStartAt(int pos) {
- if (pos > 0) {
- CharClassify::cc ccPos = WordCharClass(CharAt(pos));
- return (ccPos == CharClassify::ccWord || ccPos == CharClassify::ccPunctuation) &&
- (ccPos != WordCharClass(CharAt(pos - 1)));
- }
- return true;
-}
-
-/**
- * Check that the character at the given position is a word or punctuation character and that
- * the next character is of a different character class.
- */
-bool Document::IsWordEndAt(int pos) {
- if (pos < Length()) {
- CharClassify::cc ccPrev = WordCharClass(CharAt(pos-1));
- return (ccPrev == CharClassify::ccWord || ccPrev == CharClassify::ccPunctuation) &&
- (ccPrev != WordCharClass(CharAt(pos)));
- }
- return true;
-}
-
-/**
- * Check that the given range is has transitions between character classes at both
- * ends and where the characters on the inside are word or punctuation characters.
- */
-bool Document::IsWordAt(int start, int end) {
- return IsWordStartAt(start) && IsWordEndAt(end);
-}
-
-static inline char MakeLowerCase(char ch) {
- if (ch < 'A' || ch > 'Z')
- return ch;
- else
- return static_cast<char>(ch - 'A' + 'a');
-}
-
-static bool GoodTrailByte(int v) {
- return (v >= 0x80) && (v < 0xc0);
-}
-
-size_t Document::ExtractChar(int pos, char *bytes) {
- unsigned char ch = static_cast<unsigned char>(cb.CharAt(pos));
- size_t widthChar = UTF8CharLength(ch);
- bytes[0] = ch;
- for (size_t i=1; i<widthChar; i++) {
- bytes[i] = cb.CharAt(pos+i);
- if (!GoodTrailByte(static_cast<unsigned char>(bytes[i]))) { // Bad byte
- widthChar = 1;
- }
- }
- return widthChar;
-}
-
-CaseFolderTable::CaseFolderTable() {
- for (size_t iChar=0; iChar<sizeof(mapping); iChar++) {
- mapping[iChar] = static_cast<char>(iChar);
- }
-}
-
-CaseFolderTable::~CaseFolderTable() {
-}
-
-size_t CaseFolderTable::Fold(char *folded, size_t sizeFolded, const char *mixed, size_t lenMixed) {
- if (lenMixed > sizeFolded) {
- return 0;
- } else {
- for (size_t i=0; i<lenMixed; i++) {
- folded[i] = mapping[static_cast<unsigned char>(mixed[i])];
- }
- return lenMixed;
- }
-}
-
-void CaseFolderTable::SetTranslation(char ch, char chTranslation) {
- mapping[static_cast<unsigned char>(ch)] = chTranslation;
-}
-
-void CaseFolderTable::StandardASCII() {
- for (size_t iChar=0; iChar<sizeof(mapping); iChar++) {
- if (iChar >= 'A' && iChar <= 'Z') {
- mapping[iChar] = static_cast<char>(iChar - 'A' + 'a');
- } else {
- mapping[iChar] = static_cast<char>(iChar);
- }
- }
-}
-
-bool Document::MatchesWordOptions(bool word, bool wordStart, int pos, int length) {
- return (!word && !wordStart) ||
- (word && IsWordAt(pos, pos + length)) ||
- (wordStart && IsWordStartAt(pos));
-}
-
-/**
- * Find text in document, supporting both forward and backward
- * searches (just pass minPos > maxPos to do a backward search)
- * Has not been tested with backwards DBCS searches yet.
- */
-long Document::FindText(int minPos, int maxPos, const char *search,
- bool caseSensitive, bool word, bool wordStart, bool regExp, int flags,
@@ Diff output truncated at 100000 characters. @@
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Commits
mailing list