]> git.saurik.com Git - wxWidgets.git/commitdiff
Updated Scintilla to version 1.58
authorRobin Dunn <robin@alldunn.com>
Fri, 6 Feb 2004 00:03:13 +0000 (00:03 +0000)
committerRobin Dunn <robin@alldunn.com>
Fri, 6 Feb 2004 00:03:13 +0000 (00:03 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@25523 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

107 files changed:
contrib/build/stc/stc.bkl
contrib/include/wx/stc/stc.h
contrib/src/stc/Makefile.in
contrib/src/stc/PlatWX.cpp
contrib/src/stc/ScintillaWX.cpp
contrib/src/stc/ScintillaWX.h
contrib/src/stc/gen_iface.py
contrib/src/stc/scintilla/README.txt
contrib/src/stc/scintilla/include/Platform.h
contrib/src/stc/scintilla/include/PropSet.h
contrib/src/stc/scintilla/include/SciLexer.h
contrib/src/stc/scintilla/include/Scintilla.h
contrib/src/stc/scintilla/include/Scintilla.iface
contrib/src/stc/scintilla/src/CallTip.cxx
contrib/src/stc/scintilla/src/ContractionState.cxx
contrib/src/stc/scintilla/src/Document.cxx
contrib/src/stc/scintilla/src/Document.h
contrib/src/stc/scintilla/src/Editor.cxx
contrib/src/stc/scintilla/src/Editor.h
contrib/src/stc/scintilla/src/ExternalLexer.cxx
contrib/src/stc/scintilla/src/Indicator.cxx
contrib/src/stc/scintilla/src/Indicator.h
contrib/src/stc/scintilla/src/KeyMap.cxx
contrib/src/stc/scintilla/src/KeyWords.cxx
contrib/src/stc/scintilla/src/LexAsm.cxx
contrib/src/stc/scintilla/src/LexCLW.cxx [new file with mode: 0644]
contrib/src/stc/scintilla/src/LexErlang.cxx [new file with mode: 0644]
contrib/src/stc/scintilla/src/LexForth.cxx [new file with mode: 0644]
contrib/src/stc/scintilla/src/LexFortran.cxx
contrib/src/stc/scintilla/src/LexLua.cxx
contrib/src/stc/scintilla/src/LexMPT.cxx [new file with mode: 0644]
contrib/src/stc/scintilla/src/LexMatlab.cxx
contrib/src/stc/scintilla/src/LexMetapost.cxx [new file with mode: 0644]
contrib/src/stc/scintilla/src/LexOthers.cxx
contrib/src/stc/scintilla/src/LexPB.cxx [new file with mode: 0644]
contrib/src/stc/scintilla/src/LexPOV.cxx
contrib/src/stc/scintilla/src/LexPerl.cxx
contrib/src/stc/scintilla/src/LexRuby.cxx
contrib/src/stc/scintilla/src/LexSQL.cxx
contrib/src/stc/scintilla/src/LexScriptol.cxx
contrib/src/stc/scintilla/src/LexTeX.cxx [new file with mode: 0644]
contrib/src/stc/scintilla/src/LexVB.cxx
contrib/src/stc/scintilla/src/LexYAML.cxx [new file with mode: 0644]
contrib/src/stc/scintilla/src/PropSet.cxx
contrib/src/stc/scintilla/src/RESearch.cxx
contrib/src/stc/scintilla/src/ScintillaBase.cxx
contrib/src/stc/scintilla/src/ScintillaBase.h
contrib/src/stc/scintilla/src/ViewStyle.cxx
contrib/src/stc/scintilla/src/ViewStyle.h
contrib/src/stc/scintilla/src/XPM.cxx
contrib/src/stc/scintilla/src/XPM.h
contrib/src/stc/stc.cpp
contrib/src/stc/stc.cpp.in
contrib/src/stc/stc.h.in
include/wx/stc/stc.h
src/stc/Makefile.in
src/stc/PlatWX.cpp
src/stc/ScintillaWX.cpp
src/stc/ScintillaWX.h
src/stc/gen_iface.py
src/stc/scintilla/README.txt
src/stc/scintilla/include/Platform.h
src/stc/scintilla/include/PropSet.h
src/stc/scintilla/include/SciLexer.h
src/stc/scintilla/include/Scintilla.h
src/stc/scintilla/include/Scintilla.iface
src/stc/scintilla/src/CallTip.cxx
src/stc/scintilla/src/ContractionState.cxx
src/stc/scintilla/src/Document.cxx
src/stc/scintilla/src/Document.h
src/stc/scintilla/src/Editor.cxx
src/stc/scintilla/src/Editor.h
src/stc/scintilla/src/ExternalLexer.cxx
src/stc/scintilla/src/Indicator.cxx
src/stc/scintilla/src/Indicator.h
src/stc/scintilla/src/KeyMap.cxx
src/stc/scintilla/src/KeyWords.cxx
src/stc/scintilla/src/LexAsm.cxx
src/stc/scintilla/src/LexCLW.cxx [new file with mode: 0644]
src/stc/scintilla/src/LexErlang.cxx [new file with mode: 0644]
src/stc/scintilla/src/LexForth.cxx [new file with mode: 0644]
src/stc/scintilla/src/LexFortran.cxx
src/stc/scintilla/src/LexLua.cxx
src/stc/scintilla/src/LexMPT.cxx [new file with mode: 0644]
src/stc/scintilla/src/LexMatlab.cxx
src/stc/scintilla/src/LexMetapost.cxx [new file with mode: 0644]
src/stc/scintilla/src/LexOthers.cxx
src/stc/scintilla/src/LexPB.cxx [new file with mode: 0644]
src/stc/scintilla/src/LexPOV.cxx
src/stc/scintilla/src/LexPerl.cxx
src/stc/scintilla/src/LexRuby.cxx
src/stc/scintilla/src/LexSQL.cxx
src/stc/scintilla/src/LexScriptol.cxx
src/stc/scintilla/src/LexTeX.cxx [new file with mode: 0644]
src/stc/scintilla/src/LexVB.cxx
src/stc/scintilla/src/LexYAML.cxx [new file with mode: 0644]
src/stc/scintilla/src/PropSet.cxx
src/stc/scintilla/src/RESearch.cxx
src/stc/scintilla/src/ScintillaBase.cxx
src/stc/scintilla/src/ScintillaBase.h
src/stc/scintilla/src/ViewStyle.cxx
src/stc/scintilla/src/ViewStyle.h
src/stc/scintilla/src/XPM.cxx
src/stc/scintilla/src/XPM.h
src/stc/stc.cpp
src/stc/stc.cpp.in
src/stc/stc.h.in

index 3d3d35d04e431aadeca9312640867b25c8efc67c..7dd9548deec93c58a38b8fc9cf63f7d7de703a68 100644 (file)
         scintilla/src/CallTip.cxx
         scintilla/src/CellBuffer.cxx
         scintilla/src/ContractionState.cxx
         scintilla/src/CallTip.cxx
         scintilla/src/CellBuffer.cxx
         scintilla/src/ContractionState.cxx
-        scintilla/src/Document.cxx
         scintilla/src/DocumentAccessor.cxx
         scintilla/src/DocumentAccessor.cxx
+        scintilla/src/Document.cxx
         scintilla/src/Editor.cxx
         scintilla/src/ExternalLexer.cxx
         scintilla/src/Indicator.cxx
         scintilla/src/KeyMap.cxx
         scintilla/src/KeyWords.cxx
         scintilla/src/Editor.cxx
         scintilla/src/ExternalLexer.cxx
         scintilla/src/Indicator.cxx
         scintilla/src/KeyMap.cxx
         scintilla/src/KeyWords.cxx
-        scintilla/src/LexAVE.cxx
         scintilla/src/LexAda.cxx
         scintilla/src/LexAsm.cxx
         scintilla/src/LexAda.cxx
         scintilla/src/LexAsm.cxx
+        scintilla/src/LexAVE.cxx
         scintilla/src/LexBaan.cxx
         scintilla/src/LexBullant.cxx
         scintilla/src/LexBaan.cxx
         scintilla/src/LexBullant.cxx
-        scintilla/src/LexCPP.cxx
-        scintilla/src/LexCSS.cxx
+        scintilla/src/LexCLW.cxx
         scintilla/src/LexConf.cxx
         scintilla/src/LexConf.cxx
+        scintilla/src/LexCPP.cxx
         scintilla/src/LexCrontab.cxx
         scintilla/src/LexCrontab.cxx
+        scintilla/src/LexCSS.cxx
         scintilla/src/LexEiffel.cxx
         scintilla/src/LexEiffel.cxx
+        scintilla/src/LexErlang.cxx
         scintilla/src/LexEScript.cxx
         scintilla/src/LexEScript.cxx
+        scintilla/src/LexForth.cxx
         scintilla/src/LexFortran.cxx
         scintilla/src/LexHTML.cxx
         scintilla/src/LexLisp.cxx
         scintilla/src/LexLout.cxx
         scintilla/src/LexLua.cxx
         scintilla/src/LexFortran.cxx
         scintilla/src/LexHTML.cxx
         scintilla/src/LexLisp.cxx
         scintilla/src/LexLout.cxx
         scintilla/src/LexLua.cxx
-        scintilla/src/LexMMIXAL.cxx
         scintilla/src/LexMatlab.cxx
         scintilla/src/LexMatlab.cxx
+        scintilla/src/LexMetapost.cxx
+        scintilla/src/LexMMIXAL.cxx
+        scintilla/src/LexMPT.cxx
         scintilla/src/LexNsis.cxx
         scintilla/src/LexOthers.cxx
         scintilla/src/LexNsis.cxx
         scintilla/src/LexOthers.cxx
-        scintilla/src/LexPOV.cxx
-        scintilla/src/LexPS.cxx
         scintilla/src/LexPascal.cxx
         scintilla/src/LexPascal.cxx
+        scintilla/src/LexPB.cxx
         scintilla/src/LexPerl.cxx
         scintilla/src/LexPerl.cxx
+        scintilla/src/LexPOV.cxx
+        scintilla/src/LexPS.cxx
         scintilla/src/LexPython.cxx
         scintilla/src/LexRuby.cxx
         scintilla/src/LexPython.cxx
         scintilla/src/LexRuby.cxx
-        scintilla/src/LexSQL.cxx
         scintilla/src/LexScriptol.cxx
         scintilla/src/LexScriptol.cxx
+        scintilla/src/LexSQL.cxx
+        scintilla/src/LexTeX.cxx
         scintilla/src/LexVB.cxx
         scintilla/src/LexVB.cxx
+        scintilla/src/LexYAML.cxx
         scintilla/src/LineMarker.cxx
         scintilla/src/PropSet.cxx
         scintilla/src/RESearch.cxx
         scintilla/src/ScintillaBase.cxx
         scintilla/src/LineMarker.cxx
         scintilla/src/PropSet.cxx
         scintilla/src/RESearch.cxx
         scintilla/src/ScintillaBase.cxx
-        scintilla/src/Style.cxx
         scintilla/src/StyleContext.cxx
         scintilla/src/StyleContext.cxx
+        scintilla/src/Style.cxx
         scintilla/src/UniConversion.cxx
         scintilla/src/ViewStyle.cxx
         scintilla/src/WindowAccessor.cxx
         scintilla/src/UniConversion.cxx
         scintilla/src/ViewStyle.cxx
         scintilla/src/WindowAccessor.cxx
index f70374ee2fc851cf7da04ce2e4f41933380ccddb..207fd19dc0da2221b029ab8bc18de769cce81e2c 100644 (file)
@@ -57,7 +57,7 @@
 
 #define wxSTC_INVALID_POSITION -1
 
 
 #define wxSTC_INVALID_POSITION -1
 
-// Define start of Scintilla messages to be greater than all edit (EM_*) messages
+// Define start of Scintilla messages to be greater than all Windows edit (EM_*) messages
 // as many EM_ messages can be used although that use is deprecated.
 #define wxSTC_START 2000
 #define wxSTC_OPTIONAL_START 3000
 // as many EM_ messages can be used although that use is deprecated.
 #define wxSTC_START 2000
 #define wxSTC_OPTIONAL_START 3000
 #define wxSTC_INDIC_DIAGONAL 3
 #define wxSTC_INDIC_STRIKE 4
 #define wxSTC_INDIC_HIDDEN 5
 #define wxSTC_INDIC_DIAGONAL 3
 #define wxSTC_INDIC_STRIKE 4
 #define wxSTC_INDIC_HIDDEN 5
+#define wxSTC_INDIC_BOX 6
 #define wxSTC_INDIC0_MASK 0x20
 #define wxSTC_INDIC1_MASK 0x40
 #define wxSTC_INDIC2_MASK 0x80
 #define wxSTC_INDIC0_MASK 0x20
 #define wxSTC_INDIC1_MASK 0x40
 #define wxSTC_INDIC2_MASK 0x80
 // where most code reside, and the lines after the caret, eg. the body of a function.
 #define wxSTC_CARET_EVEN 0x08
 
 // where most code reside, and the lines after the caret, eg. the body of a function.
 #define wxSTC_CARET_EVEN 0x08
 
+// Selection modes
+#define wxSTC_SEL_STREAM 0
+#define wxSTC_SEL_RECTANGLE 1
+#define wxSTC_SEL_LINES 2
+
 // Maximum value of keywordSet parameter of SetKeyWords.
 #define wxSTC_KEYWORDSET_MAX 8
 
 // Maximum value of keywordSet parameter of SetKeyWords.
 #define wxSTC_KEYWORDSET_MAX 8
 
 #define wxSTC_LEX_PS 42
 #define wxSTC_LEX_NSIS 43
 #define wxSTC_LEX_MMIXAL 44
 #define wxSTC_LEX_PS 42
 #define wxSTC_LEX_NSIS 43
 #define wxSTC_LEX_MMIXAL 44
+#define wxSTC_LEX_CLW 45
+#define wxSTC_LEX_CLWNOCASE 46
+#define wxSTC_LEX_LOT 47
+#define wxSTC_LEX_YAML 48
+#define wxSTC_LEX_TEX 49
+#define wxSTC_LEX_METAPOST 50
+#define wxSTC_LEX_POWERBASIC 51
+#define wxSTC_LEX_FORTH 52
+#define wxSTC_LEX_ERLANG 53
+#define wxSTC_LEX_OCTAVE 54
 
 // When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
 // value assigned in sequence from SCLEX_AUTOMATIC+1.
 
 // When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
 // value assigned in sequence from SCLEX_AUTOMATIC+1.
 #define wxSTC_PL_STRING_QR 29
 #define wxSTC_PL_STRING_QW 30
 
 #define wxSTC_PL_STRING_QR 29
 #define wxSTC_PL_STRING_QW 30
 
-// Lexical states for SCLEX_VB, SCLEX_VBSCRIPT
+// Lexical states for SCLEX_VB, SCLEX_VBSCRIPT, SCLEX_POWERBASIC
 #define wxSTC_B_DEFAULT 0
 #define wxSTC_B_COMMENT 1
 #define wxSTC_B_NUMBER 2
 #define wxSTC_B_DEFAULT 0
 #define wxSTC_B_COMMENT 1
 #define wxSTC_B_NUMBER 2
 #define wxSTC_B_OPERATOR 6
 #define wxSTC_B_IDENTIFIER 7
 #define wxSTC_B_DATE 8
 #define wxSTC_B_OPERATOR 6
 #define wxSTC_B_IDENTIFIER 7
 #define wxSTC_B_DATE 8
+#define wxSTC_B_STRINGEOL 9
+#define wxSTC_B_KEYWORD2 10
+#define wxSTC_B_KEYWORD3 11
+#define wxSTC_B_KEYWORD4 12
 
 // Lexical states for SCLEX_PROPERTIES
 #define wxSTC_PROPS_DEFAULT 0
 
 // Lexical states for SCLEX_PROPERTIES
 #define wxSTC_PROPS_DEFAULT 0
 #define wxSTC_ERR_PHP 14
 #define wxSTC_ERR_ELF 15
 #define wxSTC_ERR_IFC 16
 #define wxSTC_ERR_PHP 14
 #define wxSTC_ERR_ELF 15
 #define wxSTC_ERR_IFC 16
+#define wxSTC_ERR_IFORT 17
+#define wxSTC_ERR_ABSF 18
 
 // Lexical states for SCLEX_BATCH
 #define wxSTC_BAT_DEFAULT 0
 
 // Lexical states for SCLEX_BATCH
 #define wxSTC_BAT_DEFAULT 0
 #define wxSTC_NNCRONTAB_ENVIRONMENT 9
 #define wxSTC_NNCRONTAB_IDENTIFIER 10
 
 #define wxSTC_NNCRONTAB_ENVIRONMENT 9
 #define wxSTC_NNCRONTAB_IDENTIFIER 10
 
+// Lexical states for SCLEX_FORTH (Forth Lexer)
+#define wxSTC_FORTH_DEFAULT 0
+#define wxSTC_FORTH_COMMENT 1
+#define wxSTC_FORTH_COMMENT_ML 2
+#define wxSTC_FORTH_IDENTIFIER 3
+#define wxSTC_FORTH_CONTROL 4
+#define wxSTC_FORTH_KEYWORD 5
+#define wxSTC_FORTH_DEFWORD 6
+#define wxSTC_FORTH_PREWORD1 7
+#define wxSTC_FORTH_PREWORD2 8
+#define wxSTC_FORTH_NUMBER 9
+#define wxSTC_FORTH_STRING 10
+#define wxSTC_FORTH_LOCALE 11
+
 // Lexical states for SCLEX_MATLAB
 #define wxSTC_MATLAB_DEFAULT 0
 #define wxSTC_MATLAB_COMMENT 1
 #define wxSTC_MATLAB_COMMAND 2
 #define wxSTC_MATLAB_NUMBER 3
 #define wxSTC_MATLAB_KEYWORD 4
 // Lexical states for SCLEX_MATLAB
 #define wxSTC_MATLAB_DEFAULT 0
 #define wxSTC_MATLAB_COMMENT 1
 #define wxSTC_MATLAB_COMMAND 2
 #define wxSTC_MATLAB_NUMBER 3
 #define wxSTC_MATLAB_KEYWORD 4
+
+// single quoted string
 #define wxSTC_MATLAB_STRING 5
 #define wxSTC_MATLAB_OPERATOR 6
 #define wxSTC_MATLAB_IDENTIFIER 7
 #define wxSTC_MATLAB_STRING 5
 #define wxSTC_MATLAB_OPERATOR 6
 #define wxSTC_MATLAB_IDENTIFIER 7
+#define wxSTC_MATLAB_DOUBLEQUOTESTRING 8
 
 // Lexical states for SCLEX_SCRIPTOL
 #define wxSTC_SCRIPTOL_DEFAULT 0
 
 // Lexical states for SCLEX_SCRIPTOL
 #define wxSTC_SCRIPTOL_DEFAULT 0
-#define wxSTC_SCRIPTOL_COMMENT 1
+#define wxSTC_SCRIPTOL_WHITE 1
 #define wxSTC_SCRIPTOL_COMMENTLINE 2
 #define wxSTC_SCRIPTOL_COMMENTLINE 2
-#define wxSTC_SCRIPTOL_COMMENTDOC 3
-#define wxSTC_SCRIPTOL_NUMBER 4
-#define wxSTC_SCRIPTOL_WORD 5
-#define wxSTC_SCRIPTOL_STRING 6
-#define wxSTC_SCRIPTOL_CHARACTER 7
-#define wxSTC_SCRIPTOL_UUID 8
-#define wxSTC_SCRIPTOL_PREPROCESSOR 9
-#define wxSTC_SCRIPTOL_OPERATOR 10
-#define wxSTC_SCRIPTOL_IDENTIFIER 11
-#define wxSTC_SCRIPTOL_STRINGEOL 12
-#define wxSTC_SCRIPTOL_VERBATIM 13
-#define wxSTC_SCRIPTOL_REGEX 14
-#define wxSTC_SCRIPTOL_COMMENTLINEDOC 15
-#define wxSTC_SCRIPTOL_WORD2 16
-#define wxSTC_SCRIPTOL_COMMENTDOCKEYWORD 17
-#define wxSTC_SCRIPTOL_COMMENTDOCKEYWORDERROR 18
-#define wxSTC_SCRIPTOL_COMMENTBASIC 19
+#define wxSTC_SCRIPTOL_PERSISTENT 3
+#define wxSTC_SCRIPTOL_CSTYLE 4
+#define wxSTC_SCRIPTOL_COMMENTBLOCK 5
+#define wxSTC_SCRIPTOL_NUMBER 6
+#define wxSTC_SCRIPTOL_STRING 7
+#define wxSTC_SCRIPTOL_CHARACTER 8
+#define wxSTC_SCRIPTOL_STRINGEOL 9
+#define wxSTC_SCRIPTOL_KEYWORD 10
+#define wxSTC_SCRIPTOL_OPERATOR 11
+#define wxSTC_SCRIPTOL_IDENTIFIER 12
+#define wxSTC_SCRIPTOL_TRIPLE 13
+#define wxSTC_SCRIPTOL_CLASSNAME 14
+#define wxSTC_SCRIPTOL_PREPROCESSOR 15
 
 // Lexical states for SCLEX_ASM
 #define wxSTC_ASM_DEFAULT 0
 
 // Lexical states for SCLEX_ASM
 #define wxSTC_ASM_DEFAULT 0
 #define wxSTC_ASM_REGISTER 8
 #define wxSTC_ASM_DIRECTIVE 9
 #define wxSTC_ASM_DIRECTIVEOPERAND 10
 #define wxSTC_ASM_REGISTER 8
 #define wxSTC_ASM_DIRECTIVE 9
 #define wxSTC_ASM_DIRECTIVEOPERAND 10
+#define wxSTC_ASM_COMMENTBLOCK 11
+#define wxSTC_ASM_CHARACTER 12
+#define wxSTC_ASM_STRINGEOL 13
+#define wxSTC_ASM_EXTINSTRUCTION 14
 
 // Lexical states for SCLEX_FORTRAN
 #define wxSTC_F_DEFAULT 0
 
 // Lexical states for SCLEX_FORTRAN
 #define wxSTC_F_DEFAULT 0
 #define wxSTC_MMIXAL_SYMBOL 16
 #define wxSTC_MMIXAL_INCLUDE 17
 
 #define wxSTC_MMIXAL_SYMBOL 16
 #define wxSTC_MMIXAL_INCLUDE 17
 
+// Lexical states for SCLEX_CLW
+#define wxSTC_CLW_DEFAULT 0
+#define wxSTC_CLW_LABEL 1
+#define wxSTC_CLW_COMMENT 2
+#define wxSTC_CLW_STRING 3
+#define wxSTC_CLW_USER_IDENTIFIER 4
+#define wxSTC_CLW_INTEGER_CONSTANT 5
+#define wxSTC_CLW_REAL_CONSTANT 6
+#define wxSTC_CLW_PICTURE_STRING 7
+#define wxSTC_CLW_KEYWORD 8
+#define wxSTC_CLW_COMPILER_DIRECTIVE 9
+#define wxSTC_CLW_BUILTIN_PROCEDURES_FUNCTION 10
+#define wxSTC_CLW_STRUCTURE_DATA_TYPE 11
+#define wxSTC_CLW_ATTRIBUTE 12
+#define wxSTC_CLW_STANDARD_EQUATE 13
+#define wxSTC_CLW_ERROR 14
+
+// Lexical states for SCLEX_LOT
+#define wxSTC_LOT_DEFAULT 0
+#define wxSTC_LOT_HEADER 1
+#define wxSTC_LOT_BREAK 2
+#define wxSTC_LOT_SET 3
+#define wxSTC_LOT_PASS 4
+#define wxSTC_LOT_FAIL 5
+#define wxSTC_LOT_ABORT 6
+
+// Lexical states for SCLEX_YAML
+#define wxSTC_YAML_DEFAULT 0
+#define wxSTC_YAML_COMMENT 1
+#define wxSTC_YAML_IDENTIFIER 2
+#define wxSTC_YAML_KEYWORD 3
+#define wxSTC_YAML_NUMBER 4
+#define wxSTC_YAML_REFERENCE 5
+#define wxSTC_YAML_DOCUMENT 6
+#define wxSTC_YAML_TEXT 7
+#define wxSTC_YAML_ERROR 8
+
+// Lexical states for SCLEX_TEX
+#define wxSTC_TEX_DEFAULT 0
+#define wxSTC_TEX_SPECIAL 1
+#define wxSTC_TEX_GROUP 2
+#define wxSTC_TEX_SYMBOL 3
+#define wxSTC_TEX_COMMAND 4
+#define wxSTC_TEX_TEXT 5
+#define wxSTC_METAPOST_DEFAULT 0
+#define wxSTC_METAPOST_SPECIAL 1
+#define wxSTC_METAPOST_GROUP 2
+#define wxSTC_METAPOST_SYMBOL 3
+#define wxSTC_METAPOST_COMMAND 4
+#define wxSTC_METAPOST_TEXT 5
+#define wxSTC_METAPOST_EXTRA 6
+
+// Lexical states for SCLEX_ERLANG
+#define wxSTC_ERLANG_DEFAULT 0
+#define wxSTC_ERLANG_COMMENT 1
+#define wxSTC_ERLANG_VARIABLE 2
+#define wxSTC_ERLANG_NUMBER 3
+#define wxSTC_ERLANG_KEYWORD 4
+#define wxSTC_ERLANG_STRING 5
+#define wxSTC_ERLANG_OPERATOR 6
+#define wxSTC_ERLANG_ATOM 7
+#define wxSTC_ERLANG_FUNCTION_NAME 8
+#define wxSTC_ERLANG_CHARACTER 9
+#define wxSTC_ERLANG_MACRO 10
+#define wxSTC_ERLANG_RECORD 11
+#define wxSTC_ERLANG_SEPARATOR 12
+#define wxSTC_ERLANG_NODE_NAME 13
+#define wxSTC_ERLANG_UNKNOWN 31
+
 
 //-----------------------------------------
 // Commands that can be bound to keystrokes
 
 //-----------------------------------------
 // Commands that can be bound to keystrokes
 // except they behave differently when word-wrap is enabled:
 // They go first to the start / end of the display line, like (Home|LineEnd)Display
 // The difference is that, the cursor is already at the point, it goes on to the start
 // except they behave differently when word-wrap is enabled:
 // They go first to the start / end of the display line, like (Home|LineEnd)Display
 // The difference is that, the cursor is already at the point, it goes on to the start
-// or end of the document line, as appropriate for (Home|LineEnd|VCHome)Extend.
+// or end of the document line, as appropriate for (Home|LineEnd|VCHome)(Extend)?.
 #define wxSTC_CMD_HOMEWRAP 2349
 #define wxSTC_CMD_HOMEWRAPEXTEND 2450
 #define wxSTC_CMD_LINEENDWRAP 2451
 #define wxSTC_CMD_HOMEWRAP 2349
 #define wxSTC_CMD_HOMEWRAPEXTEND 2450
 #define wxSTC_CMD_LINEENDWRAP 2451
 // Delete forwards from the current position to the end of the line.
 #define wxSTC_CMD_DELLINERIGHT 2396
 
 // Delete forwards from the current position to the end of the line.
 #define wxSTC_CMD_DELLINERIGHT 2396
 
-// Move caret between paragraphs (delimited by empty lines)
+// Move caret between paragraphs (delimited by empty lines).
 #define wxSTC_CMD_PARADOWN 2413
 #define wxSTC_CMD_PARADOWNEXTEND 2414
 #define wxSTC_CMD_PARAUP 2415
 #define wxSTC_CMD_PARAUPEXTEND 2416
 
 #define wxSTC_CMD_PARADOWN 2413
 #define wxSTC_CMD_PARADOWNEXTEND 2414
 #define wxSTC_CMD_PARAUP 2415
 #define wxSTC_CMD_PARAUPEXTEND 2416
 
+// Move caret down one line, extending rectangular selection to new caret position.
+#define wxSTC_CMD_LINEDOWNRECTEXTEND 2426
+
+// Move caret up one line, extending rectangular selection to new caret position.
+#define wxSTC_CMD_LINEUPRECTEXTEND 2427
+
+// Move caret left one character, extending rectangular selection to new caret position.
+#define wxSTC_CMD_CHARLEFTRECTEXTEND 2428
+
+// Move caret right one character, extending rectangular selection to new caret position.
+#define wxSTC_CMD_CHARRIGHTRECTEXTEND 2429
+
+// Move caret to first position on line, extending rectangular selection to new caret position.
+#define wxSTC_CMD_HOMERECTEXTEND 2430
+
+// Move caret to before first visible character on line.
+// If already there move to first character on line.
+// In either case, extend rectangular selection to new caret position.
+#define wxSTC_CMD_VCHOMERECTEXTEND 2431
+
+// Move caret to last position on line, extending rectangular selection to new caret position.
+#define wxSTC_CMD_LINEENDRECTEXTEND 2432
+
+// Move caret one page up, extending rectangular selection to new caret position.
+#define wxSTC_CMD_PAGEUPRECTEXTEND 2433
+
+// Move caret one page down, extending rectangular selection to new caret position.
+#define wxSTC_CMD_PAGEDOWNRECTEXTEND 2434
+
+// Move caret to top of page, or one page up if already at top of page.
+#define wxSTC_CMD_STUTTEREDPAGEUP 2435
+
+// Move caret to top of page, or one page up if already at top of page, extending selection to new caret position.
+#define wxSTC_CMD_STUTTEREDPAGEUPEXTEND 2436
+
+// Move caret to bottom of page, or one page down if already at bottom of page.
+#define wxSTC_CMD_STUTTEREDPAGEDOWN 2437
+
+// Move caret to bottom of page, or one page down if already at bottom of page, extending selection to new caret position.
+#define wxSTC_CMD_STUTTEREDPAGEDOWNEXTEND 2438
+
+// Move caret left one word, position cursor at end of word.
+#define wxSTC_CMD_WORDLEFTEND 2439
+
+// Move caret left one word, position cursor at end of word, extending selection to new caret position.
+#define wxSTC_CMD_WORDLEFTENDEXTEND 2440
+
+// Move caret right one word, position cursor at end of word.
+#define wxSTC_CMD_WORDRIGHTEND 2441
+
+// Move caret right one word, position cursor at end of word, extending selection to new caret position.
+#define wxSTC_CMD_WORDRIGHTENDEXTEND 2442
+
 
 // END of generated section
 //----------------------------------------------------------------------
 
 // END of generated section
 //----------------------------------------------------------------------
@@ -1410,7 +1571,7 @@ public:
     // When key+modifier combination km is pressed perform msg.
     void CmdKeyAssign(int key, int modifiers, int cmd);
 
     // When key+modifier combination km is pressed perform msg.
     void CmdKeyAssign(int key, int modifiers, int cmd);
 
-    // When key+modifier combination km do nothing.
+    // When key+modifier combination km is pressed do nothing.
     void CmdKeyClear(int key, int modifiers);
 
     // Drop all key mappings.
     void CmdKeyClear(int key, int modifiers);
 
     // Drop all key mappings.
@@ -1429,6 +1590,7 @@ public:
     void SetCaretPeriod(int periodMilliseconds);
 
     // Set the set of characters making up words for when moving or selecting by word.
     void SetCaretPeriod(int periodMilliseconds);
 
     // Set the set of characters making up words for when moving or selecting by word.
+    // First sets deaults like SetCharsDefault.
     void SetWordChars(const wxString& characters);
 
     // Start a sequence of actions that is undone and redone as a unit.
     void SetWordChars(const wxString& characters);
 
     // Start a sequence of actions that is undone and redone as a unit.
@@ -1663,7 +1825,7 @@ public:
                int    startPos,
                int    endPos,
                wxDC*  draw,
                int    startPos,
                int    endPos,
                wxDC*  draw,
-               wxDC*  target,  // Why does it use two? Can they be the same?
+               wxDC*  target, 
                wxRect renderRect,
                wxRect pageRect);
 
                wxRect renderRect,
                wxRect pageRect);
 
@@ -1781,12 +1943,12 @@ public:
     int GetTargetEnd();
 
     // Replace the target text with the argument text.
     int GetTargetEnd();
 
     // Replace the target text with the argument text.
-    // Text is counted so it can contain nulls.
+    // Text is counted so it can contain NULs.
     // Returns the length of the replacement text.
     int ReplaceTarget(const wxString& text);
 
     // Replace the target text with the argument text after \d processing.
     // Returns the length of the replacement text.
     int ReplaceTarget(const wxString& text);
 
     // Replace the target text with the argument text after \d processing.
-    // Text is counted so it can contain nulls.
+    // Text is counted so it can contain NULs.
     // Looks for \d where d is between 1 and 9 and replaces these with the strings
     // matched in the last search operation which were surrounded by \( and \).
     // Returns the length of the replacement text including any change
     // Looks for \d where d is between 1 and 9 and replaces these with the strings
     // matched in the last search operation which were surrounded by \( and \).
     // Returns the length of the replacement text including any change
@@ -1794,7 +1956,7 @@ public:
     int ReplaceTargetRE(const wxString& text);
 
     // Search for a counted string in the target and set the target to the found
     int ReplaceTargetRE(const wxString& text);
 
     // Search for a counted string in the target and set the target to the found
-    // range. Text is counted so it can contain nulls.
+    // range. Text is counted so it can contain NULs.
     // Returns length of range or -1 for failure in which case target is not moved.
     int SearchInTarget(const wxString& text);
 
     // Returns length of range or -1 for failure in which case target is not moved.
     int SearchInTarget(const wxString& text);
 
@@ -1919,7 +2081,7 @@ public:
     int GetScrollWidth();
 
     // Measure the pixel width of some text in a particular style.
     int GetScrollWidth();
 
     // Measure the pixel width of some text in a particular style.
-    // Nul terminated text argument.
+    // NUL terminated text argument.
     // Does not handle tab or control characters.
     int TextWidth(int style, const wxString& text);
 
     // Does not handle tab or control characters.
     int TextWidth(int style, const wxString& text);
 
@@ -2135,7 +2297,7 @@ public:
     void SetXOffset(int newOffset);
     int GetXOffset();
 
     void SetXOffset(int newOffset);
     int GetXOffset();
 
-    // Set the last x chosen value to be the caret x position
+    // Set the last x chosen value to be the caret x position.
     void ChooseCaretX();
 
     // Set the way the caret is kept visible when going sideway.
     void ChooseCaretX();
 
     // Set the way the caret is kept visible when going sideway.
@@ -2149,7 +2311,7 @@ public:
     // Set printing to line wrapped (SC_WRAP_WORD) or not line wrapped (SC_WRAP_NONE).
     void SetPrintWrapMode(int mode);
 
     // Set printing to line wrapped (SC_WRAP_WORD) or not line wrapped (SC_WRAP_NONE).
     void SetPrintWrapMode(int mode);
 
-    // Is printing line wrapped.
+    // Is printing line wrapped?
     int GetPrintWrapMode();
 
     // Set a fore colour for active hotspots.
     int GetPrintWrapMode();
 
     // Set a fore colour for active hotspots.
@@ -2161,6 +2323,9 @@ public:
     // Enable / Disable underlining active hotspots.
     void SetHotspotActiveUnderline(bool underline);
 
     // Enable / Disable underlining active hotspots.
     void SetHotspotActiveUnderline(bool underline);
 
+    // Limit hotspots to single line so hotspots on two lines don't merge.
+    void SetHotspotSingleLine(bool singleLine);
+
     // Given a valid document position, return the previous position taking code
     // page into account. Returns 0 if passed 0.
     int PositionBefore(int pos);
     // Given a valid document position, return the previous position taking code
     // page into account. Returns 0 if passed 0.
     int PositionBefore(int pos);
@@ -2175,6 +2340,29 @@ public:
     // Copy argument text to the clipboard.
     void CopyText(int length, const wxString& text);
 
     // Copy argument text to the clipboard.
     void CopyText(int length, const wxString& text);
 
+    // Set the selection mode to stream (SC_SEL_STREAM) or rectangular (SC_SEL_RECTANGLE) or
+    // by lines (SC_SEL_LINES).
+    void SetSelectionMode(int mode);
+
+    // Get the mode of the current selection.
+    int GetSelectionMode();
+
+    // Retrieve the position of the start of the selection at the given line (INVALID_POSITION if no selection on this line).
+    int GetLineSelStartPosition(int line);
+
+    // Retrieve the position of the end of the selection at the given line (INVALID_POSITION if no selection on this line).
+    int GetLineSelEndPosition(int line);
+
+    // Set the set of characters making up whitespace for when moving or selecting by word.
+    // Should be called after SetWordChars.
+    void SetWhitespaceChars(const wxString& characters);
+
+    // Reset the set of characters for whitespace and word characters to the defaults.
+    void SetCharsDefault();
+
+    // Get currently selected item position in the auto-completion list
+    int AutoCompGetCurrent();
+
     // Start notifying the container of all key presses and commands.
     void StartRecord();
 
     // Start notifying the container of all key presses and commands.
     void StartRecord();
 
@@ -2321,7 +2509,8 @@ private:
     void OnEraseBackground(wxEraseEvent& evt);
     void OnMenu(wxCommandEvent& evt);
     void OnListBox(wxCommandEvent& evt);
     void OnEraseBackground(wxEraseEvent& evt);
     void OnMenu(wxCommandEvent& evt);
     void OnListBox(wxCommandEvent& evt);
-
+    void OnIdle(wxIdleEvent& evt);
+    
 
     // Turn notifications from Scintilla into events
     void NotifyChange();
 
     // Turn notifications from Scintilla into events
     void NotifyChange();
index 6c645a2e24924700ed6893d3e1b26def4f2c9650..2979989fef8188df4271cb85d61fbf2545c2532a 100644 (file)
@@ -57,48 +57,56 @@ STCDLL_OBJECTS =  \
        stcdll_CallTip.o \
        stcdll_CellBuffer.o \
        stcdll_ContractionState.o \
        stcdll_CallTip.o \
        stcdll_CellBuffer.o \
        stcdll_ContractionState.o \
-       stcdll_Document.o \
        stcdll_DocumentAccessor.o \
        stcdll_DocumentAccessor.o \
+       stcdll_Document.o \
        stcdll_Editor.o \
        stcdll_ExternalLexer.o \
        stcdll_Indicator.o \
        stcdll_KeyMap.o \
        stcdll_KeyWords.o \
        stcdll_Editor.o \
        stcdll_ExternalLexer.o \
        stcdll_Indicator.o \
        stcdll_KeyMap.o \
        stcdll_KeyWords.o \
-       stcdll_LexAVE.o \
        stcdll_LexAda.o \
        stcdll_LexAsm.o \
        stcdll_LexAda.o \
        stcdll_LexAsm.o \
+       stcdll_LexAVE.o \
        stcdll_LexBaan.o \
        stcdll_LexBullant.o \
        stcdll_LexBaan.o \
        stcdll_LexBullant.o \
-       stcdll_LexCPP.o \
-       stcdll_LexCSS.o \
+       stcdll_LexCLW.o \
        stcdll_LexConf.o \
        stcdll_LexConf.o \
+       stcdll_LexCPP.o \
        stcdll_LexCrontab.o \
        stcdll_LexCrontab.o \
+       stcdll_LexCSS.o \
        stcdll_LexEiffel.o \
        stcdll_LexEiffel.o \
+       stcdll_LexErlang.o \
        stcdll_LexEScript.o \
        stcdll_LexEScript.o \
+       stcdll_LexForth.o \
        stcdll_LexFortran.o \
        stcdll_LexHTML.o \
        stcdll_LexLisp.o \
        stcdll_LexLout.o \
        stcdll_LexLua.o \
        stcdll_LexFortran.o \
        stcdll_LexHTML.o \
        stcdll_LexLisp.o \
        stcdll_LexLout.o \
        stcdll_LexLua.o \
-       stcdll_LexMMIXAL.o \
        stcdll_LexMatlab.o \
        stcdll_LexMatlab.o \
+       stcdll_LexMetapost.o \
+       stcdll_LexMMIXAL.o \
+       stcdll_LexMPT.o \
        stcdll_LexNsis.o \
        stcdll_LexOthers.o \
        stcdll_LexNsis.o \
        stcdll_LexOthers.o \
-       stcdll_LexPOV.o \
-       stcdll_LexPS.o \
        stcdll_LexPascal.o \
        stcdll_LexPascal.o \
+       stcdll_LexPB.o \
        stcdll_LexPerl.o \
        stcdll_LexPerl.o \
+       stcdll_LexPOV.o \
+       stcdll_LexPS.o \
        stcdll_LexPython.o \
        stcdll_LexRuby.o \
        stcdll_LexPython.o \
        stcdll_LexRuby.o \
-       stcdll_LexSQL.o \
        stcdll_LexScriptol.o \
        stcdll_LexScriptol.o \
+       stcdll_LexSQL.o \
+       stcdll_LexTeX.o \
        stcdll_LexVB.o \
        stcdll_LexVB.o \
+       stcdll_LexYAML.o \
        stcdll_LineMarker.o \
        stcdll_PropSet.o \
        stcdll_RESearch.o \
        stcdll_ScintillaBase.o \
        stcdll_LineMarker.o \
        stcdll_PropSet.o \
        stcdll_RESearch.o \
        stcdll_ScintillaBase.o \
-       stcdll_Style.o \
        stcdll_StyleContext.o \
        stcdll_StyleContext.o \
+       stcdll_Style.o \
        stcdll_UniConversion.o \
        stcdll_ViewStyle.o \
        stcdll_WindowAccessor.o \
        stcdll_UniConversion.o \
        stcdll_ViewStyle.o \
        stcdll_WindowAccessor.o \
@@ -115,48 +123,56 @@ STCLIB_OBJECTS =  \
        stclib_CallTip.o \
        stclib_CellBuffer.o \
        stclib_ContractionState.o \
        stclib_CallTip.o \
        stclib_CellBuffer.o \
        stclib_ContractionState.o \
-       stclib_Document.o \
        stclib_DocumentAccessor.o \
        stclib_DocumentAccessor.o \
+       stclib_Document.o \
        stclib_Editor.o \
        stclib_ExternalLexer.o \
        stclib_Indicator.o \
        stclib_KeyMap.o \
        stclib_KeyWords.o \
        stclib_Editor.o \
        stclib_ExternalLexer.o \
        stclib_Indicator.o \
        stclib_KeyMap.o \
        stclib_KeyWords.o \
-       stclib_LexAVE.o \
        stclib_LexAda.o \
        stclib_LexAsm.o \
        stclib_LexAda.o \
        stclib_LexAsm.o \
+       stclib_LexAVE.o \
        stclib_LexBaan.o \
        stclib_LexBullant.o \
        stclib_LexBaan.o \
        stclib_LexBullant.o \
-       stclib_LexCPP.o \
-       stclib_LexCSS.o \
+       stclib_LexCLW.o \
        stclib_LexConf.o \
        stclib_LexConf.o \
+       stclib_LexCPP.o \
        stclib_LexCrontab.o \
        stclib_LexCrontab.o \
+       stclib_LexCSS.o \
        stclib_LexEiffel.o \
        stclib_LexEiffel.o \
+       stclib_LexErlang.o \
        stclib_LexEScript.o \
        stclib_LexEScript.o \
+       stclib_LexForth.o \
        stclib_LexFortran.o \
        stclib_LexHTML.o \
        stclib_LexLisp.o \
        stclib_LexLout.o \
        stclib_LexLua.o \
        stclib_LexFortran.o \
        stclib_LexHTML.o \
        stclib_LexLisp.o \
        stclib_LexLout.o \
        stclib_LexLua.o \
-       stclib_LexMMIXAL.o \
        stclib_LexMatlab.o \
        stclib_LexMatlab.o \
+       stclib_LexMetapost.o \
+       stclib_LexMMIXAL.o \
+       stclib_LexMPT.o \
        stclib_LexNsis.o \
        stclib_LexOthers.o \
        stclib_LexNsis.o \
        stclib_LexOthers.o \
-       stclib_LexPOV.o \
-       stclib_LexPS.o \
        stclib_LexPascal.o \
        stclib_LexPascal.o \
+       stclib_LexPB.o \
        stclib_LexPerl.o \
        stclib_LexPerl.o \
+       stclib_LexPOV.o \
+       stclib_LexPS.o \
        stclib_LexPython.o \
        stclib_LexRuby.o \
        stclib_LexPython.o \
        stclib_LexRuby.o \
-       stclib_LexSQL.o \
        stclib_LexScriptol.o \
        stclib_LexScriptol.o \
+       stclib_LexSQL.o \
+       stclib_LexTeX.o \
        stclib_LexVB.o \
        stclib_LexVB.o \
+       stclib_LexYAML.o \
        stclib_LineMarker.o \
        stclib_PropSet.o \
        stclib_RESearch.o \
        stclib_ScintillaBase.o \
        stclib_LineMarker.o \
        stclib_PropSet.o \
        stclib_RESearch.o \
        stclib_ScintillaBase.o \
-       stclib_Style.o \
        stclib_StyleContext.o \
        stclib_StyleContext.o \
+       stclib_Style.o \
        stclib_UniConversion.o \
        stclib_ViewStyle.o \
        stclib_WindowAccessor.o \
        stclib_UniConversion.o \
        stclib_ViewStyle.o \
        stclib_WindowAccessor.o \
@@ -332,10 +348,10 @@ stcdll_CellBuffer.o: $(srcdir)/scintilla/src/CellBuffer.cxx
 stcdll_ContractionState.o: $(srcdir)/scintilla/src/ContractionState.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_ContractionState.o: $(srcdir)/scintilla/src/ContractionState.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_Document.o: $(srcdir)/scintilla/src/Document.cxx
+stcdll_DocumentAccessor.o: $(srcdir)/scintilla/src/DocumentAccessor.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_DocumentAccessor.o: $(srcdir)/scintilla/src/DocumentAccessor.cxx
+stcdll_Document.o: $(srcdir)/scintilla/src/Document.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_Editor.o: $(srcdir)/scintilla/src/Editor.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_Editor.o: $(srcdir)/scintilla/src/Editor.cxx
@@ -353,39 +369,48 @@ stcdll_KeyMap.o: $(srcdir)/scintilla/src/KeyMap.cxx
 stcdll_KeyWords.o: $(srcdir)/scintilla/src/KeyWords.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_KeyWords.o: $(srcdir)/scintilla/src/KeyWords.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_LexAVE.o: $(srcdir)/scintilla/src/LexAVE.cxx
-       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
-
 stcdll_LexAda.o: $(srcdir)/scintilla/src/LexAda.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexAsm.o: $(srcdir)/scintilla/src/LexAsm.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexAda.o: $(srcdir)/scintilla/src/LexAda.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexAsm.o: $(srcdir)/scintilla/src/LexAsm.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
+stcdll_LexAVE.o: $(srcdir)/scintilla/src/LexAVE.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
 stcdll_LexBaan.o: $(srcdir)/scintilla/src/LexBaan.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexBullant.o: $(srcdir)/scintilla/src/LexBullant.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexBaan.o: $(srcdir)/scintilla/src/LexBaan.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexBullant.o: $(srcdir)/scintilla/src/LexBullant.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_LexCPP.o: $(srcdir)/scintilla/src/LexCPP.cxx
+stcdll_LexCLW.o: $(srcdir)/scintilla/src/LexCLW.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_LexCSS.o: $(srcdir)/scintilla/src/LexCSS.cxx
+stcdll_LexConf.o: $(srcdir)/scintilla/src/LexConf.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_LexConf.o: $(srcdir)/scintilla/src/LexConf.cxx
+stcdll_LexCPP.o: $(srcdir)/scintilla/src/LexCPP.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexCrontab.o: $(srcdir)/scintilla/src/LexCrontab.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexCrontab.o: $(srcdir)/scintilla/src/LexCrontab.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
+stcdll_LexCSS.o: $(srcdir)/scintilla/src/LexCSS.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
 stcdll_LexEiffel.o: $(srcdir)/scintilla/src/LexEiffel.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexEiffel.o: $(srcdir)/scintilla/src/LexEiffel.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
+stcdll_LexErlang.o: $(srcdir)/scintilla/src/LexErlang.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
 stcdll_LexEScript.o: $(srcdir)/scintilla/src/LexEScript.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexEScript.o: $(srcdir)/scintilla/src/LexEScript.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
+stcdll_LexForth.o: $(srcdir)/scintilla/src/LexForth.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
 stcdll_LexFortran.o: $(srcdir)/scintilla/src/LexFortran.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexFortran.o: $(srcdir)/scintilla/src/LexFortran.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
@@ -401,10 +426,16 @@ stcdll_LexLout.o: $(srcdir)/scintilla/src/LexLout.cxx
 stcdll_LexLua.o: $(srcdir)/scintilla/src/LexLua.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexLua.o: $(srcdir)/scintilla/src/LexLua.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
+stcdll_LexMatlab.o: $(srcdir)/scintilla/src/LexMatlab.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
+stcdll_LexMetapost.o: $(srcdir)/scintilla/src/LexMetapost.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
 stcdll_LexMMIXAL.o: $(srcdir)/scintilla/src/LexMMIXAL.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexMMIXAL.o: $(srcdir)/scintilla/src/LexMMIXAL.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_LexMatlab.o: $(srcdir)/scintilla/src/LexMatlab.cxx
+stcdll_LexMPT.o: $(srcdir)/scintilla/src/LexMPT.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexNsis.o: $(srcdir)/scintilla/src/LexNsis.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexNsis.o: $(srcdir)/scintilla/src/LexNsis.cxx
@@ -413,16 +444,19 @@ stcdll_LexNsis.o: $(srcdir)/scintilla/src/LexNsis.cxx
 stcdll_LexOthers.o: $(srcdir)/scintilla/src/LexOthers.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexOthers.o: $(srcdir)/scintilla/src/LexOthers.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_LexPOV.o: $(srcdir)/scintilla/src/LexPOV.cxx
+stcdll_LexPascal.o: $(srcdir)/scintilla/src/LexPascal.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_LexPS.o: $(srcdir)/scintilla/src/LexPS.cxx
+stcdll_LexPB.o: $(srcdir)/scintilla/src/LexPB.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_LexPascal.o: $(srcdir)/scintilla/src/LexPascal.cxx
+stcdll_LexPerl.o: $(srcdir)/scintilla/src/LexPerl.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_LexPerl.o: $(srcdir)/scintilla/src/LexPerl.cxx
+stcdll_LexPOV.o: $(srcdir)/scintilla/src/LexPOV.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
+stcdll_LexPS.o: $(srcdir)/scintilla/src/LexPS.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexPython.o: $(srcdir)/scintilla/src/LexPython.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexPython.o: $(srcdir)/scintilla/src/LexPython.cxx
@@ -431,15 +465,21 @@ stcdll_LexPython.o: $(srcdir)/scintilla/src/LexPython.cxx
 stcdll_LexRuby.o: $(srcdir)/scintilla/src/LexRuby.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexRuby.o: $(srcdir)/scintilla/src/LexRuby.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
+stcdll_LexScriptol.o: $(srcdir)/scintilla/src/LexScriptol.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
 stcdll_LexSQL.o: $(srcdir)/scintilla/src/LexSQL.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexSQL.o: $(srcdir)/scintilla/src/LexSQL.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_LexScriptol.o: $(srcdir)/scintilla/src/LexScriptol.cxx
+stcdll_LexTeX.o: $(srcdir)/scintilla/src/LexTeX.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexVB.o: $(srcdir)/scintilla/src/LexVB.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexVB.o: $(srcdir)/scintilla/src/LexVB.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
+stcdll_LexYAML.o: $(srcdir)/scintilla/src/LexYAML.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
 stcdll_LineMarker.o: $(srcdir)/scintilla/src/LineMarker.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LineMarker.o: $(srcdir)/scintilla/src/LineMarker.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
@@ -452,10 +492,10 @@ stcdll_RESearch.o: $(srcdir)/scintilla/src/RESearch.cxx
 stcdll_ScintillaBase.o: $(srcdir)/scintilla/src/ScintillaBase.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_ScintillaBase.o: $(srcdir)/scintilla/src/ScintillaBase.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_Style.o: $(srcdir)/scintilla/src/Style.cxx
+stcdll_StyleContext.o: $(srcdir)/scintilla/src/StyleContext.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_StyleContext.o: $(srcdir)/scintilla/src/StyleContext.cxx
+stcdll_Style.o: $(srcdir)/scintilla/src/Style.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_UniConversion.o: $(srcdir)/scintilla/src/UniConversion.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_UniConversion.o: $(srcdir)/scintilla/src/UniConversion.cxx
@@ -491,10 +531,10 @@ stclib_CellBuffer.o: $(srcdir)/scintilla/src/CellBuffer.cxx
 stclib_ContractionState.o: $(srcdir)/scintilla/src/ContractionState.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_ContractionState.o: $(srcdir)/scintilla/src/ContractionState.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_Document.o: $(srcdir)/scintilla/src/Document.cxx
+stclib_DocumentAccessor.o: $(srcdir)/scintilla/src/DocumentAccessor.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_DocumentAccessor.o: $(srcdir)/scintilla/src/DocumentAccessor.cxx
+stclib_Document.o: $(srcdir)/scintilla/src/Document.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_Editor.o: $(srcdir)/scintilla/src/Editor.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_Editor.o: $(srcdir)/scintilla/src/Editor.cxx
@@ -512,39 +552,48 @@ stclib_KeyMap.o: $(srcdir)/scintilla/src/KeyMap.cxx
 stclib_KeyWords.o: $(srcdir)/scintilla/src/KeyWords.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_KeyWords.o: $(srcdir)/scintilla/src/KeyWords.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_LexAVE.o: $(srcdir)/scintilla/src/LexAVE.cxx
-       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
-
 stclib_LexAda.o: $(srcdir)/scintilla/src/LexAda.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexAsm.o: $(srcdir)/scintilla/src/LexAsm.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexAda.o: $(srcdir)/scintilla/src/LexAda.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexAsm.o: $(srcdir)/scintilla/src/LexAsm.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
+stclib_LexAVE.o: $(srcdir)/scintilla/src/LexAVE.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
 stclib_LexBaan.o: $(srcdir)/scintilla/src/LexBaan.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexBullant.o: $(srcdir)/scintilla/src/LexBullant.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexBaan.o: $(srcdir)/scintilla/src/LexBaan.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexBullant.o: $(srcdir)/scintilla/src/LexBullant.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_LexCPP.o: $(srcdir)/scintilla/src/LexCPP.cxx
+stclib_LexCLW.o: $(srcdir)/scintilla/src/LexCLW.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_LexCSS.o: $(srcdir)/scintilla/src/LexCSS.cxx
+stclib_LexConf.o: $(srcdir)/scintilla/src/LexConf.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_LexConf.o: $(srcdir)/scintilla/src/LexConf.cxx
+stclib_LexCPP.o: $(srcdir)/scintilla/src/LexCPP.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexCrontab.o: $(srcdir)/scintilla/src/LexCrontab.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexCrontab.o: $(srcdir)/scintilla/src/LexCrontab.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
+stclib_LexCSS.o: $(srcdir)/scintilla/src/LexCSS.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
 stclib_LexEiffel.o: $(srcdir)/scintilla/src/LexEiffel.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexEiffel.o: $(srcdir)/scintilla/src/LexEiffel.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
+stclib_LexErlang.o: $(srcdir)/scintilla/src/LexErlang.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
 stclib_LexEScript.o: $(srcdir)/scintilla/src/LexEScript.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexEScript.o: $(srcdir)/scintilla/src/LexEScript.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
+stclib_LexForth.o: $(srcdir)/scintilla/src/LexForth.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
 stclib_LexFortran.o: $(srcdir)/scintilla/src/LexFortran.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexFortran.o: $(srcdir)/scintilla/src/LexFortran.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
@@ -560,10 +609,16 @@ stclib_LexLout.o: $(srcdir)/scintilla/src/LexLout.cxx
 stclib_LexLua.o: $(srcdir)/scintilla/src/LexLua.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexLua.o: $(srcdir)/scintilla/src/LexLua.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
+stclib_LexMatlab.o: $(srcdir)/scintilla/src/LexMatlab.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
+stclib_LexMetapost.o: $(srcdir)/scintilla/src/LexMetapost.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
 stclib_LexMMIXAL.o: $(srcdir)/scintilla/src/LexMMIXAL.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexMMIXAL.o: $(srcdir)/scintilla/src/LexMMIXAL.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_LexMatlab.o: $(srcdir)/scintilla/src/LexMatlab.cxx
+stclib_LexMPT.o: $(srcdir)/scintilla/src/LexMPT.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexNsis.o: $(srcdir)/scintilla/src/LexNsis.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexNsis.o: $(srcdir)/scintilla/src/LexNsis.cxx
@@ -572,16 +627,19 @@ stclib_LexNsis.o: $(srcdir)/scintilla/src/LexNsis.cxx
 stclib_LexOthers.o: $(srcdir)/scintilla/src/LexOthers.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexOthers.o: $(srcdir)/scintilla/src/LexOthers.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_LexPOV.o: $(srcdir)/scintilla/src/LexPOV.cxx
+stclib_LexPascal.o: $(srcdir)/scintilla/src/LexPascal.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_LexPS.o: $(srcdir)/scintilla/src/LexPS.cxx
+stclib_LexPB.o: $(srcdir)/scintilla/src/LexPB.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_LexPascal.o: $(srcdir)/scintilla/src/LexPascal.cxx
+stclib_LexPerl.o: $(srcdir)/scintilla/src/LexPerl.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_LexPerl.o: $(srcdir)/scintilla/src/LexPerl.cxx
+stclib_LexPOV.o: $(srcdir)/scintilla/src/LexPOV.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
+stclib_LexPS.o: $(srcdir)/scintilla/src/LexPS.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexPython.o: $(srcdir)/scintilla/src/LexPython.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexPython.o: $(srcdir)/scintilla/src/LexPython.cxx
@@ -590,15 +648,21 @@ stclib_LexPython.o: $(srcdir)/scintilla/src/LexPython.cxx
 stclib_LexRuby.o: $(srcdir)/scintilla/src/LexRuby.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexRuby.o: $(srcdir)/scintilla/src/LexRuby.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
+stclib_LexScriptol.o: $(srcdir)/scintilla/src/LexScriptol.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
 stclib_LexSQL.o: $(srcdir)/scintilla/src/LexSQL.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexSQL.o: $(srcdir)/scintilla/src/LexSQL.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_LexScriptol.o: $(srcdir)/scintilla/src/LexScriptol.cxx
+stclib_LexTeX.o: $(srcdir)/scintilla/src/LexTeX.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexVB.o: $(srcdir)/scintilla/src/LexVB.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexVB.o: $(srcdir)/scintilla/src/LexVB.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
+stclib_LexYAML.o: $(srcdir)/scintilla/src/LexYAML.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
 stclib_LineMarker.o: $(srcdir)/scintilla/src/LineMarker.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LineMarker.o: $(srcdir)/scintilla/src/LineMarker.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
@@ -611,10 +675,10 @@ stclib_RESearch.o: $(srcdir)/scintilla/src/RESearch.cxx
 stclib_ScintillaBase.o: $(srcdir)/scintilla/src/ScintillaBase.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_ScintillaBase.o: $(srcdir)/scintilla/src/ScintillaBase.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_Style.o: $(srcdir)/scintilla/src/Style.cxx
+stclib_StyleContext.o: $(srcdir)/scintilla/src/StyleContext.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_StyleContext.o: $(srcdir)/scintilla/src/StyleContext.cxx
+stclib_Style.o: $(srcdir)/scintilla/src/Style.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_UniConversion.o: $(srcdir)/scintilla/src/UniConversion.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_UniConversion.o: $(srcdir)/scintilla/src/UniConversion.cxx
index ceb50296a67a96d97b99a727be1a8e92ae5ff6b9..56205b99a4c574bfef0b9b8797928f53ea18bc8d 100644 (file)
@@ -855,7 +855,6 @@ public:
     virtual int GetSelection();
     virtual int Find(const char *prefix);
     virtual void GetValue(int n, char *value, int len);
     virtual int GetSelection();
     virtual int Find(const char *prefix);
     virtual void GetValue(int n, char *value, int len);
-    virtual void Sort();
     virtual void RegisterImage(int type, const char *xpm_data);
     virtual void ClearRegisteredImages();
     virtual void SetDoubleClickAction(CallBackAction, void *);
     virtual void RegisterImage(int type, const char *xpm_data);
     virtual void ClearRegisteredImages();
     virtual void SetDoubleClickAction(CallBackAction, void *);
@@ -1008,9 +1007,6 @@ void ListBoxImpl::GetValue(int n, char *value, int len) {
     value[len-1] = '\0';
 }
 
     value[len-1] = '\0';
 }
 
-void ListBoxImpl::Sort() {
-}
-
 
 void ListBoxImpl::RegisterImage(int type, const char *xpm_data) {
     wxMemoryInputStream stream(xpm_data, strlen(xpm_data)+1);
 
 void ListBoxImpl::RegisterImage(int type, const char *xpm_data) {
     wxMemoryInputStream stream(xpm_data, strlen(xpm_data)+1);
index 26e966cf36e90d6ba10fc83cdec3268daef8f740..eaa160020815c0cae86b8a89350417bd673bca33 100644 (file)
@@ -146,7 +146,6 @@ ScintillaWX::ScintillaWX(wxStyledTextCtrl* win) {
 
 
 ScintillaWX::~ScintillaWX() {
 
 
 ScintillaWX::~ScintillaWX() {
-    SetTicking(false);
 }
 
 //----------------------------------------------------------------------
 }
 
 //----------------------------------------------------------------------
@@ -165,6 +164,8 @@ void ScintillaWX::Initialise() {
 
 void ScintillaWX::Finalise() {
     ScintillaBase::Finalise();
 
 void ScintillaWX::Finalise() {
     ScintillaBase::Finalise();
+    SetTicking(false);
+    SetIdle(false);
 }
 
 
 }
 
 
@@ -199,6 +200,19 @@ void ScintillaWX::StartDrag() {
 }
 
 
 }
 
 
+bool ScintillaWX::SetIdle(bool on) {
+    if (idler.state != on) {
+        // connect or disconnect the EVT_IDLE handler
+        if (on) 
+            stc->Connect(-1, wxEVT_IDLE, (wxObjectEventFunction)&wxStyledTextCtrl::OnIdle);
+        else
+            stc->Disconnect(-1, wxEVT_IDLE, (wxObjectEventFunction)&wxStyledTextCtrl::OnIdle);
+        idler.state = on;
+    }
+    return idler.state;
+}
+
+    
 void ScintillaWX::SetTicking(bool on) {
     wxSTCTimer* steTimer;
     if (timer.ticking != on) {
 void ScintillaWX::SetTicking(bool on) {
     wxSTCTimer* steTimer;
     if (timer.ticking != on) {
@@ -219,11 +233,13 @@ void ScintillaWX::SetTicking(bool on) {
 
 
 void ScintillaWX::SetMouseCapture(bool on) {
 
 
 void ScintillaWX::SetMouseCapture(bool on) {
-    if (on && !capturedMouse)
-        stc->CaptureMouse();
-    else if (!on && capturedMouse && stc->HasCapture())
-        stc->ReleaseMouse();
-    capturedMouse = on;
+    if (mouseDownCaptures) {
+        if (on && !capturedMouse)
+            stc->CaptureMouse();
+        else if (!on && capturedMouse && stc->HasCapture())
+            stc->ReleaseMouse();
+        capturedMouse = on;
+    }
 }
 
 
 }
 
 
@@ -652,7 +668,7 @@ void ScintillaWX::DoMiddleButtonUp(Point pt) {
     // Set the current position to the mouse click point and
     // then paste in the PRIMARY selection, if any.  wxGTK only.
     int newPos = PositionFromLocation(pt);
     // Set the current position to the mouse click point and
     // then paste in the PRIMARY selection, if any.  wxGTK only.
     int newPos = PositionFromLocation(pt);
-    MovePositionTo(newPos, 0, 1);
+    MovePositionTo(newPos, noSel, true);
 
     pdoc->BeginUndoAction();
     wxTextDataObject data;
 
     pdoc->BeginUndoAction();
     wxTextDataObject data;
@@ -775,6 +791,15 @@ void ScintillaWX::DoOnListBox() {
     AutoCompleteCompleted();
 }
 
     AutoCompleteCompleted();
 }
 
+void ScintillaWX::DoOnIdle(wxIdleEvent& evt) {
+
+    if ( Idle() )
+        evt.RequestMore();
+    else
+        SetIdle(false);
+}
 //----------------------------------------------------------------------
 
 #if wxUSE_DRAG_AND_DROP
 //----------------------------------------------------------------------
 
 #if wxUSE_DRAG_AND_DROP
index 799e58ed5a289b5bed14b76f823067038aaf29fa..1316c6661d3b965b176a8ccd46557def063ff9c8 100644 (file)
@@ -99,6 +99,7 @@ public:
     virtual void Initialise();
     virtual void Finalise();
     virtual void StartDrag();
     virtual void Initialise();
     virtual void Finalise();
     virtual void StartDrag();
+    virtual bool SetIdle(bool on);
     virtual void SetTicking(bool on);
     virtual void SetMouseCapture(bool on);
     virtual bool HaveMouseCapture();
     virtual void SetTicking(bool on);
     virtual void SetMouseCapture(bool on);
     virtual bool HaveMouseCapture();
@@ -142,7 +143,8 @@ public:
     void DoAddChar(int key);
     int  DoKeyDown(int key, bool shift, bool ctrl, bool alt, bool meta, bool* consumed);
     void DoTick() { Tick(); }
     void DoAddChar(int key);
     int  DoKeyDown(int key, bool shift, bool ctrl, bool alt, bool meta, bool* consumed);
     void DoTick() { Tick(); }
-
+    void DoOnIdle(wxIdleEvent& evt);
+    
 #if wxUSE_DRAG_AND_DROP
     bool DoDropText(long x, long y, const wxString& data);
     wxDragResult DoDragEnter(wxCoord x, wxCoord y, wxDragResult def);
 #if wxUSE_DRAG_AND_DROP
     bool DoDropText(long x, long y, const wxString& data);
     wxDragResult DoDragEnter(wxCoord x, wxCoord y, wxDragResult def);
index aa9432d377e9be65ad2fa3b19618e28436339056..070d4cbe90e78dbbe30e99f022082745b93b33b2 100644 (file)
@@ -44,6 +44,7 @@ cmdValues = [ (2300, 2349),
               (2395, 2396),
               2404,
               (2413, 2416),
               (2395, 2396),
               2404,
               (2413, 2416),
+              (2426, 2442),
               (2450, 2454),
             ]
 
               (2450, 2454),
             ]
 
@@ -275,6 +276,7 @@ methodOverrideMap = {
     'AutoCGetDropRestOfWord' : ('AutoCompGetDropRestOfWord', 0,0,0),
     'AutoCGetTypeSeparator' : ('AutoCompGetTypeSeparator', 0, 0, 0),
     'AutoCSetTypeSeparator' : ('AutoCompSetTypeSeparator', 0, 0, 0),
     'AutoCGetDropRestOfWord' : ('AutoCompGetDropRestOfWord', 0,0,0),
     'AutoCGetTypeSeparator' : ('AutoCompGetTypeSeparator', 0, 0, 0),
     'AutoCSetTypeSeparator' : ('AutoCompSetTypeSeparator', 0, 0, 0),
+    'AutoCGetCurrent'       : ('AutoCompGetCurrent', 0, 0, 0),
 
     'RegisterImage' :
     (0,
 
     'RegisterImage' :
     (0,
@@ -330,14 +332,14 @@ methodOverrideMap = {
                int    startPos,
                int    endPos,
                wxDC*  draw,
                int    startPos,
                int    endPos,
                wxDC*  draw,
-               wxDC*  target,  // Why does it use two? Can they be the same?
+               wxDC*  target, 
                wxRect renderRect,
                wxRect pageRect);''',
      ''' int %s(bool   doDraw,
                 int    startPos,
                 int    endPos,
                 wxDC*  draw,
                wxRect renderRect,
                wxRect pageRect);''',
      ''' int %s(bool   doDraw,
                 int    startPos,
                 int    endPos,
                 wxDC*  draw,
-                wxDC*  target,  // Why does it use two? Can they be the same?
+                wxDC*  target, 
                 wxRect renderRect,
                 wxRect pageRect) {
              RangeToFormat fr;
                 wxRect renderRect,
                 wxRect pageRect) {
              RangeToFormat fr;
@@ -615,8 +617,23 @@ methodOverrideMap = {
     'ParaDownExtend' : (None, 0, 0, 0),
     'ParaUp' : (None, 0, 0, 0),
     'ParaUpExtend' : (None, 0, 0, 0),
     'ParaDownExtend' : (None, 0, 0, 0),
     'ParaUp' : (None, 0, 0, 0),
     'ParaUpExtend' : (None, 0, 0, 0),
-
-
+    'LineDownRectExtend' : (None, 0, 0, 0),
+    'LineUpRectExtend' : (None, 0, 0, 0),
+    'CharLeftRectExtend' : (None, 0, 0, 0),
+    'CharRightRectExtend' : (None, 0, 0, 0),
+    'HomeRectExtend' : (None, 0, 0, 0),
+    'VCHomeRectExtend' : (None, 0, 0, 0),
+    'LineEndRectExtend' : (None, 0, 0, 0),
+    'PageUpRectExtend' : (None, 0, 0, 0),
+    'PageDownRectExtend' : (None, 0, 0, 0),
+    'StutteredPageUp' : (None, 0, 0, 0),
+    'StutteredPageUpExtend' : (None, 0, 0, 0),
+    'StutteredPageDown' : (None, 0, 0, 0),
+    'StutteredPageDownExtend' : (None, 0, 0, 0),
+    'WordLeftEnd' : (None, 0, 0, 0),
+    'WordLeftEndExtend' : (None, 0, 0, 0),
+    'WordRightEnd' : (None, 0, 0, 0),
+    'WordRightEndExtend' : (None, 0, 0, 0),
 
     '' : ('', 0, 0, 0),
 
 
     '' : ('', 0, 0, 0),
 
index 1960be5d3ddedce5e6188b5775e85b4cd5559f36..f8ebdb02a6d196c246cd290fee67d6fb7a9fdc20 100644 (file)
@@ -3,4 +3,4 @@ scintilla/include directories from the Scintilla/SCiTE source
 distribution.  All other code needed to implement Scintilla on top of
 wxWindows is located in the directory above this one.
 
 distribution.  All other code needed to implement Scintilla on top of
 wxWindows is located in the directory above this one.
 
-The current version of the Scintilla code is 1.54
+The current version of the Scintilla code is 1.58
index 4f7ba2357c3230fe6386b6335f7e5393cb457ae3..876402416880395d56f9f0b42794400b364d3812 100644 (file)
@@ -58,6 +58,7 @@ typedef void *WindowID;
 typedef void *MenuID;
 typedef void *TickerID;
 typedef void *Function;
 typedef void *MenuID;
 typedef void *TickerID;
 typedef void *Function;
+typedef void *IdlerID;
 
 /**
  * A geometric point class.
 
 /**
  * A geometric point class.
@@ -408,7 +409,6 @@ public:
        virtual int GetSelection()=0;
        virtual int Find(const char *prefix)=0;
        virtual void GetValue(int n, char *value, int len)=0;
        virtual int GetSelection()=0;
        virtual int Find(const char *prefix)=0;
        virtual void GetValue(int n, char *value, int len)=0;
-       virtual void Sort()=0;
        virtual void RegisterImage(int type, const char *xpm_data)=0;
        virtual void ClearRegisteredImages()=0;
        virtual void SetDoubleClickAction(CallBackAction, void *)=0;
        virtual void RegisterImage(int type, const char *xpm_data)=0;
        virtual void ClearRegisteredImages()=0;
        virtual void SetDoubleClickAction(CallBackAction, void *)=0;
index 20ac5f774ac3ed8fdacf5d9b8ad01cea1295f5b4..62cd5da3a93620d26ea1d84515011dd8b0643270 100644 (file)
@@ -81,7 +81,7 @@ public:
        void SetFromAllocated();
        bool InList(const char *s);
        const char *GetNearestWord(const char *wordStart, int searchLen = -1,
        void SetFromAllocated();
        bool InList(const char *s);
        const char *GetNearestWord(const char *wordStart, int searchLen = -1,
-               bool ignoreCase = false, SString wordCharacters="");
+               bool ignoreCase = false, SString wordCharacters="", int wordIndex = -1);
        char *GetNearestWords(const char *wordStart, int searchLen=-1,
                bool ignoreCase=false, char otherSeparator='\0');
 };
        char *GetNearestWords(const char *wordStart, int searchLen=-1,
                bool ignoreCase=false, char otherSeparator='\0');
 };
index 34867542f9a8bf7d55771a58c60c30ae5884fce0..44d5dcdcda215c47d92cf07d1729289f96001051 100644 (file)
 #define SCLEX_PS 42
 #define SCLEX_NSIS 43
 #define SCLEX_MMIXAL 44
 #define SCLEX_PS 42
 #define SCLEX_NSIS 43
 #define SCLEX_MMIXAL 44
+#define SCLEX_CLW 45
+#define SCLEX_CLWNOCASE 46
+#define SCLEX_LOT 47
+#define SCLEX_YAML 48
+#define SCLEX_TEX 49
+#define SCLEX_METAPOST 50
+#define SCLEX_POWERBASIC 51
+#define SCLEX_FORTH 52
+#define SCLEX_ERLANG 53
+#define SCLEX_OCTAVE 54
 #define SCLEX_AUTOMATIC 1000
 #define SCE_P_DEFAULT 0
 #define SCE_P_COMMENTLINE 1
 #define SCLEX_AUTOMATIC 1000
 #define SCE_P_DEFAULT 0
 #define SCE_P_COMMENTLINE 1
 #define SCE_B_OPERATOR 6
 #define SCE_B_IDENTIFIER 7
 #define SCE_B_DATE 8
 #define SCE_B_OPERATOR 6
 #define SCE_B_IDENTIFIER 7
 #define SCE_B_DATE 8
+#define SCE_B_STRINGEOL 9
+#define SCE_B_KEYWORD2 10
+#define SCE_B_KEYWORD3 11
+#define SCE_B_KEYWORD4 12
 #define SCE_PROPS_DEFAULT 0
 #define SCE_PROPS_COMMENT 1
 #define SCE_PROPS_SECTION 2
 #define SCE_PROPS_DEFAULT 0
 #define SCE_PROPS_COMMENT 1
 #define SCE_PROPS_SECTION 2
 #define SCE_ERR_PHP 14
 #define SCE_ERR_ELF 15
 #define SCE_ERR_IFC 16
 #define SCE_ERR_PHP 14
 #define SCE_ERR_ELF 15
 #define SCE_ERR_IFC 16
+#define SCE_ERR_IFORT 17
+#define SCE_ERR_ABSF 18
 #define SCE_BAT_DEFAULT 0
 #define SCE_BAT_COMMENT 1
 #define SCE_BAT_WORD 2
 #define SCE_BAT_DEFAULT 0
 #define SCE_BAT_COMMENT 1
 #define SCE_BAT_WORD 2
 #define SCE_NNCRONTAB_STRING 8
 #define SCE_NNCRONTAB_ENVIRONMENT 9
 #define SCE_NNCRONTAB_IDENTIFIER 10
 #define SCE_NNCRONTAB_STRING 8
 #define SCE_NNCRONTAB_ENVIRONMENT 9
 #define SCE_NNCRONTAB_IDENTIFIER 10
+#define SCE_FORTH_DEFAULT 0
+#define SCE_FORTH_COMMENT 1
+#define SCE_FORTH_COMMENT_ML 2
+#define SCE_FORTH_IDENTIFIER 3
+#define SCE_FORTH_CONTROL 4
+#define SCE_FORTH_KEYWORD 5
+#define SCE_FORTH_DEFWORD 6
+#define SCE_FORTH_PREWORD1 7
+#define SCE_FORTH_PREWORD2 8
+#define SCE_FORTH_NUMBER 9
+#define SCE_FORTH_STRING 10
+#define SCE_FORTH_LOCALE 11
 #define SCE_MATLAB_DEFAULT 0
 #define SCE_MATLAB_COMMENT 1
 #define SCE_MATLAB_COMMAND 2
 #define SCE_MATLAB_DEFAULT 0
 #define SCE_MATLAB_COMMENT 1
 #define SCE_MATLAB_COMMAND 2
 #define SCE_MATLAB_STRING 5
 #define SCE_MATLAB_OPERATOR 6
 #define SCE_MATLAB_IDENTIFIER 7
 #define SCE_MATLAB_STRING 5
 #define SCE_MATLAB_OPERATOR 6
 #define SCE_MATLAB_IDENTIFIER 7
+#define SCE_MATLAB_DOUBLEQUOTESTRING 8
 #define SCE_SCRIPTOL_DEFAULT 0
 #define SCE_SCRIPTOL_DEFAULT 0
-#define SCE_SCRIPTOL_COMMENT 1
+#define SCE_SCRIPTOL_WHITE 1
 #define SCE_SCRIPTOL_COMMENTLINE 2
 #define SCE_SCRIPTOL_COMMENTLINE 2
-#define SCE_SCRIPTOL_COMMENTDOC 3
-#define SCE_SCRIPTOL_NUMBER 4
-#define SCE_SCRIPTOL_WORD 5
-#define SCE_SCRIPTOL_STRING 6
-#define SCE_SCRIPTOL_CHARACTER 7
-#define SCE_SCRIPTOL_UUID 8
-#define SCE_SCRIPTOL_PREPROCESSOR 9
-#define SCE_SCRIPTOL_OPERATOR 10
-#define SCE_SCRIPTOL_IDENTIFIER 11
-#define SCE_SCRIPTOL_STRINGEOL 12
-#define SCE_SCRIPTOL_VERBATIM 13
-#define SCE_SCRIPTOL_REGEX 14
-#define SCE_SCRIPTOL_COMMENTLINEDOC 15
-#define SCE_SCRIPTOL_WORD2 16
-#define SCE_SCRIPTOL_COMMENTDOCKEYWORD 17
-#define SCE_SCRIPTOL_COMMENTDOCKEYWORDERROR 18
-#define SCE_SCRIPTOL_COMMENTBASIC 19
+#define SCE_SCRIPTOL_PERSISTENT 3
+#define SCE_SCRIPTOL_CSTYLE 4
+#define SCE_SCRIPTOL_COMMENTBLOCK 5
+#define SCE_SCRIPTOL_NUMBER 6
+#define SCE_SCRIPTOL_STRING 7
+#define SCE_SCRIPTOL_CHARACTER 8
+#define SCE_SCRIPTOL_STRINGEOL 9
+#define SCE_SCRIPTOL_KEYWORD 10
+#define SCE_SCRIPTOL_OPERATOR 11
+#define SCE_SCRIPTOL_IDENTIFIER 12
+#define SCE_SCRIPTOL_TRIPLE 13
+#define SCE_SCRIPTOL_CLASSNAME 14
+#define SCE_SCRIPTOL_PREPROCESSOR 15
 #define SCE_ASM_DEFAULT 0
 #define SCE_ASM_COMMENT 1
 #define SCE_ASM_NUMBER 2
 #define SCE_ASM_DEFAULT 0
 #define SCE_ASM_COMMENT 1
 #define SCE_ASM_NUMBER 2
 #define SCE_ASM_REGISTER 8
 #define SCE_ASM_DIRECTIVE 9
 #define SCE_ASM_DIRECTIVEOPERAND 10
 #define SCE_ASM_REGISTER 8
 #define SCE_ASM_DIRECTIVE 9
 #define SCE_ASM_DIRECTIVEOPERAND 10
+#define SCE_ASM_COMMENTBLOCK 11
+#define SCE_ASM_CHARACTER 12
+#define SCE_ASM_STRINGEOL 13
+#define SCE_ASM_EXTINSTRUCTION 14
 #define SCE_F_DEFAULT 0
 #define SCE_F_COMMENT 1
 #define SCE_F_NUMBER 2
 #define SCE_F_DEFAULT 0
 #define SCE_F_COMMENT 1
 #define SCE_F_NUMBER 2
 #define SCE_MMIXAL_OPERATOR 15
 #define SCE_MMIXAL_SYMBOL 16
 #define SCE_MMIXAL_INCLUDE 17
 #define SCE_MMIXAL_OPERATOR 15
 #define SCE_MMIXAL_SYMBOL 16
 #define SCE_MMIXAL_INCLUDE 17
+#define SCE_CLW_DEFAULT 0
+#define SCE_CLW_LABEL 1
+#define SCE_CLW_COMMENT 2
+#define SCE_CLW_STRING 3
+#define SCE_CLW_USER_IDENTIFIER 4
+#define SCE_CLW_INTEGER_CONSTANT 5
+#define SCE_CLW_REAL_CONSTANT 6
+#define SCE_CLW_PICTURE_STRING 7
+#define SCE_CLW_KEYWORD 8
+#define SCE_CLW_COMPILER_DIRECTIVE 9
+#define SCE_CLW_BUILTIN_PROCEDURES_FUNCTION 10
+#define SCE_CLW_STRUCTURE_DATA_TYPE 11
+#define SCE_CLW_ATTRIBUTE 12
+#define SCE_CLW_STANDARD_EQUATE 13
+#define SCE_CLW_ERROR 14
+#define SCE_LOT_DEFAULT 0
+#define SCE_LOT_HEADER 1
+#define SCE_LOT_BREAK 2
+#define SCE_LOT_SET 3
+#define SCE_LOT_PASS 4
+#define SCE_LOT_FAIL 5
+#define SCE_LOT_ABORT 6
+#define SCE_YAML_DEFAULT 0
+#define SCE_YAML_COMMENT 1
+#define SCE_YAML_IDENTIFIER 2
+#define SCE_YAML_KEYWORD 3
+#define SCE_YAML_NUMBER 4
+#define SCE_YAML_REFERENCE 5
+#define SCE_YAML_DOCUMENT 6
+#define SCE_YAML_TEXT 7
+#define SCE_YAML_ERROR 8
+#define SCE_TEX_DEFAULT 0
+#define SCE_TEX_SPECIAL 1
+#define SCE_TEX_GROUP 2
+#define SCE_TEX_SYMBOL 3
+#define SCE_TEX_COMMAND 4
+#define SCE_TEX_TEXT 5
+#define SCE_METAPOST_DEFAULT 0
+#define SCE_METAPOST_SPECIAL 1
+#define SCE_METAPOST_GROUP 2
+#define SCE_METAPOST_SYMBOL 3
+#define SCE_METAPOST_COMMAND 4
+#define SCE_METAPOST_TEXT 5
+#define SCE_METAPOST_EXTRA 6
+#define SCE_ERLANG_DEFAULT 0
+#define SCE_ERLANG_COMMENT 1
+#define SCE_ERLANG_VARIABLE 2
+#define SCE_ERLANG_NUMBER 3
+#define SCE_ERLANG_KEYWORD 4
+#define SCE_ERLANG_STRING 5
+#define SCE_ERLANG_OPERATOR 6
+#define SCE_ERLANG_ATOM 7
+#define SCE_ERLANG_FUNCTION_NAME 8
+#define SCE_ERLANG_CHARACTER 9
+#define SCE_ERLANG_MACRO 10
+#define SCE_ERLANG_RECORD 11
+#define SCE_ERLANG_SEPARATOR 12
+#define SCE_ERLANG_NODE_NAME 13
+#define SCE_ERLANG_UNKNOWN 31
 //--Autogenerated -- end of section automatically generated from Scintilla.iface
 
 #endif
 //--Autogenerated -- end of section automatically generated from Scintilla.iface
 
 #endif
index 34893c89382b259f7964bb35be47b628ae2ca81f..68c5427b616865fb82436926dd3d8d4c23f70950 100644 (file)
@@ -205,6 +205,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
 #define INDIC_DIAGONAL 3
 #define INDIC_STRIKE 4
 #define INDIC_HIDDEN 5
 #define INDIC_DIAGONAL 3
 #define INDIC_STRIKE 4
 #define INDIC_HIDDEN 5
+#define INDIC_BOX 6
 #define INDIC0_MASK 0x20
 #define INDIC1_MASK 0x40
 #define INDIC2_MASK 0x80
 #define INDIC0_MASK 0x20
 #define INDIC1_MASK 0x40
 #define INDIC2_MASK 0x80
@@ -533,6 +534,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
 #define SCI_SETHOTSPOTACTIVEFORE 2410
 #define SCI_SETHOTSPOTACTIVEBACK 2411
 #define SCI_SETHOTSPOTACTIVEUNDERLINE 2412
 #define SCI_SETHOTSPOTACTIVEFORE 2410
 #define SCI_SETHOTSPOTACTIVEBACK 2411
 #define SCI_SETHOTSPOTACTIVEUNDERLINE 2412
+#define SCI_SETHOTSPOTSINGLELINE 2421
 #define SCI_PARADOWN 2413
 #define SCI_PARADOWNEXTEND 2414
 #define SCI_PARAUP 2415
 #define SCI_PARADOWN 2413
 #define SCI_PARADOWNEXTEND 2414
 #define SCI_PARAUP 2415
@@ -541,6 +543,33 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
 #define SCI_POSITIONAFTER 2418
 #define SCI_COPYRANGE 2419
 #define SCI_COPYTEXT 2420
 #define SCI_POSITIONAFTER 2418
 #define SCI_COPYRANGE 2419
 #define SCI_COPYTEXT 2420
+#define SC_SEL_STREAM 0
+#define SC_SEL_RECTANGLE 1
+#define SC_SEL_LINES 2
+#define SCI_SETSELECTIONMODE 2422
+#define SCI_GETSELECTIONMODE 2423
+#define SCI_GETLINESELSTARTPOSITION 2424
+#define SCI_GETLINESELENDPOSITION 2425
+#define SCI_LINEDOWNRECTEXTEND 2426
+#define SCI_LINEUPRECTEXTEND 2427
+#define SCI_CHARLEFTRECTEXTEND 2428
+#define SCI_CHARRIGHTRECTEXTEND 2429
+#define SCI_HOMERECTEXTEND 2430
+#define SCI_VCHOMERECTEXTEND 2431
+#define SCI_LINEENDRECTEXTEND 2432
+#define SCI_PAGEUPRECTEXTEND 2433
+#define SCI_PAGEDOWNRECTEXTEND 2434
+#define SCI_STUTTEREDPAGEUP 2435
+#define SCI_STUTTEREDPAGEUPEXTEND 2436
+#define SCI_STUTTEREDPAGEDOWN 2437
+#define SCI_STUTTEREDPAGEDOWNEXTEND 2438
+#define SCI_WORDLEFTEND 2439
+#define SCI_WORDLEFTENDEXTEND 2440
+#define SCI_WORDRIGHTEND 2441
+#define SCI_WORDRIGHTENDEXTEND 2442
+#define SCI_SETWHITESPACECHARS 2443
+#define SCI_SETCHARSDEFAULT 2444
+#define SCI_AUTOCGETCURRENT 2445
 #define SCI_STARTRECORD 3001
 #define SCI_STOPRECORD 3002
 #define SCI_SETLEXER 4001
 #define SCI_STARTRECORD 3001
 #define SCI_STOPRECORD 3002
 #define SCI_SETLEXER 4001
index 9ca4ad539a10e6143c5935e26fc2bc1b3db5176c..06ff4e5800b64c0bac1254e080230f24435b737b 100644 (file)
@@ -2,7 +2,7 @@
 
 ## This file defines the interface to Scintilla
 
 
 ## This file defines the interface to Scintilla
 
-## Copyright 2000-2002 by Neil Hodgson <neilh@scintilla.org>
+## Copyright 2000-2003 by Neil Hodgson <neilh@scintilla.org>
 ## The License.txt file describes the conditions under which this software may be distributed.
 
 ## A line starting with ## is a pure comment and should be stripped by readers.
 ## The License.txt file describes the conditions under which this software may be distributed.
 
 ## A line starting with ## is a pure comment and should be stripped by readers.
@@ -26,7 +26,8 @@
 ## A property may be subscripted, in which case the first parameter is the subscript.
 ## fun, get, and set features have a strict syntax:
 ## <featureType><ws><returnType><ws><name>[=<number](<param>,<param>)
 ## A property may be subscripted, in which case the first parameter is the subscript.
 ## fun, get, and set features have a strict syntax:
 ## <featureType><ws><returnType><ws><name>[=<number](<param>,<param>)
-## param is <paramType><ws><paramName>[=<value>]
+## where <ws> stands for white space.
+## param may be empty (null value) or is <paramType><ws><paramName>[=<value>]
 ## Additional white space is allowed between elements.
 ## The syntax for evt is <featureType><ws><returnType><ws><name>[=<number]([<param>[,<param>]*])
 ## Feature names that contain an underscore are defined by Windows, so in these
 ## Additional white space is allowed between elements.
 ## The syntax for evt is <featureType><ws><returnType><ws><name>[=<number]([<param>[,<param>]*])
 ## Feature names that contain an underscore are defined by Windows, so in these
@@ -80,7 +81,7 @@ cat Basics
 ################################################
 ## For Scintilla.h
 val INVALID_POSITION=-1
 ################################################
 ## For Scintilla.h
 val INVALID_POSITION=-1
-# Define start of Scintilla messages to be greater than all edit (EM_*) messages
+# Define start of Scintilla messages to be greater than all Windows edit (EM_*) messages
 # as many EM_ messages can be used although that use is deprecated.
 val SCI_START=2000
 val SCI_OPTIONAL_START=3000
 # as many EM_ messages can be used although that use is deprecated.
 val SCI_START=2000
 val SCI_OPTIONAL_START=3000
@@ -131,7 +132,7 @@ fun void SelectAll=2013(,)
 fun void SetSavePoint=2014(,)
 
 # Retrieve a buffer of cells.
 fun void SetSavePoint=2014(,)
 
 # Retrieve a buffer of cells.
-# Returns the number of bytes in the buffer not including terminating nulls.
+# Returns the number of bytes in the buffer not including terminating NULs.
 fun int GetStyledText=2015(, textrange tr)
 
 # Are there any redoable actions in the undo history?
 fun int GetStyledText=2015(, textrange tr)
 
 # Are there any redoable actions in the undo history?
@@ -159,11 +160,11 @@ get int GetViewWS=2020(,)
 set void SetViewWS=2021(int viewWS,)
 
 # Find the position from a point within the window.
 set void SetViewWS=2021(int viewWS,)
 
 # Find the position from a point within the window.
-fun int PositionFromPoint=2022(int x, int y)
+fun position PositionFromPoint=2022(int x, int y)
 
 # Find the position from a point within the window but return
 # INVALID_POSITION if not close to text.
 
 # Find the position from a point within the window but return
 # INVALID_POSITION if not close to text.
-fun int PositionFromPointClose=2023(int x, int y)
+fun position PositionFromPointClose=2023(int x, int y)
 
 # Set caret to start of a line and ensure it is visible.
 fun void GotoLine=2024(int line,)
 
 # Set caret to start of a line and ensure it is visible.
 fun void GotoLine=2024(int line,)
@@ -427,7 +428,7 @@ set void SetCaretFore=2069(colour fore,)
 # When key+modifier combination km is pressed perform msg.
 fun void AssignCmdKey=2070(keymod km, int msg)
 
 # When key+modifier combination km is pressed perform msg.
 fun void AssignCmdKey=2070(keymod km, int msg)
 
-# When key+modifier combination km do nothing.
+# When key+modifier combination km is pressed do nothing.
 fun void ClearCmdKey=2071(keymod km,)
 
 # Drop all key mappings.
 fun void ClearCmdKey=2071(keymod km,)
 
 # Drop all key mappings.
@@ -446,6 +447,7 @@ get int GetCaretPeriod=2075(,)
 set void SetCaretPeriod=2076(int periodMilliseconds,)
 
 # Set the set of characters making up words for when moving or selecting by word.
 set void SetCaretPeriod=2076(int periodMilliseconds,)
 
 # Set the set of characters making up words for when moving or selecting by word.
+# First sets deaults like SetCharsDefault.
 set void SetWordChars=2077(, string characters)
 
 # Start a sequence of actions that is undone and redone as a unit.
 set void SetWordChars=2077(, string characters)
 
 # Start a sequence of actions that is undone and redone as a unit.
@@ -463,6 +465,7 @@ val INDIC_TT=2
 val INDIC_DIAGONAL=3
 val INDIC_STRIKE=4
 val INDIC_HIDDEN=5
 val INDIC_DIAGONAL=3
 val INDIC_STRIKE=4
 val INDIC_HIDDEN=5
+val INDIC_BOX=6
 val INDIC0_MASK=0x20
 val INDIC1_MASK=0x40
 val INDIC2_MASK=0x80
 val INDIC0_MASK=0x20
 val INDIC1_MASK=0x40
 val INDIC2_MASK=0x80
@@ -711,7 +714,7 @@ val SCFIND_POSIX=0x00400000
 fun position FindText=2150(int flags, findtext ft)
 
 # On Windows, will draw the document into a display context such as a printer.
 fun position FindText=2150(int flags, findtext ft)
 
 # On Windows, will draw the document into a display context such as a printer.
-fun void FormatRange=2151(bool draw, formatrange fr)
+fun position FormatRange=2151(bool draw, formatrange fr)
 
 # Retrieve the display line at the top of the display.
 get int GetFirstVisibleLine=2152(,)
 
 # Retrieve the display line at the top of the display.
 get int GetFirstVisibleLine=2152(,)
@@ -743,7 +746,7 @@ fun void SetSel=2160(position start, position end)
 
 # Retrieve the selected text.
 # Return the length of the text.
 
 # Retrieve the selected text.
 # Return the length of the text.
-fun int GetSelText=2161(,stringresult text)
+fun int GetSelText=2161(, stringresult text)
 
 # Retrieve a range of text.
 # Return the length of the text.
 
 # Retrieve a range of text.
 # Return the length of the text.
@@ -762,7 +765,7 @@ fun int PointYFromPosition=2165(, position pos)
 fun int LineFromPosition=2166(position pos,)
 
 # Retrieve the position at the start of a line.
 fun int LineFromPosition=2166(position pos,)
 
 # Retrieve the position at the start of a line.
-fun int PositionFromLine=2167(int line,)
+fun position PositionFromLine=2167(int line,)
 
 # Scroll horizontally and vertically.
 fun void LineScroll=2168(int columns, int lines)
 
 # Scroll horizontally and vertically.
 fun void LineScroll=2168(int columns, int lines)
@@ -847,12 +850,12 @@ set void SetTargetEnd=2192(position pos,)
 get position GetTargetEnd=2193(,)
 
 # Replace the target text with the argument text.
 get position GetTargetEnd=2193(,)
 
 # Replace the target text with the argument text.
-# Text is counted so it can contain nulls.
+# Text is counted so it can contain NULs.
 # Returns the length of the replacement text.
 fun int ReplaceTarget=2194(int length, string text)
 
 # Replace the target text with the argument text after \d processing.
 # Returns the length of the replacement text.
 fun int ReplaceTarget=2194(int length, string text)
 
 # Replace the target text with the argument text after \d processing.
-# Text is counted so it can contain nulls.
+# Text is counted so it can contain NULs.
 # Looks for \d where d is between 1 and 9 and replaces these with the strings
 # matched in the last search operation which were surrounded by \( and \).
 # Returns the length of the replacement text including any change
 # Looks for \d where d is between 1 and 9 and replaces these with the strings
 # matched in the last search operation which were surrounded by \( and \).
 # Returns the length of the replacement text including any change
@@ -860,7 +863,7 @@ fun int ReplaceTarget=2194(int length, string text)
 fun int ReplaceTargetRE=2195(int length, string text)
 
 # Search for a counted string in the target and set the target to the found
 fun int ReplaceTargetRE=2195(int length, string text)
 
 # Search for a counted string in the target and set the target to the found
-# range. Text is counted so it can contain nulls.
+# range. Text is counted so it can contain NULs.
 # Returns length of range or -1 for failure in which case target is not moved.
 fun int SearchInTarget=2197(int length, string text)
 
 # Returns length of range or -1 for failure in which case target is not moved.
 fun int SearchInTarget=2197(int length, string text)
 
@@ -1015,7 +1018,7 @@ set void SetScrollWidth=2274(int pixelWidth,)
 get int GetScrollWidth=2275(,)
 
 # Measure the pixel width of some text in a particular style.
 get int GetScrollWidth=2275(,)
 
 # Measure the pixel width of some text in a particular style.
-# Nul terminated text argument.
+# NUL terminated text argument.
 # Does not handle tab or control characters.
 fun int TextWidth=2276(int style, string text)
 
 # Does not handle tab or control characters.
 fun int TextWidth=2276(int style, string text)
 
@@ -1223,7 +1226,7 @@ fun void LineEndDisplayExtend=2348(,)
 # except they behave differently when word-wrap is enabled:
 # They go first to the start / end of the display line, like (Home|LineEnd)Display
 # The difference is that, the cursor is already at the point, it goes on to the start
 # except they behave differently when word-wrap is enabled:
 # They go first to the start / end of the display line, like (Home|LineEnd)Display
 # The difference is that, the cursor is already at the point, it goes on to the start
-# or end of the document line, as appropriate for (Home|LineEnd|VCHome)Extend.
+# or end of the document line, as appropriate for (Home|LineEnd|VCHome)(Extend)?.
 
 fun void HomeWrap=2349(,)
 fun void HomeWrapExtend=2450(,)
 
 fun void HomeWrap=2349(,)
 fun void HomeWrapExtend=2450(,)
@@ -1260,7 +1263,7 @@ set void SetViewEOL=2356(bool visible,)
 get int GetDocPointer=2357(,)
 
 # Change the document object used.
 get int GetDocPointer=2357(,)
 
 # Change the document object used.
-set void SetDocPointer=2358(,int pointer)
+set void SetDocPointer=2358(, int pointer)
 
 # Set which document modification events are sent to the container.
 set void SetModEventMask=2359(int mask,)
 
 # Set which document modification events are sent to the container.
 set void SetModEventMask=2359(int mask,)
@@ -1385,7 +1388,7 @@ fun void DelLineRight=2396(,)
 set void SetXOffset=2397(int newOffset,)
 get int GetXOffset=2398(,)
 
 set void SetXOffset=2397(int newOffset,)
 get int GetXOffset=2398(,)
 
-# Set the last x chosen value to be the caret x position
+# Set the last x chosen value to be the caret x position.
 fun void ChooseCaretX=2399(,)
 
 # Set the focus to this Scintilla widget.
 fun void ChooseCaretX=2399(,)
 
 # Set the focus to this Scintilla widget.
@@ -1427,7 +1430,7 @@ fun void SetYCaretPolicy=2403(int caretPolicy, int caretSlop)
 # Set printing to line wrapped (SC_WRAP_WORD) or not line wrapped (SC_WRAP_NONE).
 set void SetPrintWrapMode=2406(int mode,)
 
 # Set printing to line wrapped (SC_WRAP_WORD) or not line wrapped (SC_WRAP_NONE).
 set void SetPrintWrapMode=2406(int mode,)
 
-# Is printing line wrapped.
+# Is printing line wrapped?
 get int GetPrintWrapMode=2407(,)
 
 # Set a fore colour for active hotspots.
 get int GetPrintWrapMode=2407(,)
 
 # Set a fore colour for active hotspots.
@@ -1439,7 +1442,10 @@ set void SetHotspotActiveBack=2411(bool useSetting, colour back)
 # Enable / Disable underlining active hotspots.
 set void SetHotspotActiveUnderline=2412(bool underline,)
 
 # Enable / Disable underlining active hotspots.
 set void SetHotspotActiveUnderline=2412(bool underline,)
 
-# Move caret between paragraphs (delimited by empty lines)
+# Limit hotspots to single line so hotspots on two lines don't merge.
+set void SetHotspotSingleLine=2421(bool singleLine,)
+
+# Move caret between paragraphs (delimited by empty lines).
 fun void ParaDown=2413(,)
 fun void ParaDownExtend=2414(,)
 fun void ParaUp=2415(,)
 fun void ParaDown=2413(,)
 fun void ParaDownExtend=2414(,)
 fun void ParaUp=2415(,)
@@ -1459,6 +1465,91 @@ fun void CopyRange=2419(position start, position end)
 # Copy argument text to the clipboard.
 fun void CopyText=2420(int length, string text)
 
 # Copy argument text to the clipboard.
 fun void CopyText=2420(int length, string text)
 
+# Selection modes
+enu SelectionMode=SC_SEL_
+val SC_SEL_STREAM=0
+val SC_SEL_RECTANGLE=1
+val SC_SEL_LINES=2
+
+# Set the selection mode to stream (SC_SEL_STREAM) or rectangular (SC_SEL_RECTANGLE) or
+# by lines (SC_SEL_LINES).
+set void SetSelectionMode=2422(int mode,)
+
+# Get the mode of the current selection.
+get int GetSelectionMode=2423(,)
+
+# Retrieve the position of the start of the selection at the given line (INVALID_POSITION if no selection on this line).
+fun position GetLineSelStartPosition=2424(int line,)
+
+# Retrieve the position of the end of the selection at the given line (INVALID_POSITION if no selection on this line).
+fun position GetLineSelEndPosition=2425(int line,)
+
+## RectExtended rectangular selection moves
+# Move caret down one line, extending rectangular selection to new caret position.
+fun void LineDownRectExtend=2426(,)
+
+# Move caret up one line, extending rectangular selection to new caret position.
+fun void LineUpRectExtend=2427(,)
+
+# Move caret left one character, extending rectangular selection to new caret position.
+fun void CharLeftRectExtend=2428(,)
+
+# Move caret right one character, extending rectangular selection to new caret position.
+fun void CharRightRectExtend=2429(,)
+
+# Move caret to first position on line, extending rectangular selection to new caret position.
+fun void HomeRectExtend=2430(,)
+
+# Move caret to before first visible character on line.
+# If already there move to first character on line.
+# In either case, extend rectangular selection to new caret position.
+fun void VCHomeRectExtend=2431(,)
+
+# Move caret to last position on line, extending rectangular selection to new caret position.
+fun void LineEndRectExtend=2432(,)
+
+# Move caret one page up, extending rectangular selection to new caret position.
+fun void PageUpRectExtend=2433(,)
+
+# Move caret one page down, extending rectangular selection to new caret position.
+fun void PageDownRectExtend=2434(,)
+
+
+# Move caret to top of page, or one page up if already at top of page.
+fun void StutteredPageUp=2435(,)
+
+# Move caret to top of page, or one page up if already at top of page, extending selection to new caret position.
+fun void StutteredPageUpExtend=2436(,)
+
+# Move caret to bottom of page, or one page down if already at bottom of page.
+fun void StutteredPageDown=2437(,)
+
+# Move caret to bottom of page, or one page down if already at bottom of page, extending selection to new caret position.
+fun void StutteredPageDownExtend=2438(,)
+
+
+# Move caret left one word, position cursor at end of word.
+fun void WordLeftEnd=2439(,)
+
+# Move caret left one word, position cursor at end of word, extending selection to new caret position.
+fun void WordLeftEndExtend=2440(,)
+
+# Move caret right one word, position cursor at end of word.
+fun void WordRightEnd=2441(,)
+
+# Move caret right one word, position cursor at end of word, extending selection to new caret position.
+fun void WordRightEndExtend=2442(,)
+
+# Set the set of characters making up whitespace for when moving or selecting by word.
+# Should be called after SetWordChars.
+set void SetWhitespaceChars=2443(, string characters)
+
+# Reset the set of characters for whitespace and word characters to the defaults.
+fun void SetCharsDefault=2444(,)
+
+# Get currently selected item position in the auto-completion list
+fun int AutoCGetCurrent=2445(,)
+
 # Start notifying the container of all key presses and commands.
 fun void StartRecord=3001(,)
 
 # Start notifying the container of all key presses and commands.
 fun void StartRecord=3001(,)
 
@@ -1486,7 +1577,7 @@ set void SetKeyWords=4005(int keywordSet, string keyWords)
 # Set the lexing language of the document based on string name.
 set void SetLexerLanguage=4006(, string language)
 
 # Set the lexing language of the document based on string name.
 set void SetLexerLanguage=4006(, string language)
 
-# Load a lexer library (dll / so)
+# Load a lexer library (dll / so).
 fun void LoadLexerLibrary=4007(, string path)
 
 # Notifications
 fun void LoadLexerLibrary=4007(, string path)
 
 # Notifications
@@ -1591,6 +1682,16 @@ val SCLEX_ESCRIPT=41
 val SCLEX_PS=42
 val SCLEX_NSIS=43
 val SCLEX_MMIXAL=44
 val SCLEX_PS=42
 val SCLEX_NSIS=43
 val SCLEX_MMIXAL=44
+val SCLEX_CLW=45
+val SCLEX_CLWNOCASE=46
+val SCLEX_LOT=47
+val SCLEX_YAML=48
+val SCLEX_TEX=49
+val SCLEX_METAPOST=50
+val SCLEX_POWERBASIC=51
+val SCLEX_FORTH=52
+val SCLEX_ERLANG=53
+val SCLEX_OCTAVE=54
 
 # When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
 # value assigned in sequence from SCLEX_AUTOMATIC+1.
 
 # When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
 # value assigned in sequence from SCLEX_AUTOMATIC+1.
@@ -1796,9 +1897,10 @@ val SCE_PL_STRING_QQ=27
 val SCE_PL_STRING_QX=28
 val SCE_PL_STRING_QR=29
 val SCE_PL_STRING_QW=30
 val SCE_PL_STRING_QX=28
 val SCE_PL_STRING_QR=29
 val SCE_PL_STRING_QW=30
-# Lexical states for SCLEX_VB, SCLEX_VBSCRIPT
+# Lexical states for SCLEX_VB, SCLEX_VBSCRIPT, SCLEX_POWERBASIC
 lex VB=SCLEX_VB SCE_B_
 lex VBScript=SCLEX_VBSCRIPT SCE_B_
 lex VB=SCLEX_VB SCE_B_
 lex VBScript=SCLEX_VBSCRIPT SCE_B_
+lex PowerBasic=SCLEX_POWERBASIC SCE_B_
 val SCE_B_DEFAULT=0
 val SCE_B_COMMENT=1
 val SCE_B_NUMBER=2
 val SCE_B_DEFAULT=0
 val SCE_B_COMMENT=1
 val SCE_B_NUMBER=2
@@ -1808,6 +1910,10 @@ val SCE_B_PREPROCESSOR=5
 val SCE_B_OPERATOR=6
 val SCE_B_IDENTIFIER=7
 val SCE_B_DATE=8
 val SCE_B_OPERATOR=6
 val SCE_B_IDENTIFIER=7
 val SCE_B_DATE=8
+val SCE_B_STRINGEOL=9
+val SCE_B_KEYWORD2=10
+val SCE_B_KEYWORD3=11
+val SCE_B_KEYWORD4=12
 # Lexical states for SCLEX_PROPERTIES
 lex Properties=SCLEX_PROPERTIES SCE_PROPS_
 val SCE_PROPS_DEFAULT=0
 # Lexical states for SCLEX_PROPERTIES
 lex Properties=SCLEX_PROPERTIES SCE_PROPS_
 val SCE_PROPS_DEFAULT=0
@@ -1863,6 +1969,8 @@ val SCE_ERR_DIFF_MESSAGE=13
 val SCE_ERR_PHP=14
 val SCE_ERR_ELF=15
 val SCE_ERR_IFC=16
 val SCE_ERR_PHP=14
 val SCE_ERR_ELF=15
 val SCE_ERR_IFC=16
+val SCE_ERR_IFORT=17
+val SCE_ERR_ABSF=18
 # Lexical states for SCLEX_BATCH
 lex Batch=SCLEX_BATCH SCE_BAT_
 val SCE_BAT_DEFAULT=0
 # Lexical states for SCLEX_BATCH
 lex Batch=SCLEX_BATCH SCE_BAT_
 val SCE_BAT_DEFAULT=0
@@ -1982,6 +2090,20 @@ val SCE_NNCRONTAB_NUMBER=7
 val SCE_NNCRONTAB_STRING=8
 val SCE_NNCRONTAB_ENVIRONMENT=9
 val SCE_NNCRONTAB_IDENTIFIER=10
 val SCE_NNCRONTAB_STRING=8
 val SCE_NNCRONTAB_ENVIRONMENT=9
 val SCE_NNCRONTAB_IDENTIFIER=10
+# Lexical states for SCLEX_FORTH (Forth Lexer)
+lex Forth=SCLEX_FORTH SCE_FORTH_
+val SCE_FORTH_DEFAULT=0
+val SCE_FORTH_COMMENT=1
+val SCE_FORTH_COMMENT_ML=2
+val SCE_FORTH_IDENTIFIER=3
+val SCE_FORTH_CONTROL=4
+val SCE_FORTH_KEYWORD=5
+val SCE_FORTH_DEFWORD=6
+val SCE_FORTH_PREWORD1=7
+val SCE_FORTH_PREWORD2=8
+val SCE_FORTH_NUMBER=9
+val SCE_FORTH_STRING=10
+val SCE_FORTH_LOCALE=11
 # Lexical states for SCLEX_MATLAB
 lex MatLab=SCLEX_MATLAB SCE_MATLAB_
 val SCE_MATLAB_DEFAULT=0
 # Lexical states for SCLEX_MATLAB
 lex MatLab=SCLEX_MATLAB SCE_MATLAB_
 val SCE_MATLAB_DEFAULT=0
@@ -1989,31 +2111,29 @@ val SCE_MATLAB_COMMENT=1
 val SCE_MATLAB_COMMAND=2
 val SCE_MATLAB_NUMBER=3
 val SCE_MATLAB_KEYWORD=4
 val SCE_MATLAB_COMMAND=2
 val SCE_MATLAB_NUMBER=3
 val SCE_MATLAB_KEYWORD=4
+# single quoted string
 val SCE_MATLAB_STRING=5
 val SCE_MATLAB_OPERATOR=6
 val SCE_MATLAB_IDENTIFIER=7
 val SCE_MATLAB_STRING=5
 val SCE_MATLAB_OPERATOR=6
 val SCE_MATLAB_IDENTIFIER=7
+val SCE_MATLAB_DOUBLEQUOTESTRING=8
 # Lexical states for SCLEX_SCRIPTOL
 lex Sol=SCLEX_SCRIPTOL SCE_SCRIPTOL_
 val SCE_SCRIPTOL_DEFAULT=0
 # Lexical states for SCLEX_SCRIPTOL
 lex Sol=SCLEX_SCRIPTOL SCE_SCRIPTOL_
 val SCE_SCRIPTOL_DEFAULT=0
-val SCE_SCRIPTOL_COMMENT=1
+val SCE_SCRIPTOL_WHITE=1
 val SCE_SCRIPTOL_COMMENTLINE=2
 val SCE_SCRIPTOL_COMMENTLINE=2
-val SCE_SCRIPTOL_COMMENTDOC=3
-val SCE_SCRIPTOL_NUMBER=4
-val SCE_SCRIPTOL_WORD=5
-val SCE_SCRIPTOL_STRING=6
-val SCE_SCRIPTOL_CHARACTER=7
-val SCE_SCRIPTOL_UUID=8
-val SCE_SCRIPTOL_PREPROCESSOR=9
-val SCE_SCRIPTOL_OPERATOR=10
-val SCE_SCRIPTOL_IDENTIFIER=11
-val SCE_SCRIPTOL_STRINGEOL=12
-val SCE_SCRIPTOL_VERBATIM=13
-val SCE_SCRIPTOL_REGEX=14
-val SCE_SCRIPTOL_COMMENTLINEDOC=15
-val SCE_SCRIPTOL_WORD2=16
-val SCE_SCRIPTOL_COMMENTDOCKEYWORD=17
-val SCE_SCRIPTOL_COMMENTDOCKEYWORDERROR=18
-val SCE_SCRIPTOL_COMMENTBASIC=19
+val SCE_SCRIPTOL_PERSISTENT=3
+val SCE_SCRIPTOL_CSTYLE=4
+val SCE_SCRIPTOL_COMMENTBLOCK=5
+val SCE_SCRIPTOL_NUMBER=6
+val SCE_SCRIPTOL_STRING=7
+val SCE_SCRIPTOL_CHARACTER=8
+val SCE_SCRIPTOL_STRINGEOL=9
+val SCE_SCRIPTOL_KEYWORD=10
+val SCE_SCRIPTOL_OPERATOR=11
+val SCE_SCRIPTOL_IDENTIFIER=12
+val SCE_SCRIPTOL_TRIPLE=13
+val SCE_SCRIPTOL_CLASSNAME=14
+val SCE_SCRIPTOL_PREPROCESSOR=15
 # Lexical states for SCLEX_ASM
 lex Asm=SCLEX_ASM SCE_ASM_
 val SCE_ASM_DEFAULT=0
 # Lexical states for SCLEX_ASM
 lex Asm=SCLEX_ASM SCE_ASM_
 val SCE_ASM_DEFAULT=0
@@ -2027,6 +2147,10 @@ val SCE_ASM_MATHINSTRUCTION=7
 val SCE_ASM_REGISTER=8
 val SCE_ASM_DIRECTIVE=9
 val SCE_ASM_DIRECTIVEOPERAND=10
 val SCE_ASM_REGISTER=8
 val SCE_ASM_DIRECTIVE=9
 val SCE_ASM_DIRECTIVEOPERAND=10
+val SCE_ASM_COMMENTBLOCK=11
+val SCE_ASM_CHARACTER=12
+val SCE_ASM_STRINGEOL=13
+val SCE_ASM_EXTINSTRUCTION=14
 # Lexical states for SCLEX_FORTRAN
 lex Fortran=SCLEX_FORTRAN SCE_F_
 lex F77=SCLEX_F77 SCE_F_
 # Lexical states for SCLEX_FORTRAN
 lex Fortran=SCLEX_FORTRAN SCE_F_
 lex F77=SCLEX_F77 SCE_F_
@@ -2162,6 +2286,78 @@ val SCE_MMIXAL_HEX=14
 val SCE_MMIXAL_OPERATOR=15
 val SCE_MMIXAL_SYMBOL=16
 val SCE_MMIXAL_INCLUDE=17
 val SCE_MMIXAL_OPERATOR=15
 val SCE_MMIXAL_SYMBOL=16
 val SCE_MMIXAL_INCLUDE=17
+# Lexical states for SCLEX_CLW
+lex Clarion=SCLEX_CLW SCE_CLW_
+val SCE_CLW_DEFAULT=0
+val SCE_CLW_LABEL=1
+val SCE_CLW_COMMENT=2
+val SCE_CLW_STRING=3
+val SCE_CLW_USER_IDENTIFIER=4
+val SCE_CLW_INTEGER_CONSTANT=5
+val SCE_CLW_REAL_CONSTANT=6
+val SCE_CLW_PICTURE_STRING=7
+val SCE_CLW_KEYWORD=8
+val SCE_CLW_COMPILER_DIRECTIVE=9
+val SCE_CLW_BUILTIN_PROCEDURES_FUNCTION=10
+val SCE_CLW_STRUCTURE_DATA_TYPE=11
+val SCE_CLW_ATTRIBUTE=12
+val SCE_CLW_STANDARD_EQUATE=13
+val SCE_CLW_ERROR=14
+# Lexical states for SCLEX_LOT
+lex LOT=SCLEX_LOT SCE_LOT_
+val SCE_LOT_DEFAULT=0
+val SCE_LOT_HEADER=1
+val SCE_LOT_BREAK=2
+val SCE_LOT_SET=3
+val SCE_LOT_PASS=4
+val SCE_LOT_FAIL=5
+val SCE_LOT_ABORT=6
+# Lexical states for SCLEX_YAML
+lex YAML=SCLEX_YAML SCE_YAML_
+val SCE_YAML_DEFAULT=0
+val SCE_YAML_COMMENT=1
+val SCE_YAML_IDENTIFIER=2
+val SCE_YAML_KEYWORD=3
+val SCE_YAML_NUMBER=4
+val SCE_YAML_REFERENCE=5
+val SCE_YAML_DOCUMENT=6
+val SCE_YAML_TEXT=7
+val SCE_YAML_ERROR=8
+# Lexical states for SCLEX_TEX
+lex TeX=SCLEX_TEX SCE_TEX_
+val SCE_TEX_DEFAULT=0
+val SCE_TEX_SPECIAL=1
+val SCE_TEX_GROUP=2
+val SCE_TEX_SYMBOL=3
+val SCE_TEX_COMMAND=4
+val SCE_TEX_TEXT=5
+lex Metapost=SCLEX_METAPOST SCE_METAPOST_
+val SCE_METAPOST_DEFAULT=0
+val SCE_METAPOST_SPECIAL=1
+val SCE_METAPOST_GROUP=2
+val SCE_METAPOST_SYMBOL=3
+val SCE_METAPOST_COMMAND=4
+val SCE_METAPOST_TEXT=5
+val SCE_METAPOST_EXTRA=6
+# Lexical states for SCLEX_ERLANG
+lex Erlang=SCLEX_ERLANG SCE_ERLANG_
+val SCE_ERLANG_DEFAULT=0
+val SCE_ERLANG_COMMENT=1
+val SCE_ERLANG_VARIABLE=2
+val SCE_ERLANG_NUMBER=3
+val SCE_ERLANG_KEYWORD=4
+val SCE_ERLANG_STRING=5
+val SCE_ERLANG_OPERATOR=6
+val SCE_ERLANG_ATOM=7
+val SCE_ERLANG_FUNCTION_NAME=8
+val SCE_ERLANG_CHARACTER=9
+val SCE_ERLANG_MACRO=10
+val SCE_ERLANG_RECORD=11
+val SCE_ERLANG_SEPARATOR=12
+val SCE_ERLANG_NODE_NAME=13
+val SCE_ERLANG_UNKNOWN=31
+# Lexical states for SCLEX_OCTAVE are identical to MatLab
+lex Octave=SCLEX_OCTAVE SCE_MATLAB_
 
 # Events
 
 
 # Events
 
index 314f9bfa716df518edc06ab52628633ffdcfbc1a..2f299afffd4f30b90b7b4d3c376aaccbb90d906f 100644 (file)
@@ -48,6 +48,10 @@ void CallTip::RefreshColourPalette(Palette &pal, bool want) {
        pal.WantFind(colourLight, want);
 }
 
        pal.WantFind(colourLight, want);
 }
 
+static bool IsArrowCharacter(char ch) {
+       return (ch >= 0) && (ch <= '\002');
+}
+
 void CallTip::DrawChunk(Surface *surface, int &x, const char *s,
        int posStart, int posEnd, int ytext, PRectangle rcClient,
        bool highlight, bool draw) {
 void CallTip::DrawChunk(Surface *surface, int &x, const char *s,
        int posStart, int posEnd, int ytext, PRectangle rcClient,
        bool highlight, bool draw) {
@@ -56,7 +60,7 @@ void CallTip::DrawChunk(Surface *surface, int &x, const char *s,
        int maxEnd = 0;
        int ends[10];
        for (int i=0;i<len;i++) {
        int maxEnd = 0;
        int ends[10];
        for (int i=0;i<len;i++) {
-               if (s[i] <= '\002') {
+               if (IsArrowCharacter(s[i])) {
                        if (i > 0)
                                ends[maxEnd++] = i;
                        ends[maxEnd++] = i+1;
                        if (i > 0)
                                ends[maxEnd++] = i;
                        ends[maxEnd++] = i+1;
@@ -68,7 +72,7 @@ void CallTip::DrawChunk(Surface *surface, int &x, const char *s,
        for (int seg = 0; seg<maxEnd; seg++) {
                int endSeg = ends[seg];
                if (endSeg > startSeg) {
        for (int seg = 0; seg<maxEnd; seg++) {
                int endSeg = ends[seg];
                if (endSeg > startSeg) {
-                       if (s[startSeg] <= '\002') {
+                       if (IsArrowCharacter(s[startSeg])) {
                                xEnd = x + widthArrow;
                                offsetMain = xEnd;
                                if (draw) {
                                xEnd = x + widthArrow;
                                offsetMain = xEnd;
                                if (draw) {
index 5b36b2cadf21cf2b719b4597cee9cae1cdfc9415..8833b07bc0e7c72a97c042737b005c4cb56c80ff 100644 (file)
@@ -175,6 +175,7 @@ void ContractionState::DeleteLines(int lineDoc, int lineCount) {
                if (i != 0) // Line zero is always visible
                        lines[i].visible = lines[i + lineCount].visible;
                lines[i].expanded = lines[i + lineCount].expanded;
                if (i != 0) // Line zero is always visible
                        lines[i].visible = lines[i + lineCount].visible;
                lines[i].expanded = lines[i + lineCount].expanded;
+               lines[i].height = lines[i + lineCount].height;
        }
        linesInDoc -= lineCount;
        linesInDisplay += deltaDisplayed;
        }
        linesInDoc -= lineCount;
        linesInDisplay += deltaDisplayed;
index 487262f8add4bad246193af66d17025bb6eebb64..fb28144dd7d40021f9d97dd20e5b9bc53e009077 100644 (file)
@@ -50,7 +50,7 @@ Document::Document() {
        stylingBits = 5;
        stylingBitsMask = 0x1F;
        stylingMask = 0;
        stylingBits = 5;
        stylingBitsMask = 0x1F;
        stylingMask = 0;
-       SetWordChars(0);
+       SetDefaultCharClasses();
        endStyled = 0;
        styleClock = 0;
        enteredCount = 0;
        endStyled = 0;
        styleClock = 0;
        enteredCount = 0;
@@ -761,7 +761,7 @@ int Document::ExtendWordSelect(int pos, int delta, bool onlyWordCharacters) {
                while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == ccStart))
                        pos++;
        }
                while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == ccStart))
                        pos++;
        }
-       return pos;
+       return MovePositionOutsideChar(pos, delta);
 }
 
 /**
 }
 
 /**
@@ -791,6 +791,40 @@ int Document::NextWordStart(int pos, int delta) {
        return 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) {
+                       charClassification ccStart = WordCharClass(cb.CharAt(pos-1));
+                       if (ccStart != ccSpace) {
+                               while (pos > 0 && WordCharClass(cb.CharAt(pos - 1)) == ccStart) {
+                                       pos--;
+                               }
+                       }
+                       while (pos > 0 && WordCharClass(cb.CharAt(pos - 1)) == ccSpace) {
+                               pos--;
+                       }
+               }
+       } else {
+               while (pos < Length() && WordCharClass(cb.CharAt(pos)) == ccSpace) {
+                       pos++;
+               }
+               if (pos < Length()) {
+                       charClassification 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.
 /**
  * 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.
@@ -1012,7 +1046,7 @@ long Document::FindText(int minPos, int maxPos, const char *s,
                                }
                        }
                        pos += increment;
                                }
                        }
                        pos += increment;
-                       if (dbcsCodePage) {
+                       if (dbcsCodePage && (pos >= 0)) {
                                // Ensure trying to match from start of character
                                pos = MovePositionOutsideChar(pos, increment, false);
                        }
                                // Ensure trying to match from start of character
                                pos = MovePositionOutsideChar(pos, increment, false);
                        }
@@ -1032,10 +1066,24 @@ const char *Document::SubstituteByPosition(const char *text, int *length) {
                return 0;
        unsigned int lenResult = 0;
        for (int i = 0; i < *length; i++) {
                return 0;
        unsigned int lenResult = 0;
        for (int i = 0; i < *length; i++) {
-               if ((text[i] == '\\') && (text[i + 1] >= '1' && text[i + 1] <= '9')) {
-                       unsigned int patNum = text[i + 1] - '0';
-                       lenResult += pre->eopat[patNum] - pre->bopat[patNum];
-                       i++;
+               if (text[i] == '\\') {
+                       if (text[i + 1] >= '1' && text[i + 1] <= '9') {
+                               unsigned int patNum = text[i + 1] - '0';
+                               lenResult += pre->eopat[patNum] - pre->bopat[patNum];
+                               i++;
+                       } else {
+                               switch (text[i + 1]) {
+                               case 'a':
+                               case 'b':
+                               case 'f':
+                               case 'n':
+                               case 'r':
+                               case 't':
+                               case 'v':
+                                       i++;
+                               }
+                               lenResult++;
+                       }
                } else {
                        lenResult++;
                }
                } else {
                        lenResult++;
                }
@@ -1045,13 +1093,43 @@ const char *Document::SubstituteByPosition(const char *text, int *length) {
                return 0;
        char *o = substituted;
        for (int j = 0; j < *length; j++) {
                return 0;
        char *o = substituted;
        for (int j = 0; j < *length; j++) {
-               if ((text[j] == '\\') && (text[j + 1] >= '1' && text[j + 1] <= '9')) {
-                       unsigned int patNum = text[j + 1] - '0';
-                       unsigned int len = pre->eopat[patNum] - pre->bopat[patNum];
-                       if (pre->pat[patNum])   // Will be null if try for a match that did not occur
-                               memcpy(o, pre->pat[patNum], len);
-                       o += len;
-                       j++;
+               if (text[j] == '\\') {
+                       if (text[j + 1] >= '1' && text[j + 1] <= '9') {
+                               unsigned int patNum = text[j + 1] - '0';
+                               unsigned int len = pre->eopat[patNum] - pre->bopat[patNum];
+                               if (pre->pat[patNum])   // Will be null if try for a match that did not occur
+                                       memcpy(o, pre->pat[patNum], len);
+                               o += len;
+                               j++;
+                       } else {
+                               j++;
+                               switch (text[j]) {
+                               case 'a':
+                                       *o++ = '\a';
+                                       break;
+                               case 'b':
+                                       *o++ = '\b';
+                                       break;
+                               case 'f':
+                                       *o++ = '\f';
+                                       break;
+                               case 'n':
+                                       *o++ = '\n';
+                                       break;
+                               case 'r':
+                                       *o++ = '\r';
+                                       break;
+                               case 't':
+                                       *o++ = '\t';
+                                       break;
+                               case 'v':
+                                       *o++ = '\v';
+                                       break;
+                               default:
+                                       *o++ = '\\';
+                                       j--;
+                               }
+                       }
                } else {
                        *o++ = text[j];
                }
                } else {
                        *o++ = text[j];
                }
@@ -1085,26 +1163,27 @@ void Document::ChangeCase(Range r, bool makeUpperCase) {
        }
 }
 
        }
 }
 
-void Document::SetWordChars(unsigned char *chars) {
-       int ch;
-       for (ch = 0; ch < 256; ch++) {
+void Document::SetDefaultCharClasses() {
+       // 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;
                if (ch == '\r' || ch == '\n')
                        charClass[ch] = ccNewLine;
                else if (ch < 0x20 || ch == ' ')
                        charClass[ch] = ccSpace;
+               else if (ch >= 0x80 || isalnum(ch) || ch == '_')
+                       charClass[ch] = ccWord;
                else
                        charClass[ch] = ccPunctuation;
        }
                else
                        charClass[ch] = ccPunctuation;
        }
+}
+
+void Document::SetCharClasses(unsigned char *chars, charClassification newCharClass) {
+       // Apply the newCharClass to the specifed chars
        if (chars) {
                while (*chars) {
        if (chars) {
                while (*chars) {
-                       charClass[*chars] = ccWord;
+                       charClass[*chars] = newCharClass;
                        chars++;
                }
                        chars++;
                }
-       } else {
-               for (ch = 0; ch < 256; ch++) {
-                       if (ch >= 0x80 || isalnum(ch) || ch == '_')
-                               charClass[ch] = ccWord;
-               }
        }
 }
 
        }
 }
 
@@ -1335,14 +1414,18 @@ int Document::WordPartRight(int pos) {
        return pos;
 }
 
        return pos;
 }
 
-int Document::ExtendStyleRange(int pos, int delta) {
+bool IsLineEndChar(char c) {
+       return (c == '\n' || c == '\r');
+}
+
+int Document::ExtendStyleRange(int pos, int delta, bool singleLine) {
        int sStart = cb.StyleAt(pos);
        if (delta < 0) {
        int sStart = cb.StyleAt(pos);
        if (delta < 0) {
-               while (pos > 0 && (cb.StyleAt(pos) == sStart))
+               while (pos > 0 && (cb.StyleAt(pos) == sStart) && (!singleLine || !IsLineEndChar(cb.CharAt(pos))) )
                        pos--;
                pos++;
        } else {
                        pos--;
                pos++;
        } else {
-               while (pos < (Length()) && (cb.StyleAt(pos) == sStart))
+               while (pos < (Length()) && (cb.StyleAt(pos) == sStart) && (!singleLine || !IsLineEndChar(cb.CharAt(pos))) )
                        pos++;
        }
        return pos;
                        pos++;
        }
        return pos;
index bcdbe00ca5c888da8a9ba37982beab7f3f448285..dc9e38e21dda01e46f84716511a6ef995ca1d874 100644 (file)
@@ -87,11 +87,12 @@ public:
                        userData = 0;
                }
        };
                        userData = 0;
                }
        };
+       
+       enum charClassification { ccSpace, ccNewLine, ccWord, ccPunctuation };
 
 private:
        int refCount;
        CellBuffer cb;
 
 private:
        int refCount;
        CellBuffer cb;
-       enum charClassification { ccSpace, ccNewLine, ccWord, ccPunctuation };
        charClassification charClass[256];
        char stylingMask;
        int endStyled;
        charClassification charClass[256];
        char stylingMask;
        int endStyled;
@@ -190,6 +191,7 @@ public:
        void Indent(bool forwards);
        int ExtendWordSelect(int pos, int delta, bool onlyWordCharacters=false);
        int NextWordStart(int pos, int delta);
        void Indent(bool forwards);
        int ExtendWordSelect(int pos, int delta, bool onlyWordCharacters=false);
        int NextWordStart(int pos, int delta);
+       int NextWordEnd(int pos, int delta);
        int Length() { return cb.Length(); }
        long FindText(int minPos, int maxPos, const char *s,
                bool caseSensitive, bool word, bool wordStart, bool regExp, bool posix, int *length);
        int Length() { return cb.Length(); }
        long FindText(int minPos, int maxPos, const char *s,
                bool caseSensitive, bool word, bool wordStart, bool regExp, bool posix, int *length);
@@ -198,8 +200,9 @@ public:
        int LinesTotal();
 
        void ChangeCase(Range r, bool makeUpperCase);
        int LinesTotal();
 
        void ChangeCase(Range r, bool makeUpperCase);
-
-       void SetWordChars(unsigned char *chars);
+       
+       void SetDefaultCharClasses();
+       void SetCharClasses(unsigned char *chars, charClassification newCharClass);
        void SetStylingBits(int bits);
        void StartStyling(int position, char mask);
        bool SetStyleFor(int length, char style);
        void SetStylingBits(int bits);
        void StartStyling(int position, char mask);
        bool SetStyleFor(int length, char style);
@@ -220,7 +223,7 @@ public:
        bool IsWordPartSeparator(char ch);
        int WordPartLeft(int pos);
        int WordPartRight(int pos);
        bool IsWordPartSeparator(char ch);
        int WordPartLeft(int pos);
        int WordPartRight(int pos);
-       int ExtendStyleRange(int pos, int delta);
+       int ExtendStyleRange(int pos, int delta, bool singleLine = false);
        int ParaUp(int pos);
        int ParaDown(int pos);
 
        int ParaUp(int pos);
        int ParaDown(int pos);
 
index df260ed5126ba79716a43a99638dbeb7ac53bd50..f0f10e25a3f810eafffc9dff1629a7595980e2bd 100644 (file)
@@ -35,6 +35,9 @@ active(false), on(false), period(500) {}
 Timer::Timer() :
 ticking(false), ticksToWait(0), tickerID(0) {}
 
 Timer::Timer() :
 ticking(false), ticksToWait(0), tickerID(0) {}
 
+Idler::Idler() :
+state(false), idlerID(0) {}
+
 LineLayout::LineLayout(int maxLineLength_) :
        lineStarts(0),
        lenLineStarts(0),
 LineLayout::LineLayout(int maxLineLength_) :
        lineStarts(0),
        lenLineStarts(0),
@@ -53,6 +56,8 @@ LineLayout::LineLayout(int maxLineLength_) :
        styles(0),
        indicators(0),
        positions(0),
        styles(0),
        indicators(0),
        positions(0),
+       hsStart(0),
+       hsEnd(0),
        widthLine(wrapWidthInfinite),
        lines(1) {
        Resize(maxLineLength_);
        widthLine(wrapWidthInfinite),
        lines(1) {
        Resize(maxLineLength_);
@@ -316,6 +321,7 @@ Editor::Editor() {
        originalAnchorPos = 0;
 
        selType = selStream;
        originalAnchorPos = 0;
 
        selType = selStream;
+       moveExtendsSelection = false;
        xStartSelect = 0;
        xEndSelect = 0;
        primarySelection = true;
        xStartSelect = 0;
        xEndSelect = 0;
        primarySelection = true;
@@ -373,6 +379,8 @@ Editor::Editor() {
        wrapState = eWrapNone;
        wrapWidth = LineLayout::wrapWidthInfinite;
        docLineLastWrapped = -1;
        wrapState = eWrapNone;
        wrapWidth = LineLayout::wrapWidthInfinite;
        docLineLastWrapped = -1;
+       docLastLineToWrap = -1;
+       backgroundWrapEnabled = true;
 
        hsStart = -1;
        hsEnd = -1;
 
        hsStart = -1;
        hsEnd = -1;
@@ -393,6 +401,7 @@ Editor::~Editor() {
 }
 
 void Editor::Finalise() {
 }
 
 void Editor::Finalise() {
+       SetIdle(false);
        CancelModes();
 }
 
        CancelModes();
 }
 
@@ -408,6 +417,10 @@ void Editor::InvalidateStyleData() {
        palette.Release();
        DropGraphics();
        llc.Invalidate(LineLayout::llInvalid);
        palette.Release();
        DropGraphics();
        llc.Invalidate(LineLayout::llInvalid);
+       if (selType == selRectangle) {
+               xStartSelect = XFromPosition(anchor);
+               xEndSelect = XFromPosition(currentPos);
+       }
 }
 
 void Editor::InvalidateStyleRedraw() {
 }
 
 void Editor::InvalidateStyleRedraw() {
@@ -495,7 +508,9 @@ const char *ControlCharacterString(unsigned char ch) {
        }
 }
 
        }
 }
 
-// Convenience class to ensure LineLayout objects are always disposed.
+/**
+ * Convenience class to ensure LineLayout objects are always disposed.
+ */
 class AutoLineLayout {
        LineLayoutCache &llc;
        LineLayout *ll;
 class AutoLineLayout {
        LineLayoutCache &llc;
        LineLayout *ll;
@@ -518,6 +533,84 @@ public:
        }
 };
 
        }
 };
 
+/**
+ * Allows to iterate through the lines of a selection.
+ * Althought it can be called for a stream selection, in most cases
+ * it is inefficient and it should be used only for
+ * a rectangular or a line selection.
+ */
+class SelectionLineIterator {
+private:
+       Editor *ed;
+       int line;       ///< Current line within the iteration.
+       bool forward;   ///< True if iterating by increasing line number, false otherwise.
+       int selStart, selEnd;   ///< Positions of the start and end of the selection relative to the start of the document.
+       int minX, maxX; ///< Left and right of selection rectangle.
+
+public:
+       int lineStart, lineEnd; ///< Line numbers, first and last lines of the selection.
+       int startPos, endPos;   ///< Positions of the beginning and end of the selection on the current line.
+
+       void Reset() {
+               if (forward) {
+                       line = lineStart;
+               } else {
+                       line = lineEnd;
+               }
+       }
+
+       SelectionLineIterator(Editor *ed_, bool forward_ = true) : line(0), startPos(0), endPos(0) {
+               ed = ed_;
+               forward = forward_;
+               selStart = ed->SelectionStart();
+               selEnd = ed->SelectionEnd();
+               lineStart = ed->pdoc->LineFromPosition(selStart);
+               lineEnd = ed->pdoc->LineFromPosition(selEnd);
+               // Left of rectangle
+               minX = Platform::Minimum(ed->xStartSelect, ed->xEndSelect);
+               // Right of rectangle
+               maxX = Platform::Maximum(ed->xStartSelect, ed->xEndSelect);
+               Reset();
+       }
+       ~SelectionLineIterator() {}
+
+       void SetAt(int line) {
+               if (line < lineStart || line > lineEnd) {
+                       startPos = endPos = INVALID_POSITION;
+               } else {
+                       if (ed->selType == ed->selRectangle) {
+                               // Measure line and return character closest to minX
+                               startPos = ed->PositionFromLineX(line, minX);
+                               // Measure line and return character closest to maxX
+                               endPos = ed->PositionFromLineX(line, maxX);
+                       } else if (ed->selType == ed->selLines) {
+                               startPos = ed->pdoc->LineStart(line);
+                               endPos = ed->pdoc->LineStart(line + 1);
+                       } else {        // Stream selection, here only for completion
+                               if (line == lineStart) {
+                                       startPos = selStart;
+                               } else {
+                                       startPos = ed->pdoc->LineStart(line);
+                               }
+                               if (line == lineEnd) {
+                                       endPos = selEnd;
+                               } else {
+                                       endPos = ed->pdoc->LineStart(line + 1);
+                               }
+                       }
+               }
+       }
+       bool Iterate() {
+               SetAt(line);
+               if (forward) {
+                       line++;
+               } else {
+                       line--;
+               }
+               return startPos != INVALID_POSITION;
+       }
+};
+
 Point Editor::LocationFromPosition(int pos) {
        Point pt;
        RefreshStyleData();
 Point Editor::LocationFromPosition(int pos) {
        Point pt;
        RefreshStyleData();
@@ -681,8 +774,10 @@ int Editor::PositionFromLineX(int lineDoc, int x) {
        return retVal;
 }
 
        return retVal;
 }
 
-// If painting then abandon the painting because a wider redraw is needed.
-// Return true if calling code should stop drawing
+/**
+ * If painting then abandon the painting because a wider redraw is needed.
+ * @return true if calling code should stop drawing.
+ */
 bool Editor::AbandonPaint() {
        if ((paintState == painting) && !paintingAllText) {
                paintState = paintAbandoned;
 bool Editor::AbandonPaint() {
        if ((paintState == painting) && !paintingAllText) {
                paintState = paintAbandoned;
@@ -765,63 +860,44 @@ bool Editor::SelectionEmpty() {
        return anchor == currentPos;
 }
 
        return anchor == currentPos;
 }
 
-int Editor::SelectionStart(int line) {
-       if ((line == -1) || (selType == selStream)) {
-               return Platform::Minimum(currentPos, anchor);
-       } else { // selType == selRectangle
-               int selStart = SelectionStart();
-               int selEnd = SelectionEnd();
-               int lineStart = pdoc->LineFromPosition(selStart);
-               int lineEnd = pdoc->LineFromPosition(selEnd);
-               if (line < lineStart || line > lineEnd) {
-                       return -1;
-               } else {
-                       int minX = Platform::Minimum(xStartSelect, xEndSelect);
-                       return PositionFromLineX(line, minX);
-               }
-       }
+int Editor::SelectionStart() {
+       return Platform::Minimum(currentPos, anchor);
 }
 
 }
 
-int Editor::SelectionEnd(int line) {
-       if ((line == -1) || (selType == selStream)) {
-               return Platform::Maximum(currentPos, anchor);
-       } else { // selType == selRectangle
-               int selStart = SelectionStart();
-               int selEnd = SelectionEnd();
-               int lineStart = pdoc->LineFromPosition(selStart);
-               int lineEnd = pdoc->LineFromPosition(selEnd);
-               if (line < lineStart || line > lineEnd) {
-                       return -1;
-               } else {
-                       int maxX = Platform::Maximum(xStartSelect, xEndSelect);
-                       // measure line and return character closest to minx
-                       return PositionFromLineX(line, maxX);
-               }
-       }
+int Editor::SelectionEnd() {
+       return Platform::Maximum(currentPos, anchor);
+}
+
+void Editor::InvalidateSelection(int currentPos_, int anchor_) {
+       int firstAffected = anchor;
+       if (firstAffected > currentPos)
+               firstAffected = currentPos;
+       if (firstAffected > anchor_)
+               firstAffected = anchor_;
+       if (firstAffected > currentPos_)
+               firstAffected = currentPos_;
+       int lastAffected = anchor;
+       if (lastAffected < currentPos)
+               lastAffected = currentPos;
+       if (lastAffected < anchor_)
+               lastAffected = anchor_;
+       if (lastAffected < (currentPos_ + 1))   // +1 ensures caret repainted
+               lastAffected = (currentPos_ + 1);
+       needUpdateUI = true;
+       InvalidateRange(firstAffected, lastAffected);
 }
 
 void Editor::SetSelection(int currentPos_, int anchor_) {
        currentPos_ = pdoc->ClampPositionIntoDocument(currentPos_);
        anchor_ = pdoc->ClampPositionIntoDocument(anchor_);
        if ((currentPos != currentPos_) || (anchor != anchor_)) {
 }
 
 void Editor::SetSelection(int currentPos_, int anchor_) {
        currentPos_ = pdoc->ClampPositionIntoDocument(currentPos_);
        anchor_ = pdoc->ClampPositionIntoDocument(anchor_);
        if ((currentPos != currentPos_) || (anchor != anchor_)) {
-               int firstAffected = anchor;
-               if (firstAffected > currentPos)
-                       firstAffected = currentPos;
-               if (firstAffected > anchor_)
-                       firstAffected = anchor_;
-               if (firstAffected > currentPos_)
-                       firstAffected = currentPos_;
-               int lastAffected = anchor;
-               if (lastAffected < currentPos)
-                       lastAffected = currentPos;
-               if (lastAffected < anchor_)
-                       lastAffected = anchor_;
-               if (lastAffected < (currentPos_ + 1))   // +1 ensures caret repainted
-                       lastAffected = (currentPos_ + 1);
+               InvalidateSelection(currentPos_, anchor_);
                currentPos = currentPos_;
                anchor = anchor_;
                currentPos = currentPos_;
                anchor = anchor_;
-               needUpdateUI = true;
-               InvalidateRange(firstAffected, lastAffected);
+       }
+       if (selType == selRectangle) {
+               xStartSelect = XFromPosition(anchor);
+               xEndSelect = XFromPosition(currentPos);
        }
        ClaimSelection();
 }
        }
        ClaimSelection();
 }
@@ -829,25 +905,19 @@ void Editor::SetSelection(int currentPos_, int anchor_) {
 void Editor::SetSelection(int currentPos_) {
        currentPos_ = pdoc->ClampPositionIntoDocument(currentPos_);
        if (currentPos != currentPos_) {
 void Editor::SetSelection(int currentPos_) {
        currentPos_ = pdoc->ClampPositionIntoDocument(currentPos_);
        if (currentPos != currentPos_) {
-               int firstAffected = anchor;
-               if (firstAffected > currentPos)
-                       firstAffected = currentPos;
-               if (firstAffected > currentPos_)
-                       firstAffected = currentPos_;
-               int lastAffected = anchor;
-               if (lastAffected < currentPos)
-                       lastAffected = currentPos;
-               if (lastAffected < (currentPos_ + 1))   // +1 ensures caret repainted
-                       lastAffected = (currentPos_ + 1);
+               InvalidateSelection(currentPos_, currentPos_);
                currentPos = currentPos_;
                currentPos = currentPos_;
-               needUpdateUI = true;
-               InvalidateRange(firstAffected, lastAffected);
+       }
+       if (selType == selRectangle) {
+               xStartSelect = XFromPosition(anchor);
+               xEndSelect = XFromPosition(currentPos);
        }
        ClaimSelection();
 }
 
 void Editor::SetEmptySelection(int currentPos_) {
        selType = selStream;
        }
        ClaimSelection();
 }
 
 void Editor::SetEmptySelection(int currentPos_) {
        selType = selStream;
+       moveExtendsSelection = false;
        SetSelection(currentPos_, currentPos_);
 }
 
        SetSelection(currentPos_, currentPos_);
 }
 
@@ -867,13 +937,27 @@ bool Editor::RangeContainsProtected(int start, int end) const {
        return false;
 }
 
        return false;
 }
 
-bool Editor::SelectionContainsProtected() const {
-       // TODO: make support rectangular selection
-       return RangeContainsProtected(anchor, currentPos);
+bool Editor::SelectionContainsProtected() {
+       // DONE, but untested...: make support rectangular selection
+       bool scp = false;
+       if (selType == selStream) {
+               scp = RangeContainsProtected(anchor, currentPos);
+       } else {
+               SelectionLineIterator lineIterator(this);
+               while (lineIterator.Iterate()) {
+                       if (RangeContainsProtected(lineIterator.startPos, lineIterator.endPos)) {
+                               scp = true;
+                               break;
+                       }
+               }
+       }
+       return scp;
 }
 
 }
 
+/**
+ * Asks document to find a good position and then moves out of any invisible positions.
+ */
 int Editor::MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd) {
 int Editor::MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd) {
-       // Asks document to find a good position and then moves out of any invisible positions
        pos = pdoc->MovePositionOutsideChar(pos, moveDir, checkLineEnd);
        if (vs.ProtectionActive()) {
                int mask = pdoc->stylingBitsMask;
        pos = pdoc->MovePositionOutsideChar(pos, moveDir, checkLineEnd);
        if (vs.ProtectionActive()) {
                int mask = pdoc->stylingBitsMask;
@@ -894,18 +978,22 @@ int Editor::MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd) {
        return pos;
 }
 
        return pos;
 }
 
-int Editor::MovePositionTo(int newPos, bool extend, bool ensureVisible) {
+int Editor::MovePositionTo(int newPos, selTypes sel, bool ensureVisible) {
        int delta = newPos - currentPos;
        newPos = pdoc->ClampPositionIntoDocument(newPos);
        newPos = MovePositionOutsideChar(newPos, delta);
        int delta = newPos - currentPos;
        newPos = pdoc->ClampPositionIntoDocument(newPos);
        newPos = MovePositionOutsideChar(newPos, delta);
-       if (extend) {
+       if (sel != noSel) {
+               selType = sel;
+       }
+       if (sel != noSel || moveExtendsSelection) {
                SetSelection(newPos);
        } else {
                SetEmptySelection(newPos);
        }
        ShowCaretAtCurrentPosition();
                SetSelection(newPos);
        } else {
                SetEmptySelection(newPos);
        }
        ShowCaretAtCurrentPosition();
-       if (ensureVisible)
+       if (ensureVisible) {
                EnsureCaretVisible();
                EnsureCaretVisible();
+       }
        NotifyMove(newPos);
        return 0;
 }
        NotifyMove(newPos);
        return 0;
 }
@@ -929,7 +1017,10 @@ int Editor::MovePositionSoVisible(int pos, int moveDir) {
        }
 }
 
        }
 }
 
-// Choose the x position that the caret will try to stick to as it is moves up and down
+/**
+ * Choose the x position that the caret will try to stick to
+ * as it moves up and down.
+ */
 void Editor::SetLastXChosen() {
        Point pt = LocationFromPosition(currentPos);
        lastXChosen = pt.x;
 void Editor::SetLastXChosen() {
        Point pt = LocationFromPosition(currentPos);
        lastXChosen = pt.x;
@@ -976,12 +1067,12 @@ void Editor::MoveCaretInsideView(bool ensureVisible) {
        if (pt.y < rcClient.top) {
                MovePositionTo(PositionFromLocation(
                                   Point(lastXChosen, rcClient.top)),
        if (pt.y < rcClient.top) {
                MovePositionTo(PositionFromLocation(
                                   Point(lastXChosen, rcClient.top)),
-                              false, ensureVisible);
+                              noSel, ensureVisible);
        } else if ((pt.y + vs.lineHeight - 1) > rcClient.bottom) {
                int yOfLastLineFullyDisplayed = rcClient.top + (LinesOnScreen() - 1) * vs.lineHeight;
                MovePositionTo(PositionFromLocation(
                                   Point(lastXChosen, rcClient.top + yOfLastLineFullyDisplayed)),
        } else if ((pt.y + vs.lineHeight - 1) > rcClient.bottom) {
                int yOfLastLineFullyDisplayed = rcClient.top + (LinesOnScreen() - 1) * vs.lineHeight;
                MovePositionTo(PositionFromLocation(
                                   Point(lastXChosen, rcClient.top + yOfLastLineFullyDisplayed)),
-                              false, ensureVisible);
+                              noSel, ensureVisible);
        }
 }
 
        }
 }
 
@@ -1032,7 +1123,7 @@ This way, we favour the displaying of useful information: the begining of lines,
 where most code reside, and the lines after the caret, eg. the body of a function.
 
      |        |       |      |                                            |
 where most code reside, and the lines after the caret, eg. the body of a function.
 
      |        |       |      |                                            |
-slop | strict | jumps | even | Caret can go to the margin                 | When reaching limit (caret going out of
+slop | strict | jumps | even | Caret can go to the margin                 | When reaching limitÝ(caret going out of
      |        |       |      |                                            | visibility or going into the UZ) display is...
 -----+--------+-------+------+--------------------------------------------+--------------------------------------------------------------
   0  |   0    |   0   |   0  | Yes                                        | moved to put caret on top/on right
      |        |       |      |                                            | visibility or going into the UZ) display is...
 -----+--------+-------+------+--------------------------------------------+--------------------------------------------------------------
   0  |   0    |   0   |   0  | Yes                                        | moved to put caret on top/on right
@@ -1298,18 +1389,57 @@ void Editor::InvalidateCaret() {
                InvalidateRange(currentPos, currentPos + 1);
 }
 
                InvalidateRange(currentPos, currentPos + 1);
 }
 
-void Editor::NeedWrapping(int docLineStartWrapping) {
+void Editor::NeedWrapping(int docLineStartWrapping, int docLineEndWrapping) {
+       bool noWrap = (docLastLineToWrap == docLineLastWrapped);
        if (docLineLastWrapped > (docLineStartWrapping - 1)) {
                docLineLastWrapped = docLineStartWrapping - 1;
                if (docLineLastWrapped < -1)
                        docLineLastWrapped = -1;
                llc.Invalidate(LineLayout::llPositions);
        }
        if (docLineLastWrapped > (docLineStartWrapping - 1)) {
                docLineLastWrapped = docLineStartWrapping - 1;
                if (docLineLastWrapped < -1)
                        docLineLastWrapped = -1;
                llc.Invalidate(LineLayout::llPositions);
        }
+       if (noWrap) {
+               docLastLineToWrap = docLineEndWrapping;
+       } else if (docLastLineToWrap < docLineEndWrapping) {
+               docLastLineToWrap = docLineEndWrapping + 1;
+       }
+       if (docLastLineToWrap < -1)
+               docLastLineToWrap = -1;
+       if (docLastLineToWrap >= pdoc->LinesTotal())
+               docLastLineToWrap = pdoc->LinesTotal()-1;
+       // Wrap lines during idle.
+       if (backgroundWrapEnabled && docLastLineToWrap != docLineLastWrapped ) {
+               SetIdle(true);
+       }
 }
 
 // Check if wrapping needed and perform any needed wrapping.
 }
 
 // Check if wrapping needed and perform any needed wrapping.
+// fullwrap: if true, all lines which need wrapping will be done,
+//           in this single call.
+// priorityWrapLineStart: If greater than zero, all lines starting from
+//           here to 100 lines past will be wrapped (even if there are
+//           more lines under wrapping process in idle).
+// If it is neither fullwrap, nor priorityWrap, then 100 lines will be
+// wrapped, if there are any wrapping going on in idle. (Generally this
+// condition is called only from idler).
 // Return true if wrapping occurred.
 // Return true if wrapping occurred.
-bool Editor::WrapLines() {
+bool Editor::WrapLines(bool fullWrap, int priorityWrapLineStart) {
+       // If there are any pending wraps, do them during idle if possible.
+       if (wrapState != eWrapNone) {
+               if (docLineLastWrapped < docLastLineToWrap) {
+                       if (!(backgroundWrapEnabled && SetIdle(true))) {
+                               // Background wrapping is disabled, or idle processing
+                               // not supported.  A full wrap is required.
+                               fullWrap = true;
+                       }
+               }
+               if (!fullWrap && priorityWrapLineStart >= 0 &&
+                       // .. and if the paint window is outside pending wraps
+                       (((priorityWrapLineStart + 100) < docLineLastWrapped) ||
+                        (priorityWrapLineStart > docLastLineToWrap))) {
+                       // No priority wrap pending
+                       return false;
+               }
+       }
        int goodTopLine = topLine;
        bool wrapOccurred = false;
        if (docLineLastWrapped < pdoc->LinesTotal()) {
        int goodTopLine = topLine;
        bool wrapOccurred = false;
        if (docLineLastWrapped < pdoc->LinesTotal()) {
@@ -1332,21 +1462,47 @@ bool Editor::WrapLines() {
                        wrapWidth = rcTextArea.Width();
                        // Ensure all of the document is styled.
                        pdoc->EnsureStyledTo(pdoc->Length());
                        wrapWidth = rcTextArea.Width();
                        // Ensure all of the document is styled.
                        pdoc->EnsureStyledTo(pdoc->Length());
+                       RefreshStyleData();
                        AutoSurface surface(this);
                        if (surface) {
                        AutoSurface surface(this);
                        if (surface) {
-                               int lastLineToWrap = pdoc->LinesTotal();
-                               while (docLineLastWrapped <= lastLineToWrap) {
-                                       docLineLastWrapped++;
-                                       AutoLineLayout ll(llc, RetrieveLineLayout(docLineLastWrapped));
+                               bool priorityWrap = false;
+                               int lastLineToWrap = docLastLineToWrap;
+                               int firstLineToWrap = docLineLastWrapped;
+                               if (!fullWrap) {
+                                       if (priorityWrapLineStart >= 0) {
+                                               // This is a priority wrap.
+                                               firstLineToWrap = priorityWrapLineStart;
+                                               lastLineToWrap = firstLineToWrap + 100;
+                                               priorityWrap = true;
+                                       } else {
+                                               // This is idle wrap.
+                                               lastLineToWrap = docLineLastWrapped + 100;
+                                       }
+                                       if (lastLineToWrap >= docLastLineToWrap)
+                                               lastLineToWrap = docLastLineToWrap;
+                               } // else do a fullWrap.
+
+                               // printf("Wraplines: full = %d, priorityStart = %d (wrapping: %d to %d)\n", fullWrap, priorityWrapLineStart, firstLineToWrap, lastLineToWrap);
+                               // printf("Pending wraps: %d to %d\n", docLineLastWrapped, docLastLineToWrap);
+                               while (firstLineToWrap < lastLineToWrap) {
+                                       firstLineToWrap++;
+                                       if (!priorityWrap)
+                                               docLineLastWrapped++;
+                                       AutoLineLayout ll(llc, RetrieveLineLayout(firstLineToWrap));
                                        int linesWrapped = 1;
                                        if (ll) {
                                        int linesWrapped = 1;
                                        if (ll) {
-                                               LayoutLine(docLineLastWrapped, surface, vs, ll, wrapWidth);
+                                               LayoutLine(firstLineToWrap, surface, vs, ll, wrapWidth);
                                                linesWrapped = ll->lines;
                                        }
                                                linesWrapped = ll->lines;
                                        }
-                                       if (cs.SetHeight(docLineLastWrapped, linesWrapped)) {
+                                       if (cs.SetHeight(firstLineToWrap, linesWrapped)) {
                                                wrapOccurred = true;
                                        }
                                }
                                                wrapOccurred = true;
                                        }
                                }
+                               // If wrapping is done, bring it to resting position
+                               if (docLineLastWrapped > docLastLineToWrap) {
+                                       docLineLastWrapped = -1;
+                                       docLastLineToWrap = -1;
+                               }
                        }
                        goodTopLine = cs.DisplayFromDoc(lineDocTop);
                        if (subLineTop < cs.GetHeight(lineDocTop))
                        }
                        goodTopLine = cs.DisplayFromDoc(lineDocTop);
                        if (subLineTop < cs.GetHeight(lineDocTop))
@@ -1666,6 +1822,7 @@ LineLayout *Editor::RetrieveLineLayout(int lineNumber) {
 void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayout *ll, int width) {
        if (!ll)
                return;
 void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayout *ll, int width) {
        if (!ll)
                return;
+       PLATFORM_ASSERT(line < pdoc->LinesTotal());
        int posLineStart = pdoc->LineStart(line);
        int posLineEnd = pdoc->LineStart(line + 1);
        // If the line is very long, limit the treatment to a length that should fit in the viewport
        int posLineStart = pdoc->LineStart(line);
        int posLineEnd = pdoc->LineStart(line + 1);
        // If the line is very long, limit the treatment to a length that should fit in the viewport
@@ -1684,13 +1841,12 @@ void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayou
                        int numCharsInLine = 0;
                        // See if chars, styles, indicators, are all the same
                        bool allSame = true;
                        int numCharsInLine = 0;
                        // See if chars, styles, indicators, are all the same
                        bool allSame = true;
-                       char styleByte;
-                       int styleMask = pdoc->stylingBitsMask;
+                       const int styleMask = pdoc->stylingBitsMask;
                        // Check base line layout
                        for (int charInDoc = posLineStart; allSame && (charInDoc < posLineEnd); charInDoc++) {
                                char chDoc = pdoc->CharAt(charInDoc);
                        // Check base line layout
                        for (int charInDoc = posLineStart; allSame && (charInDoc < posLineEnd); charInDoc++) {
                                char chDoc = pdoc->CharAt(charInDoc);
-                               styleByte = pdoc->StyleAt(charInDoc);
-                               if (vstyle.viewEOL || (!IsEOLChar(chDoc != '\r'))) {
+                               if (vstyle.viewEOL || (!IsEOLChar(chDoc))) {
+                                       char styleByte = pdoc->StyleAt(charInDoc);
                                        allSame = allSame &&
                                                  (ll->styles[numCharsInLine] == static_cast<char>(styleByte & styleMask));
                                        allSame = allSame &&
                                        allSame = allSame &&
                                                  (ll->styles[numCharsInLine] == static_cast<char>(styleByte & styleMask));
                                        allSame = allSame &&
@@ -1884,7 +2040,7 @@ ColourAllocated Editor::TextBackground(ViewStyle &vsDraw, bool overrideBackgroun
                        (i >= ll->edgeColumn) &&
                        !IsEOLChar(ll->chars[i]))
                        return vsDraw.edgecolour.allocated;
                        (i >= ll->edgeColumn) &&
                        !IsEOLChar(ll->chars[i]))
                        return vsDraw.edgecolour.allocated;
-               if (inHotspot)
+               if (inHotspot && vsDraw.hotspotBackgroundSet)
                        return vsDraw.hotspotBackground.allocated;
                if (overrideBackground)
                        return background;
                        return vsDraw.hotspotBackground.allocated;
                if (overrideBackground)
                        return background;
@@ -2220,20 +2376,26 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis
        for (int indica = 0; indica <= INDIC_MAX; indica++)
                indStart[indica] = 0;
 
        for (int indica = 0; indica <= INDIC_MAX; indica++)
                indStart[indica] = 0;
 
-       for (int indicPos = 0; indicPos < ll->numCharsInLine; indicPos++) {
-               if (ll->indicators[indicPos] != ll->indicators[indicPos + 1]) {
+       for (int indicPos = lineStart; indicPos <= lineEnd; indicPos++) {
+               if ((indicPos == lineEnd) || (ll->indicators[indicPos] != ll->indicators[indicPos + 1])) {
                        int mask = 1 << pdoc->stylingBits;
                        for (int indicnum = 0; mask < 0x100; indicnum++) {
                        int mask = 1 << pdoc->stylingBits;
                        for (int indicnum = 0; mask < 0x100; indicnum++) {
-                               if ((ll->indicators[indicPos + 1] & mask) && !(ll->indicators[indicPos] & mask)) {
+                               if ((indicPos == lineEnd)) {
+                                       indStart[indicnum] = ll->positions[indicPos];
+                               } else if ((ll->indicators[indicPos + 1] & mask) && !(ll->indicators[indicPos] & mask)) {
                                        indStart[indicnum] = ll->positions[indicPos + 1];
                                }
                                        indStart[indicnum] = ll->positions[indicPos + 1];
                                }
-                               if (!(ll->indicators[indicPos + 1] & mask) && (ll->indicators[indicPos] & mask)) {
+                               if ((ll->indicators[indicPos] & mask) &&
+                                       ((indicPos == lineEnd) || !(ll->indicators[indicPos + 1] & mask))) {
+                                       int endIndicator = indicPos;
+                                       if (endIndicator >= lineEnd)
+                                               endIndicator = lineEnd-1;
                                        PRectangle rcIndic(
                                        PRectangle rcIndic(
-                                           indStart[indicnum] + xStart,
-                                           rcLine.top + vsDraw.maxAscent,
-                                           ll->positions[indicPos + 1] + xStart,
-                                           rcLine.top + vsDraw.maxAscent + 3);
-                                       vsDraw.indicators[indicnum].Draw(surface, rcIndic);
+                                               indStart[indicnum] + xStart - subLineStart,
+                                               rcLine.top + vsDraw.maxAscent,
+                                               ll->positions[endIndicator + 1] + xStart - subLineStart,
+                                               rcLine.top + vsDraw.maxAscent + 3);
+                                       vsDraw.indicators[indicnum].Draw(surface, rcIndic, rcLine);
                                }
                                mask = mask << 1;
                        }
                                }
                                mask = mask << 1;
                        }
@@ -2358,11 +2520,15 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
                needUpdateUI = false;
        }
 
                needUpdateUI = false;
        }
 
-       PaintSelMargin(surfaceWindow, rcArea);
-
-       if (WrapLines()) {
-               // The wrapping process has changed the height of some lines so abandon this
-               // paint for a complete repaint.
+       // Call priority lines wrap on a window of lines which are likely
+       // to rendered with the following paint (that is wrap the visible
+       //      lines first).
+       int startLineToWrap = cs.DocFromDisplay(topLine) - 5;
+       if (startLineToWrap < 0)
+               startLineToWrap = -1;
+       if (WrapLines(false, startLineToWrap)) {
+               // The wrapping process has changed the height of some lines so
+               // abandon this paint for a complete repaint.
                if (AbandonPaint()) {
                        return;
                }
                if (AbandonPaint()) {
                        return;
                }
@@ -2370,6 +2536,8 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
        }
        PLATFORM_ASSERT(pixmapSelPattern->Initialised());
 
        }
        PLATFORM_ASSERT(pixmapSelPattern->Initialised());
 
+       PaintSelMargin(surfaceWindow, rcArea);
+
        PRectangle rcRightMargin = rcClient;
        rcRightMargin.left = rcRightMargin.right - vs.rightMarginWidth;
        if (rcArea.Intersects(rcRightMargin)) {
        PRectangle rcRightMargin = rcClient;
        rcRightMargin.left = rcRightMargin.right - vs.rightMarginWidth;
        if (rcArea.Intersects(rcRightMargin)) {
@@ -2423,6 +2591,7 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
                //ElapsedTime etWhole;
                int lineDocPrevious = -1;       // Used to avoid laying out one document line multiple times
                AutoLineLayout ll(llc, 0);
                //ElapsedTime etWhole;
                int lineDocPrevious = -1;       // Used to avoid laying out one document line multiple times
                AutoLineLayout ll(llc, 0);
+               SelectionLineIterator lineIterator(this);
                while (visibleLine < cs.LinesDisplayed() && yposScreen < rcArea.bottom) {
 
                        int lineDoc = cs.DocFromDisplay(visibleLine);
                while (visibleLine < cs.LinesDisplayed() && yposScreen < rcArea.bottom) {
 
                        int lineDoc = cs.DocFromDisplay(visibleLine);
@@ -2442,8 +2611,14 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
                        //durLayout += et.Duration(true);
 
                        if (ll) {
                        //durLayout += et.Duration(true);
 
                        if (ll) {
-                               ll->selStart = SelectionStart(lineDoc);
-                               ll->selEnd = SelectionEnd(lineDoc);
+                               if (selType == selStream) {
+                                       ll->selStart = SelectionStart();
+                                       ll->selEnd = SelectionEnd();
+                               } else {
+                                       lineIterator.SetAt(lineDoc);
+                                       ll->selStart = lineIterator.startPos;
+                                       ll->selEnd = lineIterator.endPos;
+                               }
                                ll->containsCaret = lineDoc == lineCaret;
                                if (hideSelection) {
                                        ll->selStart = -1;
                                ll->containsCaret = lineDoc == lineCaret;
                                if (hideSelection) {
                                        ll->selStart = -1;
@@ -2466,7 +2641,7 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
                                DrawLine(surface, vs, lineDoc, visibleLine, xStart, rcLine, ll, subLine);
                                //durPaint += et.Duration(true);
 
                                DrawLine(surface, vs, lineDoc, visibleLine, xStart, rcLine, ll, subLine);
                                //durPaint += et.Duration(true);
 
-                               // Restore the precvious styles for the brace highlights in case layout is in cache.
+                               // Restore the previous styles for the brace highlights in case layout is in cache.
                                ll->RestoreBracesHighlight(rangeLine, braces);
 
                                bool expanded = cs.GetExpanded(lineDoc);
                                ll->RestoreBracesHighlight(rangeLine, braces);
 
                                bool expanded = cs.GetExpanded(lineDoc);
@@ -2917,31 +3092,28 @@ void Editor::AddCharUTF(char *s, unsigned int len, bool treatAsDBCS) {
 
 void Editor::ClearSelection() {
        if (!SelectionContainsProtected()) {
 
 void Editor::ClearSelection() {
        if (!SelectionContainsProtected()) {
-               if (selType == selRectangle) {
+               int startPos = SelectionStart();
+               if (selType == selStream) {
+                       unsigned int chars = SelectionEnd() - startPos;
+                       if (0 != chars) {
+                               pdoc->BeginUndoAction();
+                               pdoc->DeleteChars(startPos, chars);
+                               pdoc->EndUndoAction();
+                       }
+               } else {
                        pdoc->BeginUndoAction();
                        pdoc->BeginUndoAction();
-                       int lineStart = pdoc->LineFromPosition(SelectionStart());
-                       int lineEnd = pdoc->LineFromPosition(SelectionEnd());
-                       int startPos = SelectionStart();
-                       for (int line = lineEnd; line >= lineStart; line--) {
-                               startPos = SelectionStart(line);
-                               unsigned int chars = SelectionEnd(line) - startPos;
+                       SelectionLineIterator lineIterator(this, false);
+                       while (lineIterator.Iterate()) {
+                               startPos = lineIterator.startPos;
+                               unsigned int chars = lineIterator.endPos - startPos;
                                if (0 != chars) {
                                        pdoc->DeleteChars(startPos, chars);
                                }
                        }
                                if (0 != chars) {
                                        pdoc->DeleteChars(startPos, chars);
                                }
                        }
-                       SetEmptySelection(startPos);
                        pdoc->EndUndoAction();
                        selType = selStream;
                        pdoc->EndUndoAction();
                        selType = selStream;
-               } else {
-                       int startPos = SelectionStart();
-                       unsigned int chars = SelectionEnd() - startPos;
-                       SetEmptySelection(startPos);
-                       if (0 != chars) {
-                               pdoc->BeginUndoAction();
-                               pdoc->DeleteChars(startPos, chars);
-                               pdoc->EndUndoAction();
-                       }
                }
                }
+               SetEmptySelection(startPos);
        }
 }
 
        }
 }
 
@@ -3234,20 +3406,18 @@ void Editor::CheckModificationForWrap(DocModification mh) {
                llc.Invalidate(LineLayout::llCheckTextAndStyle);
                if (wrapState != eWrapNone) {
                        int lineDoc = pdoc->LineFromPosition(mh.position);
                llc.Invalidate(LineLayout::llCheckTextAndStyle);
                if (wrapState != eWrapNone) {
                        int lineDoc = pdoc->LineFromPosition(mh.position);
-                       if (mh.linesAdded == 0) {
+                       if (mh.linesAdded <= 0) {
                                AutoSurface surface(this);
                                AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc));
                                if (surface && ll) {
                                        LayoutLine(lineDoc, surface, vs, ll, wrapWidth);
                                        if (cs.GetHeight(lineDoc) != ll->lines) {
                                AutoSurface surface(this);
                                AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc));
                                if (surface && ll) {
                                        LayoutLine(lineDoc, surface, vs, ll, wrapWidth);
                                        if (cs.GetHeight(lineDoc) != ll->lines) {
-                                               NeedWrapping(lineDoc - 1);
+                                               NeedWrapping(lineDoc - 1, lineDoc + 1);
                                                Redraw();
                                        }
                                                Redraw();
                                        }
-                               } else {
-                                       NeedWrapping(lineDoc);
                                }
                        } else {
                                }
                        } else {
-                               NeedWrapping(lineDoc);
+                               NeedWrapping(lineDoc, lineDoc + 1 + mh.linesAdded);
                        }
                }
        }
                        }
                }
        }
@@ -3281,7 +3451,6 @@ void Editor::NotifyModified(Document*, DocModification mh, void *) {
        if (paintState == painting) {
                CheckForChangeOutsidePaint(Range(mh.position, mh.position + mh.length));
        }
        if (paintState == painting) {
                CheckForChangeOutsidePaint(Range(mh.position, mh.position + mh.length));
        }
-       CheckModificationForWrap(mh);
        if (mh.modificationType & SC_MOD_CHANGESTYLE) {
                if (paintState == notPainting) {
                        if (mh.position < pdoc->LineStart(topLine)) {
        if (mh.modificationType & SC_MOD_CHANGESTYLE) {
                if (paintState == notPainting) {
                        if (mh.position < pdoc->LineStart(topLine)) {
@@ -3322,6 +3491,9 @@ void Editor::NotifyModified(Document*, DocModification mh, void *) {
                        } else {
                                cs.DeleteLines(lineOfPos, -mh.linesAdded);
                        }
                        } else {
                                cs.DeleteLines(lineOfPos, -mh.linesAdded);
                        }
+               }
+               CheckModificationForWrap(mh);
+               if (mh.linesAdded != 0) {
                        // Avoid scrolling of display if change before current display
                        if (mh.position < posTopLine) {
                                int newTop = Platform::Clamp(topLine + mh.linesAdded, 0, MaxScrollPos());
                        // Avoid scrolling of display if change before current display
                        if (mh.position < posTopLine) {
                                int newTop = Platform::Clamp(topLine + mh.linesAdded, 0, MaxScrollPos());
@@ -3420,6 +3592,10 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long
        case SCI_WORDPARTLEFTEXTEND:
        case SCI_WORDPARTRIGHT:
        case SCI_WORDPARTRIGHTEXTEND:
        case SCI_WORDPARTLEFTEXTEND:
        case SCI_WORDPARTRIGHT:
        case SCI_WORDPARTRIGHTEXTEND:
+       case SCI_WORDLEFTEND:
+       case SCI_WORDLEFTENDEXTEND:
+       case SCI_WORDRIGHTEND:
+       case SCI_WORDRIGHTENDEXTEND:
        case SCI_HOME:
        case SCI_HOMEEXTEND:
        case SCI_LINEEND:
        case SCI_HOME:
        case SCI_HOMEEXTEND:
        case SCI_LINEEND:
@@ -3432,6 +3608,10 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long
        case SCI_DOCUMENTSTARTEXTEND:
        case SCI_DOCUMENTEND:
        case SCI_DOCUMENTENDEXTEND:
        case SCI_DOCUMENTSTARTEXTEND:
        case SCI_DOCUMENTEND:
        case SCI_DOCUMENTENDEXTEND:
+       case SCI_STUTTEREDPAGEUP:
+       case SCI_STUTTEREDPAGEUPEXTEND:
+       case SCI_STUTTEREDPAGEDOWN:
+       case SCI_STUTTEREDPAGEDOWNEXTEND:
        case SCI_PAGEUP:
        case SCI_PAGEUPEXTEND:
        case SCI_PAGEDOWN:
        case SCI_PAGEUP:
        case SCI_PAGEUPEXTEND:
        case SCI_PAGEDOWN:
@@ -3464,10 +3644,20 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long
        case SCI_HOMEDISPLAYEXTEND:
        case SCI_LINEENDDISPLAY:
        case SCI_LINEENDDISPLAYEXTEND:
        case SCI_HOMEDISPLAYEXTEND:
        case SCI_LINEENDDISPLAY:
        case SCI_LINEENDDISPLAYEXTEND:
-               break;
-
-               // Filter out all others like display changes.  Also, newlines are redundant
-               // with char insert messages.
+       case SCI_SETSELECTIONMODE:
+       case SCI_LINEDOWNRECTEXTEND:
+       case SCI_LINEUPRECTEXTEND:
+       case SCI_CHARLEFTRECTEXTEND:
+       case SCI_CHARRIGHTRECTEXTEND:
+       case SCI_HOMERECTEXTEND:
+       case SCI_VCHOMERECTEXTEND:
+       case SCI_LINEENDRECTEXTEND:
+       case SCI_PAGEUPRECTEXTEND:
+       case SCI_PAGEDOWNRECTEXTEND:
+               break;
+
+       // Filter out all others like display changes. Also, newlines are redundant
+       // with char insert messages.
        case SCI_NEWLINE:
        default:
                //              printf("Filtered out %ld of macro recording\n", iMessage);
        case SCI_NEWLINE:
        default:
                //              printf("Filtered out %ld of macro recording\n", iMessage);
@@ -3483,20 +3673,44 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long
        NotifyParent(scn);
 }
 
        NotifyParent(scn);
 }
 
-// Force scroll and keep position relative to top of window
-void Editor::PageMove(int direction, bool extend) {
-       Point pt = LocationFromPosition(currentPos);
-       int topLineNew = Platform::Clamp(
+/**
+ * Force scroll and keep position relative to top of window.
+ *
+ * If stuttered = true and not already at first/last row, move to first/last row of window.
+ * If stuttered = true and already at first/last row, scroll as normal.
+ */
+void Editor::PageMove(int direction, selTypes sel, bool stuttered) {
+       int topLineNew, newPos;
+
+       // I consider only the caretYSlop, and ignore the caretYPolicy-- is that a problem?
+       int currentLine = pdoc->LineFromPosition(currentPos);
+       int topStutterLine = topLine + caretYSlop;
+       int bottomStutterLine = topLine + LinesToScroll() - caretYSlop;
+
+       if (stuttered && (direction < 0 && currentLine > topStutterLine)) {
+               topLineNew = topLine;
+               newPos = PositionFromLocation(Point(lastXChosen, vs.lineHeight * caretYSlop));
+
+       } else if (stuttered && (direction > 0 && currentLine < bottomStutterLine)) {
+               topLineNew = topLine;
+               newPos = PositionFromLocation(Point(lastXChosen, vs.lineHeight * (LinesToScroll() - caretYSlop)));
+
+       } else {
+               Point pt = LocationFromPosition(currentPos);
+
+               topLineNew = Platform::Clamp(
                             topLine + direction * LinesToScroll(), 0, MaxScrollPos());
                             topLine + direction * LinesToScroll(), 0, MaxScrollPos());
-       int newPos = PositionFromLocation(
+               newPos = PositionFromLocation(
                         Point(lastXChosen, pt.y + direction * (vs.lineHeight * LinesToScroll())));
                         Point(lastXChosen, pt.y + direction * (vs.lineHeight * LinesToScroll())));
+       }
+
        if (topLineNew != topLine) {
                SetTopLine(topLineNew);
        if (topLineNew != topLine) {
                SetTopLine(topLineNew);
-               MovePositionTo(newPos, extend);
+               MovePositionTo(newPos, sel);
                Redraw();
                SetVerticalScrollPos();
        } else {
                Redraw();
                SetVerticalScrollPos();
        } else {
-               MovePositionTo(newPos, extend);
+               MovePositionTo(newPos, sel);
        }
 }
 
        }
 }
 
@@ -3504,21 +3718,19 @@ void Editor::ChangeCaseOfSelection(bool makeUpperCase) {
        pdoc->BeginUndoAction();
        int startCurrent = currentPos;
        int startAnchor = anchor;
        pdoc->BeginUndoAction();
        int startCurrent = currentPos;
        int startAnchor = anchor;
-       if (selType == selRectangle) {
-               int lineStart = pdoc->LineFromPosition(SelectionStart());
-               int lineEnd = pdoc->LineFromPosition(SelectionEnd());
-               for (int line = lineEnd; line >= lineStart; line--) {
+       if (selType == selStream) {
+               pdoc->ChangeCase(Range(SelectionStart(), SelectionEnd()),
+                                makeUpperCase);
+               SetSelection(startCurrent, startAnchor);
+       } else {
+               SelectionLineIterator lineIterator(this, false);
+               while (lineIterator.Iterate()) {
                        pdoc->ChangeCase(
                        pdoc->ChangeCase(
-                           Range(SelectionStart(line), SelectionEnd(line)),
+                           Range(lineIterator.startPos, lineIterator.endPos),
                            makeUpperCase);
                }
                // Would be nicer to keep the rectangular selection but this is complex
                            makeUpperCase);
                }
                // Would be nicer to keep the rectangular selection but this is complex
-               selType = selStream;
-               SetSelection(startCurrent, startCurrent);
-       } else {
-               pdoc->ChangeCase(Range(SelectionStart(), SelectionEnd()),
-                                makeUpperCase);
-               SetSelection(startCurrent, startAnchor);
+               SetEmptySelection(startCurrent);
        }
        pdoc->EndUndoAction();
 }
        }
        pdoc->EndUndoAction();
 }
@@ -3566,7 +3778,9 @@ void Editor::LineDuplicate() {
        delete []thisLine;
 }
 
        delete []thisLine;
 }
 
-void Editor::CancelModes() {}
+void Editor::CancelModes() {
+       moveExtendsSelection = false;
+}
 
 void Editor::NewLine() {
        ClearSelection();
 
 void Editor::NewLine() {
        ClearSelection();
@@ -3587,7 +3801,7 @@ void Editor::NewLine() {
        EnsureCaretVisible();
 }
 
        EnsureCaretVisible();
 }
 
-void Editor::CursorUpOrDown(int direction, bool extend) {
+void Editor::CursorUpOrDown(int direction, selTypes sel) {
        Point pt = LocationFromPosition(currentPos);
        int posNew = PositionFromLocation(
                         Point(lastXChosen, pt.y + direction * vs.lineHeight));
        Point pt = LocationFromPosition(currentPos);
        int posNew = PositionFromLocation(
                         Point(lastXChosen, pt.y + direction * vs.lineHeight));
@@ -3602,7 +3816,7 @@ void Editor::CursorUpOrDown(int direction, bool extend) {
                        ptNew = LocationFromPosition(posNew);
                }
        }
                        ptNew = LocationFromPosition(posNew);
                }
        }
-       MovePositionTo(posNew, extend);
+       MovePositionTo(posNew, sel);
 }
 
 int Editor::StartEndDisplayLine(int pos, bool start) {
 }
 
 int Editor::StartEndDisplayLine(int pos, bool start) {
@@ -3643,13 +3857,16 @@ int Editor::KeyCommand(unsigned int iMessage) {
                CursorUpOrDown(1);
                break;
        case SCI_LINEDOWNEXTEND:
                CursorUpOrDown(1);
                break;
        case SCI_LINEDOWNEXTEND:
-               CursorUpOrDown(1, true);
+               CursorUpOrDown(1, selStream);
+               break;
+       case SCI_LINEDOWNRECTEXTEND:
+               CursorUpOrDown(1, selRectangle);
                break;
        case SCI_PARADOWN:
                MovePositionTo(pdoc->ParaDown(currentPos));
                break;
        case SCI_PARADOWNEXTEND:
                break;
        case SCI_PARADOWN:
                MovePositionTo(pdoc->ParaDown(currentPos));
                break;
        case SCI_PARADOWNEXTEND:
-               MovePositionTo(pdoc->ParaDown(currentPos), true);
+               MovePositionTo(pdoc->ParaDown(currentPos), selStream);
                break;
        case SCI_LINESCROLLDOWN:
                ScrollTo(topLine + 1);
                break;
        case SCI_LINESCROLLDOWN:
                ScrollTo(topLine + 1);
@@ -3659,20 +3876,23 @@ int Editor::KeyCommand(unsigned int iMessage) {
                CursorUpOrDown(-1);
                break;
        case SCI_LINEUPEXTEND:
                CursorUpOrDown(-1);
                break;
        case SCI_LINEUPEXTEND:
-               CursorUpOrDown(-1, true);
+               CursorUpOrDown(-1, selStream);
+               break;
+       case SCI_LINEUPRECTEXTEND:
+               CursorUpOrDown(-1, selRectangle);
                break;
        case SCI_PARAUP:
                MovePositionTo(pdoc->ParaUp(currentPos));
                break;
        case SCI_PARAUPEXTEND:
                break;
        case SCI_PARAUP:
                MovePositionTo(pdoc->ParaUp(currentPos));
                break;
        case SCI_PARAUPEXTEND:
-               MovePositionTo(pdoc->ParaUp(currentPos), true);
+               MovePositionTo(pdoc->ParaUp(currentPos), selStream);
                break;
        case SCI_LINESCROLLUP:
                ScrollTo(topLine - 1);
                MoveCaretInsideView(false);
                break;
        case SCI_CHARLEFT:
                break;
        case SCI_LINESCROLLUP:
                ScrollTo(topLine - 1);
                MoveCaretInsideView(false);
                break;
        case SCI_CHARLEFT:
-               if (SelectionEmpty()) {
+               if (SelectionEmpty() || moveExtendsSelection) {
                        MovePositionTo(MovePositionSoVisible(currentPos - 1, -1));
                } else {
                        MovePositionTo(SelectionStart());
                        MovePositionTo(MovePositionSoVisible(currentPos - 1, -1));
                } else {
                        MovePositionTo(SelectionStart());
@@ -3680,11 +3900,15 @@ int Editor::KeyCommand(unsigned int iMessage) {
                SetLastXChosen();
                break;
        case SCI_CHARLEFTEXTEND:
                SetLastXChosen();
                break;
        case SCI_CHARLEFTEXTEND:
-               MovePositionTo(MovePositionSoVisible(currentPos - 1, -1), true);
+               MovePositionTo(MovePositionSoVisible(currentPos - 1, -1), selStream);
+               SetLastXChosen();
+               break;
+       case SCI_CHARLEFTRECTEXTEND:
+               MovePositionTo(MovePositionSoVisible(currentPos - 1, -1), selRectangle);
                SetLastXChosen();
                break;
        case SCI_CHARRIGHT:
                SetLastXChosen();
                break;
        case SCI_CHARRIGHT:
-               if (SelectionEmpty()) {
+               if (SelectionEmpty() || moveExtendsSelection) {
                        MovePositionTo(MovePositionSoVisible(currentPos + 1, 1));
                } else {
                        MovePositionTo(SelectionEnd());
                        MovePositionTo(MovePositionSoVisible(currentPos + 1, 1));
                } else {
                        MovePositionTo(SelectionEnd());
@@ -3692,7 +3916,11 @@ int Editor::KeyCommand(unsigned int iMessage) {
                SetLastXChosen();
                break;
        case SCI_CHARRIGHTEXTEND:
                SetLastXChosen();
                break;
        case SCI_CHARRIGHTEXTEND:
-               MovePositionTo(MovePositionSoVisible(currentPos + 1, 1), true);
+               MovePositionTo(MovePositionSoVisible(currentPos + 1, 1), selStream);
+               SetLastXChosen();
+               break;
+       case SCI_CHARRIGHTRECTEXTEND:
+               MovePositionTo(MovePositionSoVisible(currentPos + 1, 1), selRectangle);
                SetLastXChosen();
                break;
        case SCI_WORDLEFT:
                SetLastXChosen();
                break;
        case SCI_WORDLEFT:
@@ -3700,7 +3928,7 @@ int Editor::KeyCommand(unsigned int iMessage) {
                SetLastXChosen();
                break;
        case SCI_WORDLEFTEXTEND:
                SetLastXChosen();
                break;
        case SCI_WORDLEFTEXTEND:
-               MovePositionTo(MovePositionSoVisible(pdoc->NextWordStart(currentPos, -1), -1), true);
+               MovePositionTo(MovePositionSoVisible(pdoc->NextWordStart(currentPos, -1), -1), selStream);
                SetLastXChosen();
                break;
        case SCI_WORDRIGHT:
                SetLastXChosen();
                break;
        case SCI_WORDRIGHT:
@@ -3708,15 +3936,37 @@ int Editor::KeyCommand(unsigned int iMessage) {
                SetLastXChosen();
                break;
        case SCI_WORDRIGHTEXTEND:
                SetLastXChosen();
                break;
        case SCI_WORDRIGHTEXTEND:
-               MovePositionTo(MovePositionSoVisible(pdoc->NextWordStart(currentPos, 1), 1), true);
+               MovePositionTo(MovePositionSoVisible(pdoc->NextWordStart(currentPos, 1), 1), selStream);
+               SetLastXChosen();
+               break;
+
+       case SCI_WORDLEFTEND:
+               MovePositionTo(MovePositionSoVisible(pdoc->NextWordEnd(currentPos, -1), -1));
+               SetLastXChosen();
+               break;
+       case SCI_WORDLEFTENDEXTEND:
+               MovePositionTo(MovePositionSoVisible(pdoc->NextWordEnd(currentPos, -1), -1), selStream);
+               SetLastXChosen();
+               break;
+       case SCI_WORDRIGHTEND:
+               MovePositionTo(MovePositionSoVisible(pdoc->NextWordEnd(currentPos, 1), 1));
                SetLastXChosen();
                break;
                SetLastXChosen();
                break;
+       case SCI_WORDRIGHTENDEXTEND:
+               MovePositionTo(MovePositionSoVisible(pdoc->NextWordEnd(currentPos, 1), 1), selStream);
+               SetLastXChosen();
+               break;
+
        case SCI_HOME:
                MovePositionTo(pdoc->LineStart(pdoc->LineFromPosition(currentPos)));
                SetLastXChosen();
                break;
        case SCI_HOMEEXTEND:
        case SCI_HOME:
                MovePositionTo(pdoc->LineStart(pdoc->LineFromPosition(currentPos)));
                SetLastXChosen();
                break;
        case SCI_HOMEEXTEND:
-               MovePositionTo(pdoc->LineStart(pdoc->LineFromPosition(currentPos)), true);
+               MovePositionTo(pdoc->LineStart(pdoc->LineFromPosition(currentPos)), selStream);
+               SetLastXChosen();
+               break;
+       case SCI_HOMERECTEXTEND:
+               MovePositionTo(pdoc->LineStart(pdoc->LineFromPosition(currentPos)), selRectangle);
                SetLastXChosen();
                break;
        case SCI_LINEEND:
                SetLastXChosen();
                break;
        case SCI_LINEEND:
@@ -3724,7 +3974,11 @@ int Editor::KeyCommand(unsigned int iMessage) {
                SetLastXChosen();
                break;
        case SCI_LINEENDEXTEND:
                SetLastXChosen();
                break;
        case SCI_LINEENDEXTEND:
-               MovePositionTo(pdoc->LineEndPosition(currentPos), true);
+               MovePositionTo(pdoc->LineEndPosition(currentPos), selStream);
+               SetLastXChosen();
+               break;
+       case SCI_LINEENDRECTEXTEND:
+               MovePositionTo(pdoc->LineEndPosition(currentPos), selRectangle);
                SetLastXChosen();
                break;
        case SCI_HOMEWRAP: {
                SetLastXChosen();
                break;
        case SCI_HOMEWRAP: {
@@ -3739,7 +3993,7 @@ int Editor::KeyCommand(unsigned int iMessage) {
                        int homePos = MovePositionSoVisible(StartEndDisplayLine(currentPos, true), -1);
                        if (currentPos <= homePos)
                                homePos = pdoc->LineStart(pdoc->LineFromPosition(currentPos));
                        int homePos = MovePositionSoVisible(StartEndDisplayLine(currentPos, true), -1);
                        if (currentPos <= homePos)
                                homePos = pdoc->LineStart(pdoc->LineFromPosition(currentPos));
-                       MovePositionTo(homePos, true);
+                       MovePositionTo(homePos, selStream);
                        SetLastXChosen();
                }
                break;
                        SetLastXChosen();
                }
                break;
@@ -3755,7 +4009,7 @@ int Editor::KeyCommand(unsigned int iMessage) {
                        int endPos = MovePositionSoVisible(StartEndDisplayLine(currentPos, false), 1);
                        if (currentPos >= endPos)
                                endPos = pdoc->LineEndPosition(currentPos);
                        int endPos = MovePositionSoVisible(StartEndDisplayLine(currentPos, false), 1);
                        if (currentPos >= endPos)
                                endPos = pdoc->LineEndPosition(currentPos);
-                       MovePositionTo(endPos, true);
+                       MovePositionTo(endPos, selStream);
                        SetLastXChosen();
                }
                break;
                        SetLastXChosen();
                }
                break;
@@ -3764,7 +4018,7 @@ int Editor::KeyCommand(unsigned int iMessage) {
                SetLastXChosen();
                break;
        case SCI_DOCUMENTSTARTEXTEND:
                SetLastXChosen();
                break;
        case SCI_DOCUMENTSTARTEXTEND:
-               MovePositionTo(0, true);
+               MovePositionTo(0, selStream);
                SetLastXChosen();
                break;
        case SCI_DOCUMENTEND:
                SetLastXChosen();
                break;
        case SCI_DOCUMENTEND:
@@ -3772,20 +4026,38 @@ int Editor::KeyCommand(unsigned int iMessage) {
                SetLastXChosen();
                break;
        case SCI_DOCUMENTENDEXTEND:
                SetLastXChosen();
                break;
        case SCI_DOCUMENTENDEXTEND:
-               MovePositionTo(pdoc->Length(), true);
+               MovePositionTo(pdoc->Length(), selStream);
                SetLastXChosen();
                break;
                SetLastXChosen();
                break;
+       case SCI_STUTTEREDPAGEUP:
+               PageMove(-1, noSel, true);
+               break;
+       case SCI_STUTTEREDPAGEUPEXTEND:
+               PageMove(-1, selStream, true);
+               break;
+       case SCI_STUTTEREDPAGEDOWN:
+               PageMove(1, noSel, true);
+               break;
+       case SCI_STUTTEREDPAGEDOWNEXTEND:
+               PageMove(1, selStream, true);
+               break;
        case SCI_PAGEUP:
                PageMove(-1);
                break;
        case SCI_PAGEUPEXTEND:
        case SCI_PAGEUP:
                PageMove(-1);
                break;
        case SCI_PAGEUPEXTEND:
-               PageMove(-1, true);
+               PageMove(-1, selStream);
+               break;
+       case SCI_PAGEUPRECTEXTEND:
+               PageMove(-1, selRectangle);
                break;
        case SCI_PAGEDOWN:
                PageMove(1);
                break;
        case SCI_PAGEDOWNEXTEND:
                break;
        case SCI_PAGEDOWN:
                PageMove(1);
                break;
        case SCI_PAGEDOWNEXTEND:
-               PageMove(1, true);
+               PageMove(1, selStream);
+               break;
+       case SCI_PAGEDOWNRECTEXTEND:
+               PageMove(1, selRectangle);
                break;
        case SCI_EDITTOGGLEOVERTYPE:
                inOverstrike = !inOverstrike;
                break;
        case SCI_EDITTOGGLEOVERTYPE:
                inOverstrike = !inOverstrike;
@@ -3828,7 +4100,11 @@ int Editor::KeyCommand(unsigned int iMessage) {
                SetLastXChosen();
                break;
        case SCI_VCHOMEEXTEND:
                SetLastXChosen();
                break;
        case SCI_VCHOMEEXTEND:
-               MovePositionTo(pdoc->VCHomePosition(currentPos), true);
+               MovePositionTo(pdoc->VCHomePosition(currentPos), selStream);
+               SetLastXChosen();
+               break;
+       case SCI_VCHOMERECTEXTEND:
+               MovePositionTo(pdoc->VCHomePosition(currentPos), selRectangle);
                SetLastXChosen();
                break;
        case SCI_VCHOMEWRAP: {
                SetLastXChosen();
                break;
        case SCI_VCHOMEWRAP: {
@@ -3847,7 +4123,7 @@ int Editor::KeyCommand(unsigned int iMessage) {
                        if ((viewLineStart < currentPos) && (viewLineStart > homePos))
                                homePos = viewLineStart;
 
                        if ((viewLineStart < currentPos) && (viewLineStart > homePos))
                                homePos = viewLineStart;
 
-                       MovePositionTo(homePos, true);
+                       MovePositionTo(homePos, selStream);
                        SetLastXChosen();
                }
                break;
                        SetLastXChosen();
                }
                break;
@@ -3930,7 +4206,7 @@ int Editor::KeyCommand(unsigned int iMessage) {
                SetLastXChosen();
                break;
        case SCI_WORDPARTLEFTEXTEND:
                SetLastXChosen();
                break;
        case SCI_WORDPARTLEFTEXTEND:
-               MovePositionTo(MovePositionSoVisible(pdoc->WordPartLeft(currentPos), -1), true);
+               MovePositionTo(MovePositionSoVisible(pdoc->WordPartLeft(currentPos), -1), selStream);
                SetLastXChosen();
                break;
        case SCI_WORDPARTRIGHT:
                SetLastXChosen();
                break;
        case SCI_WORDPARTRIGHT:
@@ -3938,7 +4214,7 @@ int Editor::KeyCommand(unsigned int iMessage) {
                SetLastXChosen();
                break;
        case SCI_WORDPARTRIGHTEXTEND:
                SetLastXChosen();
                break;
        case SCI_WORDPARTRIGHTEXTEND:
-               MovePositionTo(MovePositionSoVisible(pdoc->WordPartRight(currentPos), 1), true);
+               MovePositionTo(MovePositionSoVisible(pdoc->WordPartRight(currentPos), 1), selStream);
                SetLastXChosen();
                break;
        case SCI_HOMEDISPLAY:
                SetLastXChosen();
                break;
        case SCI_HOMEDISPLAY:
@@ -3948,7 +4224,7 @@ int Editor::KeyCommand(unsigned int iMessage) {
                break;
        case SCI_HOMEDISPLAYEXTEND:
                MovePositionTo(MovePositionSoVisible(
                break;
        case SCI_HOMEDISPLAYEXTEND:
                MovePositionTo(MovePositionSoVisible(
-                                  StartEndDisplayLine(currentPos, true), -1), true);
+                                  StartEndDisplayLine(currentPos, true), -1), selStream);
                SetLastXChosen();
                break;
        case SCI_LINEENDDISPLAY:
                SetLastXChosen();
                break;
        case SCI_LINEENDDISPLAY:
@@ -3958,7 +4234,7 @@ int Editor::KeyCommand(unsigned int iMessage) {
                break;
        case SCI_LINEENDDISPLAYEXTEND:
                MovePositionTo(MovePositionSoVisible(
                break;
        case SCI_LINEENDDISPLAYEXTEND:
                MovePositionTo(MovePositionSoVisible(
-                                  StartEndDisplayLine(currentPos, false), 1), true);
+                                  StartEndDisplayLine(currentPos, false), 1), selStream);
                SetLastXChosen();
                break;
        }
                SetLastXChosen();
                break;
        }
@@ -4073,9 +4349,9 @@ void Editor::Indent(bool forwards) {
  * @return The position of the found text, -1 if not found.
  */
 long Editor::FindText(
  * @return The position of the found text, -1 if not found.
  */
 long Editor::FindText(
-    uptr_t wParam,             ///< Search modes : @c SCFIND_MATCHCASE, @c SCFIND_WHOLEWORD,
-    ///< @c SCFIND_WORDSTART, @c SCFIND_REGEXP or @c SCFIND_POSIX.
-    sptr_t lParam) {                   ///< @c TextToFind structure: The text to search for in the given range.
+       uptr_t wParam,          ///< Search modes : @c SCFIND_MATCHCASE, @c SCFIND_WHOLEWORD,
+                                               ///< @c SCFIND_WORDSTART, @c SCFIND_REGEXP or @c SCFIND_POSIX.
+       sptr_t lParam) {        ///< @c TextToFind structure: The text to search for in the given range.
 
        TextToFind *ft = reinterpret_cast<TextToFind *>(lParam);
        int lengthFound = istrlen(ft->lpstrText);
 
        TextToFind *ft = reinterpret_cast<TextToFind *>(lParam);
        int lengthFound = istrlen(ft->lpstrText);
@@ -4114,9 +4390,9 @@ void Editor::SearchAnchor() {
  * @return The position of the found text, -1 if not found.
  */
 long Editor::SearchText(
  * @return The position of the found text, -1 if not found.
  */
 long Editor::SearchText(
-    unsigned int iMessage,             ///< Accepts both @c SCI_SEARCHNEXT and @c SCI_SEARCHPREV.
-    uptr_t wParam,             ///< Search modes : @c SCFIND_MATCHCASE, @c SCFIND_WHOLEWORD,
-    ///< @c SCFIND_WORDSTART or @c SCFIND_REGEXP.
+    unsigned int iMessage,             ///< Accepts both @c SCI_SEARCHNEXT and @c SCI_SEARCHPREV.
+    uptr_t wParam,                             ///< Search modes : @c SCFIND_MATCHCASE, @c SCFIND_WHOLEWORD,
+                                                               ///< @c SCFIND_WORDSTART, @c SCFIND_REGEXP or @c SCFIND_POSIX.
     sptr_t lParam) {                   ///< The text to search for.
 
        const char *txt = reinterpret_cast<char *>(lParam);
     sptr_t lParam) {                   ///< The text to search for.
 
        const char *txt = reinterpret_cast<char *>(lParam);
@@ -4205,36 +4481,45 @@ void Editor::CopySelectionFromRange(SelectionText *ss, int start, int end) {
 }
 
 void Editor::CopySelectionRange(SelectionText *ss) {
 }
 
 void Editor::CopySelectionRange(SelectionText *ss) {
-       if (selType == selRectangle) {
+       if (selType == selStream) {
+               CopySelectionFromRange(ss, SelectionStart(), SelectionEnd());
+       } else {
                char *text = 0;
                int size = 0;
                char *text = 0;
                int size = 0;
-               int lineStart = pdoc->LineFromPosition(SelectionStart());
-               int lineEnd = pdoc->LineFromPosition(SelectionEnd());
-               int line;
-               for (line = lineStart; line <= lineEnd; line++) {
-                       size += SelectionEnd(line) - SelectionStart(line) + 1;
-                       if (pdoc->eolMode == SC_EOL_CRLF)
+               SelectionLineIterator lineIterator(this);
+               while (lineIterator.Iterate()) {
+                       size += lineIterator.endPos - lineIterator.startPos;
+                       if (selType != selLines) {
                                size++;
                                size++;
+                               if (pdoc->eolMode == SC_EOL_CRLF) {
+                                       size++;
+                               }
+                       }
                }
                if (size > 0) {
                        text = new char[size + 1];
                        if (text) {
                                int j = 0;
                }
                if (size > 0) {
                        text = new char[size + 1];
                        if (text) {
                                int j = 0;
-                               for (line = lineStart; line <= lineEnd; line++) {
-                                       for (int i = SelectionStart(line);i < SelectionEnd(line);i++) {
+                               lineIterator.Reset();
+                               while (lineIterator.Iterate()) {
+                                       for (int i = lineIterator.startPos;
+                                                i < lineIterator.endPos;
+                                                i++) {
                                                text[j++] = pdoc->CharAt(i);
                                        }
                                                text[j++] = pdoc->CharAt(i);
                                        }
-                                       if (pdoc->eolMode != SC_EOL_LF)
-                                               text[j++] = '\r';
-                                       if (pdoc->eolMode != SC_EOL_CR)
-                                               text[j++] = '\n';
+                                       if (selType != selLines) {
+                                               if (pdoc->eolMode != SC_EOL_LF) {
+                                                       text[j++] = '\r';
+                                               }
+                                               if (pdoc->eolMode != SC_EOL_CR) {
+                                                       text[j++] = '\n';
+                                               }
+                                       }
                                }
                                text[size] = '\0';
                        }
                }
                                }
                                text[size] = '\0';
                        }
                }
-               ss->Set(text, size + 1, true);
-       } else {
-               CopySelectionFromRange(ss, SelectionStart(), SelectionEnd());
+               ss->Set(text, size + 1, selType == selRectangle);
        }
 }
 
        }
 }
 
@@ -4300,17 +4585,14 @@ void Editor::DropAt(int position, const char *value, bool moving, bool rectangul
                int positionAfterDeletion = position;
                if (inDragDrop && moving) {
                        // Remove dragged out text
                int positionAfterDeletion = position;
                if (inDragDrop && moving) {
                        // Remove dragged out text
-                       if (rectangular) {
-                               int lineStart = pdoc->LineFromPosition(SelectionStart());
-                               int lineEnd = pdoc->LineFromPosition(SelectionEnd());
-                               for (int line = lineStart; line <= lineEnd; line++) {
-                                       int startPos = SelectionStart(line);
-                                       int endPos = SelectionEnd(line);
-                                       if (position >= startPos) {
-                                               if (position > endPos) {
-                                                       positionAfterDeletion -= endPos - startPos;
+                       if (rectangular || selType == selLines) {
+                               SelectionLineIterator lineIterator(this);
+                               while (lineIterator.Iterate()) {
+                                       if (position >= lineIterator.startPos) {
+                                               if (position > lineIterator.endPos) {
+                                                       positionAfterDeletion -= lineIterator.endPos - lineIterator.startPos;
                                                } else {
                                                } else {
-                                                       positionAfterDeletion -= position - startPos;
+                                                       positionAfterDeletion -= position - lineIterator.startPos;
                                                }
                                        }
                                }
                                                }
                                        }
                                }
@@ -4327,7 +4609,7 @@ void Editor::DropAt(int position, const char *value, bool moving, bool rectangul
                        PasteRectangular(position, value, istrlen(value));
                        pdoc->EndUndoAction();
                        // Should try to select new rectangle but it may not be a rectangle now so just select the drop position
                        PasteRectangular(position, value, istrlen(value));
                        pdoc->EndUndoAction();
                        // Should try to select new rectangle but it may not be a rectangle now so just select the drop position
-                       SetSelection(position, position);
+                       SetEmptySelection(position);
                } else {
                        position = MovePositionOutsideChar(position, currentPos - position);
                        if (pdoc->InsertString(position, value)) {
                } else {
                        position = MovePositionOutsideChar(position, currentPos - position);
                        if (pdoc->InsertString(position, value)) {
@@ -4336,53 +4618,65 @@ void Editor::DropAt(int position, const char *value, bool moving, bool rectangul
                        pdoc->EndUndoAction();
                }
        } else if (inDragDrop) {
                        pdoc->EndUndoAction();
                }
        } else if (inDragDrop) {
-               SetSelection(position, position);
+               SetEmptySelection(position);
        }
 }
 
        }
 }
 
-static int BeforeInOrAfter(int val, int minim, int maxim) {
-       if (val < minim)
+/**
+ * @return -1 if given position is before the selection,
+ *          1 if position is after the selection,
+ *          0 if position is inside the selection,
+ */
+int Editor::PositionInSelection(int pos) {
+       pos = MovePositionOutsideChar(pos, currentPos - pos);
+       if (pos < SelectionStart()) {
                return -1;
                return -1;
-       else if (val > maxim)
+       }
+       if (pos > SelectionEnd()) {
                return 1;
                return 1;
-       else
+       }
+       if (selType == selStream) {
                return 0;
                return 0;
-}
-
-int Editor::PositionInSelection(int pos) {
-       pos = MovePositionOutsideChar(pos, currentPos - pos);
-       if (selType == selRectangle) {
-               if (pos < SelectionStart())
+       } else {
+               SelectionLineIterator lineIterator(this);
+               lineIterator.SetAt(pdoc->LineFromPosition(pos));
+               if (pos < lineIterator.startPos) {
                        return -1;
                        return -1;
-               if (pos > SelectionEnd())
+               } else if (pos > lineIterator.endPos) {
                        return 1;
                        return 1;
-               int linePos = pdoc->LineFromPosition(pos);
-               return BeforeInOrAfter(pos, SelectionStart(linePos), SelectionEnd(linePos));
-       } else {
-               if (currentPos > anchor) {
-                       return BeforeInOrAfter(pos, anchor, currentPos);
-               } else if (currentPos < anchor) {
-                       return BeforeInOrAfter(pos, currentPos, anchor);
+               } else {
+                       return 0;
                }
        }
                }
        }
-       return 1;
 }
 
 bool Editor::PointInSelection(Point pt) {
 }
 
 bool Editor::PointInSelection(Point pt) {
-       // TODO: fix up for rectangular selection
        int pos = PositionFromLocation(pt);
        if (0 == PositionInSelection(pos)) {
        int pos = PositionFromLocation(pt);
        if (0 == PositionInSelection(pos)) {
-               if (pos == SelectionStart()) {
+               // Probably inside, but we must make a finer test
+               int selStart, selEnd;
+               if (selType == selStream) {
+                       selStart = SelectionStart();
+                       selEnd = SelectionEnd();
+               } else {
+                       SelectionLineIterator lineIterator(this);
+                       lineIterator.SetAt(pdoc->LineFromPosition(pos));
+                       selStart = lineIterator.startPos;
+                       selEnd = lineIterator.endPos;
+               }
+               if (pos == selStart) {
                        // see if just before selection
                        Point locStart = LocationFromPosition(pos);
                        // see if just before selection
                        Point locStart = LocationFromPosition(pos);
-                       if (pt.x < locStart.x)
+                       if (pt.x < locStart.x) {
                                return false;
                                return false;
+                       }
                }
                }
-               if (pos == SelectionEnd()) {
+               if (pos == selEnd) {
                        // see if just after selection
                        Point locEnd = LocationFromPosition(pos);
                        // see if just after selection
                        Point locEnd = LocationFromPosition(pos);
-                       if (pt.x > locEnd.x)
+                       if (pt.x > locEnd.x) {
                                return false;
                                return false;
+                       }
                }
                return true;
        }
                }
                return true;
        }
@@ -4430,6 +4724,7 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b
        int newPos = PositionFromLocation(pt);
        newPos = MovePositionOutsideChar(newPos, currentPos - newPos);
        inDragDrop = false;
        int newPos = PositionFromLocation(pt);
        newPos = MovePositionOutsideChar(newPos, currentPos - newPos);
        inDragDrop = false;
+       moveExtendsSelection = false;
 
        bool processed = NotifyMarginClick(pt, shift, ctrl, alt);
        if (processed)
 
        bool processed = NotifyMarginClick(pt, shift, ctrl, alt);
        if (processed)
@@ -4475,7 +4770,7 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b
                //Platform::DebugPrintf("Double click: %d - %d\n", anchor, currentPos);
                if (doubleClick) {
                        NotifyDoubleClick(pt, shift);
                //Platform::DebugPrintf("Double click: %d - %d\n", anchor, currentPos);
                if (doubleClick) {
                        NotifyDoubleClick(pt, shift);
-                       if (PositionIsHotspot(newPos))
+                       if (PointIsHotspot(newPos))
                                NotifyHotSpotDoubleClicked(newPos, shift, ctrl, alt);
                }
        } else {        // Single click
                                NotifyHotSpotDoubleClicked(newPos, shift, ctrl, alt);
                }
        } else {        // Single click
@@ -4507,7 +4802,7 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b
                        SetMouseCapture(true);
                        selectionType = selLine;
                } else {
                        SetMouseCapture(true);
                        selectionType = selLine;
                } else {
-                       if (PositionIsHotspot(newPos)) {
+                       if (PointIsHotspot(pt)) {
                                NotifyHotSpotClicked(newPos, shift, ctrl, alt);
                        }
                        if (!shift) {
                                NotifyHotSpotClicked(newPos, shift, ctrl, alt);
                        }
                        if (!shift) {
@@ -4519,13 +4814,13 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b
                                CopySelectionRange(&drag);
                                StartDrag();
                        } else {
                                CopySelectionRange(&drag);
                                StartDrag();
                        } else {
-                               xStartSelect = pt.x - vs.fixedColumnWidth + xOffset;
-                               xEndSelect = pt.x - vs.fixedColumnWidth + xOffset;
                                SetDragPosition(invalidPosition);
                                SetMouseCapture(true);
                                SetDragPosition(invalidPosition);
                                SetMouseCapture(true);
-                               if (!shift)
+                               if (!shift) {
                                        SetEmptySelection(newPos);
                                        SetEmptySelection(newPos);
+                               }
                                selType = alt ? selRectangle : selStream;
                                selType = alt ? selRectangle : selStream;
+                               xStartSelect = xEndSelect = pt.x - vs.fixedColumnWidth + xOffset;
                                selectionType = selChar;
                                originalAnchorPos = currentPos;
                        }
                                selectionType = selChar;
                                originalAnchorPos = currentPos;
                        }
@@ -4537,11 +4832,13 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b
 }
 
 bool Editor::PositionIsHotspot(int position) {
 }
 
 bool Editor::PositionIsHotspot(int position) {
-       return vs.styles[pdoc->StyleAt(position)].hotspot;
+       return vs.styles[pdoc->StyleAt(position) & pdoc->stylingBitsMask].hotspot;
 }
 
 bool Editor::PointIsHotspot(Point pt) {
 }
 
 bool Editor::PointIsHotspot(Point pt) {
-       int pos = PositionFromLocation(pt);
+       int pos = PositionFromLocationClose(pt);
+       if (pos == INVALID_POSITION)
+               return false;
        return PositionIsHotspot(pos);
 }
 
        return PositionIsHotspot(pos);
 }
 
@@ -4552,8 +4849,8 @@ void Editor::SetHotSpotRange(Point *pt) {
                // If we don't limit this to word characters then the
                // range can encompass more than the run range and then
                // the underline will not be drawn properly.
                // If we don't limit this to word characters then the
                // range can encompass more than the run range and then
                // the underline will not be drawn properly.
-               int hsStart_ = pdoc->ExtendStyleRange(pos, -1);
-               int hsEnd_ = pdoc->ExtendStyleRange(pos, 1);
+               int hsStart_ = pdoc->ExtendStyleRange(pos, -1, vs.hotspotSingleLine);
+               int hsEnd_ = pdoc->ExtendStyleRange(pos, 1, vs.hotspotSingleLine);
 
                // Only invalidate the range if the hotspot range has changed...
                if (hsStart_ != hsStart || hsEnd_ != hsEnd) {
 
                // Only invalidate the range if the hotspot range has changed...
                if (hsStart_ != hsStart || hsEnd_ != hsEnd) {
@@ -4598,7 +4895,6 @@ void Editor::ButtonMove(Point pt) {
                autoScrollTimer.ticksToWait = autoScrollDelay;
 
                // Adjust selection
                autoScrollTimer.ticksToWait = autoScrollDelay;
 
                // Adjust selection
-               xEndSelect = pt.x - vs.fixedColumnWidth + xOffset;
                int movePos = PositionFromLocation(pt);
                movePos = MovePositionOutsideChar(movePos, currentPos - movePos);
                if (posDrag >= 0) {
                int movePos = PositionFromLocation(pt);
                movePos = MovePositionOutsideChar(movePos, currentPos - movePos);
                if (posDrag >= 0) {
@@ -4608,7 +4904,17 @@ void Editor::ButtonMove(Point pt) {
                                SetSelection(movePos);
                        } else if (selectionType == selWord) {
                                // Continue selecting by word
                                SetSelection(movePos);
                        } else if (selectionType == selWord) {
                                // Continue selecting by word
-                               if (movePos >= originalAnchorPos) {     // Moved forward
+                               if (movePos == originalAnchorPos) {     // Didn't move
+                                       // No need to do anything. Previously this case was lumped
+                                       // in with "Moved forward", but that can be harmful in this
+                                       // case: a handler for the NotifyDoubleClick re-adjusts
+                                       // the selection for a fancier definition of "word" (for
+                                       // example, in Perl it is useful to include the leading
+                                       // '$', '%' or '@' on variables for word selection). In this
+                                       // the ButtonMove() called via Tick() for auto-scrolling
+                                       // could result in the fancier word selection adjustment
+                                       // being unmade.
+                               } else if (movePos > originalAnchorPos) {       // Moved forward
                                        SetSelection(pdoc->ExtendWordSelect(movePos, 1),
                                                     pdoc->ExtendWordSelect(originalAnchorPos, -1));
                                } else {        // Moved backward
                                        SetSelection(pdoc->ExtendWordSelect(movePos, 1),
                                                     pdoc->ExtendWordSelect(originalAnchorPos, -1));
                                } else {        // Moved backward
@@ -4621,6 +4927,9 @@ void Editor::ButtonMove(Point pt) {
                                LineSelection(lineMove, lineAnchor);
                        }
                }
                                LineSelection(lineMove, lineAnchor);
                        }
                }
+               // While dragging to make rectangular selection, we don't want the current
+               // position to jump to the end of smaller or empty lines.
+               xEndSelect = pt.x - vs.fixedColumnWidth + xOffset;
 
                // Autoscroll
                PRectangle rcClient = GetClientRectangle();
 
                // Autoscroll
                PRectangle rcClient = GetClientRectangle();
@@ -4659,7 +4968,6 @@ void Editor::ButtonMove(Point pt) {
                        SetHotSpotRange(NULL);
                }
        }
                        SetHotSpotRange(NULL);
                }
        }
-
 }
 
 void Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) {
 }
 
 void Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) {
@@ -4671,7 +4979,6 @@ void Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) {
                        DisplayCursor(Window::cursorText);
                        SetHotSpotRange(NULL);
                }
                        DisplayCursor(Window::cursorText);
                        SetHotSpotRange(NULL);
                }
-               xEndSelect = pt.x - vs.fixedColumnWidth + xOffset;
                ptMouseLast = pt;
                SetMouseCapture(false);
                int newPos = PositionFromLocation(pt);
                ptMouseLast = pt;
                SetMouseCapture(false);
                int newPos = PositionFromLocation(pt);
@@ -4708,6 +5015,9 @@ void Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) {
                                SetSelection(newPos);
                        }
                }
                                SetSelection(newPos);
                        }
                }
+               // Now we rely on the current pos to compute rectangular selection
+               xStartSelect = XFromPosition(anchor);
+               xEndSelect = XFromPosition(currentPos);
                lastClickTime = curTime;
                lastClick = pt;
                lastXChosen = pt.x;
                lastClickTime = curTime;
                lastClick = pt;
                lastXChosen = pt.x;
@@ -4745,6 +5055,30 @@ void Editor::Tick() {
        }
 }
 
        }
 }
 
+bool Editor::Idle() {
+
+       bool idleDone;
+
+       bool wrappingDone = (wrapState == eWrapNone) || (!backgroundWrapEnabled);
+
+       if (!wrappingDone) {
+               // Wrap lines during idle.
+               WrapLines(false, -1);
+               // No more wrapping
+               if (docLineLastWrapped == docLastLineToWrap)
+                       wrappingDone = true;
+       }
+
+       // Add more idle things to do here, but make sure idleDone is
+       // set correctly before the function returns. returning
+       // false will stop calling this idle funtion until SetIdle() is
+       // called again.
+
+       idleDone = wrappingDone; // && thatDone && theOtherThingDone...
+
+       return !idleDone;
+}
+
 void Editor::SetFocusState(bool focusState) {
        hasFocus = focusState;
        NotifyFocus(hasFocus);
 void Editor::SetFocusState(bool focusState) {
        hasFocus = focusState;
        NotifyFocus(hasFocus);
@@ -4898,6 +5232,7 @@ void Editor::SetDocPointer(Document *document) {
        pdoc->AddRef();
 
        // Ensure all positions within document
        pdoc->AddRef();
 
        // Ensure all positions within document
+       selType = selStream;
        currentPos = 0;
        anchor = 0;
        targetStart = 0;
        currentPos = 0;
        anchor = 0;
        targetStart = 0;
@@ -4914,7 +5249,9 @@ void Editor::SetDocPointer(Document *document) {
        SetScrollBars();
 }
 
        SetScrollBars();
 }
 
-// Recursively expand a fold, making lines visible except where they have an unexpanded parent
+/**
+ * Recursively expand a fold, making lines visible except where they have an unexpanded parent.
+ */
 void Editor::Expand(int &line, bool doExpand) {
        int lineMaxSubord = pdoc->GetLastChild(line);
        line++;
 void Editor::Expand(int &line, bool doExpand) {
        int lineMaxSubord = pdoc->GetLastChild(line);
        line++;
@@ -4953,12 +5290,14 @@ void Editor::ToggleContraction(int line) {
        }
 }
 
        }
 }
 
-// Recurse up from this line to find any folds that prevent this line from being visible
-// and unfold them all->
+/**
+ * Recurse up from this line to find any folds that prevent this line from being visible
+ * and unfold them all.
+ */
 void Editor::EnsureLineVisible(int lineDoc, bool enforcePolicy) {
 
        // In case in need of wrapping to ensure DisplayFromDoc works.
 void Editor::EnsureLineVisible(int lineDoc, bool enforcePolicy) {
 
        // In case in need of wrapping to ensure DisplayFromDoc works.
-       WrapLines();
+       WrapLines(true, -1);
 
        if (!cs.GetVisible(lineDoc)) {
                int lineParent = pdoc->GetFoldParent(lineDoc);
 
        if (!cs.GetVisible(lineDoc)) {
                int lineParent = pdoc->GetFoldParent(lineDoc);
@@ -5157,7 +5496,6 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                        if (selectedText.len) {
                                for (; iChar < selectedText.len; iChar++)
                                        ptr[iChar] = selectedText.s[iChar];
                        if (selectedText.len) {
                                for (; iChar < selectedText.len; iChar++)
                                        ptr[iChar] = selectedText.s[iChar];
-                               ptr[iChar] = '\0';
                        } else {
                                ptr[0] = '\0';
                        }
                        } else {
                                ptr[0] = '\0';
                        }
@@ -5307,6 +5645,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                        int cpMax = tr->chrg.cpMax;
                        if (cpMax == -1)
                                cpMax = pdoc->Length();
                        int cpMax = tr->chrg.cpMax;
                        if (cpMax == -1)
                                cpMax = pdoc->Length();
+                       PLATFORM_ASSERT(cpMax <= pdoc->Length());
                        int len = cpMax - tr->chrg.cpMin;       // No -1 as cpMin and cpMax are referring to inter character positions
                        pdoc->GetCharRange(tr->lpstrText, tr->chrg.cpMin, len);
                        // Spec says copied text is terminated with a NUL
                        int len = cpMax - tr->chrg.cpMin;       // No -1 as cpMin and cpMax are referring to inter character positions
                        pdoc->GetCharRange(tr->lpstrText, tr->chrg.cpMin, len);
                        // Spec says copied text is terminated with a NUL
@@ -5360,7 +5699,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                        if (lParam == 0)
                                return 0;
                        int insertPos = wParam;
                        if (lParam == 0)
                                return 0;
                        int insertPos = wParam;
-                       if (static_cast<short>(wParam) == -1)
+                       if (static_cast<int>(wParam) == -1)
                                insertPos = CurrentPosition();
                        int newCurrent = CurrentPosition();
                        char *sz = CharPtrFromSPtr(lParam);
                                insertPos = CurrentPosition();
                        int newCurrent = CurrentPosition();
                        char *sz = CharPtrFromSPtr(lParam);
@@ -5406,12 +5745,24 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                break;
 
        case SCI_SETWORDCHARS: {
                break;
 
        case SCI_SETWORDCHARS: {
+                       pdoc->SetDefaultCharClasses();
                        if (lParam == 0)
                                return 0;
                        if (lParam == 0)
                                return 0;
-                       pdoc->SetWordChars(reinterpret_cast<unsigned char *>(lParam));
+                       pdoc->SetCharClasses(reinterpret_cast<unsigned char *>(lParam), Document::ccWord);
                }
                break;
 
                }
                break;
 
+       case SCI_SETWHITESPACECHARS: {
+                       if (lParam == 0)
+                               return 0;
+                       pdoc->SetCharClasses(reinterpret_cast<unsigned char *>(lParam), Document::ccSpace);
+               }
+               break;
+
+       case SCI_SETCHARSDEFAULT:
+               pdoc->SetDefaultCharClasses();
+               break;
+
        case SCI_GETLENGTH:
                return pdoc->Length();
 
        case SCI_GETLENGTH:
                return pdoc->Length();
 
@@ -5468,7 +5819,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                return printWrapState;
 
        case SCI_GETSTYLEAT:
                return printWrapState;
 
        case SCI_GETSTYLEAT:
-               if (static_cast<short>(wParam) >= pdoc->Length())
+               if (static_cast<int>(wParam) >= pdoc->Length())
                        return 0;
                else
                        return pdoc->StyleAt(wParam);
                        return 0;
                else
                        return pdoc->StyleAt(wParam);
@@ -5843,8 +6194,11 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
 
        case SCI_SETMARGINWIDTHN:
                if (ValidMargin(wParam)) {
 
        case SCI_SETMARGINWIDTHN:
                if (ValidMargin(wParam)) {
-                       vs.ms[wParam].width = lParam;
-                       InvalidateStyleRedraw();
+                       // Short-circuit if the width is unchanged, to avoid unnecessary redraw.
+                       if (vs.ms[wParam].width != lParam) {
+                               vs.ms[wParam].width = lParam;
+                               InvalidateStyleRedraw();
+                       }
                }
                break;
 
                }
                break;
 
@@ -6192,6 +6546,10 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
        case SCI_WORDLEFTEXTEND:
        case SCI_WORDRIGHT:
        case SCI_WORDRIGHTEXTEND:
        case SCI_WORDLEFTEXTEND:
        case SCI_WORDRIGHT:
        case SCI_WORDRIGHTEXTEND:
+       case SCI_WORDLEFTEND:
+       case SCI_WORDLEFTENDEXTEND:
+       case SCI_WORDRIGHTEND:
+       case SCI_WORDRIGHTENDEXTEND:
        case SCI_HOME:
        case SCI_HOMEEXTEND:
        case SCI_LINEEND:
        case SCI_HOME:
        case SCI_HOMEEXTEND:
        case SCI_LINEEND:
@@ -6204,6 +6562,12 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
        case SCI_DOCUMENTSTARTEXTEND:
        case SCI_DOCUMENTEND:
        case SCI_DOCUMENTENDEXTEND:
        case SCI_DOCUMENTSTARTEXTEND:
        case SCI_DOCUMENTEND:
        case SCI_DOCUMENTENDEXTEND:
+
+       case SCI_STUTTEREDPAGEUP:
+       case SCI_STUTTEREDPAGEUPEXTEND:
+       case SCI_STUTTEREDPAGEDOWN:
+       case SCI_STUTTEREDPAGEDOWNEXTEND:
+
        case SCI_PAGEUP:
        case SCI_PAGEUPEXTEND:
        case SCI_PAGEDOWN:
        case SCI_PAGEUP:
        case SCI_PAGEUPEXTEND:
        case SCI_PAGEDOWN:
@@ -6243,6 +6607,15 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
        case SCI_HOMEDISPLAYEXTEND:
        case SCI_LINEENDDISPLAY:
        case SCI_LINEENDDISPLAYEXTEND:
        case SCI_HOMEDISPLAYEXTEND:
        case SCI_LINEENDDISPLAY:
        case SCI_LINEENDDISPLAYEXTEND:
+       case SCI_LINEDOWNRECTEXTEND:
+       case SCI_LINEUPRECTEXTEND:
+       case SCI_CHARLEFTRECTEXTEND:
+       case SCI_CHARRIGHTRECTEXTEND:
+       case SCI_HOMERECTEXTEND:
+       case SCI_VCHOMERECTEXTEND:
+       case SCI_LINEENDRECTEXTEND:
+       case SCI_PAGEUPRECTEXTEND:
+       case SCI_PAGEDOWNRECTEXTEND:
                return KeyCommand(iMessage);
 
        case SCI_BRACEHIGHLIGHT:
                return KeyCommand(iMessage);
 
        case SCI_BRACEHIGHLIGHT:
@@ -6336,7 +6709,49 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                return 0;
 
        case SCI_SELECTIONISRECTANGLE:
                return 0;
 
        case SCI_SELECTIONISRECTANGLE:
-               return (selType == selRectangle) ? 1 : 0;
+               return selType == selRectangle ? 1 : 0;
+
+       case SCI_SETSELECTIONMODE: {
+                       switch (wParam) {
+                       case SC_SEL_STREAM:
+                               moveExtendsSelection = !moveExtendsSelection || (selType != selStream);
+                               selType = selStream;
+                               break;
+                       case SC_SEL_RECTANGLE:
+                               moveExtendsSelection = !moveExtendsSelection || (selType != selRectangle);
+                               selType = selRectangle;
+                               break;
+                       case SC_SEL_LINES:
+                               moveExtendsSelection = !moveExtendsSelection || (selType != selLines);
+                               selType = selLines;
+                               break;
+                       default:
+                               moveExtendsSelection = !moveExtendsSelection || (selType != selStream);
+                               selType = selStream;
+                       }
+                       InvalidateSelection(currentPos, anchor);
+               }
+       case SCI_GETSELECTIONMODE:
+               switch (selType) {
+               case selStream:
+                       return SC_SEL_STREAM;
+               case selRectangle:
+                       return SC_SEL_RECTANGLE;
+               case selLines:
+                       return SC_SEL_LINES;
+               default:        // ?!
+                       return SC_SEL_STREAM;
+               }
+       case SCI_GETLINESELSTARTPOSITION: {
+                       SelectionLineIterator lineIterator(this);
+                       lineIterator.SetAt(wParam);
+                       return lineIterator.startPos;
+               }
+       case SCI_GETLINESELENDPOSITION: {
+                       SelectionLineIterator lineIterator(this);
+                       lineIterator.SetAt(wParam);
+                       return lineIterator.endPos;
+               }
 
        case SCI_SETOVERTYPE:
                inOverstrike = wParam != 0;
 
        case SCI_SETOVERTYPE:
                inOverstrike = wParam != 0;
@@ -6422,6 +6837,11 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                InvalidateStyleRedraw();
                break;
 
                InvalidateStyleRedraw();
                break;
 
+       case SCI_SETHOTSPOTSINGLELINE:
+               vs.hotspotSingleLine = wParam != 0;
+               InvalidateStyleRedraw();
+               break;
+
        default:
                return DefWndProc(iMessage, wParam, lParam);
        }
        default:
                return DefWndProc(iMessage, wParam, lParam);
        }
index bd4669192f7b5690a8877439155509818babf74d..08c56f7a4175205864c2936edf361c13f5c24e92 100644 (file)
@@ -31,6 +31,16 @@ public:
        Timer();
 };
 
        Timer();
 };
 
+/**
+ */
+class Idler {
+public:
+       bool state;
+       IdlerID idlerID;
+
+       Idler();
+};
+
 /**
  */
 class LineLayout {
 /**
  */
 class LineLayout {
@@ -115,6 +125,10 @@ public:
        void Dispose(LineLayout *ll);
 };
 
        void Dispose(LineLayout *ll);
 };
 
+/**
+ * Hold a piece of text selected for copying or dragging.
+ * The text is expected to hold a terminating '\0'.
+ */
 class SelectionText {
 public:
        char *s;
 class SelectionText {
 public:
        char *s;
@@ -208,6 +222,8 @@ protected:  // ScintillaBase subclass needs access to much of Editor
        Timer autoScrollTimer;
        enum { autoScrollDelay = 200 };
 
        Timer autoScrollTimer;
        enum { autoScrollDelay = 200 };
 
+       Idler idler;
+
        Point lastClick;
        unsigned int lastClickTime;
        int dwellDelay;
        Point lastClick;
        unsigned int lastClickTime;
        int dwellDelay;
@@ -244,9 +260,11 @@ protected: // ScintillaBase subclass needs access to much of Editor
        int modEventMask;
 
        SelectionText drag;
        int modEventMask;
 
        SelectionText drag;
-       enum { selStream, selRectangle, selRectangleFixed } selType;
-       int xStartSelect;
-       int xEndSelect;
+       enum selTypes { noSel, selStream, selRectangle, selLines };
+       selTypes selType;
+       bool moveExtendsSelection;
+       int xStartSelect;       ///< x position of start of rectangular selection
+       int xEndSelect;         ///< x position of end of rectangular selection
        bool primarySelection;
 
        int caretXPolicy;
        bool primarySelection;
 
        int caretXPolicy;
@@ -271,8 +289,10 @@ protected: // ScintillaBase subclass needs access to much of Editor
 
        // Wrapping support
        enum { eWrapNone, eWrapWord } wrapState;
 
        // Wrapping support
        enum { eWrapNone, eWrapWord } wrapState;
+       bool backgroundWrapEnabled;
        int wrapWidth;
        int docLineLastWrapped;
        int wrapWidth;
        int docLineLastWrapped;
+       int docLastLineToWrap;
 
        Document *pdoc;
 
 
        Document *pdoc;
 
@@ -310,15 +330,16 @@ protected:        // ScintillaBase subclass needs access to much of Editor
 
        int CurrentPosition();
        bool SelectionEmpty();
 
        int CurrentPosition();
        bool SelectionEmpty();
-       int SelectionStart(int line=-1);
-       int SelectionEnd(int line=-1);
+       int SelectionStart();
+       int SelectionEnd();
+       void InvalidateSelection(int currentPos_, int anchor_);
        void SetSelection(int currentPos_, int anchor_);
        void SetSelection(int currentPos_);
        void SetEmptySelection(int currentPos_);
        bool RangeContainsProtected(int start, int end) const;
        void SetSelection(int currentPos_, int anchor_);
        void SetSelection(int currentPos_);
        void SetEmptySelection(int currentPos_);
        bool RangeContainsProtected(int start, int end) const;
-       bool SelectionContainsProtected() const;
+       bool SelectionContainsProtected();
        int MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd=true);
        int MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd=true);
-       int MovePositionTo(int newPos, bool extend=false, bool ensureVisible=true);
+       int MovePositionTo(int newPos, selTypes sel=noSel, bool ensureVisible=true);
        int MovePositionSoVisible(int pos, int moveDir);
        void SetLastXChosen();
 
        int MovePositionSoVisible(int pos, int moveDir);
        void SetLastXChosen();
 
@@ -332,8 +353,8 @@ protected:  // ScintillaBase subclass needs access to much of Editor
        void DropCaret();
        void InvalidateCaret();
 
        void DropCaret();
        void InvalidateCaret();
 
-       void NeedWrapping(int docLineStartWrapping=0);
-       bool WrapLines();
+       void NeedWrapping(int docLineStartWrapping = 0, int docLineEndWrapping = 0x7ffffff);
+       bool WrapLines(bool fullWrap, int priorityWrapLineStart);
        void LinesJoin();
        void LinesSplit(int pixelWidth);
 
        void LinesJoin();
        void LinesSplit(int pixelWidth);
 
@@ -406,13 +427,13 @@ protected:        // ScintillaBase subclass needs access to much of Editor
        void NotifyStyleNeeded(Document *doc, void *userData, int endPos);
        void NotifyMacroRecord(unsigned int iMessage, uptr_t wParam, sptr_t lParam);
 
        void NotifyStyleNeeded(Document *doc, void *userData, int endPos);
        void NotifyMacroRecord(unsigned int iMessage, uptr_t wParam, sptr_t lParam);
 
-       void PageMove(int direction, bool extend=false);
+       void PageMove(int direction, selTypes sel=noSel, bool stuttered = false);
        void ChangeCaseOfSelection(bool makeUpperCase);
        void LineTranspose();
        void LineDuplicate();
        virtual void CancelModes();
        void NewLine();
        void ChangeCaseOfSelection(bool makeUpperCase);
        void LineTranspose();
        void LineDuplicate();
        virtual void CancelModes();
        void NewLine();
-       void CursorUpOrDown(int direction, bool extend=false);
+       void CursorUpOrDown(int direction, selTypes sel=noSel);
        int StartEndDisplayLine(int pos, bool start);
        virtual int KeyCommand(unsigned int iMessage);
        virtual int KeyDefault(int /* key */, int /*modifiers*/);
        int StartEndDisplayLine(int pos, bool start);
        virtual int KeyCommand(unsigned int iMessage);
        virtual int KeyDefault(int /* key */, int /*modifiers*/);
@@ -451,7 +472,9 @@ protected:  // ScintillaBase subclass needs access to much of Editor
        void ButtonUp(Point pt, unsigned int curTime, bool ctrl);
 
        void Tick();
        void ButtonUp(Point pt, unsigned int curTime, bool ctrl);
 
        void Tick();
+       bool Idle();
        virtual void SetTicking(bool on) = 0;
        virtual void SetTicking(bool on) = 0;
+       virtual bool SetIdle(bool) { return false; }
        virtual void SetMouseCapture(bool on) = 0;
        virtual bool HaveMouseCapture() = 0;
        void SetFocusState(bool focusState);
        virtual void SetMouseCapture(bool on) = 0;
        virtual bool HaveMouseCapture() = 0;
        void SetFocusState(bool focusState);
@@ -484,6 +507,7 @@ public:
        // Public so scintilla_set_id can use it.
        int ctrlID;
        friend class AutoSurface;
        // Public so scintilla_set_id can use it.
        int ctrlID;
        friend class AutoSurface;
+       friend class SelectionLineIterator;
 };
 
 /**
 };
 
 /**
index 88be76f2492be20f5f0b26be344e147ca65074d0..752118b7706251c005894feadf34d9ef5120b064 100644 (file)
@@ -232,8 +232,9 @@ void LexerManager::Clear()
 {
        if (NULL != first) {
                LexerLibrary *cur = first;
 {
        if (NULL != first) {
                LexerLibrary *cur = first;
-               LexerLibrary *next = first->next;
+               LexerLibrary *next;
                while (cur) {
                while (cur) {
+                       next = cur->next;
                        delete cur;
                        cur = next;
                }
                        delete cur;
                        cur = next;
                }
index 1e386b68e30111ba6aba6b0ade58898dad9ca0b1..a42abb2037de1583aec37833bad773f3f1bd17f0 100644 (file)
@@ -10,7 +10,7 @@
 #include "Scintilla.h"
 #include "Indicator.h"
 
 #include "Scintilla.h"
 #include "Indicator.h"
 
-void Indicator::Draw(Surface *surface, PRectangle &rc) {
+void Indicator::Draw(Surface *surface, const PRectangle &rc, const PRectangle &rcLine) {
        surface->PenColour(fore.allocated);
        int ymid = (rc.bottom + rc.top) / 2;
        if (style == INDIC_SQUIGGLE) {
        surface->PenColour(fore.allocated);
        int ymid = (rc.bottom + rc.top) / 2;
        if (style == INDIC_SQUIGGLE) {
@@ -57,6 +57,12 @@ void Indicator::Draw(Surface *surface, PRectangle &rc) {
                surface->LineTo(rc.right, rc.top - 4);
        } else if (style == INDIC_HIDDEN) {
                // Draw nothing
                surface->LineTo(rc.right, rc.top - 4);
        } else if (style == INDIC_HIDDEN) {
                // Draw nothing
+       } else if (style == INDIC_BOX) {
+               surface->MoveTo(rc.left, ymid+1);
+               surface->LineTo(rc.right, ymid+1);
+               surface->LineTo(rc.right, rcLine.top+1);
+               surface->LineTo(rc.left, rcLine.top+1);
+               surface->LineTo(rc.left, ymid+1);
        } else {        // Either INDIC_PLAIN or unknown
                surface->MoveTo(rc.left, ymid);
                surface->LineTo(rc.right, ymid);
        } else {        // Either INDIC_PLAIN or unknown
                surface->MoveTo(rc.left, ymid);
                surface->LineTo(rc.right, ymid);
index 56e9420bccb0bd45e76c5ff7ee85b2dfde19f64c..716db1051fe7abd142a5f2d30967eb7b704622e0 100644 (file)
@@ -16,7 +16,7 @@ public:
        ColourPair fore;
        Indicator() : style(INDIC_PLAIN), fore(ColourDesired(0,0,0)) {
        }
        ColourPair fore;
        Indicator() : style(INDIC_PLAIN), fore(ColourDesired(0,0,0)) {
        }
-       void Draw(Surface *surface, PRectangle &rc);
+       void Draw(Surface *surface, const PRectangle &rc, const PRectangle &rcLine);
 };
 
 #endif
 };
 
 #endif
index f15842af684cc509bbeac2ff8fdfec75c9e98542..950916bd08dc14764a96de579e8983bdfcd03939 100644 (file)
@@ -2,7 +2,7 @@
 /** @file KeyMap.cxx
  ** Defines a mapping between keystrokes and commands.
  **/
 /** @file KeyMap.cxx
  ** Defines a mapping between keystrokes and commands.
  **/
-// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
+// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include "Platform.h"
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include "Platform.h"
@@ -15,7 +15,7 @@ KeyMap::KeyMap() : kmap(0), len(0), alloc(0) {
        for (int i = 0; MapDefault[i].key; i++) {
                AssignCmdKey(MapDefault[i].key,
                        MapDefault[i].modifiers,
        for (int i = 0; MapDefault[i].key; i++) {
                AssignCmdKey(MapDefault[i].key,
                        MapDefault[i].modifiers,
-                       MapDefault[i].msg);
+                       MapDefault[i].msg);
        }
 }
 
        }
 }
 
@@ -35,7 +35,7 @@ void KeyMap::AssignCmdKey(int key, int modifiers, unsigned int msg) {
                KeyToCommand *ktcNew = new KeyToCommand[alloc + 5];
                if (!ktcNew)
                        return;
                KeyToCommand *ktcNew = new KeyToCommand[alloc + 5];
                if (!ktcNew)
                        return;
-               for (int k=0;k<len;k++)
+               for (int k = 0; k < len; k++)
                        ktcNew[k] = kmap[k];
                alloc += 5;
                delete []kmap;
                        ktcNew[k] = kmap[k];
                alloc += 5;
                delete []kmap;
@@ -54,7 +54,7 @@ void KeyMap::AssignCmdKey(int key, int modifiers, unsigned int msg) {
 }
 
 unsigned int KeyMap::Find(int key, int modifiers) {
 }
 
 unsigned int KeyMap::Find(int key, int modifiers) {
-       for (int i=0; i < len; i++) {
+       for (int i = 0; i < len; i++) {
                if ((key == kmap[i].key) && (modifiers == kmap[i].modifiers)) {
                        return kmap[i].msg;
                }
                if ((key == kmap[i].key) && (modifiers == kmap[i].modifiers)) {
                        return kmap[i].msg;
                }
@@ -66,41 +66,49 @@ const KeyToCommand KeyMap::MapDefault[] = {
     {SCK_DOWN,         SCI_NORM,       SCI_LINEDOWN},
     {SCK_DOWN,         SCI_SHIFT,      SCI_LINEDOWNEXTEND},
     {SCK_DOWN,         SCI_CTRL,       SCI_LINESCROLLDOWN},
     {SCK_DOWN,         SCI_NORM,       SCI_LINEDOWN},
     {SCK_DOWN,         SCI_SHIFT,      SCI_LINEDOWNEXTEND},
     {SCK_DOWN,         SCI_CTRL,       SCI_LINESCROLLDOWN},
-    {SCK_DOWN,         SCI_ALT,                SCI_PARADOWN},
-    {SCK_DOWN,         SCI_ASHIFT,     SCI_PARADOWNEXTEND},
-    {SCK_UP,                   SCI_NORM,       SCI_LINEUP},
+    {SCK_DOWN,         SCI_ASHIFT,     SCI_LINEDOWNRECTEXTEND},
+    {SCK_UP,           SCI_NORM,       SCI_LINEUP},
     {SCK_UP,                   SCI_SHIFT,      SCI_LINEUPEXTEND},
     {SCK_UP,                   SCI_CTRL,       SCI_LINESCROLLUP},
     {SCK_UP,                   SCI_SHIFT,      SCI_LINEUPEXTEND},
     {SCK_UP,                   SCI_CTRL,       SCI_LINESCROLLUP},
-    {SCK_UP,                   SCI_ALT,                SCI_PARAUP},
-    {SCK_UP,                   SCI_ASHIFT,     SCI_PARAUPEXTEND},
+    {SCK_UP,           SCI_ASHIFT,     SCI_LINEUPRECTEXTEND},
+    {'[',                      SCI_CTRL,               SCI_PARAUP},
+    {'[',                      SCI_CSHIFT,     SCI_PARAUPEXTEND},
+    {']',                      SCI_CTRL,               SCI_PARADOWN},
+    {']',                      SCI_CSHIFT,     SCI_PARADOWNEXTEND},
     {SCK_LEFT,         SCI_NORM,       SCI_CHARLEFT},
     {SCK_LEFT,         SCI_SHIFT,      SCI_CHARLEFTEXTEND},
     {SCK_LEFT,         SCI_CTRL,       SCI_WORDLEFT},
     {SCK_LEFT,         SCI_CSHIFT,     SCI_WORDLEFTEXTEND},
     {SCK_LEFT,         SCI_NORM,       SCI_CHARLEFT},
     {SCK_LEFT,         SCI_SHIFT,      SCI_CHARLEFTEXTEND},
     {SCK_LEFT,         SCI_CTRL,       SCI_WORDLEFT},
     {SCK_LEFT,         SCI_CSHIFT,     SCI_WORDLEFTEXTEND},
-    {SCK_LEFT,         SCI_ALT,                SCI_WORDPARTLEFT},
-    {SCK_LEFT,         SCI_ASHIFT,     SCI_WORDPARTLEFTEXTEND},
+    {SCK_LEFT,         SCI_ASHIFT,     SCI_CHARLEFTRECTEXTEND},
     {SCK_RIGHT,                SCI_NORM,       SCI_CHARRIGHT},
     {SCK_RIGHT,                SCI_SHIFT,      SCI_CHARRIGHTEXTEND},
     {SCK_RIGHT,                SCI_CTRL,       SCI_WORDRIGHT},
     {SCK_RIGHT,                SCI_CSHIFT,     SCI_WORDRIGHTEXTEND},
     {SCK_RIGHT,                SCI_NORM,       SCI_CHARRIGHT},
     {SCK_RIGHT,                SCI_SHIFT,      SCI_CHARRIGHTEXTEND},
     {SCK_RIGHT,                SCI_CTRL,       SCI_WORDRIGHT},
     {SCK_RIGHT,                SCI_CSHIFT,     SCI_WORDRIGHTEXTEND},
-    {SCK_RIGHT,                SCI_ALT,                SCI_WORDPARTRIGHT},
-    {SCK_RIGHT,                SCI_ASHIFT,     SCI_WORDPARTRIGHTEXTEND},
-    {SCK_HOME,                 SCI_NORM,       SCI_VCHOME},
+    {SCK_RIGHT,                SCI_ASHIFT,     SCI_CHARRIGHTRECTEXTEND},
+    {'/',              SCI_CTRL,               SCI_WORDPARTLEFT},
+    {'/',              SCI_CSHIFT,     SCI_WORDPARTLEFTEXTEND},
+    {'\\',             SCI_CTRL,               SCI_WORDPARTRIGHT},
+    {'\\',             SCI_CSHIFT,     SCI_WORDPARTRIGHTEXTEND},
+    {SCK_HOME,         SCI_NORM,       SCI_VCHOME},
     {SCK_HOME,                 SCI_SHIFT,      SCI_VCHOMEEXTEND},
     {SCK_HOME,                 SCI_CTRL,       SCI_DOCUMENTSTART},
     {SCK_HOME,                 SCI_CSHIFT,     SCI_DOCUMENTSTARTEXTEND},
     {SCK_HOME,                 SCI_ALT,        SCI_HOMEDISPLAY},
     {SCK_HOME,                 SCI_SHIFT,      SCI_VCHOMEEXTEND},
     {SCK_HOME,                 SCI_CTRL,       SCI_DOCUMENTSTART},
     {SCK_HOME,                 SCI_CSHIFT,     SCI_DOCUMENTSTARTEXTEND},
     {SCK_HOME,                 SCI_ALT,        SCI_HOMEDISPLAY},
-    {SCK_HOME,                 SCI_ASHIFT,     SCI_HOMEDISPLAYEXTEND},
-    {SCK_END,          SCI_NORM,       SCI_LINEEND},
+//    {SCK_HOME,               SCI_ASHIFT,     SCI_HOMEDISPLAYEXTEND},
+    {SCK_HOME,         SCI_ASHIFT,     SCI_VCHOMERECTEXTEND},
+    {SCK_END,          SCI_NORM,       SCI_LINEEND},
     {SCK_END,          SCI_SHIFT,      SCI_LINEENDEXTEND},
     {SCK_END,          SCI_CTRL,       SCI_DOCUMENTEND},
     {SCK_END,          SCI_CSHIFT,     SCI_DOCUMENTENDEXTEND},
     {SCK_END,          SCI_ALT,        SCI_LINEENDDISPLAY},
     {SCK_END,          SCI_SHIFT,      SCI_LINEENDEXTEND},
     {SCK_END,          SCI_CTRL,       SCI_DOCUMENTEND},
     {SCK_END,          SCI_CSHIFT,     SCI_DOCUMENTENDEXTEND},
     {SCK_END,          SCI_ALT,        SCI_LINEENDDISPLAY},
-    {SCK_END,          SCI_ASHIFT,     SCI_LINEENDDISPLAYEXTEND},
-    {SCK_PRIOR,                SCI_NORM,       SCI_PAGEUP},
+//    {SCK_END,                SCI_ASHIFT,     SCI_LINEENDDISPLAYEXTEND},
+    {SCK_END,          SCI_ASHIFT,     SCI_LINEENDRECTEXTEND},
+    {SCK_PRIOR,                SCI_NORM,       SCI_PAGEUP},
     {SCK_PRIOR,                SCI_SHIFT,      SCI_PAGEUPEXTEND},
     {SCK_PRIOR,                SCI_SHIFT,      SCI_PAGEUPEXTEND},
+    {SCK_PRIOR,                SCI_ASHIFT,     SCI_PAGEUPRECTEXTEND},
     {SCK_NEXT,                 SCI_NORM,       SCI_PAGEDOWN},
     {SCK_NEXT,                 SCI_SHIFT,      SCI_PAGEDOWNEXTEND},
     {SCK_NEXT,                 SCI_NORM,       SCI_PAGEDOWN},
     {SCK_NEXT,                 SCI_SHIFT,      SCI_PAGEDOWNEXTEND},
+    {SCK_NEXT,         SCI_ASHIFT,     SCI_PAGEDOWNRECTEXTEND},
     {SCK_DELETE,       SCI_NORM,       SCI_CLEAR},
     {SCK_DELETE,       SCI_SHIFT,      SCI_CUT},
     {SCK_DELETE,       SCI_CTRL,       SCI_DELWORDRIGHT},
     {SCK_DELETE,       SCI_NORM,       SCI_CLEAR},
     {SCK_DELETE,       SCI_SHIFT,      SCI_CUT},
     {SCK_DELETE,       SCI_CTRL,       SCI_DELWORDRIGHT},
index ae22baf2f27dc5b37f62fbd1012745f0e65a2b40..206a333b0028f3dde430854d1db31d7d66f58f1d 100644 (file)
@@ -134,6 +134,8 @@ int Scintilla_LinkLexers() {
        LINK_LEXER(lmAVE);
        LINK_LEXER(lmBaan);
        LINK_LEXER(lmBullant);
        LINK_LEXER(lmAVE);
        LINK_LEXER(lmBaan);
        LINK_LEXER(lmBullant);
+       LINK_LEXER(lmClw);
+       LINK_LEXER(lmClwNoCase);
        LINK_LEXER(lmConf);
        LINK_LEXER(lmCPP);
        LINK_LEXER(lmCPPNoCase);
        LINK_LEXER(lmConf);
        LINK_LEXER(lmCPP);
        LINK_LEXER(lmCPPNoCase);
@@ -142,7 +144,9 @@ int Scintilla_LinkLexers() {
        LINK_LEXER(lmCss);
        LINK_LEXER(lmEiffel);
        LINK_LEXER(lmEiffelkw);
        LINK_LEXER(lmCss);
        LINK_LEXER(lmEiffel);
        LINK_LEXER(lmEiffelkw);
+       LINK_LEXER(lmErlang);
        LINK_LEXER(lmESCRIPT);
        LINK_LEXER(lmESCRIPT);
+       LINK_LEXER(lmForth);
        LINK_LEXER(lmFortran);
        LINK_LEXER(lmF77);
        LINK_LEXER(lmHTML);
        LINK_LEXER(lmFortran);
        LINK_LEXER(lmF77);
        LINK_LEXER(lmHTML);
@@ -153,7 +157,10 @@ int Scintilla_LinkLexers() {
        LINK_LEXER(lmLout);
        LINK_LEXER(lmLua);
        LINK_LEXER(lmMatlab);
        LINK_LEXER(lmLout);
        LINK_LEXER(lmLua);
        LINK_LEXER(lmMatlab);
+       LINK_LEXER(lmOctave);
+       LINK_LEXER(lmMETAPOST);
        LINK_LEXER(lmMMIXAL);
        LINK_LEXER(lmMMIXAL);
+       LINK_LEXER(lmLot);
        LINK_LEXER(lmNsis);
        LINK_LEXER(lmBatch);
        LINK_LEXER(lmDiff);
        LINK_LEXER(lmNsis);
        LINK_LEXER(lmBatch);
        LINK_LEXER(lmDiff);
@@ -163,6 +170,7 @@ int Scintilla_LinkLexers() {
        LINK_LEXER(lmLatex);
        LINK_LEXER(lmNull);
        LINK_LEXER(lmPascal);
        LINK_LEXER(lmLatex);
        LINK_LEXER(lmNull);
        LINK_LEXER(lmPascal);
+       LINK_LEXER(lmPB);
        LINK_LEXER(lmPerl);
        LINK_LEXER(lmPOV);
        LINK_LEXER(lmPS);
        LINK_LEXER(lmPerl);
        LINK_LEXER(lmPOV);
        LINK_LEXER(lmPS);
@@ -170,8 +178,10 @@ int Scintilla_LinkLexers() {
        LINK_LEXER(lmRuby);
        LINK_LEXER(lmScriptol);
        LINK_LEXER(lmSQL);
        LINK_LEXER(lmRuby);
        LINK_LEXER(lmScriptol);
        LINK_LEXER(lmSQL);
+       LINK_LEXER(lmTeX);
        LINK_LEXER(lmVB);
        LINK_LEXER(lmVBScript);
        LINK_LEXER(lmVB);
        LINK_LEXER(lmVBScript);
+       LINK_LEXER(lmYAML);
 
 //--Autogenerated -- end of automatically generated section
 
 
 //--Autogenerated -- end of automatically generated section
 
index 1eecf9b31a99b8570297e32ea9d12dad72009773..93e0b3718020f95e0030a833f4f4f91b0f8ade38 100644 (file)
@@ -1,9 +1,11 @@
 // Scintilla source code edit control
 /** @file LexAsm.cxx
 // Scintilla source code edit control
 /** @file LexAsm.cxx
- ** Lexer for Assembler, just for the Masm Syntax
+ ** Lexer for Assembler, just for the MASM syntax
  ** Written by The Black Horus
  ** Written by The Black Horus
+ ** Enhancements and NASM stuff by Kein-Hong Man, 2003-10
+ ** SCE_ASM_COMMENTBLOCK and SCE_ASM_CHARACTER are for future GNU as colouring
  **/
  **/
-// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>
+// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include <stdlib.h>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include <stdlib.h>
 #include "SciLexer.h"
 
 
 #include "SciLexer.h"
 
 
-
 static inline bool IsAWordChar(const int ch) {
 static inline bool IsAWordChar(const int ch) {
-       return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_' || ch =='\\');
+       return (ch < 0x80) && (isalnum(ch) || ch == '.' ||
+               ch == '_' || ch == '?');
 }
 
 static inline bool IsAWordStart(const int ch) {
 }
 
 static inline bool IsAWordStart(const int ch) {
-       return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.');
+       return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.' ||
+               ch == '%' || ch == '@' || ch == '$' || ch == '?');
 }
 
 }
 
-inline bool isAsmOperator(char ch) {
+static inline bool IsAsmOperator(char ch) {
        if (isalnum(ch))
                return false;
        // '.' left out as it is used to make up numbers
        if (ch == '*' || ch == '/' || ch == '-' || ch == '+' ||
        if (isalnum(ch))
                return false;
        // '.' left out as it is used to make up numbers
        if (ch == '*' || ch == '/' || ch == '-' || ch == '+' ||
-               ch == '(' || ch == ')' || ch == '=' ||
-               ch == '[' || ch == ']' || ch == '<' ||
-               ch == '>' || ch == ',' ||
-               ch == '.' || ch == '%' || ch == ':')
+               ch == '(' || ch == ')' || ch == '=' || ch == '^' ||
+               ch == '[' || ch == ']' || ch == '<' || ch == '&' ||
+               ch == '>' || ch == ',' || ch == '|' || ch == '~' ||
+               ch == '%' || ch == ':')
                return true;
        return false;
 }
                return true;
        return false;
 }
@@ -52,48 +55,63 @@ static void ColouriseAsmDoc(unsigned int startPos, int length, int initStyle, Wo
        WordList &registers = *keywordlists[2];
        WordList &directive = *keywordlists[3];
        WordList &directiveOperand = *keywordlists[4];
        WordList &registers = *keywordlists[2];
        WordList &directive = *keywordlists[3];
        WordList &directiveOperand = *keywordlists[4];
+       WordList &extInstruction = *keywordlists[5];
+
+       // Do not leak onto next line
+       if (initStyle == SCE_ASM_STRINGEOL)
+               initStyle = SCE_ASM_DEFAULT;
 
        StyleContext sc(startPos, length, initStyle, styler);
 
        for (; sc.More(); sc.Forward())
        {
 
        StyleContext sc(startPos, length, initStyle, styler);
 
        for (; sc.More(); sc.Forward())
        {
+
+               // Prevent SCE_ASM_STRINGEOL from leaking back to previous line
+               if (sc.atLineStart && (sc.state == SCE_ASM_STRING)) {
+                       sc.SetState(SCE_ASM_STRING);
+               } else if (sc.atLineStart && (sc.state == SCE_ASM_CHARACTER)) {
+                       sc.SetState(SCE_ASM_CHARACTER);
+               }
+
                // Handle line continuation generically.
                if (sc.ch == '\\') {
                // Handle line continuation generically.
                if (sc.ch == '\\') {
-                       if (sc.Match("\\\n")) {
-                               sc.Forward();
-                               continue;
-                       }
-                       if (sc.Match("\\\r\n")) {
-                               sc.Forward();
+                       if (sc.chNext == '\n' || sc.chNext == '\r') {
                                sc.Forward();
                                sc.Forward();
+                               if (sc.ch == '\r' && sc.chNext == '\n') {
+                                       sc.Forward();
+                               }
                                continue;
                        }
                }
 
                // Determine if the current state should terminate.
                if (sc.state == SCE_ASM_OPERATOR) {
                                continue;
                        }
                }
 
                // Determine if the current state should terminate.
                if (sc.state == SCE_ASM_OPERATOR) {
-                       sc.SetState(SCE_ASM_DEFAULT);
+                       if (!IsAsmOperator(static_cast<char>(sc.ch))) {
+                           sc.SetState(SCE_ASM_DEFAULT);
+                       }
                }else if (sc.state == SCE_ASM_NUMBER) {
                        if (!IsAWordChar(sc.ch)) {
                                sc.SetState(SCE_ASM_DEFAULT);
                        }
                } else if (sc.state == SCE_ASM_IDENTIFIER) {
                        if (!IsAWordChar(sc.ch) ) {
                }else if (sc.state == SCE_ASM_NUMBER) {
                        if (!IsAWordChar(sc.ch)) {
                                sc.SetState(SCE_ASM_DEFAULT);
                        }
                } else if (sc.state == SCE_ASM_IDENTIFIER) {
                        if (!IsAWordChar(sc.ch) ) {
-                       char s[100];
-                       sc.GetCurrentLowered(s, sizeof(s));
-
-                       if (cpuInstruction.InList(s)) {
-                               sc.ChangeState(SCE_ASM_CPUINSTRUCTION);
-                       } else if (mathInstruction.InList(s)) {
-                               sc.ChangeState(SCE_ASM_MATHINSTRUCTION);
-                       } else if (registers.InList(s)) {
-                               sc.ChangeState(SCE_ASM_REGISTER);
-                       }  else if (directive.InList(s)) {
-                               sc.ChangeState(SCE_ASM_DIRECTIVE);
-                       } else if (directiveOperand.InList(s)) {
-                               sc.ChangeState(SCE_ASM_DIRECTIVEOPERAND);
-                       }
-                       sc.SetState(SCE_ASM_DEFAULT);
+                               char s[100];
+                               sc.GetCurrentLowered(s, sizeof(s));
+
+                               if (cpuInstruction.InList(s)) {
+                                       sc.ChangeState(SCE_ASM_CPUINSTRUCTION);
+                               } else if (mathInstruction.InList(s)) {
+                                       sc.ChangeState(SCE_ASM_MATHINSTRUCTION);
+                               } else if (registers.InList(s)) {
+                                       sc.ChangeState(SCE_ASM_REGISTER);
+                               }  else if (directive.InList(s)) {
+                                       sc.ChangeState(SCE_ASM_DIRECTIVE);
+                               } else if (directiveOperand.InList(s)) {
+                                       sc.ChangeState(SCE_ASM_DIRECTIVEOPERAND);
+                               } else if (extInstruction.InList(s)) {
+                                       sc.ChangeState(SCE_ASM_EXTINSTRUCTION);
+                               }
+                               sc.SetState(SCE_ASM_DEFAULT);
                        }
                }
                else if (sc.state == SCE_ASM_COMMENT ) {
                        }
                }
                else if (sc.state == SCE_ASM_COMMENT ) {
@@ -108,20 +126,36 @@ static void ColouriseAsmDoc(unsigned int startPos, int length, int initStyle, Wo
                        } else if (sc.ch == '\"') {
                                sc.ForwardSetState(SCE_ASM_DEFAULT);
                        } else if (sc.atLineEnd) {
                        } else if (sc.ch == '\"') {
                                sc.ForwardSetState(SCE_ASM_DEFAULT);
                        } else if (sc.atLineEnd) {
+                               sc.ChangeState(SCE_ASM_STRINGEOL);
+                               sc.ForwardSetState(SCE_ASM_DEFAULT);
+                       }
+               } else if (sc.state == SCE_ASM_CHARACTER) {
+                       if (sc.ch == '\\') {
+                               if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {
+                                       sc.Forward();
+                               }
+                       } else if (sc.ch == '\'') {
+                               sc.ForwardSetState(SCE_ASM_DEFAULT);
+                       } else if (sc.atLineEnd) {
+                               sc.ChangeState(SCE_ASM_STRINGEOL);
                                sc.ForwardSetState(SCE_ASM_DEFAULT);
                        }
                }
 
                // Determine if a new state should be entered.
                                sc.ForwardSetState(SCE_ASM_DEFAULT);
                        }
                }
 
                // Determine if a new state should be entered.
-               else if (sc.state == SCE_ASM_DEFAULT) {
+               if (sc.state == SCE_ASM_DEFAULT) {
                        if (sc.ch == ';'){
                                sc.SetState(SCE_ASM_COMMENT);
                        } else if (isdigit(sc.ch) || (sc.ch == '.' && isdigit(sc.chNext))) {
                                sc.SetState(SCE_ASM_NUMBER);
                        } else if (IsAWordStart(sc.ch)) {
                                sc.SetState(SCE_ASM_IDENTIFIER);
                        if (sc.ch == ';'){
                                sc.SetState(SCE_ASM_COMMENT);
                        } else if (isdigit(sc.ch) || (sc.ch == '.' && isdigit(sc.chNext))) {
                                sc.SetState(SCE_ASM_NUMBER);
                        } else if (IsAWordStart(sc.ch)) {
                                sc.SetState(SCE_ASM_IDENTIFIER);
-                       } else if (sc.Match('\"')) {
+                       } else if (sc.ch == '\"') {
                                sc.SetState(SCE_ASM_STRING);
                                sc.SetState(SCE_ASM_STRING);
+                       } else if (sc.ch == '\'') {
+                               sc.SetState(SCE_ASM_CHARACTER);
+                       } else if (IsAsmOperator(static_cast<char>(sc.ch))) {
+                               sc.SetState(SCE_ASM_OPERATOR);
                        }
                }
 
                        }
                }
 
@@ -135,6 +169,7 @@ static const char * const asmWordListDesc[] = {
        "Registers",
        "Directives",
        "Directive operands",
        "Registers",
        "Directives",
        "Directive operands",
+       "Extended instructions",
        0
 };
 
        0
 };
 
diff --git a/contrib/src/stc/scintilla/src/LexCLW.cxx b/contrib/src/stc/scintilla/src/LexCLW.cxx
new file mode 100644 (file)
index 0000000..e524077
--- /dev/null
@@ -0,0 +1,441 @@
+// Scintilla source code edit control
+/** @file LexClw.cxx
+ ** Lexer for Clarion.
+ **/
+// Copyright 2003 by Ron Schofield <ron@schofieldcomputer.com>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+static char MakeUpperCase(char ch) {
+       if (ch < 'a' || ch > 'z')
+               return ch;
+       else
+               return static_cast<char>(ch - 'a' + 'A');
+}
+
+static void MakeUpperCaseString(char *s) {
+       while (*s) {
+               *s = MakeUpperCase(*s);
+               s++;
+       }
+}
+
+// Is a label start character
+inline bool IsALabelStart(const int iChar) {
+       return(isalpha(iChar) || iChar == '_');
+}
+
+// Is a label character
+inline bool IsALabelCharacter(const int iChar) {
+       return(isalnum(iChar) || iChar == '_' || iChar == ':');
+}
+
+// Is the character is a ! and the the next character is not a !
+inline bool IsACommentStart(StyleContext &scDoc) {
+       return(scDoc.ch == '!' && scDoc.chNext != '!');
+}
+
+// Is the character a Clarion hex character (ABCDEF)
+inline bool IsAHexCharacter(const int iChar, bool bCaseSensitive) {
+       // Case insensitive.
+       if (!bCaseSensitive) {
+               if (strchr("ABCDEFabcdef", iChar) != NULL) {
+                       return(true);
+               }
+       }
+       // Case sensitive
+       else {
+               if (strchr("ABCDEF", iChar) != NULL) {
+                       return(true);
+               }
+       }
+       return(false);
+}
+
+// Is the character a Clarion base character (B=Binary, O=Octal, H=Hex)
+inline bool IsANumericBaseCharacter(const int iChar, bool bCaseSensitive) {
+       // Case insensitive.
+       if (!bCaseSensitive) {
+               // If character is a numeric base character
+               if (strchr("BOHboh", iChar) != NULL) {
+                       return(true);
+               }
+       }
+       // Case sensitive
+       else {
+               // If character is a numeric base character
+               if (strchr("BOH", iChar) != NULL) {
+                       return(true);
+               }
+       }
+       return(false);
+}
+
+// Set the correct numeric constant state
+inline bool SetNumericConstantState(StyleContext &scDoc) {
+       int iPoints = 0;                        // Point counter
+       char cNumericString[100];       // Numeric string buffer
+
+       // Buffer the current numberic string
+       scDoc.GetCurrent(cNumericString, sizeof(cNumericString));
+       // Loop through the string until end of string (NULL termination)
+       for (int iIndex = 0; cNumericString[iIndex] != '\0'; iIndex++) {
+               // Depending on the character
+               switch (cNumericString[iIndex]) {
+                       // Is a . (point)
+                       case '.' :
+                               // Increment point counter
+                               iPoints++;
+                               break;
+                       default :
+                               break;
+               }
+       }
+       // If points found (can be more than one for improper formatted number
+       if (iPoints > 0) {
+               return(true);
+       }
+       // Else no points found
+       else {
+               return(false);
+       }
+}
+
+// Clarion Language Colouring Procedure
+static void ColouriseClwDoc(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *wlKeywords[], Accessor &accStyler, bool bCaseSensitive) {
+
+       int iParenthesesLevel=0;                // Parenthese Level
+
+       WordList &wlClarionKeywords = *wlKeywords[0];           // Clarion Keywords
+       WordList &wlCompilerDirectives = *wlKeywords[1];        // Compiler Directives
+       WordList &wlBuiltInProcsFuncs = *wlKeywords[2];         // Builtin Procedures and Functions
+       WordList &wlStructsDataTypes = *wlKeywords[3];          // Structures and Data Types
+       WordList &wlAttributes = *wlKeywords[4];                        // Procedure Attributes
+       WordList &wlStandardEquates = *wlKeywords[5];           // Standard Equates
+       WordList &wlReservedWords = *wlKeywords[6];                     // Clarion Reserved Keywords
+
+       StyleContext scDoc(uiStartPos, iLength, iInitStyle, accStyler);
+
+       // lex source code
+    for (; scDoc.More(); scDoc.Forward())
+       {
+               //
+               // Determine if the current state should terminate.
+               //
+
+               // Label State Handling
+               if (scDoc.state == SCE_CLW_LABEL) {
+                       // If the character is not a valid label
+                       if (!IsALabelCharacter(scDoc.ch)) {
+                               // If the character is a . (dot syntax)
+                               if (scDoc.ch == '.') {
+                                       // Uncolour the . (dot) to default state, move forward one character,
+                                       // and change back to the label state.
+                                       scDoc.SetState(SCE_CLW_DEFAULT);
+                                       scDoc.Forward();
+                                       scDoc.SetState(SCE_CLW_LABEL);
+                               }
+                               // Else terminate the label state
+                               else {
+                                       char cLabel[100];               // Label buffer
+                                       // Buffer the current label string
+                                       scDoc.GetCurrent(cLabel,sizeof(cLabel));
+                                       // If case insensitive, convert string to UPPERCASE to match passed keywords.
+                                       if (!bCaseSensitive) {
+                                               MakeUpperCaseString(cLabel);
+                                       }
+                                       // If label string is in the Clarion reserved keyword list
+                                       if (wlReservedWords.InList(cLabel)){
+                                               // change to error state
+                                               scDoc.ChangeState(SCE_CLW_ERROR);
+                                       }
+                                       // Else if label string is in the compiler directive keyword list
+                                       else if (wlCompilerDirectives.InList(cLabel)) {
+                                               // change the state to compiler directive state
+                                               scDoc.ChangeState(SCE_CLW_COMPILER_DIRECTIVE);
+                                       }
+                                       // Terminate the label state and set to default state
+                                       scDoc.SetState(SCE_CLW_DEFAULT);
+                               }
+                       }
+               }
+               // Keyword State Handling
+               else if (scDoc.state == SCE_CLW_KEYWORD) {
+                       // If character is : (colon)
+                       if (scDoc.ch == ':') {
+                               char cEquate[100];              // Equate buffer
+                               // Move forward to include : (colon) in buffer
+                               scDoc.Forward();
+                               // Buffer the equate string
+                               scDoc.GetCurrent(cEquate,sizeof(cEquate));
+                               // If case insensitive, convert string to UPPERCASE to match passed keywords.
+                               if (!bCaseSensitive) {
+                                       MakeUpperCaseString(cEquate);
+                               }
+                               // If statement string is in the equate list
+                               if (wlStandardEquates.InList(cEquate)) {
+                                       // Change to equate state
+                                       scDoc.ChangeState(SCE_CLW_STANDARD_EQUATE);
+                               }
+                       }
+                       // If the character is not a valid label character
+                       else if (!IsALabelCharacter(scDoc.ch)) {
+                               char cStatement[100];           // Statement buffer
+                               // Buffer the statement string
+                               scDoc.GetCurrent(cStatement,sizeof(cStatement));
+                               // If case insensitive, convert string to UPPERCASE to match passed keywords.
+                               if (!bCaseSensitive) {
+                                       MakeUpperCaseString(cStatement);
+                               }
+                               // If statement string is in the Clarion keyword list
+                               if (wlClarionKeywords.InList(cStatement)) {
+                                       // Set to the Clarion keyword state
+                                       scDoc.ChangeState(SCE_CLW_KEYWORD);
+                               }
+                               // Else if statement string is in the compiler directive keyword list
+                               else if (wlCompilerDirectives.InList(cStatement)) {
+                                       // Set to the compiler directive state
+                                       scDoc.ChangeState(SCE_CLW_COMPILER_DIRECTIVE);
+                               }
+                               // Else if statement string is in the builtin procedures and functions keyword list
+                               else if (wlBuiltInProcsFuncs.InList(cStatement)) {
+                                       // Set to the builtin procedures and functions state
+                                       scDoc.ChangeState(SCE_CLW_BUILTIN_PROCEDURES_FUNCTION);
+                               }
+                               // Else if statement string is in the tructures and data types keyword list
+                               else if (wlStructsDataTypes.InList(cStatement)) {
+                                       // Set to the structures and data types state
+                                       scDoc.ChangeState(SCE_CLW_STRUCTURE_DATA_TYPE);
+                               }
+                               // Else if statement string is in the procedure attribute keyword list
+                               else if (wlAttributes.InList(cStatement)) {
+                                       // Set to the procedure attribute state
+                                       scDoc.ChangeState(SCE_CLW_ATTRIBUTE);
+                               }
+                               // Else if statement string is in the standard equate keyword list
+                               else if (wlStandardEquates.InList(cStatement)) {
+                                       // Set to the standard equate state
+                                       scDoc.ChangeState(SCE_CLW_STANDARD_EQUATE);
+                               }
+                               // Terminate the keyword state and set to default state
+                               scDoc.SetState(SCE_CLW_DEFAULT);
+                       }
+               }
+               // String State Handling
+               else if (scDoc.state == SCE_CLW_STRING) {
+                       // If the character is an ' (single quote)
+                       if (scDoc.ch == '\'') {
+                               // Set the state to default and move forward colouring
+                               // the ' (single quote) as default state
+                               // terminating the string state
+                               scDoc.SetState(SCE_CLW_DEFAULT);
+                               scDoc.Forward();
+                       }
+                       // If the next character is an ' (single quote)
+                       if (scDoc.chNext == '\'') {
+                               // Move forward one character and set to default state
+                               // colouring the next ' (single quote) as default state
+                               // terminating the string state
+                               scDoc.ForwardSetState(SCE_CLW_DEFAULT);
+                               scDoc.Forward();
+                       }
+               }
+               // Picture String State Handling
+               else if (scDoc.state == SCE_CLW_PICTURE_STRING) {
+                       // If the character is an ( (open parenthese)
+                       if (scDoc.ch == '(') {
+                               // Increment the parenthese level
+                               iParenthesesLevel++;
+                       }
+                       // Else if the character is a ) (close parenthese)
+                       else if (scDoc.ch == ')') {
+                               // If the parenthese level is set to zero
+                               // parentheses matched
+                               if (!iParenthesesLevel) {
+                                       scDoc.SetState(SCE_CLW_DEFAULT);
+                               }
+                               // Else parenthese level is greater than zero
+                               // still looking for matching parentheses
+                               else {
+                                       // Decrement the parenthese level
+                                       iParenthesesLevel--;
+                               }
+                       }
+               }
+               // Standard Equate State Handling
+               else if (scDoc.state == SCE_CLW_STANDARD_EQUATE) {
+                       if (!isalnum(scDoc.ch)) {
+                               scDoc.SetState(SCE_CLW_DEFAULT);
+                       }
+               }
+               // Integer Constant State Handling
+               else if (scDoc.state == SCE_CLW_INTEGER_CONSTANT) {
+                       // If the character is not a digit (0-9)
+                       // or character is not a hexidecimal character (A-F)
+                       // or character is not a . (point)
+                       // or character is not a numberic base character (B,O,H)
+                       if (!(isdigit(scDoc.ch)
+                       || IsAHexCharacter(scDoc.ch, bCaseSensitive)
+                       || scDoc.ch == '.'
+                       || IsANumericBaseCharacter(scDoc.ch, bCaseSensitive))) {
+                               // If the number was a real
+                               if (SetNumericConstantState(scDoc)) {
+                                       // Colour the matched string to the real constant state
+                                       scDoc.ChangeState(SCE_CLW_REAL_CONSTANT);
+                               }
+                               // Else the number was an integer
+                               else {
+                                       // Colour the matched string to an integer constant state
+                                       scDoc.ChangeState(SCE_CLW_INTEGER_CONSTANT);
+                               }
+                               // Terminate the integer constant state and set to default state
+                               scDoc.SetState(SCE_CLW_DEFAULT);
+                       }
+               }
+
+               //
+               // Determine if a new state should be entered.
+               //
+
+               // Beginning of Line Handling
+               if (scDoc.atLineStart) {
+                       // If column 1 character is a label start character
+                       if (IsALabelStart(scDoc.ch)) {
+                               // Set the state to label
+                               scDoc.SetState(SCE_CLW_LABEL);
+                       }
+                       // else if character is a space or tab
+                       else if (IsASpace(scDoc.ch)){
+                               // Set to default state
+                               scDoc.SetState(SCE_CLW_DEFAULT);
+                       }
+                       // else if the start of a comment or is an * (asterisk)
+                       else if (IsACommentStart(scDoc) || scDoc.ch == '*' ) {
+                               // then set the state to comment.
+                               scDoc.SetState(SCE_CLW_COMMENT);
+                       }
+                       // else the character is a ? (question mark)
+                       else if (scDoc.ch == '?') {
+                               // Change to the compiler directive state, move forward,
+                               // colouring the ? (question mark), change back to default state.
+                               scDoc.ChangeState(SCE_CLW_COMPILER_DIRECTIVE);
+                               scDoc.Forward();
+                               scDoc.SetState(SCE_CLW_DEFAULT);
+                       }
+                       // else an invalid character in column 1
+                       else {
+                               // Set to error state
+                               scDoc.SetState(SCE_CLW_ERROR);
+                       }
+               }
+               // End of Line Handling
+               else if (scDoc.atLineEnd) {
+                       // Reset to the default state at the end of each line.
+                       scDoc.SetState(SCE_CLW_DEFAULT);
+               }
+               // Default Handling
+               else {
+                       // If in default state
+                       if (scDoc.state == SCE_CLW_DEFAULT) {
+                               // If is a letter could be a possible statement
+                               if (isalpha(scDoc.ch)) {
+                                       // Set the state to Clarion Keyword and verify later
+                                       scDoc.SetState(SCE_CLW_KEYWORD);
+                               }
+                               // else is a number
+                               else if (isdigit(scDoc.ch)) {
+                                       // Set the state to Integer Constant and verify later
+                                       scDoc.SetState(SCE_CLW_INTEGER_CONSTANT);
+                               }
+                               // else if the start of a comment or a | (line continuation)
+                               else if (IsACommentStart(scDoc) || scDoc.ch == '|') {
+                                       // then set the state to comment.
+                                       scDoc.SetState(SCE_CLW_COMMENT);
+                               }
+                               // else if the character is a ' (single quote)
+                               else if (scDoc.ch == '\'') {
+                                       // If the character is also a ' (single quote)
+                                       // Embedded Apostrophe
+                                       if (scDoc.chNext == '\'') {
+                                               // Move forward colouring it as default state
+                                               scDoc.ForwardSetState(SCE_CLW_DEFAULT);
+                                       }
+                                       else {
+                                               // move to the next character and then set the state to comment.
+                                               scDoc.ForwardSetState(SCE_CLW_STRING);
+                                       }
+                               }
+                               // else the character is an @ (apersand)
+                               else if (scDoc.ch == '@') {
+                                       // Case insensitive.
+                                       if (!bCaseSensitive) {
+                                               // If character is a valid picture token character
+                                               if (strchr("DEKNPSTdeknpst", scDoc.chNext) != NULL) {
+                                                       // Set to the picture string state
+                                                       scDoc.SetState(SCE_CLW_PICTURE_STRING);
+                                               }
+                                       }
+                                       // Case sensitive
+                                       else {
+                                               // If character is a valid picture token character
+                                               if (strchr("DEKNPST", scDoc.chNext) != NULL) {
+                                                       // Set the picture string state
+                                                       scDoc.SetState(SCE_CLW_PICTURE_STRING);
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+       // lexing complete
+       scDoc.Complete();
+}
+
+// Clarion Language Case Sensitive Colouring Procedure
+static void ColouriseClwDocSensitive(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *wlKeywords[], Accessor &accStyler) {
+       ColouriseClwDoc(uiStartPos, iLength, iInitStyle, wlKeywords, accStyler, true);
+}
+
+// Clarion Language Case Insensitive Colouring Procedure
+static void ColouriseClwDocInsensitive(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *wlKeywords[], Accessor &accStyler) {
+       ColouriseClwDoc(uiStartPos, iLength, iInitStyle, wlKeywords, accStyler, false);
+}
+
+// Clarion Language Folding Procedure
+#ifdef FOLDING_IMPLEMENTED
+static void FoldClwDoc(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *wlKeywords[], Accessor &accStyler) {
+
+}
+#endif
+
+// Word List Descriptions
+static const char * const rgWordListDescriptions[] = {
+       "Clarion Keywords",
+       "Compiler Directives",
+       "Built-in Procedures and Functions",
+       "Structure and Data Types",
+       "Attributes",
+       "Standard Equates",
+       "Reserved Words",
+       0,
+};
+
+// Case Sensitive Clarion Language Lexer
+LexerModule lmClw(SCLEX_CLW, ColouriseClwDocSensitive, "clw", NULL, rgWordListDescriptions);
+
+// Case Insensitive Clarion Language Lexer
+LexerModule lmClwNoCase(SCLEX_CLWNOCASE, ColouriseClwDocInsensitive, "clwnocase", NULL, rgWordListDescriptions);
diff --git a/contrib/src/stc/scintilla/src/LexErlang.cxx b/contrib/src/stc/scintilla/src/LexErlang.cxx
new file mode 100644 (file)
index 0000000..9444eb9
--- /dev/null
@@ -0,0 +1,522 @@
+// Scintilla source code edit control
+/** @file LexErlang.cxx
+ ** Lexer for Erlang.
+ ** Written by Peter-Henry Mander, based on Matlab lexer by José Fonseca
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+/*
+   TODO:
+   o  _Param should be a new lexical type
+*/
+
+static int is_radix(int radix, int ch) {
+   int digit;
+   if ( 16 < radix || 2 > radix ) {
+      return 0;
+   }
+   if ( isdigit(ch) ) {
+      digit = ch - '0';
+   } else if ( isxdigit(ch) ) {
+      digit = toupper(ch) - 'A' + 10;
+   } else {
+      return 0;
+   }
+   if ( digit < radix ) {
+      return 1;
+   } else {
+      return 0;
+   }
+}
+
+typedef enum {
+   STATE_NULL,
+   ATOM_UNQUOTED,
+   ATOM_QUOTED,
+   ATOM_FUN_NAME,
+   NODE_NAME_UNQUOTED,
+   NODE_NAME_QUOTED,
+   MACRO_START,
+   MACRO_UNQUOTED,
+   MACRO_QUOTED,
+   RECORD_START,
+   RECORD_UNQUOTED,
+   RECORD_QUOTED,
+   NUMERAL_START,
+   NUMERAL_SIGNED,
+   NUMERAL_RADIX_LITERAL,
+   NUMERAL_SPECULATIVE_MANTISSA,
+   NUMERAL_FLOAT_MANTISSA,
+   NUMERAL_FLOAT_EXPONENT,
+   NUMERAL_FLOAT_SIGNED_EXPONENT,
+   PARSE_ERROR
+} atom_parse_state_t;
+
+static void ColouriseErlangDoc(unsigned int startPos, int length, int initStyle,
+                               WordList *keywordlists[], Accessor &styler) {
+
+       WordList &keywords = *keywordlists[0];
+
+       styler.StartAt(startPos);
+
+       StyleContext sc(startPos, length, initStyle, styler);
+   atom_parse_state_t parse_state = STATE_NULL;
+   int radix_digits = 0;
+   int exponent_digits = 0;
+       for (; sc.More(); sc.Forward()) {
+      if ( STATE_NULL != parse_state ) {
+         switch (parse_state) {
+         case STATE_NULL:
+                               sc.SetState(SCE_ERLANG_DEFAULT);
+            break;
+         case ATOM_UNQUOTED:
+            if ( '@' == sc.ch ){
+               parse_state = NODE_NAME_UNQUOTED;
+            } else if ( !isalnum(sc.ch) && sc.ch != '_' ) {
+               char s[100];
+               sc.GetCurrent(s, sizeof(s));
+               if (keywords.InList(s)) {
+                  sc.ChangeState(SCE_ERLANG_KEYWORD);
+                  sc.SetState(SCE_ERLANG_DEFAULT);
+                  parse_state = STATE_NULL;
+               } else {
+                  if ( '/' == sc.ch ) {
+                     parse_state = ATOM_FUN_NAME;
+                  } else {
+                     sc.ChangeState(SCE_ERLANG_ATOM);
+                     sc.SetState(SCE_ERLANG_DEFAULT);
+                     parse_state = STATE_NULL;
+                  }
+               }
+            }
+            break;
+         case ATOM_QUOTED:
+            if ( '@' == sc.ch ){
+               parse_state = NODE_NAME_QUOTED;
+            } else if ( '\'' == sc.ch && '\\' != sc.chPrev ) {
+               sc.ChangeState(SCE_ERLANG_ATOM);
+               sc.ForwardSetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            }
+            break;
+         case ATOM_FUN_NAME:
+            if ( !isdigit(sc.ch) ) {
+               sc.ChangeState(SCE_ERLANG_FUNCTION_NAME);
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            }
+            break;
+         case NODE_NAME_QUOTED:
+            if ( '@' == sc.ch ) {
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            } else if ( '\'' == sc.ch && '\\' != sc.chPrev ) {
+               sc.ChangeState(SCE_ERLANG_NODE_NAME);
+               sc.ForwardSetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            }
+            break;
+         case NODE_NAME_UNQUOTED:
+            if ( '@' == sc.ch ) {
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            } else if ( !isalnum(sc.ch) && sc.ch != '_' ) {
+               sc.ChangeState(SCE_ERLANG_NODE_NAME);
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            }
+            break;
+         case RECORD_START:
+            if ( '\'' == sc.ch ) {
+               parse_state = RECORD_QUOTED;
+            } else if (isalpha(sc.ch) && islower(sc.ch)) {
+               parse_state = RECORD_UNQUOTED;
+            } else { // error
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            }
+            break;
+         case RECORD_QUOTED:
+            if ( '\'' == sc.ch && '\\' != sc.chPrev ) {
+               sc.ChangeState(SCE_ERLANG_RECORD);
+               sc.ForwardSetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            }
+            break;
+         case RECORD_UNQUOTED:
+            if ( !isalpha(sc.ch) && '_' != sc.ch ) {
+               sc.ChangeState(SCE_ERLANG_RECORD);
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            }
+            break;
+         case MACRO_START:
+            if ( '\'' == sc.ch ) {
+               parse_state = MACRO_QUOTED;
+            } else if (isalpha(sc.ch)) {
+               parse_state = MACRO_UNQUOTED;
+            } else { // error
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            }
+            break;
+         case MACRO_UNQUOTED:
+            if ( !isalpha(sc.ch) && '_' != sc.ch ) {
+               sc.ChangeState(SCE_ERLANG_MACRO);
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            }
+            break;
+         case MACRO_QUOTED:
+            if ( '\'' == sc.ch && '\\' != sc.chPrev ) {
+               sc.ChangeState(SCE_ERLANG_MACRO);
+               sc.ForwardSetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            }
+            break;
+         case NUMERAL_START:
+            if ( isdigit(sc.ch) ) {
+               radix_digits *= 10;
+               radix_digits += sc.ch - '0'; // Assuming ASCII here!
+            } else if ( '#' == sc.ch ) {
+               if ( 2 > radix_digits || 16 < radix_digits) {
+                  sc.SetState(SCE_ERLANG_DEFAULT);
+                  parse_state = STATE_NULL;
+               } else {
+                  parse_state = NUMERAL_RADIX_LITERAL;
+               }
+            } else if ( '.' == sc.ch && isdigit(sc.chNext)) {
+               radix_digits = 0;
+               parse_state = NUMERAL_FLOAT_MANTISSA;
+            } else if ( 'e' == sc.ch || 'E' == sc.ch ) {
+               exponent_digits = 0;
+               parse_state = NUMERAL_FLOAT_EXPONENT;
+            } else {
+               radix_digits = 0;
+               sc.ChangeState(SCE_ERLANG_NUMBER);
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            }
+            break;
+         case NUMERAL_RADIX_LITERAL:
+            if ( !is_radix(radix_digits,sc.ch) ) {
+               radix_digits = 0;
+               if ( !isalnum(sc.ch) ) {
+                  sc.ChangeState(SCE_ERLANG_NUMBER);
+               }
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            }
+            break;
+         case NUMERAL_FLOAT_MANTISSA:
+            if ( 'e' == sc.ch || 'E' == sc.ch ) {
+               exponent_digits = 0;
+               parse_state = NUMERAL_FLOAT_EXPONENT;
+            } else if ( !isdigit(sc.ch) ) {
+               sc.ChangeState(SCE_ERLANG_NUMBER);
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            }
+            break;
+         case NUMERAL_FLOAT_EXPONENT:
+            if ( '-' == sc.ch || '+' == sc.ch ) {
+               parse_state = NUMERAL_FLOAT_SIGNED_EXPONENT;
+            } else if ( !isdigit(sc.ch) ) {
+               if ( 0 < exponent_digits ) {
+                  sc.ChangeState(SCE_ERLANG_NUMBER);
+               }
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            } else {
+               ++exponent_digits;
+            }
+            break;
+         case NUMERAL_FLOAT_SIGNED_EXPONENT:
+            if ( !isdigit(sc.ch) ) {
+               if ( 0 < exponent_digits ) {
+                  sc.ChangeState(SCE_ERLANG_NUMBER);
+               }
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            } else {
+               ++exponent_digits;
+            }
+            break;
+         case NUMERAL_SIGNED:
+            if ( !isdigit(sc.ch) ) {
+               sc.ChangeState(SCE_ERLANG_NUMBER);
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            } else if ( '.' == sc.ch ) {
+               parse_state = NUMERAL_FLOAT_MANTISSA;
+            }
+            break;
+         case NUMERAL_SPECULATIVE_MANTISSA:
+            if ( !isdigit(sc.ch) ) {
+               sc.ChangeState(SCE_ERLANG_OPERATOR);
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            } else {
+               parse_state = NUMERAL_FLOAT_MANTISSA;
+            }
+            break;
+         case PARSE_ERROR:
+                               sc.SetState(SCE_ERLANG_DEFAULT);
+            parse_state = STATE_NULL;
+            break;
+         }
+      } else if (sc.state == SCE_ERLANG_OPERATOR) {
+                       if (sc.chPrev == '.') {
+                               if (sc.ch == '*' || sc.ch == '/' || sc.ch == '\\' || sc.ch == '^') {
+                                       sc.ForwardSetState(SCE_ERLANG_DEFAULT);
+                               } else if (sc.ch == '\'') {
+                                       sc.ForwardSetState(SCE_ERLANG_DEFAULT);
+                               } else {
+                                       sc.SetState(SCE_ERLANG_DEFAULT);
+                               }
+                       } else {
+                               sc.SetState(SCE_ERLANG_DEFAULT);
+                       }
+               } else if (sc.state == SCE_ERLANG_VARIABLE) {
+                       if (!isalnum(sc.ch) && sc.ch != '_') {
+            sc.SetState(SCE_ERLANG_DEFAULT);
+                       }
+               } else if (sc.state == SCE_ERLANG_STRING) {
+                       if (sc.ch == '\"' && sc.chPrev != '\\') {
+                               sc.ForwardSetState(SCE_ERLANG_DEFAULT);
+                       }
+               } else if (sc.state == SCE_ERLANG_COMMENT ) {
+                       if (sc.atLineEnd) {
+                               sc.SetState(SCE_ERLANG_DEFAULT);
+                       }
+      } else if (sc.state == SCE_ERLANG_CHARACTER ) {
+         if ( sc.chPrev == '\\' ) {
+            sc.ForwardSetState(SCE_ERLANG_DEFAULT);
+         } else if ( sc.ch != '\\' ) {
+            sc.ForwardSetState(SCE_ERLANG_DEFAULT);
+         }
+      }
+
+               if (sc.state == SCE_ERLANG_DEFAULT) {
+                       if (sc.ch == '%') {
+                               sc.SetState(SCE_ERLANG_COMMENT);
+                       } else if (sc.ch == '\"') {
+            sc.SetState(SCE_ERLANG_STRING);
+         } else if (sc.ch == '#') {
+            parse_state = RECORD_START;
+                               sc.SetState(SCE_ERLANG_UNKNOWN);
+         } else if (sc.ch == '?') {
+            parse_state = MACRO_START;
+                               sc.SetState(SCE_ERLANG_UNKNOWN);
+         } else if (sc.ch == '$') {
+                               sc.SetState(SCE_ERLANG_CHARACTER);
+         } else if (sc.ch == '\'') {
+            parse_state = ATOM_QUOTED;
+                               sc.SetState(SCE_ERLANG_UNKNOWN);
+                       } else if ( isdigit(sc.ch) ) {
+            parse_state = NUMERAL_START;
+            radix_digits = sc.ch - '0';
+                               sc.SetState(SCE_ERLANG_UNKNOWN);
+         } else if ( '.' == sc.ch ) {
+            parse_state = NUMERAL_SPECULATIVE_MANTISSA;
+                               sc.SetState(SCE_ERLANG_UNKNOWN);
+                       } else if (isalpha(sc.ch) && isupper(sc.ch)) {
+                               sc.SetState(SCE_ERLANG_VARIABLE);
+                       } else if (isalpha(sc.ch)) {
+            parse_state = ATOM_UNQUOTED;
+                               sc.SetState(SCE_ERLANG_UNKNOWN);
+                       } else if (isoperator(static_cast<char>(sc.ch)) || sc.ch == '\\') {
+                               sc.SetState(SCE_ERLANG_OPERATOR);
+                       }
+               }
+       }
+       sc.Complete();
+}
+
+static int ClassifyFoldPointErlang(
+   Accessor &styler,
+   int styleNext,
+   int keyword_start
+) {
+       int lev = 0;
+   if ( styler.Match(keyword_start,"case")
+      || (
+            styler.Match(keyword_start,"fun")
+         && SCE_ERLANG_FUNCTION_NAME != styleNext)
+      || styler.Match(keyword_start,"if")
+      || styler.Match(keyword_start,"query")
+      || styler.Match(keyword_start,"receive")
+   ) {
+      ++lev;
+   } else if ( styler.Match(keyword_start,"end") ) {
+      --lev;
+   }
+       return lev;
+}
+
+
+static void FoldErlangDoc(
+   unsigned int startPos, int length, int initStyle,
+   WordList** /*keywordlists*/, Accessor &styler
+) {
+       unsigned int endPos = startPos + length;
+       //~ int visibleChars = 0;
+       int lineCurrent = styler.GetLine(startPos);
+       int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
+       int levelCurrent = levelPrev;
+       char chNext = styler.SafeGetCharAt(startPos);
+       int styleNext = styler.StyleAt(startPos);
+       int style = initStyle;
+       int keyword_start = 0;
+
+   bool fold_keywords = true;
+   bool fold_comments = true;
+   bool fold_braces = true;
+   bool fold_function_clauses = false;
+   bool fold_clauses = false;
+
+   //int clause_level = 0;
+
+       for (unsigned int i = startPos; i < endPos; i++) {
+               char ch = chNext;
+               chNext = styler.SafeGetCharAt(i + 1);
+               int stylePrev = style;
+               style = styleNext;
+               styleNext = styler.StyleAt(i + 1);
+               bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
+
+      if ( (stylePrev != SCE_ERLANG_KEYWORD) && (style == SCE_ERLANG_KEYWORD) ) {
+         keyword_start = i;
+      }
+      if ( fold_keywords ) {
+         if ( (stylePrev == SCE_ERLANG_KEYWORD)
+            && (style != SCE_ERLANG_KEYWORD)
+            && (style != SCE_ERLANG_ATOM)
+         ) {
+            levelCurrent += ClassifyFoldPointErlang(styler,styleNext,keyword_start);
+         }
+      }
+
+      if ( fold_comments ) {
+         if (style == SCE_ERLANG_COMMENT) {
+            if ((ch == '%') && (chNext == '{')) {
+               levelCurrent++;
+            } else if ((ch == '%') && (chNext == '}')) {
+               levelCurrent--;
+            }
+         }
+      }
+
+      if ( fold_function_clauses ) {
+         if ( (SC_FOLDLEVELBASE == levelCurrent) /*&& (style == SCE_ERLANG_OPERATOR)*/ ) {
+            if ( (ch == '-') && (chNext == '>')) {
+               //~ fprintf(stderr,"levelCurrent=%d\n", levelCurrent);
+               //++clause_level;
+               //~ if ( 0 < clause_level )
+                  ++levelCurrent;
+            }
+         }
+         //~ if (  (stylePrev != SCE_ERLANG_RECORD)
+            //~ && (style != SCE_ERLANG_NUMBER)
+            //~ && (style != SCE_ERLANG_STRING)
+            //~ && (style != SCE_ERLANG_COMMENT)
+         //~ ) {
+            if ( (SC_FOLDLEVELBASE+1 == levelCurrent) && (ch == '.') ) {
+               //--clause_level;
+               //~ if ( 0 == clause_level )
+                  --levelCurrent;
+            }
+         //~ }
+      }
+
+      if ( fold_clauses ) {
+         if ( (0 < levelCurrent) && (style == SCE_ERLANG_OPERATOR) ) {
+            if ((ch == '-') && (chNext == '>')) {
+               levelCurrent++;
+            }
+            if ( (ch == ';') ) {
+               levelCurrent--;
+            }
+         }
+         if ( (stylePrev != SCE_ERLANG_RECORD)
+            && (style != SCE_ERLANG_NUMBER)
+            && (style != SCE_ERLANG_STRING)
+            && (style != SCE_ERLANG_COMMENT)
+         ) {
+            if ( (ch == '.') ) {
+               levelCurrent--;
+            }
+         }
+         if (  (stylePrev == SCE_ERLANG_KEYWORD)
+            && (style != SCE_ERLANG_KEYWORD)
+            && (style != SCE_ERLANG_ATOM)
+            && (
+               styler.Match(keyword_start,"end") // 'end' counted twice if fold_keywords too
+               || styler.Match(keyword_start,"after") )
+         ) {
+            levelCurrent--;
+         }
+      }
+
+      if ( fold_braces ) {
+         if (style == SCE_ERLANG_OPERATOR) {
+            if ( (ch == '{') || (ch == '(') || (ch == '[') ) {
+               levelCurrent++;
+            } else if ( (ch == '}') || (ch == ')') || (ch == ']') ) {
+               levelCurrent--;
+            }
+         }
+      }
+
+               if (atEOL) {
+                       int lev = levelPrev;
+                       //~ if (visibleChars == 0 && foldCompact)
+                               //~ lev |= SC_FOLDLEVELWHITEFLAG;
+                       //~ if ((levelCurrent > levelPrev) && (visibleChars > 0))
+                       if ((levelCurrent > levelPrev)) {
+                               lev |= SC_FOLDLEVELHEADERFLAG;
+         }
+                       if (lev != styler.LevelAt(lineCurrent)) {
+                               styler.SetLevel(lineCurrent, lev);
+                       }
+                       lineCurrent++;
+                       levelPrev = levelCurrent;
+                       //~ visibleChars = 0;
+               }
+               //~ if (!isspacechar(ch))
+                       //~ visibleChars++;
+
+       }
+       // Fill in the real level of the next line, keeping the current flags as they will be filled in later
+       int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
+       styler.SetLevel(lineCurrent, levelPrev | flagsNext);
+}
+
+static const char * const erlangWordListDesc[] = {
+       "Keywords",
+       0
+};
+
+LexerModule lmErlang(
+   SCLEX_ERLANG,
+   ColouriseErlangDoc,
+   "erlang",
+   FoldErlangDoc,
+   erlangWordListDesc);
+
diff --git a/contrib/src/stc/scintilla/src/LexForth.cxx b/contrib/src/stc/scintilla/src/LexForth.cxx
new file mode 100644 (file)
index 0000000..3f12815
--- /dev/null
@@ -0,0 +1,348 @@
+// Scintilla source code edit control
+/** @file LexCrontab.cxx
+ ** Lexer to use with extended crontab files used by a powerful
+ ** Windows scheduler/event monitor/automation manager nnCron.
+ ** (http://nemtsev.eserv.ru/)
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+bool is_whitespace(int ch){
+    return ch == '\n' || ch == '\r' || ch == '\t' || ch == ' ';
+}
+
+bool is_blank(int ch){
+    return ch == '\t' || ch == ' ';
+}
+//#define FORTH_DEBUG
+#ifdef FORTH_DEBUG
+static FILE *f_debug;
+#define log(x)  fputs(f_debug,x);
+#else
+#define log(x)
+#endif
+
+#define STATE_LOCALE
+#define BL ' '
+
+static Accessor *st;
+static int cur_pos,pos1,pos2,pos0,lengthDoc;
+char *buffer;
+
+char getChar(bool is_bl){
+    char ch=st->SafeGetCharAt(cur_pos);
+    if(is_bl) if(is_whitespace(ch)) ch=BL;
+    return ch;
+}
+
+char getCharBL(){
+    char ch=st->SafeGetCharAt(cur_pos);
+    return ch;
+}
+bool is_eol(char ch){
+    return ch=='\n' || ch=='\r';
+}
+
+int parse(char ch, bool skip_eol){
+// pos1 - start pos of word
+// pos2 - pos after of word
+// pos0 - start pos
+    char c=0;
+    int len;
+    bool is_bl=ch==BL;
+    pos0=pos1=pos2=cur_pos;
+    for(;cur_pos<lengthDoc && (c=getChar(is_bl))==ch; cur_pos++){
+        if(is_eol(c) && !skip_eol){
+            pos2=pos1;
+            return 0;
+        }
+    }
+    pos1=cur_pos;
+    pos2=pos1;
+    if(cur_pos==lengthDoc) return 0;
+    for(len=0;cur_pos<lengthDoc && (c=getChar(is_bl))!=ch; cur_pos++){
+        if(is_eol(c) && !skip_eol) break;
+        pos2++;
+        buffer[len++]=c;
+    }
+    if(c==ch) pos2--;
+    buffer[len]='\0';
+#ifdef FORTH_DEBUG
+    fprintf(f_debug,"parse: %c %s\n",ch,buffer);
+#endif
+    return len;
+}
+
+bool _is_number(char *s,int base){
+    for(;*s;s++){
+        int digit=((int)*s)-(int)'0';
+#ifdef FORTH_DEBUG
+    fprintf(f_debug,"digit: %c %d\n",*s,digit);
+#endif
+        if(digit>9 && base>10) digit-=7;
+        if(digit<0) return false;
+        if(digit>=base) return false;
+    }
+    return true;
+}
+
+bool is_number(char *s){
+    if(strncmp(s,"0x",2)==0) return _is_number(s+2,16);
+    return _is_number(s,10);
+}
+
+static void ColouriseForthDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler)
+{
+    st=&styler;
+    cur_pos=startPos;
+    lengthDoc = startPos + length;
+    buffer = new char[length];
+
+#ifdef FORTH_DEBUG
+    f_debug=fopen("c:\\sci.log","at");
+#endif
+
+    WordList &control = *keywordLists[0];
+    WordList &keyword = *keywordLists[1];
+    WordList &defword = *keywordLists[2];
+    WordList &preword1 = *keywordLists[3];
+    WordList &preword2 = *keywordLists[4];
+    WordList &strings = *keywordLists[5];
+
+    // go through all provided text segment
+    // using the hand-written state machine shown below
+    styler.StartAt(startPos);
+    styler.StartSegment(startPos);
+    while(parse(BL,true)!=0){
+        if(pos0!=pos1){
+            styler.ColourTo(pos0,SCE_FORTH_DEFAULT);
+            styler.ColourTo(pos1-1,SCE_FORTH_DEFAULT);
+        }
+        if(strcmp("\\",buffer)==0){
+            styler.ColourTo(pos1,SCE_FORTH_COMMENT);
+            parse(1,false);
+            styler.ColourTo(pos2,SCE_FORTH_COMMENT);
+        }else if(strcmp("(",buffer)==0){
+            styler.ColourTo(pos1,SCE_FORTH_COMMENT);
+            parse(')',true);
+            if(cur_pos<lengthDoc) cur_pos++;
+            styler.ColourTo(cur_pos,SCE_FORTH_COMMENT);
+        }else if(strcmp("[",buffer)==0){
+            styler.ColourTo(pos1,SCE_FORTH_STRING);
+            parse(']',true);
+            if(cur_pos<lengthDoc) cur_pos++;
+            styler.ColourTo(cur_pos,SCE_FORTH_STRING);
+        }else if(strcmp("{",buffer)==0){
+            styler.ColourTo(pos1,SCE_FORTH_LOCALE);
+            parse('}',false);
+            if(cur_pos<lengthDoc) cur_pos++;
+            styler.ColourTo(cur_pos,SCE_FORTH_LOCALE);
+        }else if(strings.InList(buffer)) {
+            styler.ColourTo(pos1,SCE_FORTH_STRING);
+            parse('"',false);
+            if(cur_pos<lengthDoc) cur_pos++;
+            styler.ColourTo(cur_pos,SCE_FORTH_STRING);
+        }else if(control.InList(buffer)) {
+            styler.ColourTo(pos1,SCE_FORTH_CONTROL);
+            styler.ColourTo(pos2,SCE_FORTH_CONTROL);
+        }else if(keyword.InList(buffer)) {
+            styler.ColourTo(pos1,SCE_FORTH_KEYWORD);
+            styler.ColourTo(pos2,SCE_FORTH_KEYWORD);
+        }else if(defword.InList(buffer)) {
+            styler.ColourTo(pos1,SCE_FORTH_KEYWORD);
+            styler.ColourTo(pos2,SCE_FORTH_KEYWORD);
+            parse(BL,false);
+            styler.ColourTo(pos1-1,SCE_FORTH_DEFAULT);
+            styler.ColourTo(pos1,SCE_FORTH_DEFWORD);
+            styler.ColourTo(pos2,SCE_FORTH_DEFWORD);
+        }else if(preword1.InList(buffer)) {
+            styler.ColourTo(pos1,SCE_FORTH_PREWORD1);
+            parse(BL,false);
+            styler.ColourTo(pos2,SCE_FORTH_PREWORD1);
+        }else if(preword2.InList(buffer)) {
+            styler.ColourTo(pos1,SCE_FORTH_PREWORD2);
+            parse(BL,false);
+            styler.ColourTo(pos2,SCE_FORTH_PREWORD2);
+            parse(BL,false);
+            styler.ColourTo(pos1,SCE_FORTH_STRING);
+            styler.ColourTo(pos2,SCE_FORTH_STRING);
+        }else if(is_number(buffer)){
+            styler.ColourTo(pos1,SCE_FORTH_NUMBER);
+            styler.ColourTo(pos2,SCE_FORTH_NUMBER);
+        }
+    }
+#ifdef FORTH_DEBUG
+    fclose(f_debug);
+#endif
+    delete []buffer;
+    return;
+/*
+                        if(control.InList(buffer)) {
+                            styler.ColourTo(i,SCE_FORTH_CONTROL);
+                        } else if(keyword.InList(buffer)) {
+                            styler.ColourTo(i-1,SCE_FORTH_KEYWORD );
+                        } else if(defword.InList(buffer)) {
+                            styler.ColourTo(i-1,SCE_FORTH_DEFWORD );
+//                            prev_state=SCE_FORTH_DEFWORD
+                        } else if(preword1.InList(buffer)) {
+                            styler.ColourTo(i-1,SCE_FORTH_PREWORD1 );
+//                            state=SCE_FORTH_PREWORD1;
+                        } else if(preword2.InList(buffer)) {
+                            styler.ColourTo(i-1,SCE_FORTH_PREWORD2 );
+                         } else {
+                            styler.ColourTo(i-1,SCE_FORTH_DEFAULT);
+                        }
+*/
+/*
+    chPrev=' ';
+    for (int i = startPos; i < lengthDoc; i++) {
+        char ch = chNext;
+        chNext = styler.SafeGetCharAt(i + 1);
+        if(i!=startPos) chPrev=styler.SafeGetCharAt(i - 1);
+
+        if (styler.IsLeadByte(ch)) {
+            chNext = styler.SafeGetCharAt(i + 2);
+            i++;
+            continue;
+        }
+#ifdef FORTH_DEBUG
+        fprintf(f_debug,"%c %d ",ch,state);
+#endif
+        switch(state) {
+            case SCE_FORTH_DEFAULT:
+                if(is_whitespace(ch)) {
+                    // whitespace is simply ignored here...
+                    styler.ColourTo(i,SCE_FORTH_DEFAULT);
+                    break;
+                } else if( ch == '\\' && is_blank(chNext)) {
+                    // signals the start of an one line comment...
+                    state = SCE_FORTH_COMMENT;
+                    styler.ColourTo(i,SCE_FORTH_COMMENT);
+                } else if( is_whitespace(chPrev) &&  ch == '(' &&  is_whitespace(chNext)) {
+                    // signals the start of a plain comment...
+                    state = SCE_FORTH_COMMENT_ML;
+                    styler.ColourTo(i,SCE_FORTH_COMMENT_ML);
+                } else if( isdigit(ch) ) {
+                    // signals the start of a number
+                    bufferCount = 0;
+                    buffer[bufferCount++] = ch;
+                    state = SCE_FORTH_NUMBER;
+                } else if( !is_whitespace(ch)) {
+                    // signals the start of an identifier
+                    bufferCount = 0;
+                    buffer[bufferCount++] = ch;
+                    state = SCE_FORTH_IDENTIFIER;
+                } else {
+                    // style it the default style..
+                    styler.ColourTo(i,SCE_FORTH_DEFAULT);
+                }
+                break;
+
+            case SCE_FORTH_COMMENT:
+                // if we find a newline here,
+                // we simply go to default state
+                // else continue to work on it...
+                if( ch == '\n' || ch == '\r' ) {
+                    state = SCE_FORTH_DEFAULT;
+                } else {
+                    styler.ColourTo(i,SCE_FORTH_COMMENT);
+                }
+                break;
+
+            case SCE_FORTH_COMMENT_ML:
+                if( ch == ')') {
+                    state = SCE_FORTH_DEFAULT;
+                } else {
+                    styler.ColourTo(i+1,SCE_FORTH_COMMENT_ML);
+                }
+                break;
+
+            case SCE_FORTH_IDENTIFIER:
+                // stay  in CONF_IDENTIFIER state until we find a non-alphanumeric
+                if( !is_whitespace(ch) ) {
+                    buffer[bufferCount++] = ch;
+                } else {
+                    state = SCE_FORTH_DEFAULT;
+                    buffer[bufferCount] = '\0';
+#ifdef FORTH_DEBUG
+        fprintf(f_debug,"\nid %s\n",buffer);
+#endif
+
+                    // check if the buffer contains a keyword,
+                    // and highlight it if it is a keyword...
+//                    switch(prev_state)
+//                    case SCE_FORTH_DEFAULT:
+                        if(control.InList(buffer)) {
+                            styler.ColourTo(i,SCE_FORTH_CONTROL);
+                        } else if(keyword.InList(buffer)) {
+                            styler.ColourTo(i-1,SCE_FORTH_KEYWORD );
+                        } else if(defword.InList(buffer)) {
+                            styler.ColourTo(i-1,SCE_FORTH_DEFWORD );
+//                            prev_state=SCE_FORTH_DEFWORD
+                        } else if(preword1.InList(buffer)) {
+                            styler.ColourTo(i-1,SCE_FORTH_PREWORD1 );
+//                            state=SCE_FORTH_PREWORD1;
+                        } else if(preword2.InList(buffer)) {
+                            styler.ColourTo(i-1,SCE_FORTH_PREWORD2 );
+                         } else {
+                            styler.ColourTo(i-1,SCE_FORTH_DEFAULT);
+                        }
+//                        break;
+//                    case
+
+                    // push back the faulty character
+                    chNext = styler[i--];
+                }
+                break;
+
+            case SCE_FORTH_NUMBER:
+                // stay  in CONF_NUMBER state until we find a non-numeric
+                if( isdigit(ch) ) {
+                    buffer[bufferCount++] = ch;
+                } else {
+                    state = SCE_FORTH_DEFAULT;
+                    buffer[bufferCount] = '\0';
+                    // Colourize here... (normal number)
+                    styler.ColourTo(i-1,SCE_FORTH_NUMBER);
+                    // push back a character
+                    chNext = styler[i--];
+                }
+                break;
+        }
+    }
+#ifdef FORTH_DEBUG
+    fclose(f_debug);
+#endif
+    delete []buffer;
+*/
+}
+
+static void FoldForthDoc(unsigned int, int, int, WordList *[],
+                       Accessor &) {
+}
+
+static const char * const forthWordLists[] = {
+            "control keywords",
+            "keywords",
+            "definition words",
+            "prewords with one argument",
+            "prewords with two arguments",
+            "string definition keywords",
+            0,
+        };
+
+LexerModule lmForth(SCLEX_FORTH, ColouriseForthDoc, "forth",FoldForthDoc,forthWordLists);
index e2109a0ab59c03f0434db4176badc35e53e660b0..0cc7342e69134535e4d329e3e4cd5449d77de823 100644 (file)
@@ -1,51 +1,63 @@
 // Scintilla source code edit control
 /** @file LexFortran.cxx
  ** Lexer for Fortran.
 // Scintilla source code edit control
 /** @file LexFortran.cxx
  ** Lexer for Fortran.
- ** Writen by Chuan-jian Shen, Last changed Nov. 2002
+ ** Writen by Chuan-jian Shen, Last changed Sep. 2003
  **/
 // Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
  **/
 // Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
-
+/***************************************/
 #include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
 #include <stdio.h>
 #include <stdarg.h>
 #include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
 #include <stdio.h>
 #include <stdarg.h>
-
+/***************************************/
 #include "Platform.h"
 #include "Platform.h"
-
 #include "PropSet.h"
 #include "Accessor.h"
 #include "StyleContext.h"
 #include "KeyWords.h"
 #include "Scintilla.h"
 #include "SciLexer.h"
 #include "PropSet.h"
 #include "Accessor.h"
 #include "StyleContext.h"
 #include "KeyWords.h"
 #include "Scintilla.h"
 #include "SciLexer.h"
-
+/***********************************************/
 static inline bool IsAWordChar(const int ch) {
        return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '%');
 }
 static inline bool IsAWordChar(const int ch) {
        return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '%');
 }
-
+/**********************************************/
 static inline bool IsAWordStart(const int ch) {
        return (ch < 0x80) && (isalnum(ch));
 }
 static inline bool IsAWordStart(const int ch) {
        return (ch < 0x80) && (isalnum(ch));
 }
-
+/***************************************/
 inline bool IsABlank(unsigned int ch) {
     return (ch == ' ') || (ch == 0x09) || (ch == 0x0b) ;
 }
 inline bool IsABlank(unsigned int ch) {
     return (ch == ' ') || (ch == 0x09) || (ch == 0x0b) ;
 }
-static void ColouriseFortranDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
-                            Accessor &styler, bool isFixFormat) {
-
+/***************************************/
+inline bool IsALineEnd(char ch) {
+    return ((ch == '\n') || (ch == '\r')) ;
+}
+/***************************************/
+unsigned int GetContinuedPos(unsigned int pos, Accessor &styler) {
+       while (!IsALineEnd(styler.SafeGetCharAt(pos++))) continue;
+       if (styler.SafeGetCharAt(pos) == '\n') pos++;
+       while (IsABlank(styler.SafeGetCharAt(pos++))) continue;
+       char chCur = styler.SafeGetCharAt(pos);
+       if (chCur == '&') {
+               while (IsABlank(styler.SafeGetCharAt(++pos))) continue;
+               return pos;
+       } else {
+               return pos;
+       }
+}
+/***************************************/
+static void ColouriseFortranDoc(unsigned int startPos, int length, int initStyle,
+                       WordList *keywordlists[], Accessor &styler, bool isFixFormat) {
        WordList &keywords = *keywordlists[0];
        WordList &keywords2 = *keywordlists[1];
        WordList &keywords3 = *keywordlists[2];
        WordList &keywords = *keywordlists[0];
        WordList &keywords2 = *keywordlists[1];
        WordList &keywords3 = *keywordlists[2];
-
-       int posLineStart = 0, prevState = 0;
+       /***************************************/
+       int posLineStart = 0, numNonBlank = 0, prevState = 0;
        int endPos = startPos + length;
        int endPos = startPos + length;
-
-       // backtrack to the beginning of the document, this may be slow for big documents.
-       // initStyle = SCE_F_DEFAULT;
-       // StyleContext sc(0, startPos+length, initStyle, styler);
-
+       /***************************************/
        // backtrack to the nearest keyword
        while ((startPos > 1) && (styler.StyleAt(startPos) != SCE_F_WORD)) {
                startPos--;
        // backtrack to the nearest keyword
        while ((startPos > 1) && (styler.StyleAt(startPos) != SCE_F_WORD)) {
                startPos--;
@@ -53,22 +65,47 @@ static void ColouriseFortranDoc(unsigned int startPos, int length, int initStyle
        startPos = styler.LineStart(styler.GetLine(startPos));
        initStyle = styler.StyleAt(startPos - 1);
        StyleContext sc(startPos, endPos-startPos, initStyle, styler);
        startPos = styler.LineStart(styler.GetLine(startPos));
        initStyle = styler.StyleAt(startPos - 1);
        StyleContext sc(startPos, endPos-startPos, initStyle, styler);
-
+       /***************************************/
        for (; sc.More(); sc.Forward()) {
        for (; sc.More(); sc.Forward()) {
-
-               // remember the position of the line
+               // remember the start position of the line
                if (sc.atLineStart) {
                        posLineStart = sc.currentPos;
                if (sc.atLineStart) {
                        posLineStart = sc.currentPos;
+                       numNonBlank = 0;
                        sc.SetState(SCE_F_DEFAULT);
                }
                        sc.SetState(SCE_F_DEFAULT);
                }
-
+               if (!IsASpaceOrTab(sc.ch)) numNonBlank ++;
+               /***********************************************/
+               // Handle the fix format generically
+               int toLineStart = sc.currentPos - posLineStart;
+               if (isFixFormat && (toLineStart < 6 || toLineStart > 72)) {
+                       if (toLineStart == 0 && (tolower(sc.ch) == 'c' || sc.ch == '*') || sc.ch == '!') {
+                               sc.SetState(SCE_F_COMMENT);
+                               while (!sc.atLineEnd && sc.More()) sc.Forward(); // Until line end
+                       } else if (toLineStart > 72) {
+                               sc.SetState(SCE_F_COMMENT);
+                               while (!sc.atLineEnd && sc.More()) sc.Forward(); // Until line end
+                       } else if (toLineStart < 5) {
+                               if (IsADigit(sc.ch))
+                                       sc.SetState(SCE_F_LABEL);
+                               else
+                                       sc.SetState(SCE_F_DEFAULT);
+                       } else if (toLineStart == 5) {
+                               if (!IsASpace(sc.ch) && sc.ch != '0') {
+                                       sc.SetState(SCE_F_CONTINUATION);
+                                       sc.ForwardSetState(prevState);
+                               } else
+                                       sc.SetState(SCE_F_DEFAULT);
+                       }
+                       continue;
+               }
+               /***************************************/
                // Handle line continuation generically.
                // Handle line continuation generically.
-               if (sc.ch == '&') {
+               if (!isFixFormat && sc.ch == '&') {
                        char chTemp = ' ';
                        int j = 1;
                        while (IsABlank(chTemp) && j<132) {
                                chTemp = static_cast<char>(sc.GetRelative(j));
                        char chTemp = ' ';
                        int j = 1;
                        while (IsABlank(chTemp) && j<132) {
                                chTemp = static_cast<char>(sc.GetRelative(j));
-                               j ++;
+                               j++;
                        }
                        if (chTemp == '!') {
                                sc.SetState(SCE_F_CONTINUATION);
                        }
                        if (chTemp == '!') {
                                sc.SetState(SCE_F_CONTINUATION);
@@ -76,24 +113,21 @@ static void ColouriseFortranDoc(unsigned int startPos, int length, int initStyle
                        } else if (chTemp == '\r' || chTemp == '\n') {
                                int currentState = sc.state;
                                sc.SetState(SCE_F_CONTINUATION);
                        } else if (chTemp == '\r' || chTemp == '\n') {
                                int currentState = sc.state;
                                sc.SetState(SCE_F_CONTINUATION);
-                               if (currentState == SCE_F_STRING1 || currentState == SCE_F_STRING2) {
-                                       sc.ForwardSetState(SCE_F_DEFAULT);
-                                       while (IsASpace(sc.ch) && sc.More()) sc.Forward();
-                                       if (sc.ch == '&') {
-                                               sc.SetState(SCE_F_CONTINUATION);
-                                               sc.Forward();
-                                       }
-                                       sc.SetState(currentState);
+                               sc.ForwardSetState(SCE_F_DEFAULT);
+                               while (IsASpace(sc.ch) && sc.More()) sc.Forward();
+                               if (sc.ch == '&') {
+                                       sc.SetState(SCE_F_CONTINUATION);
+                                       sc.Forward();
                                }
                                }
+                               sc.SetState(currentState);
                        }
                        }
-                       continue;
                }
                }
-
+               /***************************************/
                // Determine if the current state should terminate.
                if (sc.state == SCE_F_OPERATOR) {
                        sc.SetState(SCE_F_DEFAULT);
                } else if (sc.state == SCE_F_NUMBER) {
                // Determine if the current state should terminate.
                if (sc.state == SCE_F_OPERATOR) {
                        sc.SetState(SCE_F_DEFAULT);
                } else if (sc.state == SCE_F_NUMBER) {
-                       if (!IsAWordChar(sc.ch)) {
+                       if (!(IsAWordChar(sc.ch) || sc.ch=='\'' || sc.ch=='\"' || sc.ch=='.')) {
                                sc.SetState(SCE_F_DEFAULT);
                        }
                } else if (sc.state == SCE_F_IDENTIFIER) {
                                sc.SetState(SCE_F_DEFAULT);
                        }
                } else if (sc.state == SCE_F_IDENTIFIER) {
@@ -109,7 +143,7 @@ static void ColouriseFortranDoc(unsigned int startPos, int length, int initStyle
                                }
                                sc.SetState(SCE_F_DEFAULT);
                        }
                                }
                                sc.SetState(SCE_F_DEFAULT);
                        }
-               } else if (sc.state == SCE_F_COMMENT) {
+               } else if (sc.state == SCE_F_COMMENT || sc.state == SCE_F_PREPROCESSOR) {
                        if (sc.ch == '\r' || sc.ch == '\n') {
                                sc.SetState(SCE_F_DEFAULT);
                        }
                        if (sc.ch == '\r' || sc.ch == '\n') {
                                sc.SetState(SCE_F_DEFAULT);
                        }
@@ -123,24 +157,14 @@ static void ColouriseFortranDoc(unsigned int startPos, int length, int initStyle
                                        prevState = SCE_F_DEFAULT;
                                }
                        } else if (sc.atLineEnd) {
                                        prevState = SCE_F_DEFAULT;
                                }
                        } else if (sc.atLineEnd) {
-                               if (isFixFormat) {
-                                       sc.ForwardSetState(SCE_F_DEFAULT);
-                                       posLineStart = sc.currentPos;
-                               } else {
-                                       sc.ChangeState(SCE_F_STRINGEOL);
-                                       sc.ForwardSetState(SCE_F_DEFAULT);
-                               }
+                               sc.ChangeState(SCE_F_STRINGEOL);
+                               sc.ForwardSetState(SCE_F_DEFAULT);
                        }
                } else if (sc.state == SCE_F_STRING2) {
                        prevState = sc.state;
                        if (sc.atLineEnd) {
                        }
                } else if (sc.state == SCE_F_STRING2) {
                        prevState = sc.state;
                        if (sc.atLineEnd) {
-                               if (isFixFormat) {
-                                       sc.ForwardSetState(SCE_F_DEFAULT);
-                                       posLineStart = sc.currentPos;
-                               } else {
-                                       sc.ChangeState(SCE_F_STRINGEOL);
-                                       sc.ForwardSetState(SCE_F_DEFAULT);
-                               }
+                               sc.ChangeState(SCE_F_STRINGEOL);
+                               sc.ForwardSetState(SCE_F_DEFAULT);
                        } else if (sc.ch == '\"') {
                                if (sc.chNext == '\"') {
                                        sc.Forward();
                        } else if (sc.ch == '\"') {
                                if (sc.chNext == '\"') {
                                        sc.Forward();
@@ -156,33 +180,36 @@ static void ColouriseFortranDoc(unsigned int startPos, int length, int initStyle
                } else if (sc.state == SCE_F_CONTINUATION) {
                        sc.SetState(SCE_F_DEFAULT);
                } else if (sc.state == SCE_F_LABEL) {
                } else if (sc.state == SCE_F_CONTINUATION) {
                        sc.SetState(SCE_F_DEFAULT);
                } else if (sc.state == SCE_F_LABEL) {
-                       if (sc.currentPos >= static_cast<unsigned int>(posLineStart+5)) {
+                       if (!IsADigit(sc.ch)) {
                                sc.SetState(SCE_F_DEFAULT);
                                sc.SetState(SCE_F_DEFAULT);
+                       } else {
+                               if (isFixFormat && sc.currentPos-posLineStart > 4)
+                                       sc.SetState(SCE_F_DEFAULT);
+                               else if (numNonBlank > 5)
+                                       sc.SetState(SCE_F_DEFAULT);
                        }
                }
                        }
                }
-
+               /***************************************/
                // Determine if a new state should be entered.
                if (sc.state == SCE_F_DEFAULT) {
                // Determine if a new state should be entered.
                if (sc.state == SCE_F_DEFAULT) {
-                       int toLineStart = sc.currentPos - posLineStart;
-                       if (isFixFormat && (toLineStart < 6 || toLineStart > 72)) {
-                               if (sc.atLineStart && (tolower(sc.ch) == 'c' || sc.ch == '*') || sc.ch == '!') {
-                                       sc.SetState(SCE_F_COMMENT);
-                               } else if (toLineStart > 72) {
+                       if (sc.ch == '!') {
+                               if (sc.chNext == '$') {
+                                       sc.SetState(SCE_F_PREPROCESSOR);
+                               } else {
                                        sc.SetState(SCE_F_COMMENT);
                                        sc.SetState(SCE_F_COMMENT);
-                               } else if (toLineStart < 5 && !IsASpace(sc.ch)) {
-                                       sc.SetState(SCE_F_LABEL);
-                               } else if (toLineStart == 5 && (!IsASpace(sc.ch) && sc.ch != '0')) {
-                                       sc.SetState(SCE_F_CONTINUATION);
-                                       sc.ForwardSetState(prevState);
                                }
                                }
+                       } else if ((!isFixFormat) && IsADigit(sc.ch) && numNonBlank == 1) {
+                               sc.SetState(SCE_F_LABEL);
                        } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
                                sc.SetState(SCE_F_NUMBER);
                        } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
                                sc.SetState(SCE_F_NUMBER);
+                       } else if ((tolower(sc.ch) == 'b' || tolower(sc.ch) == 'o' ||
+                                           tolower(sc.ch) == 'z') && (sc.chNext == '\"' || sc.chNext == '\'')) {
+                               sc.SetState(SCE_F_NUMBER);
+                               sc.Forward();
                        } else if (sc.ch == '.' && isalpha(sc.chNext)) {
                                sc.SetState(SCE_F_OPERATOR2);
                        } else if (IsAWordStart(sc.ch)) {
                                sc.SetState(SCE_F_IDENTIFIER);
                        } else if (sc.ch == '.' && isalpha(sc.chNext)) {
                                sc.SetState(SCE_F_OPERATOR2);
                        } else if (IsAWordStart(sc.ch)) {
                                sc.SetState(SCE_F_IDENTIFIER);
-                       } else if (sc.ch == '!') {
-                               sc.SetState(SCE_F_COMMENT);
                        } else if (sc.ch == '\"') {
                                sc.SetState(SCE_F_STRING2);
                        } else if (sc.ch == '\'') {
                        } else if (sc.ch == '\"') {
                                sc.SetState(SCE_F_STRING2);
                        } else if (sc.ch == '\'') {
@@ -194,37 +221,46 @@ static void ColouriseFortranDoc(unsigned int startPos, int length, int initStyle
        }
        sc.Complete();
 }
        }
        sc.Complete();
 }
-
-// The folding depends on the mercy of the programer.
-static int classifyFoldPointFortran(const char* s, const char* prevWord) {
+/***************************************/
+// To determine the folding level depending on keywords
+static int classifyFoldPointFortran(const char* s, const char* prevWord, const char chNextNonBlank) {
        int lev = 0;
        int lev = 0;
-       if (strcmp(prevWord, "end") == 0) return lev;
        if ((strcmp(prevWord, "else") == 0 && strcmp(s, "if") == 0) || strcmp(s, "elseif") == 0)
                return -1;
        if (strcmp(s, "associate") == 0 || strcmp(s, "block") == 0
            || strcmp(s, "blockdata") == 0 || strcmp(s, "select") == 0
            || strcmp(s, "do") == 0 || strcmp(s, "enum") ==0
        if ((strcmp(prevWord, "else") == 0 && strcmp(s, "if") == 0) || strcmp(s, "elseif") == 0)
                return -1;
        if (strcmp(s, "associate") == 0 || strcmp(s, "block") == 0
            || strcmp(s, "blockdata") == 0 || strcmp(s, "select") == 0
            || strcmp(s, "do") == 0 || strcmp(s, "enum") ==0
-           || strcmp(s, "forall") == 0 || strcmp(s, "function") == 0
-           || strcmp(s, "interface") == 0 || strcmp(s, "module") == 0
-           || strcmp(s, "program") == 0 || strcmp(s, "subroutine") == 0
-           || strcmp(s, "then") == 0 || strcmp(s, "where") == 0) {
-               lev = 1;
-       } else if (strcmp(s, "end") == 0 || strcmp(s, "continue") == 0
-           || strcmp(s, "endassociate") == 0 || strcmp(s, "endblock") == 0
-           || strcmp(s, "endblockdata") == 0 || strcmp(s, "endselect") == 0
-           || strcmp(s, "enddo") == 0 || strcmp(s, "endenum") ==0
-           || strcmp(s, "endif") == 0
-           || strcmp(s, "endforall") == 0 || strcmp(s, "endfunction") == 0
-           || strcmp(s, "endinterface") == 0 || strcmp(s, "endmodule") == 0
-           || strcmp(s, "endprogram") == 0 || strcmp(s, "endsubroutine") == 0
-           || strcmp(s, "endwhere") == 0 || strcmp(s, "procedure") == 0 ) {
-               lev = -1;
+           || strcmp(s, "function") == 0 || strcmp(s, "interface") == 0
+               || strcmp(s, "module") == 0 || strcmp(s, "program") == 0
+               || strcmp(s, "subroutine") == 0 || strcmp(s, "then") == 0
+               || (strcmp(s, "type") == 0 && chNextNonBlank != '(') ){
+                       if (strcmp(prevWord, "end") == 0)
+                               lev = 0;
+                       else
+                               lev = 1;
+       } else if (strcmp(s, "end") == 0 && chNextNonBlank != '='
+               || strcmp(s, "endassociate") == 0 || strcmp(s, "endblock") == 0
+               || strcmp(s, "endblockdata") == 0 || strcmp(s, "endselect") == 0
+               || strcmp(s, "enddo") == 0 || strcmp(s, "endenum") ==0
+               || strcmp(s, "endif") == 0 || strcmp(s, "endforall") == 0
+               || strcmp(s, "endfunction") == 0 || strcmp(s, "endinterface") == 0
+               || strcmp(s, "endmodule") == 0 || strcmp(s, "endprogram") == 0
+               || strcmp(s, "endsubroutine") == 0 || strcmp(s, "endtype") == 0
+               || strcmp(s, "endwhere") == 0
+               || strcmp(s, "procedure") == 0 ) { // Take care of the module procedure statement
+                       lev = -1;
+       } else if (strcmp(prevWord, "end") == 0 && strcmp(s, "if") == 0){ // end if
+                       lev = 0;
        }
        return lev;
 }
        }
        return lev;
 }
-static void FoldFortranDoc(unsigned int startPos, int length, int initStyle, WordList *[], Accessor &styler) {
-       //~ bool foldComment = styler.GetPropertyInt("fold.comment") != 0;
+// Folding the code
+static void FoldFortranDoc(unsigned int startPos, int length, int initStyle,
+                                                  Accessor &styler, bool isFixFormat) {
+       //
+       // bool foldComment = styler.GetPropertyInt("fold.comment") != 0;
        // Do not know how to fold the comment at the moment.
        // Do not know how to fold the comment at the moment.
+       //
        bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
        unsigned int endPos = startPos + length;
        int visibleChars = 0;
        bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
        unsigned int endPos = startPos + length;
        int visibleChars = 0;
@@ -232,37 +268,133 @@ static void FoldFortranDoc(unsigned int startPos, int length, int initStyle, Wor
        int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
        int levelCurrent = levelPrev;
        char chNext = styler[startPos];
        int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
        int levelCurrent = levelPrev;
        char chNext = styler[startPos];
+       char chNextNonBlank;
        int styleNext = styler.StyleAt(startPos);
        int style = initStyle;
        int styleNext = styler.StyleAt(startPos);
        int style = initStyle;
-
+       /***************************************/
        int lastStart = 0;
        int lastStart = 0;
-       char prevWord[32] = "";
-
+       char prevWord[32] = "", Label[6] = "";
+       // Variables for do label folding.
+       static int doLabels[100], posLabel=-1;
+       /***************************************/
        for (unsigned int i = startPos; i < endPos; i++) {
                char ch = chNext;
                chNext = styler.SafeGetCharAt(i + 1);
        for (unsigned int i = startPos; i < endPos; i++) {
                char ch = chNext;
                chNext = styler.SafeGetCharAt(i + 1);
+               chNextNonBlank = chNext;
+               unsigned int j=i+1;
+               while(IsABlank(chNextNonBlank) && j<endPos) {
+                       j ++ ;
+                       chNextNonBlank = styler.SafeGetCharAt(j);
+               }
                int stylePrev = style;
                style = styleNext;
                styleNext = styler.StyleAt(i + 1);
                bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
                int stylePrev = style;
                style = styleNext;
                styleNext = styler.StyleAt(i + 1);
                bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
-
-               if (stylePrev == SCE_F_DEFAULT && style == SCE_F_WORD)
-               {
-                       // Store last word start point.
+               //
+               if (stylePrev == SCE_F_DEFAULT && (style == SCE_F_WORD || style == SCE_F_LABEL)) {
+                       // Store last word and label start point.
                        lastStart = i;
                }
                        lastStart = i;
                }
-
+               /***************************************/
                if (style == SCE_F_WORD) {
                        if(iswordchar(ch) && !iswordchar(chNext)) {
                                char s[32];
                if (style == SCE_F_WORD) {
                        if(iswordchar(ch) && !iswordchar(chNext)) {
                                char s[32];
-                               unsigned int j;
-                               for(j = 0; ( j < 31 ) && ( j < i-lastStart+1 ); j++) {
-                                       s[j] = static_cast<char>(tolower(styler[lastStart + j]));
+                               unsigned int k;
+                               for(k=0; (k<31 ) && (k<i-lastStart+1 ); k++) {
+                                       s[k] = static_cast<char>(tolower(styler[lastStart+k]));
+                               }
+                               s[k] = '\0';
+                               // Handle the forall and where statement and structure.
+                               if (strcmp(s, "forall") == 0 || strcmp(s, "where") == 0) {
+                                       if (strcmp(prevWord, "end") != 0) {
+                                               j = i + 1;
+                                               char chBrace = '(', chSeek = ')', ch1 = styler.SafeGetCharAt(j);
+                                               // Find the position of the first (
+                                               while (ch1 != chBrace && j<endPos) {
+                                                       j++;
+                                                       ch1 = styler.SafeGetCharAt(j);
+                                               }
+                                               char styBrace = styler.StyleAt(j);
+                                               int depth = 1;
+                                               char chAtPos;
+                                               char styAtPos;
+                                               while (j<endPos) {
+                                                       j++;
+                                                       chAtPos = styler.SafeGetCharAt(j);
+                                                       styAtPos = styler.StyleAt(j);
+                                                       if (styAtPos == styBrace) {
+                                                               if (chAtPos == chBrace) depth++;
+                                                               if (chAtPos == chSeek) depth--;
+                                                               if (depth == 0) break;
+                                                       }
+                                               }
+                                               while (j<endPos) {
+                                                       j++;
+                                                       chAtPos = styler.SafeGetCharAt(j);
+                                                       styAtPos = styler.StyleAt(j);
+                                                       if (styAtPos == SCE_F_COMMENT || IsABlank(chAtPos)) continue;
+                                                       if (isFixFormat) {
+                                                               if (!IsALineEnd(chAtPos)) {
+                                                                       break;
+                                                               } else {
+                                                                       if (lineCurrent < styler.GetLine(styler.Length()-1)) {
+                                                                               j = styler.LineStart(lineCurrent+1);
+                                                                               if (styler.StyleAt(j+5) == SCE_F_CONTINUATION) {
+                                                                                       j += 5;
+                                                                                       continue;
+                                                                               } else {
+                                                                                       levelCurrent++;
+                                                                                       break;
+                                                                               }
+                                                                       }
+                                                               }
+                                                       } else {
+                                                               if (chAtPos == '&' && styler.StyleAt(j) == SCE_F_CONTINUATION) {
+                                                                       j = GetContinuedPos(j+1, styler);
+                                                                       continue;
+                                                               } else if (IsALineEnd(chAtPos)) {
+                                                                       levelCurrent ++;
+                                                                       break;
+                                                               } else {
+                                                                       break;
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               } else {
+                                       levelCurrent += classifyFoldPointFortran(s, prevWord, chNextNonBlank);
+                                       // Store the do Labels into array
+                                       if (strcmp(s, "do") == 0 && IsADigit(chNextNonBlank)) {
+                                               unsigned int k = 0;
+                                               for (i=j; (i<j+5 && i<endPos); i++) {
+                                                       ch = styler.SafeGetCharAt(i);
+                                                       if (IsADigit(ch))
+                                                               Label[k++] = ch;
+                                                       else
+                                                               break;
+                                               }
+                                               Label[k] = '\0';
+                                               posLabel ++;
+                                               doLabels[posLabel] = atoi(Label);
+                                       }
                                }
                                }
-                               s[j] = '\0';
-                               levelCurrent += classifyFoldPointFortran(s, prevWord);
                                strcpy(prevWord, s);
                        }
                                strcpy(prevWord, s);
                        }
+               } else if (style == SCE_F_LABEL) {
+                       if(IsADigit(ch) && !IsADigit(chNext)) {
+                               for(j = 0; ( j < 5 ) && ( j < i-lastStart+1 ); j++) {
+                                       ch = styler.SafeGetCharAt(lastStart + j);
+                                       if (IsADigit(ch) && styler.StyleAt(lastStart+j) == SCE_F_LABEL)
+                                               Label[j] = ch;
+                                       else
+                                               break;
+                               }
+                               Label[j] = '\0';
+                               while (doLabels[posLabel] == atoi(Label) && posLabel > -1) {
+                                       levelCurrent--;
+                                       posLabel--;
+                               }
+                       }
                }
                if (atEOL) {
                        int lev = levelPrev;
                }
                if (atEOL) {
                        int lev = levelPrev;
@@ -278,33 +410,41 @@ static void FoldFortranDoc(unsigned int startPos, int length, int initStyle, Wor
                        visibleChars = 0;
                        strcpy(prevWord, "");
                }
                        visibleChars = 0;
                        strcpy(prevWord, "");
                }
-
-               if (!isspacechar(ch))
-                       visibleChars++;
+               /***************************************/
+               if (!isspacechar(ch)) visibleChars++;
        }
        }
-
+       /***************************************/
        // Fill in the real level of the next line, keeping the current flags as they will be filled in later
        int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
        styler.SetLevel(lineCurrent, levelPrev | flagsNext);
 }
        // Fill in the real level of the next line, keeping the current flags as they will be filled in later
        int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
        styler.SetLevel(lineCurrent, levelPrev | flagsNext);
 }
-
+/***************************************/
 static const char * const FortranWordLists[] = {
        "Primary keywords and identifiers",
        "Intrinsic functions",
        "Extended and user defined functions",
        0,
 };
 static const char * const FortranWordLists[] = {
        "Primary keywords and identifiers",
        "Intrinsic functions",
        "Extended and user defined functions",
        0,
 };
-
+/***************************************/
 static void ColouriseFortranDocFreeFormat(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
                             Accessor &styler) {
        ColouriseFortranDoc(startPos, length, initStyle, keywordlists, styler, false);
 }
 static void ColouriseFortranDocFreeFormat(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
                             Accessor &styler) {
        ColouriseFortranDoc(startPos, length, initStyle, keywordlists, styler, false);
 }
-
+/***************************************/
 static void ColouriseFortranDocFixFormat(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
                             Accessor &styler) {
        ColouriseFortranDoc(startPos, length, initStyle, keywordlists, styler, true);
 }
 static void ColouriseFortranDocFixFormat(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
                             Accessor &styler) {
        ColouriseFortranDoc(startPos, length, initStyle, keywordlists, styler, true);
 }
-
-
-LexerModule lmFortran(SCLEX_FORTRAN, ColouriseFortranDocFreeFormat, "fortran", FoldFortranDoc, FortranWordLists);
-LexerModule lmF77(SCLEX_F77, ColouriseFortranDocFixFormat, "f77", FoldFortranDoc, FortranWordLists);
+/***************************************/
+static void FoldFortranDocFreeFormat(unsigned int startPos, int length, int initStyle,
+               WordList *[], Accessor &styler) {
+       FoldFortranDoc(startPos, length, initStyle,styler, false);
+}
+/***************************************/
+static void FoldFortranDocFixFormat(unsigned int startPos, int length, int initStyle,
+               WordList *[], Accessor &styler) {
+       FoldFortranDoc(startPos, length, initStyle,styler, true);
+}
+/***************************************/
+LexerModule lmFortran(SCLEX_FORTRAN, ColouriseFortranDocFreeFormat, "fortran", FoldFortranDocFreeFormat, FortranWordLists);
+LexerModule lmF77(SCLEX_F77, ColouriseFortranDocFixFormat, "f77", FoldFortranDocFixFormat, FortranWordLists);
index 18612c9ee3558bd4574a397ce8f3d68a911a8477..3781eed83af5877c6dd18df13cdbe9a337526b07 100644 (file)
@@ -27,21 +27,31 @@ static inline bool IsAWordChar(const int ch) {
        return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.');
 }
 
        return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.');
 }
 
-inline bool IsAWordStart(const int ch) {
+static inline bool IsAWordStart(const int ch) {
        return (ch < 0x80) && (isalnum(ch) || ch == '_');
 }
 
        return (ch < 0x80) && (isalnum(ch) || ch == '_');
 }
 
-inline bool isLuaOperator(char ch) {
-       if (isalnum(ch))
+static inline bool IsANumberChar(const int ch) {
+       // Not exactly following number definition (several dots are seen as OK, etc.)
+       // but probably enough in most cases.
+       return (ch < 0x80) &&
+               (isdigit(ch) || toupper(ch) == 'E' ||
+             ch == '.' || ch == '-' || ch == '+');
+}
+
+static inline bool IsLuaOperator(int ch) {
+       if (ch >= 0x80 || isalnum(ch)) {
                return false;
                return false;
+       }
        // '.' left out as it is used to make up numbers
        if (ch == '*' || ch == '/' || ch == '-' || ch == '+' ||
                ch == '(' || ch == ')' || ch == '=' ||
                ch == '{' || ch == '}' || ch == '~' ||
                ch == '[' || ch == ']' || ch == ';' ||
                ch == '<' || ch == '>' || ch == ',' ||
        // '.' left out as it is used to make up numbers
        if (ch == '*' || ch == '/' || ch == '-' || ch == '+' ||
                ch == '(' || ch == ')' || ch == '=' ||
                ch == '{' || ch == '}' || ch == '~' ||
                ch == '[' || ch == ']' || ch == ';' ||
                ch == '<' || ch == '>' || ch == ',' ||
-               ch == '.' || ch == '^' || ch == '%' || ch == ':')
+               ch == '.' || ch == '^' || ch == '%' || ch == ':') {
                return true;
                return true;
+       }
        return false;
 }
 
        return false;
 }
 
@@ -124,11 +134,8 @@ static void ColouriseLuaDoc(
                        sc.SetState(SCE_LUA_DEFAULT);
                } else if (sc.state == SCE_LUA_NUMBER) {
                        // We stop the number definition on non-numerical non-dot non-eE non-sign char
                        sc.SetState(SCE_LUA_DEFAULT);
                } else if (sc.state == SCE_LUA_NUMBER) {
                        // We stop the number definition on non-numerical non-dot non-eE non-sign char
-                       if (!(isdigit(sc.ch) || sc.ch == '.' ||
-                                 toupper(sc.ch) == 'E' || sc.ch == '-' || sc.ch == '+')) {
-                                       // Not exactly following number definition (several dots are seen as OK, etc.)
-                                       // but probably enough in most cases.
-                                       sc.SetState(SCE_LUA_DEFAULT);
+                       if (!IsANumberChar(sc.ch)) {
+                               sc.SetState(SCE_LUA_DEFAULT);
                        }
                } else if (sc.state == SCE_LUA_IDENTIFIER) {
                        if (!IsAWordChar(sc.ch)) {
                        }
                } else if (sc.state == SCE_LUA_IDENTIFIER) {
                        if (!IsAWordChar(sc.ch)) {
@@ -233,7 +240,7 @@ static void ColouriseLuaDoc(
                                sc.Forward();
                        } else if (sc.atLineStart && sc.Match('$')) {
                                sc.SetState(SCE_LUA_PREPROCESSOR);      // Obsolete since Lua 4.0, but still in old code
                                sc.Forward();
                        } else if (sc.atLineStart && sc.Match('$')) {
                                sc.SetState(SCE_LUA_PREPROCESSOR);      // Obsolete since Lua 4.0, but still in old code
-                       } else if (isLuaOperator(static_cast<char>(sc.ch))) {
+                       } else if (IsLuaOperator(static_cast<char>(sc.ch))) {
                                sc.SetState(SCE_LUA_OPERATOR);
                        }
                }
                                sc.SetState(SCE_LUA_OPERATOR);
                        }
                }
diff --git a/contrib/src/stc/scintilla/src/LexMPT.cxx b/contrib/src/stc/scintilla/src/LexMPT.cxx
new file mode 100644 (file)
index 0000000..1058b9b
--- /dev/null
@@ -0,0 +1,182 @@
+// Scintilla source code edit control
+/** @file LexMPT.cxx
+ ** Lexer for MPT specific files. Based on LexOthers.cxx
+ ** LOT = the text log file created by the MPT application while running a test program
+ ** Other MPT specific files to be added later.
+ **/
+// Copyright 2003 by Marius Gheorghe <mgheorghe@cabletest.com>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+#include "SString.h"
+
+static int GetLotLineState(SString &line) {
+       if (line.length()) {
+               // Most of the time the first non-blank character in line determines that line's type
+               // Now finds the first non-blank character
+               unsigned i; // Declares counter here to make it persistent after the for loop
+               for (i = 0; i < line.length(); ++i) {
+                       if (!isspace(line[i]))
+                               break;
+               }
+
+               // Checks if it was a blank line
+               if (i == line.length())
+                       return SCE_LOT_DEFAULT;
+
+               switch (line[i]) {
+               case '*': // Fail measurement
+                       return SCE_LOT_FAIL;
+
+               case '+': // Header
+               case '|': // Header
+                       return SCE_LOT_HEADER;
+
+               case ':': // Set test limits
+                       return SCE_LOT_SET;
+
+               case '-': // Section break
+                       return SCE_LOT_BREAK;
+
+               default:  // Any other line
+                       // Checks for message at the end of lot file
+                       if (line.contains("PASSED")) {
+                               return SCE_LOT_PASS;
+                       }
+                       else if (line.contains("FAILED")) {
+                               return SCE_LOT_FAIL;
+                       }
+                       else if (line.contains("ABORTED")) {
+                               return SCE_LOT_ABORT;
+                       }
+                       else {
+                               return i ? SCE_LOT_PASS : SCE_LOT_DEFAULT;                      
+                       }
+               }
+       }
+       else {
+               return SCE_LOT_DEFAULT;
+       }
+}
+
+static void ColourizeLotDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {
+       styler.StartAt(startPos);
+       styler.StartSegment(startPos);
+       bool atLineStart = true;// Arms the 'at line start' flag
+       char chNext = styler.SafeGetCharAt(startPos);
+       SString line("");
+       line.setsizegrowth(256);        // Lot lines are less than 256 chars long most of the time. This should avoid reallocations
+
+       // Styles LOT document
+       unsigned int i;                 // Declared here because it's used after the for loop
+       for (i = startPos; i < startPos + length; ++i) {
+               char ch = chNext;
+               chNext = styler.SafeGetCharAt(i + 1);
+               line += ch;
+               atLineStart = false;
+
+               // LOT files are only used on the Win32 platform, thus EOL == CR+LF
+               // Searches for the end of line
+               if (ch == '\r' && chNext == '\n') {
+                       line += chNext; // Gets the '\n'
+                       ++i; // Advances past the '\n'
+                       chNext = styler.SafeGetCharAt(i + 1); // Gets character of next line
+                       styler.ColourTo(i, GetLotLineState(line));
+                       line = "";
+                       atLineStart = true; // Arms flag for next line
+               }
+       }
+
+       // Last line may not have a line ending
+       if (!atLineStart) {
+               styler.ColourTo(i - 1, GetLotLineState(line));
+       }
+}
+
+// Folds an MPT LOT file: the blocks that can be folded are:
+// sections (headed by a set line)
+// passes (contiguous pass results within a section)
+// fails (contiguous fail results within a section)
+static void FoldLotDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {
+       bool foldCompact = styler.GetPropertyInt("fold.compact", 0) != 0;
+       unsigned int endPos = startPos + length;
+       int visibleChars = 0;
+       int lineCurrent = styler.GetLine(startPos);
+
+       char chNext = styler.SafeGetCharAt(startPos);
+       int style = SCE_LOT_DEFAULT;
+       int styleNext = styler.StyleAt(startPos);
+       int lev = SC_FOLDLEVELBASE;
+
+       // Gets style of previous line if not at the beginning of the document
+       if (startPos > 1)
+               style = styler.StyleAt(startPos - 2);
+
+       for (unsigned int i = startPos; i < endPos; i++) {
+               char ch = chNext;
+               chNext = styler.SafeGetCharAt(i + 1);
+
+               if (ch == '\r' && chNext == '\n') {
+                       // TO DO:
+                       // Should really get the state of the previous line from the styler
+                       int stylePrev = style;  
+                       style = styleNext;
+                       styleNext = styler.StyleAt(i + 2);
+               
+                       switch (style) {
+/*
+                       case SCE_LOT_SET:
+                               lev = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG;
+                               break;
+*/
+                       case SCE_LOT_FAIL:
+/*
+                               if (stylePrev != SCE_LOT_FAIL) 
+                                       lev = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG;
+                               else
+                                       lev = SC_FOLDLEVELBASE + 1;
+*/
+                               lev = SC_FOLDLEVELBASE;
+                               break;
+
+                       default:
+                               if (lineCurrent == 0 || stylePrev == SCE_LOT_FAIL) 
+                                       lev = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG;
+                               else
+                                       lev = SC_FOLDLEVELBASE + 1;
+
+                               if (visibleChars == 0 && foldCompact)
+                                       lev |= SC_FOLDLEVELWHITEFLAG;
+                               break;
+                       }
+
+                       if (lev != styler.LevelAt(lineCurrent)) 
+                               styler.SetLevel(lineCurrent, lev);
+
+                       lineCurrent++;
+                       visibleChars = 0;
+               }
+
+               if (!isspacechar(ch))
+                       visibleChars++;
+       }
+
+       int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
+       styler.SetLevel(lineCurrent, lev | flagsNext);
+}
+
+static const char * const emptyWordListDesc[] = {
+       0
+};
+
+LexerModule lmLot(SCLEX_LOT, ColourizeLotDoc, "lot", FoldLotDoc, emptyWordListDesc);
index 5f4dff3b8e4661d83ceeb034ae2b457677bcca24..249fa67ce2cc65f929913a65265bd7a1506375e2 100644 (file)
@@ -2,6 +2,10 @@
 /** @file LexMatlab.cxx
  ** Lexer for Matlab.
  ** Written by José Fonseca
 /** @file LexMatlab.cxx
  ** Lexer for Matlab.
  ** Written by José Fonseca
+ **
+ ** Changes by Christoph Dalitz 2003/12/04:
+ **   - added support for Octave
+ **   - Strings can now be included both in single or double quotes
  **/
 // Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
  **/
 // Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 #include "Scintilla.h"
 #include "SciLexer.h"
 
 #include "Scintilla.h"
 #include "SciLexer.h"
 
+
+static bool IsMatlabCommentChar(int c) {
+       return (c == '%') ;
+}
+
+static bool IsOctaveCommentChar(int c) {
+       return (c == '%' || c == '#') ;
+}
+
 static bool IsMatlabComment(Accessor &styler, int pos, int len) {
 static bool IsMatlabComment(Accessor &styler, int pos, int len) {
-       return len > 0 && (styler[pos] == '%' || styler[pos] == '!') ;
+       return len > 0 && IsMatlabCommentChar(styler[pos]) ;
+}
+
+static bool IsOctaveComment(Accessor &styler, int pos, int len) {
+       return len > 0 && IsOctaveCommentChar(styler[pos]) ;
 }
 
 static inline bool IsAWordChar(const int ch) {
 }
 
 static inline bool IsAWordChar(const int ch) {
@@ -33,8 +50,10 @@ static inline bool IsAWordStart(const int ch) {
        return (ch < 0x80) && (isalnum(ch) || ch == '_');
 }
 
        return (ch < 0x80) && (isalnum(ch) || ch == '_');
 }
 
-static void ColouriseMatlabDoc(unsigned int startPos, int length, int initStyle,
-                               WordList *keywordlists[], Accessor &styler) {
+static void ColouriseMatlabOctaveDoc(
+            unsigned int startPos, int length, int initStyle,
+            WordList *keywordlists[], Accessor &styler,
+            bool (*IsCommentChar)(int)) {
 
        WordList &keywords = *keywordlists[0];
 
 
        WordList &keywords = *keywordlists[0];
 
@@ -81,9 +100,11 @@ static void ColouriseMatlabDoc(unsigned int startPos, int length, int initStyle,
                                transpose = true;
                        }
                } else if (sc.state == SCE_MATLAB_STRING) {
                                transpose = true;
                        }
                } else if (sc.state == SCE_MATLAB_STRING) {
-                       // Matlab doubles quotes to preserve them, so just end this string
-                       // state now as a following quote will start again
-                       if (sc.ch == '\'') {
+                       if (sc.ch == '\'' && sc.chPrev != '\\') {
+                               sc.ForwardSetState(SCE_MATLAB_DEFAULT);
+                       }
+               } else if (sc.state == SCE_MATLAB_DOUBLEQUOTESTRING) {
+                       if (sc.ch == '"' && sc.chPrev != '\\') {
                                sc.ForwardSetState(SCE_MATLAB_DEFAULT);
                        }
                } else if (sc.state == SCE_MATLAB_COMMENT || sc.state == SCE_MATLAB_COMMAND) {
                                sc.ForwardSetState(SCE_MATLAB_DEFAULT);
                        }
                } else if (sc.state == SCE_MATLAB_COMMENT || sc.state == SCE_MATLAB_COMMAND) {
@@ -94,7 +115,7 @@ static void ColouriseMatlabDoc(unsigned int startPos, int length, int initStyle,
                }
 
                if (sc.state == SCE_MATLAB_DEFAULT) {
                }
 
                if (sc.state == SCE_MATLAB_DEFAULT) {
-                       if (sc.ch == '%') {
+                       if (IsCommentChar(sc.ch)) {
                                sc.SetState(SCE_MATLAB_COMMENT);
                        } else if (sc.ch == '!') {
                                sc.SetState(SCE_MATLAB_COMMAND);
                                sc.SetState(SCE_MATLAB_COMMENT);
                        } else if (sc.ch == '!') {
                                sc.SetState(SCE_MATLAB_COMMAND);
@@ -104,6 +125,8 @@ static void ColouriseMatlabDoc(unsigned int startPos, int length, int initStyle,
                                } else {
                                        sc.SetState(SCE_MATLAB_STRING);
                                }
                                } else {
                                        sc.SetState(SCE_MATLAB_STRING);
                                }
+                       } else if (sc.ch == '"') {
+              sc.SetState(SCE_MATLAB_DOUBLEQUOTESTRING);
                        } else if (isdigit(sc.ch) || (sc.ch == '.' && isdigit(sc.chNext))) {
                                sc.SetState(SCE_MATLAB_NUMBER);
                        } else if (isalpha(sc.ch)) {
                        } else if (isdigit(sc.ch) || (sc.ch == '.' && isdigit(sc.chNext))) {
                                sc.SetState(SCE_MATLAB_NUMBER);
                        } else if (isalpha(sc.ch)) {
@@ -123,8 +146,20 @@ static void ColouriseMatlabDoc(unsigned int startPos, int length, int initStyle,
        sc.Complete();
 }
 
        sc.Complete();
 }
 
-static void FoldMatlabDoc(unsigned int startPos, int length, int,
-                          WordList *[], Accessor &styler) {
+static void ColouriseMatlabDoc(unsigned int startPos, int length, int initStyle,
+                               WordList *keywordlists[], Accessor &styler) {
+  ColouriseMatlabOctaveDoc(startPos, length, initStyle, keywordlists, styler, IsMatlabCommentChar);
+}
+
+static void ColouriseOctaveDoc(unsigned int startPos, int length, int initStyle,
+                               WordList *keywordlists[], Accessor &styler) {
+  ColouriseMatlabOctaveDoc(startPos, length, initStyle, keywordlists, styler, IsOctaveCommentChar);
+}
+
+static void FoldMatlabOctaveDoc(unsigned int startPos, int length, int,
+                          WordList *[], Accessor &styler,
+                          bool (*IsComment)(Accessor&,int,int)) {
+
        int endPos = startPos + length;
 
        // Backtrack to previous line in case need to fix its fold status
        int endPos = startPos + length;
 
        // Backtrack to previous line in case need to fix its fold status
@@ -136,7 +171,7 @@ static void FoldMatlabDoc(unsigned int startPos, int length, int,
                }
        }
        int spaceFlags = 0;
                }
        }
        int spaceFlags = 0;
-       int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsMatlabComment);
+       int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsComment);
        char chNext = styler[startPos];
        for (int i = startPos; i < endPos; i++) {
                char ch = chNext;
        char chNext = styler[startPos];
        for (int i = startPos; i < endPos; i++) {
                char ch = chNext;
@@ -144,7 +179,7 @@ static void FoldMatlabDoc(unsigned int startPos, int length, int,
 
                if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == endPos)) {
                        int lev = indentCurrent;
 
                if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == endPos)) {
                        int lev = indentCurrent;
-                       int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsMatlabComment);
+                       int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsComment);
                        if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {
                                // Only non whitespace lines can be headers
                                if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) {
                        if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {
                                // Only non whitespace lines can be headers
                                if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) {
@@ -152,7 +187,7 @@ static void FoldMatlabDoc(unsigned int startPos, int length, int,
                                } else if (indentNext & SC_FOLDLEVELWHITEFLAG) {
                                        // Line after is blank so check the next - maybe should continue further?
                                        int spaceFlags2 = 0;
                                } else if (indentNext & SC_FOLDLEVELWHITEFLAG) {
                                        // Line after is blank so check the next - maybe should continue further?
                                        int spaceFlags2 = 0;
-                                       int indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsMatlabComment);
+                                       int indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsComment);
                                        if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) {
                                                lev |= SC_FOLDLEVELHEADERFLAG;
                                        }
                                        if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) {
                                                lev |= SC_FOLDLEVELHEADERFLAG;
                                        }
@@ -165,9 +200,26 @@ static void FoldMatlabDoc(unsigned int startPos, int length, int,
        }
 }
 
        }
 }
 
+static void FoldMatlabDoc(unsigned int startPos, int length, int initStyle,
+                          WordList *keywordlists[], Accessor &styler) {
+  FoldMatlabOctaveDoc(startPos, length, initStyle, keywordlists, styler, IsMatlabComment);
+}
+
+static void FoldOctaveDoc(unsigned int startPos, int length, int initStyle,
+                          WordList *keywordlists[], Accessor &styler) {
+  FoldMatlabOctaveDoc(startPos, length, initStyle, keywordlists, styler, IsOctaveComment);
+}
+
 static const char * const matlabWordListDesc[] = {
        "Keywords",
        0
 };
 
 static const char * const matlabWordListDesc[] = {
        "Keywords",
        0
 };
 
+static const char * const octaveWordListDesc[] = {
+       "Keywords",
+       0
+};
+
 LexerModule lmMatlab(SCLEX_MATLAB, ColouriseMatlabDoc, "matlab", FoldMatlabDoc, matlabWordListDesc);
 LexerModule lmMatlab(SCLEX_MATLAB, ColouriseMatlabDoc, "matlab", FoldMatlabDoc, matlabWordListDesc);
+
+LexerModule lmOctave(SCLEX_OCTAVE, ColouriseOctaveDoc, "octave", FoldOctaveDoc, octaveWordListDesc);
diff --git a/contrib/src/stc/scintilla/src/LexMetapost.cxx b/contrib/src/stc/scintilla/src/LexMetapost.cxx
new file mode 100644 (file)
index 0000000..b7d482c
--- /dev/null
@@ -0,0 +1,320 @@
+// Scintilla source code edit control
+
+// File: LexMetapost.cxx - general context conformant metapost coloring scheme
+// Author: Hans Hagen - PRAGMA ADE - Hasselt NL - www.pragma-ade.com
+// Version: September 28, 2003
+
+// Copyright: 1998-2003 by Neil Hodgson <neilh@scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+// This lexer is derived from the one written for the texwork environment (1999++) which in
+// turn is inspired on texedit (1991++) which finds its roots in wdt (1986).
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+#include "StyleContext.h"
+
+// val SCE_METAPOST_DEFAULT = 0
+// val SCE_METAPOST_SPECIAL = 1
+// val SCE_METAPOST_GROUP = 2
+// val SCE_METAPOST_SYMBOL = 3
+// val SCE_METAPOST_COMMAND = 4
+// val SCE_METAPOST_TEXT = 5
+
+// Definitions in SciTEGlobal.properties:
+//
+// Metapost Highlighting
+//
+// # Default
+// style.metapost.0=fore:#7F7F00
+// # Special
+// style.metapost.1=fore:#007F7F
+// # Group
+// style.metapost.2=fore:#880000
+// # Symbol
+// style.metapost.3=fore:#7F7F00
+// # Command
+// style.metapost.4=fore:#008800
+// # Text
+// style.metapost.5=fore:#000000
+
+// lexer.tex.comment.process=0
+
+// Auxiliary functions:
+
+static inline bool endOfLine(Accessor &styler, unsigned int i) {
+       return
+      (styler[i] == '\n') || ((styler[i] == '\r') && (styler.SafeGetCharAt(i + 1) != '\n')) ;
+}
+
+static inline bool isMETAPOSTcomment(int ch) {
+       return
+      (ch == '%') ;
+}
+
+static inline bool isMETAPOSTone(int ch) {
+       return
+      (ch == '[') || (ch == ']') || (ch == '(') || (ch == ')') ||
+      (ch == ':') || (ch == '=') || (ch == '<') || (ch == '>') ||
+      (ch == '{') || (ch == '}') || (ch == '\'') || (ch == '\"') ;
+}
+
+static inline bool isMETAPOSTtwo(int ch) {
+       return
+      (ch == ';') || (ch == '$') || (ch == '@') || (ch == '#');
+}
+
+static inline bool isMETAPOSTthree(int ch) {
+       return
+      (ch == '.') || (ch == '-') || (ch == '+') || (ch == '/') ||
+      (ch == '*') || (ch == ',') || (ch == '|') || (ch == '`') ||
+      (ch == '!') || (ch == '?') || (ch == '^') || (ch == '&') ||
+      (ch == '%') ;
+}
+
+static inline bool isMETAPOSTidentifier(int ch) {
+       return
+      ((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) ||
+      (ch == '_') ;
+}
+
+static inline bool isMETAPOSTnumber(int ch) {
+       return
+      (ch >= '0') && (ch <= '9') ;
+}
+
+static inline bool isMETAPOSTstring(int ch) {
+       return
+      (ch == '\"') ;
+}
+
+static inline bool isMETAPOSTcolon(int ch) {
+       return
+               (ch == ':') ;
+}
+
+static inline bool isMETAPOSTequal(int ch) {
+       return
+               (ch == '=') ;
+}
+
+static int CheckMETAPOSTInterface(
+    unsigned int startPos,
+    int length,
+    Accessor &styler,
+       int defaultInterface) {
+
+    char lineBuffer[1024] ;
+       unsigned int linePos = 0 ;
+
+       // some day we can make something lexer.metapost.mapping=(none,0)(metapost,1)(mp,1)(metafun,2)...
+
+    if (styler.SafeGetCharAt(0) == '%') {
+        for (unsigned int i = 0; i < startPos + length; i++) {
+            lineBuffer[linePos++] = styler.SafeGetCharAt(i) ;
+            if (endOfLine(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {
+                lineBuffer[linePos] = '\0';
+                               if (strstr(lineBuffer, "interface=none")) {
+                    return 0 ;
+                               } else if (strstr(lineBuffer, "interface=metapost") || strstr(lineBuffer, "interface=mp")) {
+                    return 1 ;
+                               } else if (strstr(lineBuffer, "interface=metafun")) {
+                    return 2 ;
+                               } else if (styler.SafeGetCharAt(1) == 'D' && strstr(lineBuffer, "%D \\module")) {
+                                       // better would be to limit the search to just one line
+                                       return 2 ;
+                } else {
+                    return defaultInterface ;
+                }
+            }
+               }
+    }
+
+    return defaultInterface ;
+}
+
+static void ColouriseMETAPOSTDoc(
+    unsigned int startPos,
+    int length,
+    int,
+    WordList *keywordlists[],
+    Accessor &styler) {
+
+       styler.StartAt(startPos) ;
+       styler.StartSegment(startPos) ;
+
+       bool processComment   = styler.GetPropertyInt("lexer.metapost.comment.process",   0) == 1 ;
+    int  defaultInterface = styler.GetPropertyInt("lexer.metapost.interface.default", 1) ;
+
+       int currentInterface = CheckMETAPOSTInterface(startPos,length,styler,defaultInterface) ;
+
+       // 0  no keyword highlighting
+       // 1  metapost keyword hightlighting
+       // 2+ metafun keyword hightlighting
+
+       int extraInterface = 0 ;
+
+       if (currentInterface != 0) {
+               extraInterface = currentInterface ;
+       }
+
+       WordList &keywords  = *keywordlists[0] ;
+       WordList &keywords2 = *keywordlists[extraInterface-1] ;
+
+       StyleContext sc(startPos, length, SCE_METAPOST_TEXT, styler) ;
+
+       char key[100] ;
+
+    bool inTeX     = false ;
+       bool inComment = false ;
+       bool inString  = false ;
+       bool inClause  = false ;
+
+       bool going = sc.More() ; // needed because of a fuzzy end of file state
+
+       for (; going; sc.Forward()) {
+
+               if (! sc.More()) { going = false ; } // we need to go one behind the end of text
+
+               if (inClause) {
+                       sc.SetState(SCE_METAPOST_TEXT) ;
+                       inClause = false ;
+               }
+
+               if (inComment) {
+                       if (sc.atLineEnd) {
+                               sc.SetState(SCE_METAPOST_TEXT) ;
+                               inTeX = false ;
+                               inComment = false ;
+                               inClause = false ;
+                               inString = false ; // not correct but we want to stimulate one-lines
+                       }
+               } else if (inString) {
+                       if (isMETAPOSTstring(sc.ch)) {
+                               sc.SetState(SCE_METAPOST_SPECIAL) ;
+                               sc.ForwardSetState(SCE_METAPOST_TEXT) ;
+                               inString = false ;
+                       } else if (sc.atLineEnd) {
+                               sc.SetState(SCE_METAPOST_TEXT) ;
+                               inTeX = false ;
+                               inComment = false ;
+                               inClause = false ;
+                               inString = false ; // not correct but we want to stimulate one-lines
+                       }
+               } else {
+                       if ((! isMETAPOSTidentifier(sc.ch)) && (sc.LengthCurrent() > 0)) {
+                               if (sc.state == SCE_METAPOST_COMMAND) {
+                                       sc.GetCurrent(key, sizeof(key)) ;
+                                       if ((strcmp(key,"btex") == 0) || (strcmp(key,"verbatimtex") == 0)) {
+                                       sc.ChangeState(SCE_METAPOST_GROUP) ;
+                                               inTeX = true ;
+                                       } else if (inTeX) {
+                                               if (strcmp(key,"etex") == 0) {
+                                               sc.ChangeState(SCE_METAPOST_GROUP) ;
+                                                       inTeX = false ;
+                                               } else {
+                                               sc.ChangeState(SCE_METAPOST_TEXT) ;
+                                               }
+                                       } else {
+                                               if (keywords && keywords.InList(key)) {
+                                               sc.ChangeState(SCE_METAPOST_COMMAND) ;
+                                               } else if (keywords2 && keywords2.InList(key)) {
+                                                       sc.ChangeState(SCE_METAPOST_EXTRA) ;
+                                               } else {
+                                                       sc.ChangeState(SCE_METAPOST_TEXT) ;
+                                               }
+                                       }
+                               }
+                       }
+                       if (isMETAPOSTcomment(sc.ch)) {
+                               if (! inTeX) {
+                                       sc.SetState(SCE_METAPOST_SYMBOL) ;
+                                       sc.ForwardSetState(SCE_METAPOST_DEFAULT) ;
+                                       inComment = ! processComment ;
+                               } else {
+                                       sc.SetState(SCE_METAPOST_TEXT) ;
+                               }
+                       } else if (isMETAPOSTstring(sc.ch)) {
+                               if (! inTeX) {
+                                       sc.SetState(SCE_METAPOST_SPECIAL) ;
+                                       if (! isMETAPOSTstring(sc.chNext)) {
+                                               sc.ForwardSetState(SCE_METAPOST_TEXT) ;
+                                       }
+                                       inString = true ;
+                               } else {
+                                       sc.SetState(SCE_METAPOST_TEXT) ;
+                               }
+                       } else if (isMETAPOSTcolon(sc.ch)) {
+                               if (! inTeX) {
+                                       if (! isMETAPOSTequal(sc.chNext)) {
+                                               sc.SetState(SCE_METAPOST_COMMAND) ;
+                                               inClause = true ;
+                                       } else {
+                                               sc.SetState(SCE_METAPOST_SPECIAL) ;
+                                       }
+                               } else {
+                                       sc.SetState(SCE_METAPOST_TEXT) ;
+                               }
+                       } else if (isMETAPOSTone(sc.ch)) {
+                               if (! inTeX) {
+                                       sc.SetState(SCE_METAPOST_SPECIAL) ;
+                               } else {
+                                       sc.SetState(SCE_METAPOST_TEXT) ;
+                               }
+                       } else if (isMETAPOSTtwo(sc.ch)) {
+                               if (! inTeX) {
+                                       sc.SetState(SCE_METAPOST_GROUP) ;
+                               } else {
+                                       sc.SetState(SCE_METAPOST_TEXT) ;
+                               }
+                       } else if (isMETAPOSTthree(sc.ch)) {
+                               if (! inTeX) {
+                                       sc.SetState(SCE_METAPOST_SYMBOL) ;
+                               } else {
+                                       sc.SetState(SCE_METAPOST_TEXT) ;
+                               }
+                       } else if (isMETAPOSTidentifier(sc.ch)) {
+                               if (sc.state != SCE_METAPOST_COMMAND) {
+                                       sc.SetState(SCE_METAPOST_TEXT) ;
+                                       sc.ChangeState(SCE_METAPOST_COMMAND) ;
+                               }
+                       } else if (isMETAPOSTnumber(sc.ch)) {
+                               // rather redundant since for the moment we don't handle numbers
+                               sc.SetState(SCE_METAPOST_TEXT) ;
+                       } else if (sc.atLineEnd) {
+                               sc.SetState(SCE_METAPOST_TEXT) ;
+                               inTeX = false ;
+                               inComment = false ;
+                               inClause = false ;
+                               inString = false ;
+                       } else {
+                               sc.SetState(SCE_METAPOST_TEXT) ;
+                       }
+               }
+
+       }
+
+       sc.Complete();
+
+}
+
+// Hooks info the system:
+
+static const char * const metapostWordListDesc[] = {
+       "MetaPost",
+       "MetaFun",
+       0
+} ;
+
+LexerModule lmMETAPOST(SCLEX_METAPOST, ColouriseMETAPOSTDoc, "metapost", 0, metapostWordListDesc);
index 31ac415ad4eb7b7ebf865e55628c46853d252c62..819dd312905ade74736add7af3ac4781c450a7f7 100644 (file)
@@ -427,6 +427,12 @@ static void ColouriseErrorListLine(
                styler.ColourTo(endPos, SCE_ERR_DIFF_ADDITION);
        } else if (lineBuffer[0] == '-' && lineBuffer[1] == '-' && lineBuffer[2] == '-') {
                styler.ColourTo(endPos, SCE_ERR_DIFF_MESSAGE);
                styler.ColourTo(endPos, SCE_ERR_DIFF_ADDITION);
        } else if (lineBuffer[0] == '-' && lineBuffer[1] == '-' && lineBuffer[2] == '-') {
                styler.ColourTo(endPos, SCE_ERR_DIFF_MESSAGE);
+       } else if (strstart(lineBuffer, "cf90-")) {
+               // Absoft Pro Fortran 90/95 v8.2 error and/or warning message
+               styler.ColourTo(endPos, SCE_ERR_ABSF);
+       } else if (strstart(lineBuffer, "fortcom:")) {
+               // Intel Fortran Compiler v8.0 error/warning message
+               styler.ColourTo(endPos, SCE_ERR_IFORT);
        } else if (lineBuffer[0] == '-') {
                styler.ColourTo(endPos, SCE_ERR_DIFF_DELETION);
        } else if (strstr(lineBuffer, "File \"") && strstr(lineBuffer, ", line ")) {
        } else if (lineBuffer[0] == '-') {
                styler.ColourTo(endPos, SCE_ERR_DIFF_DELETION);
        } else if (strstr(lineBuffer, "File \"") && strstr(lineBuffer, ", line ")) {
diff --git a/contrib/src/stc/scintilla/src/LexPB.cxx b/contrib/src/stc/scintilla/src/LexPB.cxx
new file mode 100644 (file)
index 0000000..d35944e
--- /dev/null
@@ -0,0 +1,228 @@
+// Scintilla source code edit control
+/** @file LexPB.cxx
+ ** Lexer for PowerBasic by Roland Walter, roland@rowalt.de
+ ** Last update: 17.10.2003 (toggling of subs/functions now until next sub/functin - this gives better results)
+ **/
+//
+// Necessary changes in Scintilla project:
+//  - In SciLexer.h and Scintilla.iface:
+//
+//    #define SCLEX_PB 51                              //ID for PowerBasic lexer
+//    (...)
+//    #define SCE_B_DEFAULT 0                  //in both VB and PB lexer
+//    #define SCE_B_COMMENT 1                  //in both VB and PB lexer
+//    #define SCE_B_NUMBER 2                   //in both VB and PB lexer
+//    #define SCE_B_KEYWORD 3                  //in both VB and PB lexer
+//    #define SCE_B_STRING 4                   //in both VB and PB lexer
+//    #define SCE_B_PREPROCESSOR 5             //VB lexer only, unsupported by PB lexer
+//    #define SCE_B_OPERATOR 6                 //in both VB and PB lexer
+//    #define SCE_B_IDENTIFIER 7               //in both VB and PB lexer
+//    #define SCE_B_DATE 8                             //VB lexer only, unsupported by PB lexer
+
+//  - Statement added to KeyWords.cxx:      'LINK_LEXER(lmPB);'
+//  - Statement added to scintilla_vc6.mak: '$(DIR_O)\LexPB.obj: ...\src\LexPB.cxx $(LEX_HEADERS)'
+//
+// Copyright for Scintilla: 1998-2001 by Neil Hodgson <neilh@scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+static inline bool IsTypeCharacter(const int ch) {
+       return ch == '%' || ch == '&' || ch == '@' || ch == '!' || ch == '#' || ch == '$';
+}
+
+static inline bool IsAWordChar(const int ch) {
+       return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
+}
+
+static inline bool IsAWordStart(const int ch) {
+       return (ch < 0x80) && (isalnum(ch) || ch == '_');
+}
+
+bool MatchUpperCase(Accessor &styler, int pos, const char *s)   //Same as styler.Match() but uppercase comparison (a-z,A-Z and space only)
+{
+       char ch;
+       for (int i=0; *s; i++)
+       {
+               ch=styler.SafeGetCharAt(pos+i);
+               if (ch > 0x60) ch -= '\x20';
+               if (*s != ch) return false;
+               s++;
+       }
+       return true;
+}
+
+static void ColourisePBDoc(unsigned int startPos, int length, int initStyle,WordList *keywordlists[],
+                                                  Accessor &styler) {
+
+       WordList &keywords = *keywordlists[0];
+
+       styler.StartAt(startPos);
+
+       StyleContext sc(startPos, length, initStyle, styler);
+
+       for (; sc.More(); sc.Forward()) {
+
+               if (sc.state == SCE_B_OPERATOR)
+               {
+                       sc.SetState(SCE_B_DEFAULT);
+               }
+               else if (sc.state == SCE_B_KEYWORD)
+               {
+                       if (!IsAWordChar(sc.ch))
+                       {
+                               if (!IsTypeCharacter(sc.ch))
+                               {
+                                       if (sc.ch == ']') {sc.Forward();}
+                                       char s[100];
+                                       sc.GetCurrentLowered(s, sizeof(s));
+                                       if (keywords.InList(s))
+                                       {
+                                               if (strcmp(s, "rem") == 0)
+                                               {
+                                                       sc.ChangeState(SCE_B_COMMENT);
+                                                       if (sc.atLineEnd) {sc.SetState(SCE_B_DEFAULT);}
+                                               }
+                                               else
+                                               {
+                                                       sc.SetState(SCE_B_DEFAULT);
+                                               }
+                                       }
+                                       else
+                                       {
+                                               sc.ChangeState(SCE_B_IDENTIFIER);
+                                               sc.SetState(SCE_B_DEFAULT);
+                                       }
+                               }
+                       }
+               }
+               else if (sc.state == SCE_B_NUMBER)
+               {
+                       if (!IsAWordChar(sc.ch)) {sc.SetState(SCE_B_DEFAULT);}
+               }
+               else if (sc.state == SCE_B_STRING)
+               {
+                       // PB doubles quotes to preserve them, so just end this string
+                       // state now as a following quote will start again
+                       if (sc.ch == '\"')
+                       {
+                               if (tolower(sc.chNext) == 'c') {sc.Forward();}
+                               sc.ForwardSetState(SCE_B_DEFAULT);
+                       }
+               }
+               else if (sc.state == SCE_B_COMMENT)
+               {
+                       if (sc.atLineEnd) {sc.SetState(SCE_B_DEFAULT);}
+               }
+
+               if (sc.state == SCE_B_DEFAULT)
+               {
+                       if (sc.ch == '\'') {sc.SetState(SCE_B_COMMENT);}
+                       else if (sc.ch == '\"') {sc.SetState(SCE_B_STRING);}
+                       else if (sc.ch == '#')
+                       {       int n = 1;
+                               int chSeek = ' ';
+                               while ((n < 100) && (chSeek == ' ' || chSeek == '\t'))
+                               {
+                                       chSeek = sc.GetRelative(n);
+                                       n++;
+                               }
+                               sc.SetState(SCE_B_OPERATOR);
+                       }
+                       else if (sc.ch == '&' && tolower(sc.chNext) == 'h') {sc.SetState(SCE_B_NUMBER);}
+                       else if (sc.ch == '&' && tolower(sc.chNext) == 'b') {sc.SetState(SCE_B_NUMBER);}
+                       else if (sc.ch == '&' && tolower(sc.chNext) == 'o') {sc.SetState(SCE_B_NUMBER);}
+                       else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {sc.SetState(SCE_B_NUMBER);}
+                       else if (IsAWordStart(sc.ch) || (sc.ch == '[')) {sc.SetState(SCE_B_KEYWORD);}
+                       else if (isoperator(static_cast<char>(sc.ch)) || (sc.ch == '\\')) {sc.SetState(SCE_B_OPERATOR);}
+               }
+
+       }
+       sc.Complete();
+}
+
+static void FoldPBDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler)
+{
+       // No folding enabled, no reason to continue...
+       if( styler.GetPropertyInt("fold") == 0 )
+               return;
+
+       unsigned int endPos = startPos + length;
+       int lineCurrent = styler.GetLine(startPos);
+       int levelCurrent = SC_FOLDLEVELBASE;
+       if (lineCurrent > 0)
+               levelCurrent = styler.LevelAt(lineCurrent-1) >> 16;
+       int levelNext = levelCurrent;
+       char chNext = styler[startPos];
+
+       bool atEOL=1;
+       for (unsigned int i = startPos; i < endPos; i++)
+       {
+               char ch = chNext;
+               chNext = styler.SafeGetCharAt(i + 1);
+
+               if( atEOL )                     //Begin of a new line (The Sub/Function/Macro keywords may occur at begin of line only)
+               {
+                       if( MatchUpperCase(styler,i,"FUNCTION") )  //else if(
+                       {
+                               styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
+                               levelNext=SC_FOLDLEVELBASE+1;
+                       }
+                       else if( MatchUpperCase(styler,i,"CALLBACK FUNCTION") )
+                       {
+                               styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
+                               levelNext=SC_FOLDLEVELBASE+1;
+                       }
+                       else if( MatchUpperCase(styler,i,"STATIC FUNCTION") )
+                       {
+                               styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
+                               levelNext=SC_FOLDLEVELBASE+1;
+                       }
+                       else if( MatchUpperCase(styler,i,"SUB") )
+                       {
+                               styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
+                               levelNext=SC_FOLDLEVELBASE+1;
+                       }
+                       else if( MatchUpperCase(styler,i,"STATIC SUB") )
+                       {
+                               styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
+                               levelNext=SC_FOLDLEVELBASE+1;
+                       }
+                       //else if( MatchUpperCase(styler,i,"MACRO") )  //ToDo: What's with single-line macros?
+               }
+
+               atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
+               if( atEOL )
+               {
+                       lineCurrent++;
+                       levelCurrent = levelNext;
+               }
+       }
+
+       if (levelNext == SC_FOLDLEVELBASE)
+       {
+               int levelUse = levelCurrent;
+               int lev = levelUse | levelNext << 16;
+               styler.SetLevel(lineCurrent, lev);
+       }
+}
+
+static const char * const pbWordListDesc[] = {
+       "Keywords",
+       0
+};
+
+LexerModule lmPB(SCLEX_POWERBASIC, ColourisePBDoc, "powerbasic", FoldPBDoc, pbWordListDesc);
index 33ba6a490f999bd27a7195de599df7338f2b5985..0c1a21ab48bdd7c8fdc8f1c8e76a9184a939759c 100644 (file)
@@ -33,10 +33,18 @@ static inline bool IsAWordChar(const int ch) {
        return ch < 0x80 && (isalnum(ch) || ch == '_');
 }
 
        return ch < 0x80 && (isalnum(ch) || ch == '_');
 }
 
-inline bool IsAWordStart(const int ch) {
+static inline bool IsAWordStart(const int ch) {
        return ch < 0x80 && isalpha(ch);
 }
 
        return ch < 0x80 && isalpha(ch);
 }
 
+static inline bool IsANumberChar(const int ch) {
+       // Not exactly following number definition (several dots are seen as OK, etc.)
+       // but probably enough in most cases.
+       return (ch < 0x80) &&
+               (isdigit(ch) || toupper(ch) == 'E' ||
+             ch == '.' || ch == '-' || ch == '+');
+}
+
 static void ColourisePovDoc(
        unsigned int startPos,
        int length,
 static void ColourisePovDoc(
        unsigned int startPos,
        int length,
@@ -91,11 +99,8 @@ static void ColourisePovDoc(
                        sc.SetState(SCE_POV_DEFAULT);
                } else if (sc.state == SCE_POV_NUMBER) {
                        // We stop the number definition on non-numerical non-dot non-eE non-sign char
                        sc.SetState(SCE_POV_DEFAULT);
                } else if (sc.state == SCE_POV_NUMBER) {
                        // We stop the number definition on non-numerical non-dot non-eE non-sign char
-                       if (!(isdigit(sc.ch) || sc.ch == '.' ||
-                                 toupper(sc.ch) == 'E' || sc.ch == '-' || sc.ch == '+')) {
-                                       // Not exactly following number definition (several dots are seen as OK, etc.)
-                                       // but probably enough in most cases.
-                                       sc.SetState(SCE_POV_DEFAULT);
+                       if (!IsANumberChar(sc.ch)) {
+                               sc.SetState(SCE_POV_DEFAULT);
                        }
                } else if (sc.state == SCE_POV_IDENTIFIER) {
                        if (!IsAWordChar(sc.ch)) {
                        }
                } else if (sc.state == SCE_POV_IDENTIFIER) {
                        if (!IsAWordChar(sc.ch)) {
index 211c3b8751e83e47db835eb76ec4c0f9fc53e5c7..16a068778e774d06abdc879349c8e43886731e16 100644 (file)
@@ -2,7 +2,8 @@
 /** @file LexPerl.cxx
  ** Lexer for subset of Perl.
  **/
 /** @file LexPerl.cxx
  ** Lexer for subset of Perl.
  **/
-// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
+// Lexical analysis fixes by Kein-Hong Man <mkh@pl.jaring.my> 20031020
+// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include <stdlib.h>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include <stdlib.h>
 #include "Scintilla.h"
 #include "SciLexer.h"
 
 #include "Scintilla.h"
 #include "SciLexer.h"
 
+#define PERLNUM_DECIMAL 1
+#define PERLNUM_NON_DEC 2
+#define PERLNUM_FLOAT 3
+#define PERLNUM_VECTOR 4
+#define PERLNUM_V_VECTOR 5
+
+#define HERE_DELIM_MAX 256
+
 static inline bool isEOLChar(char ch) {
        return (ch == '\r') || (ch == '\n');
 }
 static inline bool isEOLChar(char ch) {
        return (ch == '\r') || (ch == '\n');
 }
@@ -31,9 +40,6 @@ static bool isSingleCharOp(char ch) {
 }
 
 static inline bool isPerlOperator(char ch) {
 }
 
 static inline bool isPerlOperator(char ch) {
-       if (isalnum(ch))
-               return false;
-       // '.' left out as it is used to make up numbers
        if (ch == '%' || ch == '^' || ch == '&' || ch == '*' || ch == '\\' ||
                ch == '(' || ch == ')' || ch == '-' || ch == '+' ||
                ch == '=' || ch == '|' || ch == '{' || ch == '}' ||
        if (ch == '%' || ch == '^' || ch == '&' || ch == '*' || ch == '\\' ||
                ch == '(' || ch == ')' || ch == '-' || ch == '+' ||
                ch == '=' || ch == '|' || ch == '{' || ch == '}' ||
@@ -46,18 +52,13 @@ static inline bool isPerlOperator(char ch) {
 
 static int classifyWordPerl(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {
        char s[100];
 
 static int classifyWordPerl(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {
        char s[100];
-       bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.');
        for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
                s[i] = styler[start + i];
                s[i + 1] = '\0';
        }
        char chAttr = SCE_PL_IDENTIFIER;
        for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
                s[i] = styler[start + i];
                s[i + 1] = '\0';
        }
        char chAttr = SCE_PL_IDENTIFIER;
-       if (wordIsNumber)
-               chAttr = SCE_PL_NUMBER;
-       else {
-               if (keywords.InList(s))
-                       chAttr = SCE_PL_WORD;
-       }
+       if (keywords.InList(s))
+               chAttr = SCE_PL_WORD;
        styler.ColourTo(end, chAttr);
        return chAttr;
 }
        styler.ColourTo(end, chAttr);
        return chAttr;
 }
@@ -67,6 +68,23 @@ static inline bool isEndVar(char ch) {
               ch != '_' && ch != '\'';
 }
 
               ch != '_' && ch != '\'';
 }
 
+static inline bool isNonQuote(char ch) {
+       return isalnum(ch) || ch == '_';
+}
+
+static inline char actualNumStyle(int numberStyle) {
+       switch (numberStyle) {
+       case PERLNUM_VECTOR:
+       case PERLNUM_V_VECTOR:
+               return SCE_PL_STRING;
+       case PERLNUM_DECIMAL:
+       case PERLNUM_NON_DEC:
+       case PERLNUM_FLOAT:
+       default:
+               return SCE_PL_NUMBER;
+       }
+}
+
 static bool isMatch(Accessor &styler, int lengthDoc, int pos, const char *val) {
        if ((pos + static_cast<int>(strlen(val))) >= lengthDoc) {
                return false;
 static bool isMatch(Accessor &styler, int lengthDoc, int pos, const char *val) {
        if ((pos + static_cast<int>(strlen(val))) >= lengthDoc) {
                return false;
@@ -109,12 +127,16 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                char Quote;             // the char after '<<'
                bool Quoted;            // true if Quote in ('\'','"','`')
                int DelimiterLength;    // strlen(Delimiter)
                char Quote;             // the char after '<<'
                bool Quoted;            // true if Quote in ('\'','"','`')
                int DelimiterLength;    // strlen(Delimiter)
-               char Delimiter[256];    // the Delimiter, 256: sizeof PL_tokenbuf
+               char *Delimiter;        // the Delimiter, 256: sizeof PL_tokenbuf
                HereDocCls() {
                        State = 0;
                        DelimiterLength = 0;
                HereDocCls() {
                        State = 0;
                        DelimiterLength = 0;
+                       Delimiter = new char[HERE_DELIM_MAX];
                        Delimiter[0] = '\0';
                }
                        Delimiter[0] = '\0';
                }
+               ~HereDocCls() {
+                       delete []Delimiter;
+               }
        };
        HereDocCls HereDoc;     // TODO: FIFO for stacked here-docs
 
        };
        HereDocCls HereDoc;     // TODO: FIFO for stacked here-docs
 
@@ -141,14 +163,17 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
        };
        QuoteCls Quote;
 
        };
        QuoteCls Quote;
 
-       char sooked[100];
-       int sookedpos = 0;
-       bool preferRE = true;
-       sooked[sookedpos] = '\0';
        int state = initStyle;
        int state = initStyle;
+       char numState = PERLNUM_DECIMAL;
+       int dotCount = 0;
        unsigned int lengthDoc = startPos + length;
        unsigned int lengthDoc = startPos + length;
+       //int sookedpos = 0; // these have no apparent use, see POD state
+       //char sooked[100];
+       //sooked[sookedpos] = '\0';
 
 
-       // If in a long distance lexical state, seek to the beginning  to find quote characters
+       // If in a long distance lexical state, seek to the beginning to find quote characters
+       // Perl strings can be multi-line with embedded newlines, so backtrack.
+       // Perl numbers have additional state during lexing, so backtrack too.
        if (state == SCE_PL_HERE_Q || state == SCE_PL_HERE_QQ || state == SCE_PL_HERE_QX) {
                while ((startPos > 1) && (styler.StyleAt(startPos) != SCE_PL_HERE_DELIM)) {
                        startPos--;
        if (state == SCE_PL_HERE_Q || state == SCE_PL_HERE_QQ || state == SCE_PL_HERE_QX) {
                while ((startPos > 1) && (styler.StyleAt(startPos) != SCE_PL_HERE_DELIM)) {
                        startPos--;
@@ -163,6 +188,10 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
        || state == SCE_PL_STRING_QW
        || state == SCE_PL_REGEX
        || state == SCE_PL_REGSUBST
        || state == SCE_PL_STRING_QW
        || state == SCE_PL_REGEX
        || state == SCE_PL_REGSUBST
+       || state == SCE_PL_STRING
+       || state == SCE_PL_BACKTICKS
+       || state == SCE_PL_CHARACTER
+       || state == SCE_PL_NUMBER
        ) {
                while ((startPos > 1) && (styler.StyleAt(startPos - 1) == state)) {
                        startPos--;
        ) {
                while ((startPos > 1) && (styler.StyleAt(startPos - 1) == state)) {
                        startPos--;
@@ -179,6 +208,9 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 
        for (unsigned int i = startPos; i < lengthDoc; i++) {
                char ch = chNext;
 
        for (unsigned int i = startPos; i < lengthDoc; i++) {
                char ch = chNext;
+               // if the current character is not consumed due to the completion of an
+               // earlier style, lexing can be restarted via a simple goto
+       restartLexer:
                chNext = styler.SafeGetCharAt(i + 1);
                char chNext2 = styler.SafeGetCharAt(i + 2);
 
                chNext = styler.SafeGetCharAt(i + 1);
                char chNext2 = styler.SafeGetCharAt(i + 2);
 
@@ -189,32 +221,36 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                        continue;
                }
                if ((chPrev == '\r' && ch == '\n')) {   // skip on DOS/Windows
                        continue;
                }
                if ((chPrev == '\r' && ch == '\n')) {   // skip on DOS/Windows
+                       styler.ColourTo(i, state);
                        chPrev = ch;
                        continue;
                }
 
                if (HereDoc.State == 1 && isEOLChar(ch)) {
                        // Begin of here-doc (the line after the here-doc delimiter):
                        chPrev = ch;
                        continue;
                }
 
                if (HereDoc.State == 1 && isEOLChar(ch)) {
                        // Begin of here-doc (the line after the here-doc delimiter):
+                       // Lexically, the here-doc starts from the next line after the >>, but the
+                       // first line of here-doc seem to follow the style of the last EOL sequence
                        HereDoc.State = 2;
                        HereDoc.State = 2;
-                       styler.ColourTo(i - 1, state);
                        if (HereDoc.Quoted) {
                                if (state == SCE_PL_HERE_DELIM) {
                                        // Missing quote at end of string! We are stricter than perl.
                        if (HereDoc.Quoted) {
                                if (state == SCE_PL_HERE_DELIM) {
                                        // Missing quote at end of string! We are stricter than perl.
+                                       // Colour here-doc anyway while marking this bit as an error.
                                        state = SCE_PL_ERROR;
                                        state = SCE_PL_ERROR;
-                               } else {
-                                       switch (HereDoc.Quote) {
-                                       case '\'':
-                                               state = SCE_PL_HERE_Q ;
-                                               break;
-                                       case '"':
-                                               state = SCE_PL_HERE_QQ;
-                                               break;
-                                       case '`':
-                                               state = SCE_PL_HERE_QX;
-                                               break;
-                                       }
+                               }
+                               styler.ColourTo(i - 1, state);
+                               switch (HereDoc.Quote) {
+                               case '\'':
+                                       state = SCE_PL_HERE_Q ;
+                                       break;
+                               case '"':
+                                       state = SCE_PL_HERE_QQ;
+                                       break;
+                               case '`':
+                                       state = SCE_PL_HERE_QX;
+                                       break;
                                }
                        } else {
                                }
                        } else {
+                               styler.ColourTo(i - 1, state);
                                switch (HereDoc.Quote) {
                                case '\\':
                                        state = SCE_PL_HERE_Q ;
                                switch (HereDoc.Quote) {
                                case '\\':
                                        state = SCE_PL_HERE_Q ;
@@ -226,26 +262,37 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                }
 
                if (state == SCE_PL_DEFAULT) {
                }
 
                if (state == SCE_PL_DEFAULT) {
-                       if (iswordstart(ch)) {
-                               styler.ColourTo(i - 1, state);
-                               if (ch == 's' && !isalnum(chNext)) {
+                       if (isdigit(ch) || (isdigit(chNext) &&
+                               (ch == '.' || ch == 'v'))) {
+                               state = SCE_PL_NUMBER;
+                               numState = PERLNUM_DECIMAL;
+                               dotCount = 0;
+                               if (ch == '0') {        // hex,bin,octal
+                                       if (chNext == 'x' || chNext == 'b' || isdigit(chNext)) {
+                                               numState = PERLNUM_NON_DEC;
+                                       }
+                               } else if (ch == 'v') { // vector
+                                       numState = PERLNUM_V_VECTOR;
+                               }
+                       } else if (iswordstart(ch)) {
+                               if (ch == 's' && !isNonQuote(chNext)) {
                                        state = SCE_PL_REGSUBST;
                                        Quote.New(2);
                                        state = SCE_PL_REGSUBST;
                                        Quote.New(2);
-                               } else if (ch == 'm' && !isalnum(chNext)) {
+                               } else if (ch == 'm' && !isNonQuote(chNext)) {
                                        state = SCE_PL_REGEX;
                                        Quote.New(1);
                                        state = SCE_PL_REGEX;
                                        Quote.New(1);
-                               } else if (ch == 'q' && !isalnum(chNext)) {
+                               } else if (ch == 'q' && !isNonQuote(chNext)) {
                                        state = SCE_PL_STRING_Q;
                                        Quote.New(1);
                                        state = SCE_PL_STRING_Q;
                                        Quote.New(1);
-                               } else if (ch == 'y' && !isalnum(chNext)) {
+                               } else if (ch == 'y' && !isNonQuote(chNext)) {
                                        state = SCE_PL_REGSUBST;
                                        Quote.New(2);
                                        state = SCE_PL_REGSUBST;
                                        Quote.New(2);
-                               } else if (ch == 't' && chNext == 'r' && !isalnum(chNext2)) {
+                               } else if (ch == 't' && chNext == 'r' && !isNonQuote(chNext2)) {
                                        state = SCE_PL_REGSUBST;
                                        Quote.New(2);
                                        i++;
                                        chNext = chNext2;
                                        state = SCE_PL_REGSUBST;
                                        Quote.New(2);
                                        i++;
                                        chNext = chNext2;
-                               } else if (ch == 'q' && (chNext == 'q' || chNext == 'r' || chNext == 'w' || chNext == 'x') && !isalnum(chNext2)) {
+                               } else if (ch == 'q' && (chNext == 'q' || chNext == 'r' || chNext == 'w' || chNext == 'x') && !isNonQuote(chNext2)) {
                                        if      (chNext == 'q') state = SCE_PL_STRING_QQ;
                                        else if (chNext == 'x') state = SCE_PL_STRING_QX;
                                        else if (chNext == 'r') state = SCE_PL_STRING_QR;
                                        if      (chNext == 'q') state = SCE_PL_STRING_QQ;
                                        else if (chNext == 'x') state = SCE_PL_STRING_QX;
                                        else if (chNext == 'r') state = SCE_PL_STRING_QR;
@@ -253,9 +300,12 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                        i++;
                                        chNext = chNext2;
                                        Quote.New(1);
                                        i++;
                                        chNext = chNext2;
                                        Quote.New(1);
+                               } else if (ch == 'x' && (chNext == '=' ||       // repetition
+                                          (chNext != '_' && !isalnum(chNext)) ||
+                                          (isdigit(chPrev) && isdigit(chNext)))) {
+                                       styler.ColourTo(i, SCE_PL_OPERATOR);
                                } else {
                                        state = SCE_PL_WORD;
                                } else {
                                        state = SCE_PL_WORD;
-                                       preferRE = false;
                                        if ((!iswordchar(chNext) && chNext != '\'')
                                                || (chNext == '.' && chNext2 == '.')) {
                                                // We need that if length of word == 1!
                                        if ((!iswordchar(chNext) && chNext != '\'')
                                                || (chNext == '.' && chNext2 == '.')) {
                                                // We need that if length of word == 1!
@@ -265,10 +315,8 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                        }
                                }
                        } else if (ch == '#') {
                                        }
                                }
                        } else if (ch == '#') {
-                               styler.ColourTo(i - 1, state);
                                state = SCE_PL_COMMENTLINE;
                        } else if (ch == '\"') {
                                state = SCE_PL_COMMENTLINE;
                        } else if (ch == '\"') {
-                               styler.ColourTo(i - 1, state);
                                state = SCE_PL_STRING;
                                Quote.New(1);
                                Quote.Open(ch);
                                state = SCE_PL_STRING;
                                Quote.New(1);
                                Quote.Open(ch);
@@ -277,31 +325,32 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                        // Archaic call
                                        styler.ColourTo(i, state);
                                } else {
                                        // Archaic call
                                        styler.ColourTo(i, state);
                                } else {
-                                       styler.ColourTo(i - 1, state);
                                        state = SCE_PL_CHARACTER;
                                        Quote.New(1);
                                        Quote.Open(ch);
                                }
                        } else if (ch == '`') {
                                        state = SCE_PL_CHARACTER;
                                        Quote.New(1);
                                        Quote.Open(ch);
                                }
                        } else if (ch == '`') {
-                               styler.ColourTo(i - 1, state);
                                state = SCE_PL_BACKTICKS;
                                Quote.New(1);
                                Quote.Open(ch);
                        } else if (ch == '$') {
                                state = SCE_PL_BACKTICKS;
                                Quote.New(1);
                                Quote.Open(ch);
                        } else if (ch == '$') {
-                               preferRE = false;
-                               styler.ColourTo(i - 1, state);
                                if ((chNext == '{') || isspacechar(chNext)) {
                                        styler.ColourTo(i, SCE_PL_SCALAR);
                                } else {
                                        state = SCE_PL_SCALAR;
                                if ((chNext == '{') || isspacechar(chNext)) {
                                        styler.ColourTo(i, SCE_PL_SCALAR);
                                } else {
                                        state = SCE_PL_SCALAR;
-                                       i++;
-                                       ch = chNext;
-                                       chNext = chNext2;
+                                       if (chNext == '`' && chNext2 == '`') {
+                                               i += 2;
+                                               ch = styler.SafeGetCharAt(i);
+                                               chNext = styler.SafeGetCharAt(i + 1);
+                                       } else {
+                                               i++;
+                                               ch = chNext;
+                                               chNext = chNext2;
+                                       }
                                }
                        } else if (ch == '@') {
                                }
                        } else if (ch == '@') {
-                               preferRE = false;
-                               styler.ColourTo(i - 1, state);
-                               if (isalpha(chNext) || chNext == '#' || chNext == '$' || chNext == '_') {
+                               if (isalpha(chNext) || chNext == '#' || chNext == '$'
+                                                   || chNext == '_' || chNext == '+') {
                                        state = SCE_PL_ARRAY;
                                } else if (chNext != '{' && chNext != '[') {
                                        styler.ColourTo(i, SCE_PL_ARRAY);
                                        state = SCE_PL_ARRAY;
                                } else if (chNext != '{' && chNext != '[') {
                                        styler.ColourTo(i, SCE_PL_ARRAY);
@@ -311,8 +360,6 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                        styler.ColourTo(i, SCE_PL_ARRAY);
                                }
                        } else if (ch == '%') {
                                        styler.ColourTo(i, SCE_PL_ARRAY);
                                }
                        } else if (ch == '%') {
-                               preferRE = false;
-                               styler.ColourTo(i - 1, state);
                                if (isalpha(chNext) || chNext == '#' || chNext == '$' || chNext == '_') {
                                        state = SCE_PL_HASH;
                                } else if (chNext == '{') {
                                if (isalpha(chNext) || chNext == '#' || chNext == '$' || chNext == '_') {
                                        state = SCE_PL_HASH;
                                } else if (chNext == '{') {
@@ -321,56 +368,189 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                        styler.ColourTo(i, SCE_PL_OPERATOR);
                                }
                        } else if (ch == '*') {
                                        styler.ColourTo(i, SCE_PL_OPERATOR);
                                }
                        } else if (ch == '*') {
-                               styler.ColourTo(i - 1, state);
-                               state = SCE_PL_SYMBOLTABLE;
-                       } else if (ch == '/' && preferRE) {
-                               styler.ColourTo(i - 1, state);
-                               state = SCE_PL_REGEX;
-                               Quote.New(1);
-                               Quote.Open(ch);
+                               if (isalpha(chNext) || chNext == '_' || chNext == '{') {
+                                       state = SCE_PL_SYMBOLTABLE;
+                               } else {
+                                       if (chNext == '*') {    // exponentiation
+                                               i++;
+                                               ch = chNext;
+                                               chNext = chNext2;
+                                       }
+                                       styler.ColourTo(i, SCE_PL_OPERATOR);
+                               }
+                       } else if (ch == '/') {
+                               // Explicit backward peeking to set a consistent preferRE for
+                               // any slash found, so no longer need to track preferRE state.
+                               // Find first previous significant lexed element and interpret.
+                               bool preferRE = false;
+                               unsigned int bk = (i > 0)? i - 1: 0;
+                               char bkch;
+                               styler.Flush();
+                               while ((bk > 0) && (styler.StyleAt(bk) == SCE_PL_DEFAULT ||
+                                       styler.StyleAt(bk) == SCE_PL_COMMENTLINE)) {
+                                       bk--;
+                               }
+                               if (bk == 0) {
+                                       preferRE = true;
+                               } else {
+                                       int bkstyle = styler.StyleAt(bk);
+                                       switch(bkstyle) {
+                                       case SCE_PL_OPERATOR:
+                                               preferRE = true;
+                                               bkch = styler.SafeGetCharAt(bk);
+                                               if (bkch == ')' || bkch == ']') {
+                                                       preferRE = false;
+                                               } else if (bkch == '}') {
+                                                       // backtrack further, count balanced brace pairs
+                                                       // if a brace pair found, see if it's a variable
+                                                       int braceCount = 1;
+                                                       while (--bk > 0) {
+                                                               bkstyle = styler.StyleAt(bk);
+                                                               if (bkstyle == SCE_PL_OPERATOR) {
+                                                                       bkch = styler.SafeGetCharAt(bk);
+                                                                       if (bkch == '}') {
+                                                                               braceCount++;
+                                                                       } else if (bkch == '{') {
+                                                                               if (--braceCount == 0)
+                                                                                       break;
+                                                                       }
+                                                               }
+                                                       }
+                                                       if (bk == 0) {
+                                                               // at beginning, true
+                                                       } else if (braceCount == 0) {
+                                                               // balanced { found, check for variable
+                                                               bkstyle = styler.StyleAt(bk - 1);
+                                                               if (bkstyle == SCE_PL_SCALAR
+                                                                || bkstyle == SCE_PL_ARRAY
+                                                                || bkstyle == SCE_PL_HASH
+                                                                || bkstyle == SCE_PL_SYMBOLTABLE) {
+                                                                       preferRE = false;
+                                                               }
+                                                       }
+                                               }
+                                               break;
+                                       // other styles uses the default, preferRE=false
+                                       case SCE_PL_IDENTIFIER:
+                                       case SCE_PL_POD:
+                                       case SCE_PL_WORD:
+                                       case SCE_PL_HERE_Q:
+                                       case SCE_PL_HERE_QQ:
+                                       case SCE_PL_HERE_QX:
+                                               preferRE = true;
+                                               break;
+                                       }
+                               }
+                               if (preferRE) {
+                                       state = SCE_PL_REGEX;
+                                       Quote.New(1);
+                                       Quote.Open(ch);
+                               } else {
+                                       styler.ColourTo(i, SCE_PL_OPERATOR);
+                               }
                        } else if (ch == '<' && chNext == '<') {
                        } else if (ch == '<' && chNext == '<') {
-                               styler.ColourTo(i - 1, state);
                                state = SCE_PL_HERE_DELIM;
                                HereDoc.State = 0;
                                state = SCE_PL_HERE_DELIM;
                                HereDoc.State = 0;
-                       } else if (ch == '='
+                       } else if (ch == '='    // POD
                                   && isalpha(chNext)
                                   && (isEOLChar(chPrev))) {
                                   && isalpha(chNext)
                                   && (isEOLChar(chPrev))) {
-                               styler.ColourTo(i - 1, state);
                                state = SCE_PL_POD;
                                state = SCE_PL_POD;
-                               sookedpos = 0;
-                               sooked[sookedpos] = '\0';
-                       } else if (ch == '-'
+                               //sookedpos = 0;
+                               //sooked[sookedpos] = '\0';
+                       } else if (ch == '-'    // file test operators
                                   && isSingleCharOp(chNext)
                                   && !isalnum((chNext2 = styler.SafeGetCharAt(i+2)))) {
                                   && isSingleCharOp(chNext)
                                   && !isalnum((chNext2 = styler.SafeGetCharAt(i+2)))) {
-                               styler.ColourTo(i - 1, state);
                                styler.ColourTo(i + 1, SCE_PL_WORD);
                                state = SCE_PL_DEFAULT;
                                styler.ColourTo(i + 1, SCE_PL_WORD);
                                state = SCE_PL_DEFAULT;
-                               preferRE = false;
-                               i += 2;
-                               ch = chNext2;
-                               chNext = chNext2 = styler.SafeGetCharAt(i + 1);
+                               i++;
+                               ch = chNext;
+                               chNext = chNext2;
                        } else if (isPerlOperator(ch)) {
                        } else if (isPerlOperator(ch)) {
-                               if (ch == ')' || ch == ']')
-                                       preferRE = false;
-                               else
-                                       preferRE = true;
-                               styler.ColourTo(i - 1, state);
+                               if (ch == '.' && chNext == '.') { // .. and ...
+                                       i++;
+                                       if (chNext2 == '.') { i++; }
+                                       state = SCE_PL_DEFAULT;
+                                       ch = styler.SafeGetCharAt(i);
+                                       chNext = styler.SafeGetCharAt(i + 1);
+                               }
                                styler.ColourTo(i, SCE_PL_OPERATOR);
                                styler.ColourTo(i, SCE_PL_OPERATOR);
+                       } else {
+                               // keep colouring defaults to make restart easier
+                               styler.ColourTo(i, SCE_PL_DEFAULT);
+                       }
+               } else if (state == SCE_PL_NUMBER) {
+                       if (ch == '.') {
+                               if (chNext == '.') {
+                                       // double dot is always an operator
+                                       goto numAtEnd;
+                               } else if (numState == PERLNUM_NON_DEC || numState == PERLNUM_FLOAT) {
+                                       // non-decimal number or float exponent, consume next dot
+                                       styler.ColourTo(i - 1, SCE_PL_NUMBER);
+                                       styler.ColourTo(i, SCE_PL_OPERATOR);
+                                       state = SCE_PL_DEFAULT;
+                               } else { // decimal or vectors allows dots
+                                       dotCount++;
+                                       if (numState == PERLNUM_DECIMAL) {
+                                               if (dotCount > 1) {
+                                                       if (isdigit(chNext)) { // really a vector
+                                                               numState = PERLNUM_VECTOR;
+                                                       } else  // number then dot
+                                                               goto numAtEnd;
+                                               }
+                                       } else { // vectors
+                                               if (!isdigit(chNext))   // vector then dot
+                                                       goto numAtEnd;
+                                       }
+                               }
+                       } else if (ch == '_' && numState == PERLNUM_DECIMAL) {
+                               if (!isdigit(chNext)) {
+                                       goto numAtEnd;
+                               }
+                       } else if (isalnum(ch)) {
+                               if (numState == PERLNUM_VECTOR || numState == PERLNUM_V_VECTOR) {
+                                       if (isalpha(ch)) {
+                                               if (dotCount == 0) { // change to word
+                                                       state = SCE_PL_WORD;
+                                               } else { // vector then word
+                                                       goto numAtEnd;
+                                               }
+                                       }
+                               } else if (numState == PERLNUM_DECIMAL) {
+                                       if (ch == 'E' || ch == 'e') { // exponent
+                                               numState = PERLNUM_FLOAT;
+                                               if (chNext == '+' || chNext == '-') {
+                                                       i++;
+                                                       ch = chNext;
+                                                       chNext = chNext2;
+                                               }
+                                       } else if (!isdigit(ch)) { // number then word
+                                               goto numAtEnd;
+                                       }
+                               } else if (numState == PERLNUM_FLOAT) {
+                                       if (!isdigit(ch)) { // float then word
+                                               goto numAtEnd;
+                                       }
+                               } else {// (numState == PERLNUM_NON_DEC)
+                                       // allow alphanum for bin,hex,oct for now
+                               }
+                       } else {
+                               // complete current number or vector
+                       numAtEnd:
+                               styler.ColourTo(i - 1, actualNumStyle(numState));
+                               state = SCE_PL_DEFAULT;
+                               goto restartLexer;
                        }
                } else if (state == SCE_PL_WORD) {
                        if ((!iswordchar(chNext) && chNext != '\'')
                                || (chNext == '.' && chNext2 == '.')) {
                                // ".." is always an operator if preceded by a SCE_PL_WORD.
                                // Archaic Perl has quotes inside names
                        }
                } else if (state == SCE_PL_WORD) {
                        if ((!iswordchar(chNext) && chNext != '\'')
                                || (chNext == '.' && chNext2 == '.')) {
                                // ".." is always an operator if preceded by a SCE_PL_WORD.
                                // Archaic Perl has quotes inside names
-                               if (isMatch(styler, lengthDoc, styler.GetStartSegment(), "__DATA__")) {
-                                       styler.ColourTo(i, SCE_PL_DATASECTION);
-                                       state = SCE_PL_DATASECTION;
-                               } else if (isMatch(styler, lengthDoc, styler.GetStartSegment(), "__END__")) {
+                               if (isMatch(styler, lengthDoc, styler.GetStartSegment(), "__DATA__")
+                                || isMatch(styler, lengthDoc, styler.GetStartSegment(), "__END__")) {
                                        styler.ColourTo(i, SCE_PL_DATASECTION);
                                        state = SCE_PL_DATASECTION;
                                } else {
                                        styler.ColourTo(i, SCE_PL_DATASECTION);
                                        state = SCE_PL_DATASECTION;
                                } else {
-                                       if (classifyWordPerl(styler.GetStartSegment(), i, keywords, styler) == SCE_PL_WORD)
-                                               preferRE = true;
+                                       classifyWordPerl(styler.GetStartSegment(), i, keywords, styler);
                                        state = SCE_PL_DEFAULT;
                                        ch = ' ';
                                }
                                        state = SCE_PL_DEFAULT;
                                        ch = ' ';
                                }
@@ -380,6 +560,10 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                if (isEOLChar(ch)) {
                                        styler.ColourTo(i - 1, state);
                                        state = SCE_PL_DEFAULT;
                                if (isEOLChar(ch)) {
                                        styler.ColourTo(i - 1, state);
                                        state = SCE_PL_DEFAULT;
+                                       goto restartLexer;
+                               } else if (isEOLChar(chNext)) {
+                                       styler.ColourTo(i, state);
+                                       state = SCE_PL_DEFAULT;
                                }
                        } else if (state == SCE_PL_HERE_DELIM) {
                                //
                                }
                        } else if (state == SCE_PL_HERE_DELIM) {
                                //
@@ -398,9 +582,16 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                // There must be no space between the << and the identifier.
                                // (If you put a space it will be treated as a null identifier,
                                // which is valid, and matches the first empty line.)
                                // There must be no space between the << and the identifier.
                                // (If you put a space it will be treated as a null identifier,
                                // which is valid, and matches the first empty line.)
+                               // (This is deprecated, -w warns of this syntax)
                                // The terminating string must appear by itself (unquoted and with no
                                // surrounding whitespace) on the terminating line.
                                //
                                // The terminating string must appear by itself (unquoted and with no
                                // surrounding whitespace) on the terminating line.
                                //
+                               // From Bash info:
+                               // ---------------
+                               // Specifier format is: <<[-]WORD
+                               // Optional '-' is for removal of leading tabs from here-doc.
+                               // Whitespace acceptable after <<[-] operator.
+                               //
                                if (HereDoc.State == 0) { // '<<' encountered
                                        HereDoc.State = 1;
                                        HereDoc.Quote = chNext;
                                if (HereDoc.State == 0) { // '<<' encountered
                                        HereDoc.State = 1;
                                        HereDoc.Quote = chNext;
@@ -412,15 +603,16 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                                ch = chNext;
                                                chNext = chNext2;
                                                HereDoc.Quoted = true;
                                                ch = chNext;
                                                chNext = chNext2;
                                                HereDoc.Quoted = true;
-                                       } else if (chNext == '\\') { // ref?
-                                               i++;
-                                               ch = chNext;
-                                               chNext = chNext2;
-                                       } else if (isalnum(chNext) || chNext == '_') { // an unquoted here-doc delimiter
-                                       }
-                                       else if (isspacechar(chNext)) { // deprecated here-doc delimiter || TODO: left shift operator
-                                       }
-                                       else { // TODO: ???
+                                       } else if (isalpha(chNext) || chNext == '_') {
+                                               // an unquoted here-doc delimiter, no special handling
+                                       } else if (isspacechar(chNext) || isdigit(chNext) || chNext == '\\'
+                                               || chNext == '=' || chNext == '$' || chNext == '@') {
+                                               // left shift << or <<= operator cases
+                                               styler.ColourTo(i, SCE_PL_OPERATOR);
+                                               state = SCE_PL_DEFAULT;
+                                               HereDoc.State = 0;
+                                       } else {
+                                               // symbols terminates; deprecated zero-length delimiter
                                        }
 
                                } else if (HereDoc.State == 1) { // collect the delimiter
                                        }
 
                                } else if (HereDoc.State == 1) { // collect the delimiter
@@ -428,9 +620,6 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                                if (ch == HereDoc.Quote) { // closing quote => end of delimiter
                                                        styler.ColourTo(i, state);
                                                        state = SCE_PL_DEFAULT;
                                                if (ch == HereDoc.Quote) { // closing quote => end of delimiter
                                                        styler.ColourTo(i, state);
                                                        state = SCE_PL_DEFAULT;
-                                                       i++;
-                                                       ch = chNext;
-                                                       chNext = chNext2;
                                                } else {
                                                        if (ch == '\\' && chNext == HereDoc.Quote) { // escaped quote
                                                                i++;
                                                } else {
                                                        if (ch == '\\' && chNext == HereDoc.Quote) { // escaped quote
                                                                i++;
@@ -447,24 +636,27 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                                } else {
                                                        styler.ColourTo(i - 1, state);
                                                        state = SCE_PL_DEFAULT;
                                                } else {
                                                        styler.ColourTo(i - 1, state);
                                                        state = SCE_PL_DEFAULT;
+                                                       goto restartLexer;
                                                }
                                        }
                                                }
                                        }
-                                       if (HereDoc.DelimiterLength >= static_cast<int>(sizeof(HereDoc.Delimiter)) - 1) {
+                                       if (HereDoc.DelimiterLength >= HERE_DELIM_MAX - 1) {
                                                styler.ColourTo(i - 1, state);
                                                state = SCE_PL_ERROR;
                                                styler.ColourTo(i - 1, state);
                                                state = SCE_PL_ERROR;
+                                               goto restartLexer;
                                        }
                                }
                        } else if (HereDoc.State == 2) {
                                // state == SCE_PL_HERE_Q || state == SCE_PL_HERE_QQ || state == SCE_PL_HERE_QX
                                if (isEOLChar(chPrev) && isMatch(styler, lengthDoc, i, HereDoc.Delimiter)) {
                                        i += HereDoc.DelimiterLength;
                                        }
                                }
                        } else if (HereDoc.State == 2) {
                                // state == SCE_PL_HERE_Q || state == SCE_PL_HERE_QQ || state == SCE_PL_HERE_QX
                                if (isEOLChar(chPrev) && isMatch(styler, lengthDoc, i, HereDoc.Delimiter)) {
                                        i += HereDoc.DelimiterLength;
-                                       chNext = styler.SafeGetCharAt(i);
-                                       if (isEOLChar(chNext)) {
+                                       chPrev = styler.SafeGetCharAt(i - 1);
+                                       ch = styler.SafeGetCharAt(i);
+                                       if (isEOLChar(ch)) {
                                                styler.ColourTo(i - 1, state);
                                                state = SCE_PL_DEFAULT;
                                                HereDoc.State = 0;
                                                styler.ColourTo(i - 1, state);
                                                state = SCE_PL_DEFAULT;
                                                HereDoc.State = 0;
+                                               goto restartLexer;
                                        }
                                        }
-                                       ch = chNext;
                                        chNext = styler.SafeGetCharAt(i + 1);
                                }
                        } else if (state == SCE_PL_POD) {
                                        chNext = styler.SafeGetCharAt(i + 1);
                                }
                        } else if (state == SCE_PL_POD) {
@@ -474,33 +666,30 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                                i += 4;
                                                state = SCE_PL_DEFAULT;
                                                ch = styler.SafeGetCharAt(i);
                                                i += 4;
                                                state = SCE_PL_DEFAULT;
                                                ch = styler.SafeGetCharAt(i);
-                                               chNext = styler.SafeGetCharAt(i + 1);
+                                               //chNext = styler.SafeGetCharAt(i + 1);
+                                               goto restartLexer;
                                        }
                                }
                                        }
                                }
-                       } else if (state == SCE_PL_SCALAR) {
-                               if (isEndVar(ch)) {
-                                       if (i == (styler.GetStartSegment() + 1)) {
+                       } else if (state == SCE_PL_SCALAR       // variable names
+                               || state == SCE_PL_ARRAY
+                               || state == SCE_PL_HASH
+                               || state == SCE_PL_SYMBOLTABLE) {
+                               if (ch == ':' && chNext == ':') {       // skip ::
+                                       i++;
+                                       ch = chNext;
+                                       chNext = chNext2;
+                               }
+                               else if (isEndVar(ch)) {
+                                       if ((state == SCE_PL_SCALAR || state == SCE_PL_ARRAY)
+                                           && i == (styler.GetStartSegment() + 1)) {
                                                // Special variable: $(, $_ etc.
                                                styler.ColourTo(i, state);
                                                // Special variable: $(, $_ etc.
                                                styler.ColourTo(i, state);
+                                               state = SCE_PL_DEFAULT;
                                        } else {
                                                styler.ColourTo(i - 1, state);
                                        } else {
                                                styler.ColourTo(i - 1, state);
+                                               state = SCE_PL_DEFAULT;
+                                               goto restartLexer;
                                        }
                                        }
-                                       state = SCE_PL_DEFAULT;
-                               }
-                       } else if (state == SCE_PL_ARRAY) {
-                               if (isEndVar(ch)) {
-                                       styler.ColourTo(i - 1, state);
-                                       state = SCE_PL_DEFAULT;
-                               }
-                       } else if (state == SCE_PL_HASH) {
-                               if (isEndVar(ch)) {
-                                       styler.ColourTo(i - 1, state);
-                                       state = SCE_PL_DEFAULT;
-                               }
-                       } else if (state == SCE_PL_SYMBOLTABLE) {
-                               if (isEndVar(ch)) {
-                                       styler.ColourTo(i - 1, state);
-                                       state = SCE_PL_DEFAULT;
                                }
                        } else if (state == SCE_PL_REGEX
                                || state == SCE_PL_STRING_QR
                                }
                        } else if (state == SCE_PL_REGEX
                                || state == SCE_PL_STRING_QR
@@ -627,29 +816,6 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                        Quote.Count++;
                                }
                        }
                                        Quote.Count++;
                                }
                        }
-
-                       if (state == SCE_PL_DEFAULT) {    // One of the above succeeded
-                               if (ch == '#') {
-                                       state = SCE_PL_COMMENTLINE;
-                               } else if (ch == '\"') {
-                                       state = SCE_PL_STRING;
-                                       Quote.New(1);
-                                       Quote.Open(ch);
-                               } else if (ch == '\'') {
-                                       state = SCE_PL_CHARACTER;
-                                       Quote.New(1);
-                                       Quote.Open(ch);
-                               } else if (iswordstart(ch)) {
-                                       state = SCE_PL_WORD;
-                                       preferRE = false;
-                               } else if (isPerlOperator(ch)) {
-                                       if (ch == ')' || ch == ']')
-                                               preferRE = false;
-                                       else
-                                               preferRE = true;
-                                       styler.ColourTo(i, SCE_PL_OPERATOR);
-                               }
-                       }
                }
                if (state == SCE_PL_ERROR) {
                        break;
                }
                if (state == SCE_PL_ERROR) {
                        break;
index 43a874968d5f6c18aedccdff15ad9740a5326e20..692a47adefe6c02def9653cb8944c5e0f49d2bc7 100644 (file)
@@ -96,6 +96,11 @@ static int GetRbStringState(Accessor &styler, int i, int *nextIndex) {
                return SCE_P_DEFAULT;
        }
 
                return SCE_P_DEFAULT;
        }
 
+       if (i>0 && styler.SafeGetCharAt(i-1) == '$') {
+               *nextIndex = i + 1;
+               return SCE_P_DEFAULT;
+       }
+
        if (ch == chNext && ch == styler.SafeGetCharAt(i + 2)) {
                *nextIndex = i + 3;
 
        if (ch == chNext && ch == styler.SafeGetCharAt(i + 2)) {
                *nextIndex = i + 3;
 
index 3f65b12097a161e3b295f7844b76e85bfaa702e4..144176855eeb149847ed4ef262a3bcb3cf85a140 100644 (file)
@@ -88,7 +88,10 @@ static void ColouriseSQLDoc(unsigned int startPos, int length,
                        } else if (ch == '-' && chNext == '-') {
                                styler.ColourTo(i - 1, state);
                                state = SCE_C_COMMENTLINE;
                        } else if (ch == '-' && chNext == '-') {
                                styler.ColourTo(i - 1, state);
                                state = SCE_C_COMMENTLINE;
-                       } else if ((ch == '\'') || (ch == '"')) {
+                       } else if (ch == '\'') {
+                               styler.ColourTo(i - 1, state);
+                               state = SCE_C_CHARACTER;
+                       } else if (ch == '"') {
                                styler.ColourTo(i - 1, state);
                                state = SCE_C_STRING;
                        } else if (isoperator(ch)) {
                                styler.ColourTo(i - 1, state);
                                state = SCE_C_STRING;
                        } else if (isoperator(ch)) {
@@ -103,7 +106,9 @@ static void ColouriseSQLDoc(unsigned int startPos, int length,
                                        state = SCE_C_COMMENT;
                                } else if (ch == '-' && chNext == '-') {
                                        state = SCE_C_COMMENTLINE;
                                        state = SCE_C_COMMENT;
                                } else if (ch == '-' && chNext == '-') {
                                        state = SCE_C_COMMENTLINE;
-                               } else if ((ch == '\'') || (ch == '"'))  {
+                               } else if (ch == '\'') {
+                                       state = SCE_C_CHARACTER;
+                               } else if (ch == '"') {
                                        state = SCE_C_STRING;
                                } else if (isoperator(ch)) {
                                        styler.ColourTo(i, SCE_C_OPERATOR);
                                        state = SCE_C_STRING;
                                } else if (isoperator(ch)) {
                                        styler.ColourTo(i, SCE_C_OPERATOR);
@@ -123,7 +128,7 @@ static void ColouriseSQLDoc(unsigned int startPos, int length,
                                        styler.ColourTo(i - 1, state);
                                        state = SCE_C_DEFAULT;
                                }
                                        styler.ColourTo(i - 1, state);
                                        state = SCE_C_DEFAULT;
                                }
-                       } else if (state == SCE_C_STRING) {
+                       } else if (state == SCE_C_CHARACTER) {
                                if (ch == '\'') {
                                        if ( chNext == '\'' ) {
                                                i++;
                                if (ch == '\'') {
                                        if ( chNext == '\'' ) {
                                                i++;
@@ -134,7 +139,9 @@ static void ColouriseSQLDoc(unsigned int startPos, int length,
                                        }
                                        ch = chNext;
                                        chNext = styler.SafeGetCharAt(i + 1);
                                        }
                                        ch = chNext;
                                        chNext = styler.SafeGetCharAt(i + 1);
-                               } else if (ch == '"') {
+                               }
+                       } else if (state == SCE_C_STRING) {
+                               if (ch == '"') {
                                        if (chNext == '"') {
                                                i++;
                                        } else {
                                        if (chNext == '"') {
                                                i++;
                                        } else {
@@ -151,7 +158,9 @@ static void ColouriseSQLDoc(unsigned int startPos, int length,
                                        state = SCE_C_COMMENT;
                                } else if (ch == '-' && chNext == '-') {
                                        state = SCE_C_COMMENTLINE;
                                        state = SCE_C_COMMENT;
                                } else if (ch == '-' && chNext == '-') {
                                        state = SCE_C_COMMENTLINE;
-                               } else if ((ch == '\'') || (ch == '"')) {
+                               } else if (ch == '\'') {
+                                       state = SCE_C_CHARACTER;
+                               } else if (ch == '"') {
                                        state = SCE_C_STRING;
                                } else if (iswordstart(ch)) {
                                        state = SCE_C_WORD;
                                        state = SCE_C_STRING;
                                } else if (iswordstart(ch)) {
                                        state = SCE_C_WORD;
index fda10e316c61bea044cf1c55e4a9499290f557e2..faaa2d46dfad78c264fd4d52d8fa51b0b614a402 100644 (file)
 
 static void ClassifyWordSol(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord)
 {
 
 static void ClassifyWordSol(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord)
 {
-       char s[100];
-       bool wordIsNumber = isdigit(styler[start]) != 0;
-       for (unsigned int i = 0; i < end - start + 1 && i < 30; i++)
-    {
-               s[i] = styler[start + i];
-               s[i + 1] = '\0';
-       }
-       char chAttr = SCE_P_IDENTIFIER;
-    if (0 == strcmp(prevWord, "class"))       chAttr = SCE_P_CLASSNAME;
-    else if (wordIsNumber)                    chAttr = SCE_P_NUMBER;
-    else if (keywords.InList(s))              chAttr = SCE_P_WORD;
+    char s[100];
+    bool wordIsNumber = isdigit(styler[start]) != 0;
+    for (unsigned int i = 0; i < end - start + 1 && i < 30; i++)
+     {
+           s[i] = styler[start + i];
+           s[i + 1] = '\0';
+     }
+    char chAttr = SCE_SCRIPTOL_IDENTIFIER;
+    if (0 == strcmp(prevWord, "class"))       chAttr = SCE_SCRIPTOL_CLASSNAME;
+    else if (wordIsNumber)                    chAttr = SCE_SCRIPTOL_NUMBER;
+    else if (keywords.InList(s))              chAttr = SCE_SCRIPTOL_KEYWORD;
     else for (unsigned int i = 0; i < end - start + 1; i++)  // test dotted idents
     {
     else for (unsigned int i = 0; i < end - start + 1; i++)  // test dotted idents
     {
-               if (styler[start + i] == '.')
+        if (styler[start + i] == '.')
         {
         {
-                       styler.ColourTo(start + i - 1, chAttr);
-                       styler.ColourTo(start + i, SCE_P_OPERATOR);
-               }
-       }
-       styler.ColourTo(end, chAttr);
-       strcpy(prevWord, s);
+            styler.ColourTo(start + i - 1, chAttr);
+            styler.ColourTo(start + i, SCE_SCRIPTOL_OPERATOR);
+        }
+    }
+    styler.ColourTo(end, chAttr);
+    strcpy(prevWord, s);
 }
 
 static bool IsSolComment(Accessor &styler, int pos, int len)
 {
 }
 
 static bool IsSolComment(Accessor &styler, int pos, int len)
 {
-//    return len > 0 && styler[pos]=='`';
    char c;
    if(len > 0)
    {
    char c;
    if(len > 0)
    {
@@ -63,60 +62,62 @@ static bool IsSolComment(Accessor &styler, int pos, int len)
    return false;
 }
 
    return false;
 }
 
-static bool IsSolStringStart(char ch, char /*chNext*/)
+static bool IsSolStringStart(char ch)
 {
     if (ch == '\'' || ch == '"')  return true;
 {
     if (ch == '\'' || ch == '"')  return true;
-    //chNext = chNext;  // for future use
-
-       return false;
+    return false;
 }
 
 }
 
-static bool IsSolWordStart(char ch, char chNext)
+static bool IsSolWordStart(char ch)
 {
 {
-    return (iswordchar(ch) && !IsSolStringStart(ch, chNext));
+    return (iswordchar(ch) && !IsSolStringStart(ch));
 }
 
 }
 
-/* Return the state to use for the string starting at i; *nextIndex will be set to the first index following the quote(s) */
+
 static int GetSolStringState(Accessor &styler, int i, int *nextIndex)
 {
        char ch = styler.SafeGetCharAt(i);
        char chNext = styler.SafeGetCharAt(i + 1);
 
 static int GetSolStringState(Accessor &styler, int i, int *nextIndex)
 {
        char ch = styler.SafeGetCharAt(i);
        char chNext = styler.SafeGetCharAt(i + 1);
 
-       if (ch != '"' && ch != '\'') {
-               *nextIndex = i + 1;
-               return SCE_P_DEFAULT;
+        if (ch != '\"' && ch != '\'')
+        {
+            *nextIndex = i + 1;
+            return SCE_SCRIPTOL_DEFAULT;
        }
        }
-
+        // ch is either single or double quotes in string
+        // code below seem non-sense but is here for future extensions
        if (ch == chNext && ch == styler.SafeGetCharAt(i + 2))
        if (ch == chNext && ch == styler.SafeGetCharAt(i + 2))
-    {
-       *nextIndex = i + 3;
-       if (ch == '"') return SCE_P_TRIPLEDOUBLE;
-       else           return SCE_P_TRIPLE;
+        {
+          *nextIndex = i + 3;
+          if(ch == '\"') return SCE_SCRIPTOL_TRIPLE;
+          if(ch == '\'') return SCE_SCRIPTOL_TRIPLE;
+          return SCE_SCRIPTOL_STRING;
        }
        }
-    else
-    {
-       *nextIndex = i + 1;
-       if (ch == '"') return SCE_P_STRING;
-       else           return SCE_P_CHARACTER;
+        else
+        {
+          *nextIndex = i + 1;
+          if (ch == '"') return SCE_SCRIPTOL_STRING;
+          else           return SCE_SCRIPTOL_STRING;
        }
 }
 
        }
 }
 
+
 static void ColouriseSolDoc(unsigned int startPos, int length, int initStyle,
 static void ColouriseSolDoc(unsigned int startPos, int length, int initStyle,
-                                                  WordList *keywordlists[], Accessor &styler)
+                            WordList *keywordlists[], Accessor &styler)
  {
 
        int lengthDoc = startPos + length;
  {
 
        int lengthDoc = startPos + length;
+        char stringType = '\"';
 
 
-       // Backtrack to previous line in case need to fix its tab whinging
        if (startPos > 0)
        if (startPos > 0)
-    {
-               int lineCurrent = styler.GetLine(startPos);
-               if (lineCurrent > 0)
         {
         {
-           startPos = styler.LineStart(lineCurrent-1);
-           if (startPos == 0) initStyle = SCE_P_DEFAULT;
-           else               initStyle = styler.StyleAt(startPos-1);
-               }
+            int lineCurrent = styler.GetLine(startPos);
+            if (lineCurrent > 0)
+            {
+              startPos = styler.LineStart(lineCurrent-1);
+              if (startPos == 0) initStyle = SCE_SCRIPTOL_DEFAULT;
+              else               initStyle = styler.StyleAt(startPos-1);
+            }
        }
 
        styler.StartAt(startPos, 127);
        }
 
        styler.StartAt(startPos, 127);
@@ -126,241 +127,216 @@ static void ColouriseSolDoc(unsigned int startPos, int length, int initStyle,
        int whingeLevel = styler.GetPropertyInt("tab.timmy.whinge.level");
        char prevWord[200];
        prevWord[0] = '\0';
        int whingeLevel = styler.GetPropertyInt("tab.timmy.whinge.level");
        char prevWord[200];
        prevWord[0] = '\0';
-    if (length == 0)  return ;
+        if (length == 0)  return;
 
        int state = initStyle & 31;
 
        int nextIndex = 0;
 
        int state = initStyle & 31;
 
        int nextIndex = 0;
-       char chPrev = ' ';
-       //char chPrev2 = ' ';
-       char chNext = styler[startPos];
+        char chPrev  = ' ';
+        char chPrev2 = ' ';
+        char chNext  = styler[startPos];
        styler.StartSegment(startPos);
        bool atStartLine = true;
        int spaceFlags = 0;
        for (int i = startPos; i < lengthDoc; i++)
        styler.StartSegment(startPos);
        bool atStartLine = true;
        int spaceFlags = 0;
        for (int i = startPos; i < lengthDoc; i++)
-    {
+        {
 
 
-      if (atStartLine)
-      {
+         if (atStartLine)
+         {
          char chBad = static_cast<char>(64);
          char chGood = static_cast<char>(0);
          char chFlags = chGood;
 
          if (whingeLevel == 1)
          {
          char chBad = static_cast<char>(64);
          char chGood = static_cast<char>(0);
          char chFlags = chGood;
 
          if (whingeLevel == 1)
          {
-                               chFlags = (spaceFlags & wsInconsistent) ? chBad : chGood;
+             chFlags = (spaceFlags & wsInconsistent) ? chBad : chGood;
          }
          else if (whingeLevel == 2)
          {
          }
          else if (whingeLevel == 2)
          {
-                               chFlags = (spaceFlags & wsSpaceTab) ? chBad : chGood;
+             chFlags = (spaceFlags & wsSpaceTab) ? chBad : chGood;
          }
          else if (whingeLevel == 3)
          {
          }
          else if (whingeLevel == 3)
          {
-                               chFlags = (spaceFlags & wsSpace) ? chBad : chGood;
+             chFlags = (spaceFlags & wsSpace) ? chBad : chGood;
          }
          else if (whingeLevel == 4)
          {
          }
          else if (whingeLevel == 4)
          {
-                               chFlags = (spaceFlags & wsTab) ? chBad : chGood;
+              chFlags = (spaceFlags & wsTab) ? chBad : chGood;
          }
          styler.SetFlags(chFlags, static_cast<char>(state));
          atStartLine = false;
        }
 
          }
          styler.SetFlags(chFlags, static_cast<char>(state));
          atStartLine = false;
        }
 
-               char ch = chNext;
-               chNext = styler.SafeGetCharAt(i + 1);
+       char ch = chNext;
+       chNext = styler.SafeGetCharAt(i + 1);
 
 
-               if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc))
-        {
-                       if ((state == SCE_P_DEFAULT) || (state == SCE_P_TRIPLE) || (state == SCE_P_TRIPLEDOUBLE))
-            {
-                               styler.ColourTo(i, state);
-                       }
-                       atStartLine = true;
-         }
+       if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc))
+       {
+          if ((state == SCE_SCRIPTOL_DEFAULT) ||
+              (state == SCE_SCRIPTOL_TRIPLE) ||
+              (state == SCE_SCRIPTOL_COMMENTBLOCK))
+          {
+              styler.ColourTo(i, state);
+          }
+          atStartLine = true;
+        }
 
 
-               if (styler.IsLeadByte(ch))
-        {
-                       chNext = styler.SafeGetCharAt(i + 2);
-                       chPrev = ' ';
-                       //chPrev2 = ' ';
-                       i += 1;
-                       continue;
-               }
+        if (styler.IsLeadByte(ch))
+         {
+             chNext = styler.SafeGetCharAt(i + 2);
+             chPrev  = ' ';
+             chPrev2 = ' ';
+             i += 1;
+             continue;
+         }
 
 
-               if (state == SCE_P_STRINGEOL)
-        {
-                       if (ch != '\r' && ch != '\n')
+        if (state == SCE_SCRIPTOL_STRINGEOL)
+         {
+             if (ch != '\r' && ch != '\n')
              {
              {
-                               styler.ColourTo(i - 1, state);
-                               state = SCE_P_DEFAULT;
+                    styler.ColourTo(i - 1, state);
+                    state = SCE_SCRIPTOL_DEFAULT;
              }
              }
-        }
+         }
 
 
-               if (state == SCE_P_DEFAULT)
-        {
-            if (IsSolWordStart(ch, chNext))
+        if (state == SCE_SCRIPTOL_DEFAULT)
+         {
+            if (IsSolWordStart(ch))
             {
             {
-                               styler.ColourTo(i - 1, state);
-                               state = SCE_P_WORD;
+                 styler.ColourTo(i - 1, state);
+                 state = SCE_SCRIPTOL_KEYWORD;
             }
             else if (ch == '`')
             {
             }
             else if (ch == '`')
             {
-                               styler.ColourTo(i - 1, state);
-                state = SCE_P_COMMENTLINE;
+                styler.ColourTo(i - 1, state);
+                state = SCE_SCRIPTOL_COMMENTLINE;
             }
             else if (ch == '/')
             {
             }
             else if (ch == '/')
             {
-                               styler.ColourTo(i - 1, state);
-                if(chNext == '/') state = SCE_P_COMMENTLINE;
-                if(chNext == '*') state = SCE_P_COMMENTBLOCK;
+                styler.ColourTo(i - 1, state);
+                if(chNext == '/') state = SCE_SCRIPTOL_CSTYLE;
+                if(chNext == '*') state = SCE_SCRIPTOL_COMMENTBLOCK;
             }
 
             }
 
-            else if (ch == '=' && chNext == 'b')
-            {
-                               // =begin indicates the start of a comment (doc) block
-               if(styler.SafeGetCharAt(i + 2) == 'e' && styler.SafeGetCharAt(i + 3) == 'g' && styler.SafeGetCharAt(i + 4) == 'i' && styler.SafeGetCharAt(i + 5) == 'n')
-               {
-                                       styler.ColourTo(i - 1, state);
-                                       state = SCE_P_TRIPLEDOUBLE; //SCE_C_COMMENT;
-               }
-            }
-            else if (IsSolStringStart(ch, chNext))
+            else if (IsSolStringStart(ch))
             {
                styler.ColourTo(i - 1, state);
                state = GetSolStringState(styler, i, &nextIndex);
             {
                styler.ColourTo(i - 1, state);
                state = GetSolStringState(styler, i, &nextIndex);
+               if(state == SCE_SCRIPTOL_STRING)
+               {
+                 stringType = ch;
+               }
                if (nextIndex != i + 1)
                {
                if (nextIndex != i + 1)
                {
-                                       i = nextIndex - 1;
-                                       ch = ' ';
-                                       //chPrev = ' ';
-                                       chNext = styler.SafeGetCharAt(i + 1);
+                   i = nextIndex - 1;
+                   ch = ' ';
+                   chPrev = ' ';
+                   chNext = styler.SafeGetCharAt(i + 1);
                }
                }
-                       }
+           }
             else if (isoperator(ch))
             {
             else if (isoperator(ch))
             {
-                               styler.ColourTo(i - 1, state);
-                               styler.ColourTo(i, SCE_P_OPERATOR);
-                       }
+                 styler.ColourTo(i - 1, state);
+                 styler.ColourTo(i, SCE_SCRIPTOL_OPERATOR);
+            }
           }
           }
-          else if (state == SCE_P_WORD)
+          else if (state == SCE_SCRIPTOL_KEYWORD)
           {
               if (!iswordchar(ch))
               {
                  ClassifyWordSol(styler.GetStartSegment(), i - 1, keywords, styler, prevWord);
           {
               if (!iswordchar(ch))
               {
                  ClassifyWordSol(styler.GetStartSegment(), i - 1, keywords, styler, prevWord);
-                 state = SCE_P_DEFAULT;
+                 state = SCE_SCRIPTOL_DEFAULT;
                  if (ch == '`')
                  {
                  if (ch == '`')
                  {
-                     state = chNext == '`' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE;
+                     state = chNext == '`' ? SCE_SCRIPTOL_PERSISTENT : SCE_SCRIPTOL_COMMENTLINE;
                  }
                  }
-                 else if (IsSolStringStart(ch, chNext))
+                 else if (IsSolStringStart(ch))
                  {
                     styler.ColourTo(i - 1, state);
                     state = GetSolStringState(styler, i, &nextIndex);
                  {
                     styler.ColourTo(i - 1, state);
                     state = GetSolStringState(styler, i, &nextIndex);
-                                       if (nextIndex != i + 1)
+                    if (nextIndex != i + 1)
                     {
                     {
-                                               i = nextIndex - 1;
-                                               ch = ' ';
-                                               //chPrev = ' ';
-                                               chNext = styler.SafeGetCharAt(i + 1);
-                                       }
+                       i = nextIndex - 1;
+                       ch = ' ';
+                       chPrev = ' ';
+                       chNext = styler.SafeGetCharAt(i + 1);
+                     }
                  }
                  else if (isoperator(ch))
                  {
                  }
                  else if (isoperator(ch))
                  {
-                                       styler.ColourTo(i, SCE_P_OPERATOR);
+                     styler.ColourTo(i, SCE_SCRIPTOL_OPERATOR);
                  }
              }
           }
           else
           {
                  }
              }
           }
           else
           {
-            if (state == SCE_P_COMMENTLINE)
+            if (state == SCE_SCRIPTOL_COMMENTLINE ||
+                state == SCE_SCRIPTOL_PERSISTENT ||
+                state == SCE_SCRIPTOL_CSTYLE)
             {
             {
-                               if (ch == '\r' || ch == '\n')
+                 if (ch == '\r' || ch == '\n')
                  {
                  {
-                                       styler.ColourTo(i - 1, state);
-                                       state = SCE_P_DEFAULT;
+                     styler.ColourTo(i - 1, state);
+                     state = SCE_SCRIPTOL_DEFAULT;
                  }
             }
                  }
             }
-            else if(state == SCE_P_COMMENTBLOCK)
+            else if(state == SCE_SCRIPTOL_COMMENTBLOCK)
             {
             {
-              if(ch == '*' && chNext == '/') state = SCE_P_DEFAULT;
+              if(chPrev == '*' && ch == '/')
+              {
+                styler.ColourTo(i, state);
+                state = SCE_SCRIPTOL_DEFAULT;
+              }
             }
             }
-            else if (state == SCE_P_STRING)
+            else if ((state == SCE_SCRIPTOL_STRING) ||
+                     (state == SCE_SCRIPTOL_CHARACTER))
             {
             {
-                               if ((ch == '\r' || ch == '\n') && (chPrev != '\\'))
+               if ((ch == '\r' || ch == '\n') && (chPrev != '\\'))
                 {
                 {
-                                       styler.ColourTo(i - 1, state);
-                                       state = SCE_P_STRINGEOL;
-                               }
+                    styler.ColourTo(i - 1, state);
+                    state = SCE_SCRIPTOL_STRINGEOL;
+                }
                 else if (ch == '\\')
                 {
                    if (chNext == '\"' || chNext == '\'' || chNext == '\\')
                    {
                 else if (ch == '\\')
                 {
                    if (chNext == '\"' || chNext == '\'' || chNext == '\\')
                    {
-                                               i++;
-                                               ch = chNext;
-                                               chNext = styler.SafeGetCharAt(i + 1);
+                        i++;
+                        ch = chNext;
+                        chNext = styler.SafeGetCharAt(i + 1);
                    }
                    }
-                               }
-                else if (ch == '\"')
-                {
-                                       styler.ColourTo(i, state);
-                                       state = SCE_P_DEFAULT;
-                               }
-                       }
-            else if (state == SCE_P_CHARACTER)
-             {
-                               if ((ch == '\r' || ch == '\n') && (chPrev != '\\'))
-                 {
-                                       styler.ColourTo(i - 1, state);
-                                       state = SCE_P_STRINGEOL;
                  }
                  }
-                 else if (ch == '\\')
-                 {
-                                       if (chNext == '\"' || chNext == '\'' || chNext == '\\')
-                    {
-                                               i++;
-                                               ch = chNext;
-                                               chNext = styler.SafeGetCharAt(i + 1);
-                                       }
-                               }
-                else if (ch == '\'')
+                else if ((ch == '\"') || (ch == '\''))
                 {
                 {
-                                       styler.ColourTo(i, state);
-                                       state = SCE_P_DEFAULT;
-                               }
-            }
-            /*
-            else if (state == SCE_P_TRIPLE)
+                    // must match the entered quote type
+                    if(ch == stringType)
+                    {
+                      styler.ColourTo(i, state);
+                      state = SCE_SCRIPTOL_DEFAULT;
+                    }
+                 }
+             }
+             else if (state == SCE_SCRIPTOL_TRIPLE)
              {
              {
-                               if (ch == '\'' && chPrev == '\'' && chPrev2 == '\'')
+                if ((ch == '\'' && chPrev == '\'' && chPrev2 == '\'') ||
+                    (ch == '\"' && chPrev == '\"' && chPrev2 == '\"'))
                  {
                     styler.ColourTo(i, state);
                  {
                     styler.ColourTo(i, state);
-                                       state = SCE_P_DEFAULT;
-                 }
-              }
-            else if (state == SCE_P_TRIPLEDOUBLE)
-              {
-                               // =end terminates the comment block
-                               if (ch == 'd' && chPrev == 'n' && chPrev2 == 'e')
-                {
-                                       if  (styler.SafeGetCharAt(i - 3) == '=')
-                     {
-                                               styler.ColourTo(i, state);
-                                               state = SCE_P_DEFAULT;
-                     }
+                    state = SCE_SCRIPTOL_DEFAULT;
                  }
                  }
-                       }
-            */
-               }
-               //chPrev2 = chPrev;
-               chPrev = ch;
+             }
+            
+           }
+          chPrev2 = chPrev;
+          chPrev = ch;
        }
        }
-       if (state == SCE_P_WORD)
-    {
-       ClassifyWordSol(styler.GetStartSegment(), lengthDoc-1, keywords, styler, prevWord);
+        if (state == SCE_SCRIPTOL_KEYWORD)
+        {
+            ClassifyWordSol(styler.GetStartSegment(),
+                 lengthDoc-1, keywords, styler, prevWord);
        }
        }
-    else
-    {
-               styler.ColourTo(lengthDoc-1, state);
+        else
+        {
+            styler.ColourTo(lengthDoc-1, state);
        }
 }
 
        }
 }
 
@@ -369,57 +345,58 @@ static void FoldSolDoc(unsigned int startPos, int length, int initStyle,
  {
        int lengthDoc = startPos + length;
 
  {
        int lengthDoc = startPos + length;
 
-       // Backtrack to previous line in case need to fix its fold status
        int lineCurrent = styler.GetLine(startPos);
        int lineCurrent = styler.GetLine(startPos);
-       if (startPos > 0) {
-               if (lineCurrent > 0)
+       if (startPos > 0)
         {
         {
-                       lineCurrent--;
-                       startPos = styler.LineStart(lineCurrent);
-                       if (startPos == 0)
-                               initStyle = SCE_P_DEFAULT;
-                       else
-                               initStyle = styler.StyleAt(startPos-1);
-               }
+          if (lineCurrent > 0)
+          {
+               lineCurrent--;
+               startPos = styler.LineStart(lineCurrent);
+               if (startPos == 0)
+                    initStyle = SCE_SCRIPTOL_DEFAULT;
+               else
+                    initStyle = styler.StyleAt(startPos-1);
+           }
        }
        int state = initStyle & 31;
        int spaceFlags = 0;
         int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsSolComment);
        }
        int state = initStyle & 31;
        int spaceFlags = 0;
         int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsSolComment);
-       if ((state == SCE_P_TRIPLE) || (state == SCE_P_TRIPLEDOUBLE))
-               indentCurrent |= SC_FOLDLEVELWHITEFLAG;
+        if ((state == SCE_SCRIPTOL_TRIPLE))
+             indentCurrent |= SC_FOLDLEVELWHITEFLAG;
        char chNext = styler[startPos];
        for (int i = startPos; i < lengthDoc; i++)
        char chNext = styler[startPos];
        for (int i = startPos; i < lengthDoc; i++)
-    {
+         {
                char ch = chNext;
                chNext = styler.SafeGetCharAt(i + 1);
                int style = styler.StyleAt(i) & 31;
 
                if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc))
                char ch = chNext;
                chNext = styler.SafeGetCharAt(i + 1);
                int style = styler.StyleAt(i) & 31;
 
                if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc))
-        {
-                       int lev = indentCurrent;
-            int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsSolComment);
-                       if ((style == SCE_P_TRIPLE) || (style== SCE_P_TRIPLEDOUBLE))
-                               indentNext |= SC_FOLDLEVELWHITEFLAG;
-                       if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG))
-            {
-                               // Only non whitespace lines can be headers
-                               if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK))
-                {
-                                       lev |= SC_FOLDLEVELHEADERFLAG;
-                               } else if (indentNext & SC_FOLDLEVELWHITEFLAG)
                 {
                 {
-                                       // Line after is blank so check the next - maybe should continue further?
-                                       int spaceFlags2 = 0;
-                    int indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsSolComment);
-                                       if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK))
+                   int lev = indentCurrent;
+                   int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsSolComment);
+                   if (style == SCE_SCRIPTOL_TRIPLE)
+                        indentNext |= SC_FOLDLEVELWHITEFLAG;
+                   if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG))
                     {
                     {
-                                               lev |= SC_FOLDLEVELHEADERFLAG;
-                                       }
-                               }
-                       }
-                       indentCurrent = indentNext;
-                       styler.SetLevel(lineCurrent, lev);
-                       lineCurrent++;
+                        // Only non whitespace lines can be headers
+                        if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK))
+                        {
+                              lev |= SC_FOLDLEVELHEADERFLAG;
+                        }
+                        else if (indentNext & SC_FOLDLEVELWHITEFLAG)
+                        {
+                             // Line after is blank so check the next - maybe should continue further?
+                             int spaceFlags2 = 0;
+                             int indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsSolComment);
+                             if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK))
+                             {
+                                   lev |= SC_FOLDLEVELHEADERFLAG;
+                              }
+                        }
+                    }
+                   indentCurrent = indentNext;
+                   styler.SetLevel(lineCurrent, lev);
+                   lineCurrent++;
                }
        }
 }
                }
        }
 }
diff --git a/contrib/src/stc/scintilla/src/LexTeX.cxx b/contrib/src/stc/scintilla/src/LexTeX.cxx
new file mode 100644 (file)
index 0000000..a5b0946
--- /dev/null
@@ -0,0 +1,288 @@
+// Scintilla source code edit control
+
+// File: LexTeX.cxx - general context conformant tex coloring scheme
+// Author: Hans Hagen - PRAGMA ADE - Hasselt NL - www.pragma-ade.com
+// Version: September 28, 2003
+
+// Copyright: 1998-2003 by Neil Hodgson <neilh@scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+// This lexer is derived from the one written for the texwork environment (1999++) which in
+// turn is inspired on texedit (1991++) which finds its roots in wdt (1986).
+
+// If you run into strange boundary cases, just tell me and I'll look into it.
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+#include "StyleContext.h"
+
+// val SCE_TEX_DEFAULT = 0
+// val SCE_TEX_SPECIAL = 1
+// val SCE_TEX_GROUP   = 2
+// val SCE_TEX_SYMBOL  = 3
+// val SCE_TEX_COMMAND = 4
+// val SCE_TEX_TEXT    = 5
+
+// Definitions in SciTEGlobal.properties:
+//
+// TeX Highlighting
+//
+// # Default
+// style.tex.0=fore:#7F7F00
+// # Special
+// style.tex.1=fore:#007F7F
+// # Group
+// style.tex.2=fore:#880000
+// # Symbol
+// style.tex.3=fore:#7F7F00
+// # Command
+// style.tex.4=fore:#008800
+// # Text
+// style.tex.5=fore:#000000
+
+// lexer.tex.interface.default=0
+// lexer.tex.comment.process=0
+
+// todo: lexer.tex.auto.if
+
+// Auxiliary functions:
+
+static inline bool endOfLine(Accessor &styler, unsigned int i) {
+       return
+      (styler[i] == '\n') || ((styler[i] == '\r') && (styler.SafeGetCharAt(i + 1) != '\n')) ;
+}
+
+static inline bool isTeXzero(int ch) {
+       return
+      (ch == '%') ;
+}
+
+static inline bool isTeXone(int ch) {
+       return
+      (ch == '[') || (ch == ']') || (ch == '=') || (ch == '#') ||
+      (ch == '(') || (ch == ')') || (ch == '<') || (ch == '>') ||
+      (ch == '"') ;
+}
+
+static inline bool isTeXtwo(int ch) {
+       return
+      (ch == '{') || (ch == '}') || (ch == '$') ;
+}
+
+static inline bool isTeXthree(int ch) {
+       return
+      (ch == '~') || (ch == '^') || (ch == '_') || (ch == '&') ||
+      (ch == '-') || (ch == '+') || (ch == '\"') || (ch == '`') ||
+      (ch == '/') || (ch == '|') || (ch == '%') ;
+}
+
+static inline bool isTeXfour(int ch) {
+       return
+      (ch == '\\') ;
+}
+
+static inline bool isTeXfive(int ch) {
+       return
+      ((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) ||
+      (ch == '@') || (ch == '!') || (ch == '?') ;
+}
+
+static inline bool isTeXsix(int ch) {
+       return
+      (ch == ' ') ;
+}
+
+static inline bool isTeXseven(int ch) {
+       return
+      (ch == '^') ;
+}
+
+// Interface determination
+
+static int CheckTeXInterface(
+    unsigned int startPos,
+    int length,
+    Accessor &styler,
+       int defaultInterface) {
+
+    char lineBuffer[1024] ;
+       unsigned int linePos = 0 ;
+
+    // some day we can make something lexer.tex.mapping=(all,0)(nl,1)(en,2)...
+
+    if (styler.SafeGetCharAt(0) == '%') {
+        for (unsigned int i = 0; i < startPos + length; i++) {
+            lineBuffer[linePos++] = styler.SafeGetCharAt(i) ;
+            if (endOfLine(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {
+                lineBuffer[linePos] = '\0';
+                if (strstr(lineBuffer, "interface=all")) {
+                    return 0 ;
+                               } else if (strstr(lineBuffer, "interface=tex")) {
+                    return 1 ;
+                } else if (strstr(lineBuffer, "interface=nl")) {
+                    return 2 ;
+                } else if (strstr(lineBuffer, "interface=en")) {
+                    return 3 ;
+                } else if (strstr(lineBuffer, "interface=de")) {
+                    return 4 ;
+                } else if (strstr(lineBuffer, "interface=cz")) {
+                    return 5 ;
+                } else if (strstr(lineBuffer, "interface=it")) {
+                    return 6 ;
+                } else if (strstr(lineBuffer, "interface=ro")) {
+                    return 7 ;
+                } else if (strstr(lineBuffer, "interface=latex")) {
+                                       // we will move latex cum suis up to 91+ when more keyword lists are supported
+                    return 8 ;
+                               } else if (styler.SafeGetCharAt(1) == 'D' && strstr(lineBuffer, "%D \\module")) {
+                                       // better would be to limit the search to just one line
+                                       return 3 ;
+                } else {
+                    return defaultInterface ;
+                }
+            }
+               }
+    }
+
+    return defaultInterface ;
+}
+
+static void ColouriseTeXDoc(
+    unsigned int startPos,
+    int length,
+    int,
+    WordList *keywordlists[],
+    Accessor &styler) {
+
+       styler.StartAt(startPos) ;
+       styler.StartSegment(startPos) ;
+
+       bool processComment   = styler.GetPropertyInt("lexer.tex.comment.process",   0) == 1 ;
+    bool useKeywords      = styler.GetPropertyInt("lexer.tex.use.keywords",      1) == 1 ;
+       bool autoIf           = styler.GetPropertyInt("lexer.tex.auto.if",           1) == 1 ;
+    int  defaultInterface = styler.GetPropertyInt("lexer.tex.interface.default", 1) ;
+
+       char key[100] ;
+       int  k ;
+       bool newifDone = false ;
+       bool inComment = false ;
+
+       int currentInterface = CheckTeXInterface(startPos,length,styler,defaultInterface) ;
+
+    if (currentInterface == 0) {
+        useKeywords = false ;
+        currentInterface = 1 ;
+    }
+
+    WordList &keywords = *keywordlists[currentInterface-1] ;
+
+       StyleContext sc(startPos, length, SCE_TEX_TEXT, styler);
+
+       bool going = sc.More() ; // needed because of a fuzzy end of file state
+
+       for (; going; sc.Forward()) {
+
+               if (! sc.More()) { going = false ; } // we need to go one behind the end of text
+
+               if (inComment) {
+                       if (sc.atLineEnd) {
+                               sc.SetState(SCE_TEX_TEXT) ;
+                               newifDone = false ;
+                               inComment = false ;
+                       }
+               } else {
+                       if (! isTeXfive(sc.ch)) {
+                               if (sc.state == SCE_TEX_COMMAND) {
+                                       if (sc.LengthCurrent() == 1) { // \<noncstoken>
+                                               if (isTeXseven(sc.ch) && isTeXseven(sc.chNext)) {
+                                                       sc.Forward(2) ; // \^^ and \^^<token>
+                                               }
+                                               sc.ForwardSetState(SCE_TEX_TEXT) ;
+                                       } else {
+                                               sc.GetCurrent(key, sizeof(key)-1) ;
+                                               k = strlen(key) ;
+                                               memmove(key,key+1,k) ; // shift left over escape token
+                                               key[k] = '\0' ;
+                                               k-- ;
+                                               if (! keywords || ! useKeywords) {
+                                                       sc.SetState(SCE_TEX_COMMAND) ;
+                                                       newifDone = false ;
+                                               } else if (k == 1) { //\<cstoken>
+                                                       sc.SetState(SCE_TEX_COMMAND) ;
+                                                       newifDone = false ;
+                                               } else if (keywords.InList(key)) {
+                                               sc.SetState(SCE_TEX_COMMAND) ;
+                                                       newifDone = autoIf && (strcmp(key,"newif") == 0) ;
+                                               } else if (autoIf && ! newifDone && (key[0] == 'i') && (key[1] == 'f') && keywords.InList("if")) {
+                                               sc.SetState(SCE_TEX_COMMAND) ;
+                                               } else {
+                                                       sc.ChangeState(SCE_TEX_TEXT) ;
+                                                       sc.SetState(SCE_TEX_TEXT) ;
+                                                       newifDone = false ;
+                                               }
+                                       }
+                               }
+                               if (isTeXzero(sc.ch)) {
+                                       sc.SetState(SCE_TEX_SYMBOL) ;
+                                       sc.ForwardSetState(SCE_TEX_DEFAULT) ;
+                                       inComment = ! processComment ;
+                                       newifDone = false ;
+                               } else if (isTeXseven(sc.ch) && isTeXseven(sc.chNext)) {
+                                       sc.SetState(SCE_TEX_TEXT) ;
+                                       sc.ForwardSetState(SCE_TEX_TEXT) ;
+                               } else if (isTeXone(sc.ch)) {
+                                       sc.SetState(SCE_TEX_SPECIAL) ;
+                                       newifDone = false ;
+                               } else if (isTeXtwo(sc.ch)) {
+                                       sc.SetState(SCE_TEX_GROUP) ;
+                                       newifDone = false ;
+                               } else if (isTeXthree(sc.ch)) {
+                                       sc.SetState(SCE_TEX_SYMBOL) ;
+                                       newifDone = false ;
+                               } else if (isTeXfour(sc.ch)) {
+                                       sc.SetState(SCE_TEX_COMMAND) ;
+                               } else if (isTeXsix(sc.ch)) {
+                                       sc.SetState(SCE_TEX_TEXT) ;
+                               } else if (sc.atLineEnd) {
+                                       sc.SetState(SCE_TEX_TEXT) ;
+                                       newifDone = false ;
+                                       inComment = false ;
+                               } else {
+                                       sc.SetState(SCE_TEX_TEXT) ;
+                               }
+                       } else if (sc.state != SCE_TEX_COMMAND) {
+                               sc.SetState(SCE_TEX_TEXT) ;
+                       }
+               }
+       }
+       sc.ChangeState(SCE_TEX_TEXT) ;
+       sc.Complete();
+
+}
+
+
+// Hooks into the system:
+
+static const char * const texWordListDesc[] = {
+    "TeX, eTeX, pdfTeX, Omega"
+    "ConTeXt Dutch",
+    "ConTeXt English",
+    "ConTeXt German",
+    "ConTeXt Czech",
+    "ConTeXt Italian",
+    "ConTeXt Romanian",
+       0,
+} ;
+
+LexerModule lmTeX(SCLEX_TEX, ColouriseTeXDoc, "tex", 0, texWordListDesc);
index 72fdb9c3cf86c4699fb6f812614f2728f9f32261..93bdedbd897b77c946d6527e972dd266e9ca50fe 100644 (file)
@@ -2,7 +2,7 @@
 /** @file LexVB.cxx
  ** Lexer for Visual Basic and VBScript.
  **/
 /** @file LexVB.cxx
  ** Lexer for Visual Basic and VBScript.
  **/
-// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
+// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include <stdlib.h>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include <stdlib.h>
@@ -24,16 +24,19 @@ static bool IsVBComment(Accessor &styler, int pos, int len) {
        return len>0 && styler[pos]=='\'';
 }
 
        return len>0 && styler[pos]=='\'';
 }
 
-static inline bool IsTypeCharacter(const int ch) {
+static inline bool IsTypeCharacter(int ch) {
        return ch == '%' || ch == '&' || ch == '@' || ch == '!' || ch == '#' || ch == '$';
 }
 
        return ch == '%' || ch == '&' || ch == '@' || ch == '!' || ch == '#' || ch == '$';
 }
 
-static inline bool IsAWordChar(const int ch) {
-       return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
+// Extended to accept accented characters
+static inline bool IsAWordChar(int ch) {
+       return ch >= 0x80 ||
+              (isalnum(ch) || ch == '.' || ch == '_');
 }
 
 }
 
-static inline bool IsAWordStart(const int ch) {
-       return (ch < 0x80) && (isalnum(ch) || ch == '_');
+static inline bool IsAWordStart(int ch) {
+       return ch >= 0x80 ||
+              (isalnum(ch) || ch == '_');
 }
 
 static inline bool IsADateCharacter(const int ch) {
 }
 
 static inline bool IsADateCharacter(const int ch) {
@@ -45,6 +48,9 @@ static void ColouriseVBDoc(unsigned int startPos, int length, int initStyle,
                            WordList *keywordlists[], Accessor &styler, bool vbScriptSyntax) {
 
        WordList &keywords = *keywordlists[0];
                            WordList *keywordlists[], Accessor &styler, bool vbScriptSyntax) {
 
        WordList &keywords = *keywordlists[0];
+       WordList &keywords2 = *keywordlists[1];
+       WordList &keywords3 = *keywordlists[2];
+       WordList &keywords4 = *keywordlists[3];
 
        styler.StartAt(startPos);
 
 
        styler.StartAt(startPos);
 
@@ -56,26 +62,37 @@ static void ColouriseVBDoc(unsigned int startPos, int length, int initStyle,
 
                if (sc.state == SCE_B_OPERATOR) {
                        sc.SetState(SCE_B_DEFAULT);
 
                if (sc.state == SCE_B_OPERATOR) {
                        sc.SetState(SCE_B_DEFAULT);
-               } else if (sc.state == SCE_B_KEYWORD) {
+               } else if (sc.state == SCE_B_IDENTIFIER) {
                        if (!IsAWordChar(sc.ch)) {
                        if (!IsAWordChar(sc.ch)) {
-                               if (vbScriptSyntax || !IsTypeCharacter(sc.ch)) {
-                                       if (sc.ch == ']')
-                                               sc.Forward();
-                                       char s[100];
-                                       sc.GetCurrentLowered(s, sizeof(s));
+                               // In Basic (except VBScript), a variable name or a function name
+                               // can end with a special character indicating the type of the value
+                               // held or returned.
+                               bool skipType = false;
+                               if (!vbScriptSyntax && IsTypeCharacter(sc.ch)) {
+                                       sc.Forward();   // Skip it
+                                       skipType = true;
+                               }
+                               if (sc.ch == ']') {
+                                       sc.Forward();
+                               }
+                               char s[100];
+                               sc.GetCurrentLowered(s, sizeof(s));
+                               if (skipType) {
+                                       s[strlen(s) - 1] = '\0';
+                               }
+                               if (strcmp(s, "rem") == 0) {
+                                       sc.ChangeState(SCE_B_COMMENT);
+                               } else {
                                        if (keywords.InList(s)) {
                                        if (keywords.InList(s)) {
-                                               if (strcmp(s, "rem") == 0) {
-                                                       sc.ChangeState(SCE_B_COMMENT);
-                                                       if (sc.atLineEnd) {
-                                                               sc.SetState(SCE_B_DEFAULT);
-                                                       }
-                                               } else {
-                                                       sc.SetState(SCE_B_DEFAULT);
-                                               }
-                                       } else {
-                                               sc.ChangeState(SCE_B_IDENTIFIER);
-                                               sc.SetState(SCE_B_DEFAULT);
-                                       }
+                                               sc.ChangeState(SCE_B_KEYWORD);
+                                       } else if (keywords2.InList(s)) {
+                                               sc.ChangeState(SCE_B_KEYWORD2);
+                                       } else if (keywords3.InList(s)) {
+                                               sc.ChangeState(SCE_B_KEYWORD3);
+                                       } else if (keywords4.InList(s)) {
+                                               sc.ChangeState(SCE_B_KEYWORD4);
+                                       }       // Else, it is really an identifier...
+                                       sc.SetState(SCE_B_DEFAULT);
                                }
                        }
                } else if (sc.state == SCE_B_NUMBER) {
                                }
                        }
                } else if (sc.state == SCE_B_NUMBER) {
@@ -90,6 +107,9 @@ static void ColouriseVBDoc(unsigned int startPos, int length, int initStyle,
                                        sc.Forward();
                                }
                                sc.ForwardSetState(SCE_B_DEFAULT);
                                        sc.Forward();
                                }
                                sc.ForwardSetState(SCE_B_DEFAULT);
+                       } else if (sc.atLineEnd) {
+                               sc.ChangeState(SCE_B_STRINGEOL);
+                               sc.ForwardSetState(SCE_B_DEFAULT);
                        }
                } else if (sc.state == SCE_B_COMMENT) {
                        if (sc.atLineEnd) {
                        }
                } else if (sc.state == SCE_B_COMMENT) {
                        if (sc.atLineEnd) {
@@ -132,7 +152,7 @@ static void ColouriseVBDoc(unsigned int startPos, int length, int initStyle,
                        } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
                                sc.SetState(SCE_B_NUMBER);
                        } else if (IsAWordStart(sc.ch) || (sc.ch == '[')) {
                        } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
                                sc.SetState(SCE_B_NUMBER);
                        } else if (IsAWordStart(sc.ch) || (sc.ch == '[')) {
-                               sc.SetState(SCE_B_KEYWORD);
+                               sc.SetState(SCE_B_IDENTIFIER);
                        } else if (isoperator(static_cast<char>(sc.ch)) || (sc.ch == '\\')) {
                                sc.SetState(SCE_B_OPERATOR);
                        }
                        } else if (isoperator(static_cast<char>(sc.ch)) || (sc.ch == '\\')) {
                                sc.SetState(SCE_B_OPERATOR);
                        }
@@ -202,6 +222,9 @@ static void ColouriseVBScriptDoc(unsigned int startPos, int length, int initStyl
 
 static const char * const vbWordListDesc[] = {
        "Keywords",
 
 static const char * const vbWordListDesc[] = {
        "Keywords",
+       "user1",
+       "user2",
+       "user3",
        0
 };
 
        0
 };
 
diff --git a/contrib/src/stc/scintilla/src/LexYAML.cxx b/contrib/src/stc/scintilla/src/LexYAML.cxx
new file mode 100644 (file)
index 0000000..e3053f8
--- /dev/null
@@ -0,0 +1,305 @@
+// Scintilla source code edit control
+/** @file LexYAML.cxx
+ ** Lexer for YAML.
+ **/
+// Copyright 2003- by Sean O'Dell <sean@celsoft.com>
+// Release under the same license as Scintilla/SciTE.
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+static const char * const yamlWordListDesc[] = {
+       "Keywords",
+       0
+};
+
+static inline bool AtEOL(Accessor &styler, unsigned int i) {
+       return (styler[i] == '\n') ||
+               ((styler[i] == '\r') && (styler.SafeGetCharAt(i + 1) != '\n'));
+}
+
+static unsigned int SpaceCount(char* lineBuffer) {
+       if (lineBuffer == NULL)
+               return 0;
+       
+       char* headBuffer = lineBuffer;
+       
+       while (*headBuffer == ' ')
+               headBuffer++;
+       
+       return headBuffer - lineBuffer;
+}
+
+#define YAML_STATE_BITSIZE 16
+#define YAML_STATE_MASK                        (0xFFFF0000)
+#define YAML_STATE_DOCUMENT            (1 << YAML_STATE_BITSIZE)
+#define YAML_STATE_VALUE                       (2 << YAML_STATE_BITSIZE)
+#define YAML_STATE_COMMENT             (3 << YAML_STATE_BITSIZE)
+#define YAML_STATE_TEXT_PARENT (4 << YAML_STATE_BITSIZE)
+#define YAML_STATE_TEXT                        (5 << YAML_STATE_BITSIZE)
+
+static void ColouriseYAMLLine(
+       char *lineBuffer,
+       unsigned int currentLine,
+       unsigned int lengthLine,
+       unsigned int startLine,
+       unsigned int endPos,
+       WordList &keywords,
+       Accessor &styler) {
+           
+       unsigned int i = 0;
+       bool bInQuotes = false;
+       unsigned int indentAmount = SpaceCount(lineBuffer);
+               
+       if (currentLine > 0) {
+               int parentLineState = styler.GetLineState(currentLine - 1);
+       
+               if ((parentLineState&YAML_STATE_MASK) == YAML_STATE_TEXT || (parentLineState&YAML_STATE_MASK) == YAML_STATE_TEXT_PARENT) {
+                       unsigned int parentIndentAmount = parentLineState&(~YAML_STATE_MASK);
+                       if (indentAmount > parentIndentAmount) {
+                               styler.SetLineState(currentLine, YAML_STATE_TEXT | parentIndentAmount);
+                               styler.ColourTo(endPos, SCE_YAML_TEXT);
+                               return;
+                       }
+               }
+       }
+       styler.SetLineState(currentLine, 0);
+       if (strncmp(lineBuffer, "---", 3) == 0) {       // Document marker
+               styler.SetLineState(currentLine, YAML_STATE_DOCUMENT);
+               styler.ColourTo(endPos, SCE_YAML_DOCUMENT);
+               return;
+       }
+       // Skip initial spaces
+       while ((i < lengthLine) && lineBuffer[i] == ' ') { // YAML always uses space, never TABS or anything else
+               i++;
+       }
+       if (lineBuffer[i] == '\t') { // if we skipped all spaces, and we are NOT inside a text block, this is wrong
+               styler.ColourTo(endPos, SCE_YAML_ERROR);
+               return;
+       }
+       if (lineBuffer[i] == '#') {     // Comment
+               styler.SetLineState(currentLine, YAML_STATE_COMMENT);
+               styler.ColourTo(endPos, SCE_YAML_COMMENT);
+               return;
+       }
+       while (i < lengthLine) {
+               if (lineBuffer[i] == '\'' || lineBuffer[i] == '\"') {
+                       bInQuotes = !bInQuotes;
+               } else if (lineBuffer[i] == ':' && !bInQuotes) {
+                       styler.ColourTo(startLine + i, SCE_YAML_IDENTIFIER);
+                       // Non-folding scalar
+                       i++;
+                       while ((i < lengthLine) && isspacechar(lineBuffer[i]))
+                               i++;
+                       unsigned int endValue = lengthLine - 1;
+                       while ((endValue >= i) && isspacechar(lineBuffer[endValue]))
+                               endValue--;
+                       lineBuffer[endValue + 1] = '\0';
+                       if (lineBuffer[i] == '|' || lineBuffer[i] == '>') {
+                               i++;
+                               if (lineBuffer[i] == '+' || lineBuffer[i] == '-')
+                                       i++;
+                               while ((i < lengthLine) && isspacechar(lineBuffer[i]))
+                                       i++;
+                               if (lineBuffer[i] == '\0') {
+                                       styler.SetLineState(currentLine, YAML_STATE_TEXT_PARENT | indentAmount);
+                                       styler.ColourTo(endPos, SCE_YAML_DEFAULT);
+                                       return;
+                               } else if (lineBuffer[i] == '#') {
+                                       styler.SetLineState(currentLine, YAML_STATE_TEXT_PARENT | indentAmount);
+                                       styler.ColourTo(startLine + i - 1, SCE_YAML_DEFAULT);
+                                       styler.ColourTo(endPos, SCE_YAML_COMMENT);
+                                       return;
+                               } else {
+                                       styler.ColourTo(endPos, SCE_YAML_ERROR);
+                                       return;
+                               }
+                       }
+                       styler.SetLineState(currentLine, YAML_STATE_VALUE);
+                       if (lineBuffer[i] == '&' || lineBuffer[i] == '*') {
+                               styler.ColourTo(endPos, SCE_YAML_REFERENCE);
+                               return;
+                       }
+                       if (keywords.InList(&lineBuffer[i])) { // Convertible value (true/false, etc.)
+                               styler.ColourTo(endPos, SCE_YAML_KEYWORD);
+                               return;
+                       } else {
+                               unsigned int i2 = i;
+                               while ((i < lengthLine) && lineBuffer[i]) {
+                                       if (!isdigit(lineBuffer[i]) && lineBuffer[i] != '-' && lineBuffer[i] != '.' && lineBuffer[i] != ',') {
+                                               styler.ColourTo(endPos, SCE_YAML_DEFAULT);
+                                               return;
+                                       }
+                                       i++;
+                               }
+                               if (i > i2) {
+                                       styler.ColourTo(endPos, SCE_YAML_NUMBER);
+                                       return;
+                               }
+                       }
+                       break; // shouldn't get here, but just in case, the rest of the line is coloured the default
+               }
+               i++;
+       }
+       styler.ColourTo(endPos, SCE_YAML_DEFAULT);
+}
+
+static void ColouriseYAMLDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler) {
+       char lineBuffer[1024];
+       styler.StartAt(startPos);
+       styler.StartSegment(startPos);
+       unsigned int linePos = 0;
+       unsigned int startLine = startPos;
+       unsigned int endPos = startPos + length;
+       unsigned int maxPos = styler.Length();
+       unsigned int lineCurrent = styler.GetLine(startPos);
+       
+       for (unsigned int i = startPos; i < maxPos && i < endPos; i++) {
+               lineBuffer[linePos++] = styler[i];
+               if (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {
+                       // End of line (or of line buffer) met, colourise it
+                       lineBuffer[linePos] = '\0';
+                       ColouriseYAMLLine(lineBuffer, lineCurrent, linePos, startLine, i, *keywordLists[0], styler);
+                       linePos = 0;
+                       startLine = i + 1;
+                       lineCurrent++;
+               }
+       }
+       if (linePos > 0) {      // Last line does not have ending characters
+               ColouriseYAMLLine(lineBuffer, lineCurrent, linePos, startLine, startPos + length - 1, *keywordLists[0], styler);
+       }
+}
+
+static bool IsCommentLine(int line, Accessor &styler) {
+       int pos = styler.LineStart(line);
+       if (styler[pos] == '#')
+               return true;
+       return false;
+}
+
+static void FoldYAMLDoc(unsigned int startPos, int length, int /*initStyle - unused*/,
+                      WordList *[], Accessor &styler) {
+       const int maxPos = startPos + length;
+       const int maxLines = styler.GetLine(maxPos - 1);             // Requested last line
+       const int docLines = styler.GetLine(styler.Length() - 1);  // Available last line
+       const bool foldComment = styler.GetPropertyInt("fold.comment.yaml") != 0;
+
+       // Backtrack to previous non-blank line so we can determine indent level
+       // for any white space lines
+       // and so we can fix any preceding fold level (which is why we go back
+       // at least one line in all cases)
+       int spaceFlags = 0;
+       int lineCurrent = styler.GetLine(startPos);
+       int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, NULL);
+       while (lineCurrent > 0) {
+               lineCurrent--;
+               indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, NULL);
+               if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG) &&
+                       (!IsCommentLine(lineCurrent, styler)))
+                       break;
+       }
+       int indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK;
+
+       // Set up initial loop state
+       int prevComment = 0;
+       if (lineCurrent >= 1)
+               prevComment = foldComment && IsCommentLine(lineCurrent - 1, styler);
+
+       // Process all characters to end of requested range
+       // or comment that hangs over the end of the range.  Cap processing in all cases
+       // to end of document (in case of unclosed comment at end).
+       while ((lineCurrent <= docLines) && ((lineCurrent <= maxLines) || prevComment)) {
+
+               // Gather info
+               int lev = indentCurrent;
+               int lineNext = lineCurrent + 1;
+               int indentNext = indentCurrent;
+               if (lineNext <= docLines) {
+                       // Information about next line is only available if not at end of document
+                       indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);
+       }
+               const int comment = foldComment && IsCommentLine(lineCurrent, styler);
+               const int comment_start = (comment && !prevComment && (lineNext <= docLines) &&
+                                          IsCommentLine(lineNext, styler) && (lev > SC_FOLDLEVELBASE));
+               const int comment_continue = (comment && prevComment);
+               if (!comment)
+                       indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK;
+               if (indentNext & SC_FOLDLEVELWHITEFLAG)
+                       indentNext = SC_FOLDLEVELWHITEFLAG | indentCurrentLevel;
+
+               if (comment_start) {
+                       // Place fold point at start of a block of comments
+                       lev |= SC_FOLDLEVELHEADERFLAG;
+               } else if (comment_continue) {
+                       // Add level to rest of lines in the block
+                       lev = lev + 1;
+               }
+
+               // Skip past any blank lines for next indent level info; we skip also
+               // comments (all comments, not just those starting in column 0)
+               // which effectively folds them into surrounding code rather
+               // than screwing up folding.
+
+               while ((lineNext < docLines) &&
+                       ((indentNext & SC_FOLDLEVELWHITEFLAG) ||
+                        (lineNext <= docLines && IsCommentLine(lineNext, styler)))) {
+
+                       lineNext++;
+                       indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);
+               }
+
+               const int levelAfterComments = indentNext & SC_FOLDLEVELNUMBERMASK;
+               const int levelBeforeComments = Platform::Maximum(indentCurrentLevel,levelAfterComments);
+
+               // Now set all the indent levels on the lines we skipped
+               // Do this from end to start.  Once we encounter one line
+               // which is indented more than the line after the end of
+               // the comment-block, use the level of the block before
+
+               int skipLine = lineNext;
+               int skipLevel = levelAfterComments;
+
+               while (--skipLine > lineCurrent) {
+                       int skipLineIndent = styler.IndentAmount(skipLine, &spaceFlags, NULL);
+
+                       if ((skipLineIndent & SC_FOLDLEVELNUMBERMASK) > levelAfterComments)
+                               skipLevel = levelBeforeComments;
+
+                       int whiteFlag = skipLineIndent & SC_FOLDLEVELWHITEFLAG;
+
+                       styler.SetLevel(skipLine, skipLevel | whiteFlag);
+               }
+
+               // Set fold header on non-comment line
+               if (!comment && !(indentCurrent & SC_FOLDLEVELWHITEFLAG) ) {
+                       if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK))
+                               lev |= SC_FOLDLEVELHEADERFLAG;
+               }
+
+               // Keep track of block comment state of previous line
+               prevComment = comment_start || comment_continue;
+
+               // Set fold level for this line and move to next line
+               styler.SetLevel(lineCurrent, lev);
+               indentCurrent = indentNext;
+               lineCurrent = lineNext;
+       }
+
+       // NOTE: Cannot set level of last line here because indentCurrent doesn't have
+       // header flag set; the loop above is crafted to take care of this case!
+       //styler.SetLevel(lineCurrent, indentCurrent);
+}
+
+LexerModule lmYAML(SCLEX_YAML, ColouriseYAMLDoc, "yaml", FoldYAMLDoc, yamlWordListDesc);
index 021a6572739172bb6868a3c8518be713356bf297..658d5046a431cd6532e050a42dd626dae6162ca2 100644 (file)
@@ -562,7 +562,7 @@ bool WordList::InList(const char *s) {
  * The length of the word to compare is passed too.
  * Letter case can be ignored or preserved (default).
  */
  * The length of the word to compare is passed too.
  * Letter case can be ignored or preserved (default).
  */
-const char *WordList::GetNearestWord(const char *wordStart, int searchLen /*= -1*/, bool ignoreCase /*= false*/, SString wordCharacters /*='/0' */) {
+const char *WordList::GetNearestWord(const char *wordStart, int searchLen /*= -1*/, bool ignoreCase /*= false*/, SString wordCharacters /*='/0' */, int wordIndex /*= -1 */) {
        int start = 0; // lower bound of the api array block to search
        int end = len - 1; // upper bound of the api array block to search
        int pivot; // index of api array element just being compared
        int start = 0; // lower bound of the api array block to search
        int end = len - 1; // upper bound of the api array block to search
        int pivot; // index of api array element just being compared
@@ -580,8 +580,33 @@ const char *WordList::GetNearestWord(const char *wordStart, int searchLen /*= -1
                        pivot = (start + end) >> 1;
                        word = wordsNoCase[pivot];
                        cond = CompareNCaseInsensitive(wordStart, word, searchLen);
                        pivot = (start + end) >> 1;
                        word = wordsNoCase[pivot];
                        cond = CompareNCaseInsensitive(wordStart, word, searchLen);
-                       if (!cond && (!wordCharacters.contains(word[searchLen])))
+                       if (!cond && (!wordCharacters.contains(word[searchLen]))) {
+                               // Found a word in a binary fashion. Now checks if a specific index was requested
+                               if (wordIndex < 0)
                                        return word; // result must not be freed with free()
                                        return word; // result must not be freed with free()
+
+                               // Finds first word in a series of equal words
+                               int first = pivot;
+                               end = pivot - 1;
+                               while (start <= end) {
+                                       pivot = (start + end) >> 1;
+                                       word = wordsNoCase[pivot];
+                                       cond = CompareNCaseInsensitive(wordStart, word, searchLen);
+                                       if (!cond && (!wordCharacters.contains(word[searchLen]))) {
+                                               // Found another word
+                                               first = pivot;
+                                               end = pivot - 1;
+                                       } 
+                                       else if (cond > 0) 
+                                               start = pivot + 1;
+                                       else if (cond <= 0)
+                                               break;
+                               }
+
+                               // Gets the word at the requested index
+                               word = wordsNoCase[first + wordIndex];
+                               return word;
+                       }
                        else if (cond > 0)
                                start = pivot + 1;
                        else if (cond <= 0)
                        else if (cond > 0)
                                start = pivot + 1;
                        else if (cond <= 0)
@@ -592,8 +617,33 @@ const char *WordList::GetNearestWord(const char *wordStart, int searchLen /*= -1
                        pivot = (start + end) >> 1;
                        word = words[pivot];
                        cond = strncmp(wordStart, word, searchLen);
                        pivot = (start + end) >> 1;
                        word = words[pivot];
                        cond = strncmp(wordStart, word, searchLen);
-                       if (!cond && (!wordCharacters.contains(word[searchLen])))
-                               return word; // result must not be freed with free()
+                       if (!cond && (!wordCharacters.contains(word[searchLen]))) {
+                               // Found a word in a binary fashion. Now checks if a specific index was requested
+                               if (wordIndex < 0)
+                                       return word; // result must not be freed with free()
+
+                               // Finds first word in a series of equal words
+                               int first = pivot;
+                               end = pivot - 1;
+                               while (start <= end) {
+                                       pivot = (start + end) >> 1;
+                                       word = words[pivot];
+                                       cond = strncmp(wordStart, word, searchLen);
+                                       if (!cond && (!wordCharacters.contains(word[searchLen]))) {
+                                               // Found another word
+                                               first = pivot;
+                                               end = pivot - 1;
+                                       } 
+                                       else if (cond > 0) 
+                                               start = pivot + 1;
+                                       else if (cond <= 0)
+                                               break;
+                               }
+
+                               // Gets the word at the requested index
+                               word = words[first + wordIndex];
+                               return word;
+                       }
                        else if (cond > 0)
                                start = pivot + 1;
                        else if (cond <= 0)
                        else if (cond > 0)
                                start = pivot + 1;
                        else if (cond <= 0)
index 3ca61bb9cec295647b059cc43c4bf8f1e4034ef1..b7ea71bfb9631d81d3b92743c6626b2dfda35cee 100644 (file)
  *      Dept. of Computer Science
  *      York University
  *
  *      Dept. of Computer Science
  *      York University
  *
- * Original code available from http://www.cs.yorku.ca/~oz/ 
+ * Original code available from http://www.cs.yorku.ca/~oz/
  * Translation to C++ by Neil Hodgson neilh@scintilla.org
  * Removed all use of register.
  * Converted to modern function prototypes.
  * Translation to C++ by Neil Hodgson neilh@scintilla.org
  * Removed all use of register.
  * Converted to modern function prototypes.
- * Put all global/static variables into an object so this code can be 
+ * Put all global/static variables into an object so this code can be
  * used from multiple threads etc.
  *
  * These routines are the PUBLIC DOMAIN equivalents of regex
  * used from multiple threads etc.
  *
  * These routines are the PUBLIC DOMAIN equivalents of regex
  * see Henry Spencer's regexp routines, or GNU Emacs pattern
  * matching module.
  *
  * see Henry Spencer's regexp routines, or GNU Emacs pattern
  * matching module.
  *
- * Modification history:
- *
- * $Log$
- * Revision 1.8  2003/09/18 05:05:38  RD
- * Updated to Scintilla 1.54
- * Applied most of patch #806092
- * Added new wxSTC sample from Otto Wyss
- *
- * Revision 1.9  2003/03/21 10:36:08  nyamatongwe
- * Detect patterns too long in regular expression search.
- *
- * Revision 1.8  2003/03/04 10:53:59  nyamatongwe
- * Patch from Jakub to optionally implement more POSIX compatible regular
- * expressions. \(..\) changes to (..)
- * Fixes problem where find previous would not find earlier matches on same
- * line.
- *
- * Revision 1.8  2003/03/03 20:12:56  vrana
- * Added posix syntax.
- *
- * Revision 1.7  2002/09/28 00:33:28  nyamatongwe
- * Fixed problem with character ranges caused by expansion to 8 bits.
- *
- * Revision 1.6  2001/04/29 13:32:10  nyamatongwe
- * Addition of new target methods - versions of ReplaceTarget that take counted
- * strings to allow for nulls, SearchInTarget and Get/SetSearchFlags to use a
- * series of calls rather than a structure.
- * Handling of \000 in search and replace.
- * Handling of /escapes within character ranges of regular expressions.
- * Some handling of bare ^ and $ regular expressions.
- *
- * Revision 1.5  2001/04/20 07:36:09  nyamatongwe
- * Removed DEBUG code that failed to compile on GTK+.
- *
- * Revision 1.4  2001/04/13 03:52:13  nyamatongwe
- * Added URL to find original code to comments.
- *
- * Revision 1.3  2001/04/06 12:24:21  nyamatongwe
- * Made regular expression searching work on a line by line basis, made ^ and
- * $ work, made [set] work, and added a case insensitive option.
- *
- * Revision 1.2  2001/04/05 01:58:04  nyamatongwe
- * Replace target functionality to make find and replace operations faster
- * by diminishing screen updates and allow for \d patterns in the replacement
- * text.
- *
- * Revision 1.1  2001/04/04 12:52:44  nyamatongwe
- * Moved to public domain regular expresion implementation.
- *
- * Revision 1.4  1991/10/17  03:56:42  oz
- * miscellaneous changes, small cleanups etc.
- *
- * Revision 1.3  1989/04/01  14:18:09  oz
- * Change all references to a dfa: this is actually an nfa.
- *
- * Revision 1.2  88/08/28  15:36:04  oz
- * Use a complement bitmap to represent NCL.
- * This removes the need to have seperate 
- * code in the PMatch case block - it is 
- * just CCL code now.
- * 
- * Use the actual CCL code in the CLO
- * section of PMatch. No need for a recursive
- * PMatch call.
- * 
- * Use a bitmap table to set char bits in an
- * 8-bit chunk.
- * 
+ * Modification history removed.
+ *
  * Interfaces:
  *      RESearch::Compile:        compile a regular expression into a NFA.
  *
  * Interfaces:
  *      RESearch::Compile:        compile a regular expression into a NFA.
  *
  *                     void re_fail(msg, op)
  *                     char *msg;
  *                     char op;
  *                     void re_fail(msg, op)
  *                     char *msg;
  *                     char op;
- *  
+ *
  * Regular Expressions:
  *
  *      [1]     char    matches itself, unless it is a special
  * Regular Expressions:
  *
  *      [1]     char    matches itself, unless it is a special
  *
  *      [3]     \       matches the character following it, except
  *                     when followed by a left or right round bracket,
  *
  *      [3]     \       matches the character following it, except
  *                     when followed by a left or right round bracket,
- *                     a digit 1 to 9 or a left or right angle bracket. 
+ *                     a digit 1 to 9 or a left or right angle bracket.
  *                     (see [7], [8] and [9])
  *                     (see [7], [8] and [9])
- *                     It is used as an escape character for all 
+ *                     It is used as an escape character for all
  *                     other meta-characters, and itself. When used
  *                     in a set ([4]), it is treated as an ordinary
  *                     character.
  *
  *      [4]     [set]   matches one of the characters in the set.
  *                      If the first character in the set is "^",
  *                     other meta-characters, and itself. When used
  *                     in a set ([4]), it is treated as an ordinary
  *                     character.
  *
  *      [4]     [set]   matches one of the characters in the set.
  *                      If the first character in the set is "^",
- *                      it matches a character NOT in the set, i.e. 
- *                     complements the set. A shorthand S-E is 
- *                     used to specify a set of characters S upto 
- *                     E, inclusive. The special characters "]" and 
- *                     "-" have no special meaning if they appear 
+ *                      it matches a character NOT in the set, i.e.
+ *                     complements the set. A shorthand S-E is
+ *                     used to specify a set of characters S upto
+ *                     E, inclusive. The special characters "]" and
+ *                     "-" have no special meaning if they appear
  *                     as the first chars in the set.
  *                      examples:        match:
  *
  *                     as the first chars in the set.
  *                      examples:        match:
  *
  * Notes:
  *
  *     This implementation uses a bit-set representation for character
  * Notes:
  *
  *     This implementation uses a bit-set representation for character
- *     classes for speed and compactness. Each character is represented 
- *     by one bit in a 128-bit block. Thus, CCL always takes a 
+ *     classes for speed and compactness. Each character is represented
+ *     by one bit in a 128-bit block. Thus, CCL always takes a
  *     constant 16 bytes in the internal nfa, and RESearch::Execute does a single
  *     bit comparison to locate the character in the set.
  *
  *     constant 16 bytes in the internal nfa, and RESearch::Execute does a single
  *     bit comparison to locate the character in the set.
  *
  *     compile:        CHR f CHR o CLO CHR o END CLO ANY END END
  *     matches:        fo foo fooo foobar fobar foxx ...
  *
  *     compile:        CHR f CHR o CLO CHR o END CLO ANY END END
  *     matches:        fo foo fooo foobar fobar foxx ...
  *
- *     pattern:        fo[ob]a[rz]     
+ *     pattern:        fo[ob]a[rz]
  *     compile:        CHR f CHR o CCL bitset CHR a CCL bitset END
  *     matches:        fobar fooar fobaz fooaz
  *
  *     compile:        CHR f CHR o CCL bitset CHR a CCL bitset END
  *     matches:        fobar fooar fobaz fooaz
  *
  * The following defines are not meant to be changeable.
  * They are for readability only.
  */
  * The following defines are not meant to be changeable.
  * They are for readability only.
  */
-#define BLKIND 0170
+#define BLKIND 0370
 #define BITIND 07
 
 #define ASCIIB 0177
 #define BITIND 07
 
 #define ASCIIB 0177
 const char bitarr[] = {1,2,4,8,16,32,64,'\200'};
 
 #define badpat(x)      (*nfa = END, x)
 const char bitarr[] = {1,2,4,8,16,32,64,'\200'};
 
 #define badpat(x)      (*nfa = END, x)
+
 RESearch::RESearch() {
        Init();
 }
 RESearch::RESearch() {
        Init();
 }
@@ -361,7 +295,7 @@ const char *RESearch::Compile(const char *pat, int length, bool caseSensitive, b
        int n;
        char mask;              /* xor mask -CCL/NCL */
        int c1, c2;
        int n;
        char mask;              /* xor mask -CCL/NCL */
        int c1, c2;
-               
+
        if (!pat || !length)
                if (sta)
                        return 0;
        if (!pat || !length)
                if (sta)
                        return 0;
@@ -403,7 +337,7 @@ const char *RESearch::Compile(const char *pat, int length, bool caseSensitive, b
 
                        i++;
                        if (*++p == '^') {
 
                        i++;
                        if (*++p == '^') {
-                               mask = '\377';  
+                               mask = '\377';
                                i++;
                                p++;
                        } else
                                i++;
                                p++;
                        } else
@@ -447,7 +381,7 @@ const char *RESearch::Compile(const char *pat, int length, bool caseSensitive, b
 
                        for (n = 0; n < BITBLK; bittab[n++] = (char) 0)
                                *mp++ = static_cast<char>(mask ^ bittab[n]);
 
                        for (n = 0; n < BITBLK; bittab[n++] = (char) 0)
                                *mp++ = static_cast<char>(mask ^ bittab[n]);
-       
+
                        break;
 
                case '*':               /* match 0 or more.. */
                        break;
 
                case '*':               /* match 0 or more.. */
@@ -592,7 +526,7 @@ const char *RESearch::Compile(const char *pat, int length, bool caseSensitive, b
  * RESearch::Execute:
  *     execute nfa to find a match.
  *
  * RESearch::Execute:
  *     execute nfa to find a match.
  *
- *     special cases: (nfa[0]) 
+ *     special cases: (nfa[0])
  *             BOL
  *                     Match only once, starting from the
  *                     beginning.
  *             BOL
  *                     Match only once, starting from the
  *                     beginning.
@@ -617,7 +551,7 @@ int RESearch::Execute(CharacterIndexer &ci, int lp, int endp) {
 
        bol = lp;
        failure = 0;
 
        bol = lp;
        failure = 0;
-       
+
        Clear();
 
        switch(*ap) {
        Clear();
 
        switch(*ap) {
@@ -658,7 +592,7 @@ int RESearch::Execute(CharacterIndexer &ci, int lp, int endp) {
        return 1;
 }
 
        return 1;
 }
 
-/* 
+/*
  * PMatch: internal routine for the hard part
  *
  *     This code is partly snarfed from an early grep written by
  * PMatch: internal routine for the hard part
  *
  *     This code is partly snarfed from an early grep written by
@@ -684,7 +618,7 @@ int RESearch::Execute(CharacterIndexer &ci, int lp, int endp) {
  *
  *     At the end of a successful match, bopat[n] and eopat[n]
  *     are set to the beginning and end of subpatterns matched
  *
  *     At the end of a successful match, bopat[n] and eopat[n]
  *     are set to the beginning and end of subpatterns matched
- *     by tagged expressions (n = 1 to 9).     
+ *     by tagged expressions (n = 1 to 9).
  *
  */
 
  *
  */
 
@@ -695,23 +629,23 @@ extern void re_fail(char *,char);
  * and EOW. the reason for not using ctype macros is that we can
  * let the user add into our own table. see RESearch::ModifyWord. This table
  * is not in the bitset form, since we may wish to extend it in the
  * and EOW. the reason for not using ctype macros is that we can
  * let the user add into our own table. see RESearch::ModifyWord. This table
  * is not in the bitset form, since we may wish to extend it in the
- * future for other character classifications. 
+ * future for other character classifications.
  *
  *     TRUE for 0-9 A-Z a-z _
  */
 static char chrtyp[MAXCHR] = {
  *
  *     TRUE for 0-9 A-Z a-z _
  */
 static char chrtyp[MAXCHR] = {
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 
-       0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
+       0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+       1, 0, 0, 0, 0, 1, 0, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 0, 0, 0, 0, 0
        };
 
        1, 1, 1, 0, 0, 0, 0, 0
        };
 
@@ -833,10 +767,10 @@ int RESearch::PMatch(CharacterIndexer &ci, int lp, int endp, char *ap) {
  *     the compact bitset representation for the default table]
  */
 
  *     the compact bitset representation for the default table]
  */
 
-static char deftab[16] = {     
-       0, 0, 0, 0, 0, 0, '\377', 003, '\376', '\377', '\377', '\207',  
-       '\376', '\377', '\377', 007 
-}; 
+static char deftab[16] = {
+       0, 0, 0, 0, 0, 0, '\377', 003, '\376', '\377', '\377', '\207',
+       '\376', '\377', '\377', 007
+};
 
 void RESearch::ModifyWord(char *s) {
        int i;
 
 void RESearch::ModifyWord(char *s) {
        int i;
@@ -883,7 +817,7 @@ int RESearch::Substitute(CharacterIndexer &ci, char *src, char *dst) {
                                pin = c - '0';
                                break;
                        }
                                pin = c - '0';
                                break;
                        }
-                       
+
                default:
                        *dst++ = c;
                        continue;
                default:
                        *dst++ = c;
                        continue;
index 039539ad3c3ece57230f7b9d8581a68ef7fa4d2d..e42b5dc65ea0b0e065295df708d615e6a3e0729b 100644 (file)
@@ -198,16 +198,18 @@ void ScintillaBase::AutoCompleteStart(int lenEntered, const char *list) {
 
        if (ac.chooseSingle && (listType == 0)) {
                if (list && !strchr(list, ac.GetSeparator())) {
 
        if (ac.chooseSingle && (listType == 0)) {
                if (list && !strchr(list, ac.GetSeparator())) {
+                       const char *typeSep = strchr(list, ac.GetTypesep());
+                       size_t lenInsert = (typeSep) ? (typeSep-list) : strlen(list);
                        if (ac.ignoreCase) {
                                SetEmptySelection(currentPos - lenEntered);
                                pdoc->DeleteChars(currentPos, lenEntered);
                                SetEmptySelection(currentPos);
                        if (ac.ignoreCase) {
                                SetEmptySelection(currentPos - lenEntered);
                                pdoc->DeleteChars(currentPos, lenEntered);
                                SetEmptySelection(currentPos);
-                               pdoc->InsertString(currentPos, list);
-                               SetEmptySelection(currentPos + static_cast<int>(strlen(list)));
+                               pdoc->InsertString(currentPos, list, lenInsert);
+                               SetEmptySelection(currentPos + lenInsert);
                        } else {
                                SetEmptySelection(currentPos);
                        } else {
                                SetEmptySelection(currentPos);
-                               pdoc->InsertString(currentPos, list + lenEntered);
-                               SetEmptySelection(currentPos + static_cast<int>(strlen(list + lenEntered)));
+                               pdoc->InsertString(currentPos, list + lenEntered, lenInsert - lenEntered);
+                               SetEmptySelection(currentPos + lenInsert - lenEntered);
                        }
                        return;
                }
                        }
                        return;
                }
@@ -345,6 +347,10 @@ void ScintillaBase::AutoCompleteCompleted() {
        pdoc->EndUndoAction();
 }
 
        pdoc->EndUndoAction();
 }
 
+int ScintillaBase::AutoCompleteGetCurrent() {
+       return ac.lb->GetSelection();
+}
+
 void ScintillaBase::CallTipShow(Point pt, const char *defn) {
        AutoCompleteCancel();
        pt.y += vs.lineHeight;
 void ScintillaBase::CallTipShow(Point pt, const char *defn) {
        AutoCompleteCancel();
        pt.y += vs.lineHeight;
@@ -497,6 +503,9 @@ sptr_t ScintillaBase::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lPara
                ac.Select(reinterpret_cast<char *>(lParam));
                break;
 
                ac.Select(reinterpret_cast<char *>(lParam));
                break;
 
+       case SCI_AUTOCGETCURRENT:
+               return AutoCompleteGetCurrent();
+
        case SCI_AUTOCSETCANCELATSTART:
                ac.cancelAtStartPos = wParam != 0;
                break;
        case SCI_AUTOCSETCANCELATSTART:
                ac.cancelAtStartPos = wParam != 0;
                break;
@@ -557,7 +566,7 @@ sptr_t ScintillaBase::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lPara
                return ac.GetTypesep();
 
        case SCI_CALLTIPSHOW:
                return ac.GetTypesep();
 
        case SCI_CALLTIPSHOW:
-               CallTipShow(LocationFromPosition(wParam), 
+               CallTipShow(LocationFromPosition(wParam),
                        reinterpret_cast<const char *>(lParam));
                break;
 
                        reinterpret_cast<const char *>(lParam));
                break;
 
index bb09e3f5b314f6764407a5925881d1f3db95d7cb..6ea23ab5a3718bb1632182d5e0a4f96233c679f8 100644 (file)
@@ -65,6 +65,7 @@ protected:
        void AutoCompleteStart(int lenEntered, const char *list);
        void AutoCompleteCancel();
        void AutoCompleteMove(int delta);
        void AutoCompleteStart(int lenEntered, const char *list);
        void AutoCompleteCancel();
        void AutoCompleteMove(int delta);
+       int AutoCompleteGetCurrent();
        void AutoCompleteCharacterAdded(char ch);
        void AutoCompleteCharacterDeleted();
        void AutoCompleteCompleted();
        void AutoCompleteCharacterAdded(char ch);
        void AutoCompleteCharacterDeleted();
        void AutoCompleteCompleted();
index eb8e54f2f8b3759d6acafc41111a1c47e6b0a231..e2a65e09e4c685d64770401cfaa90710275a5105 100644 (file)
@@ -84,6 +84,7 @@ ViewStyle::ViewStyle(const ViewStyle &source) {
        hotspotBackgroundSet = source.hotspotBackgroundSet;
        hotspotBackground.desired = source.hotspotBackground.desired;
        hotspotUnderline = source.hotspotUnderline;
        hotspotBackgroundSet = source.hotspotBackgroundSet;
        hotspotBackground.desired = source.hotspotBackground.desired;
        hotspotUnderline = source.hotspotUnderline;
+       hotspotSingleLine = source.hotspotSingleLine;
 
        whitespaceForegroundSet = source.whitespaceForegroundSet;
        whitespaceForeground.desired = source.whitespaceForeground.desired;
 
        whitespaceForegroundSet = source.whitespaceForegroundSet;
        whitespaceForeground.desired = source.whitespaceForeground.desired;
@@ -164,6 +165,7 @@ void ViewStyle::Init() {
        hotspotBackgroundSet = false;
        hotspotBackground.desired = ColourDesired(0xff, 0xff, 0xff);
        hotspotUnderline = true;
        hotspotBackgroundSet = false;
        hotspotBackground.desired = ColourDesired(0xff, 0xff, 0xff);
        hotspotUnderline = true;
+       hotspotSingleLine = true;
 
        leftMarginWidth = 1;
        rightMarginWidth = 1;
 
        leftMarginWidth = 1;
        rightMarginWidth = 1;
index ff38efef2eb5ca328d52bbf274d5942080963930..5f27cc08cb33fbf583336a1647c5ae91f7a45d95 100644 (file)
@@ -68,6 +68,7 @@ public:
        bool hotspotBackgroundSet;
        ColourPair hotspotBackground;
        bool hotspotUnderline;
        bool hotspotBackgroundSet;
        ColourPair hotspotBackground;
        bool hotspotUnderline;
+       bool hotspotSingleLine;
        /// Margins are ordered: Line Numbers, Selection Margin, Spacing Margin
        enum { margins=3 };
        int leftMarginWidth;    ///< Spacing margin on left of text
        /// Margins are ordered: Line Numbers, Selection Margin, Spacing Margin
        enum { margins=3 };
        int leftMarginWidth;    ///< Spacing margin on left of text
index c3f66c2e405d84fc26bc4b92bc437b3249a5055c..e693736a21c3e50831cf2d876b91d523d43f4037 100644 (file)
@@ -1,6 +1,6 @@
 // Scintilla source code edit control
 /** @file XPM.cxx
 // Scintilla source code edit control
 /** @file XPM.cxx
- ** Define a class that holds data in the X Pixmap (XPM) format,
+ ** Define a class that holds data in the X Pixmap (XPM) format.
  **/
 // Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
  **/
 // Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
@@ -33,7 +33,7 @@ static size_t MeasureLength(const char *s) {
 ColourAllocated XPM::ColourFromCode(int ch) {
        return colourCodeTable[ch]->allocated;
 #ifdef SLOW
 ColourAllocated XPM::ColourFromCode(int ch) {
        return colourCodeTable[ch]->allocated;
 #ifdef SLOW
-       for (int i=0;i<nColours;i++) {
+       for (int i=0; i<nColours; i++) {
                if (codes[i] == ch) {
                        return colours[i].allocated;
                }
                if (codes[i] == ch) {
                        return colours[i].allocated;
                }
@@ -49,13 +49,13 @@ void XPM::FillRun(Surface *surface, int code, int startX, int y, int x) {
        }
 }
 
        }
 }
 
-XPM::XPM(const char *textForm) : 
-       data(0),        codes(0), colours(0), lines(0) {
+XPM::XPM(const char *textForm) :
+       data(0), codes(0), colours(0), lines(0) {
        Init(textForm);
 }
 
 XPM::XPM(const char * const *linesForm) :
        Init(textForm);
 }
 
 XPM::XPM(const char * const *linesForm) :
-       data(0),        codes(0), colours(0), lines(0) {
+       data(0), codes(0), colours(0), lines(0) {
        Init(linesForm);
 }
 
        Init(linesForm);
 }
 
@@ -116,7 +116,7 @@ void XPM::Init(const char * const *linesForm) {
                *nextBit++ = '\0';
        }
 
                *nextBit++ = '\0';
        }
 
-       for (int code=0;code<256; code++) {
+       for (int code=0; code<256; code++) {
                colourCodeTable[code] = 0;
        }
 
                colourCodeTable[code] = 0;
        }
 
@@ -149,7 +149,7 @@ void XPM::RefreshColourPalette(Palette &pal, bool want) {
        if (!data || !codes || !colours || !lines) {
                return;
        }
        if (!data || !codes || !colours || !lines) {
                return;
        }
-       for (int i=0;i<nColours;i++) {
+       for (int i=0; i<nColours; i++) {
                pal.WantFind(colours[i], want);
        }
 }
                pal.WantFind(colours[i], want);
        }
 }
@@ -158,7 +158,7 @@ void XPM::CopyDesiredColours() {
        if (!data || !codes || !colours || !lines) {
                return;
        }
        if (!data || !codes || !colours || !lines) {
                return;
        }
-       for (int i=0;i<nColours;i++) {
+       for (int i=0; i<nColours; i++) {
                colours[i].Copy();
        }
 }
                colours[i].Copy();
        }
 }
@@ -222,7 +222,7 @@ XPMSet::~XPMSet() {
 }
 
 void XPMSet::Clear() {
 }
 
 void XPMSet::Clear() {
-       for (int i=0;i<maximum;i++) {
+       for (int i = 0; i < len; i++) {
                delete set[i];
        }
        delete []set;
                delete set[i];
        }
        delete []set;
@@ -239,34 +239,34 @@ void XPMSet::Add(int id, const char *textForm) {
        width = -1;
 
        // Replace if this id already present
        width = -1;
 
        // Replace if this id already present
-       for (int i=0;i<maximum;i++) {
+       for (int i = 0; i < len; i++) {
                if (set[i]->GetId() == id) {
                        set[i]->Init(textForm);
                        return;
                }
        }
 
                if (set[i]->GetId() == id) {
                        set[i]->Init(textForm);
                        return;
                }
        }
 
-       // No present, so add to end
+       // Not present, so add to end
        XPM *pxpm = new XPM(textForm);
        if (pxpm) {
                pxpm->SetId(id);
                pxpm->CopyDesiredColours();
                if (len == maximum) {
        XPM *pxpm = new XPM(textForm);
        if (pxpm) {
                pxpm->SetId(id);
                pxpm->CopyDesiredColours();
                if (len == maximum) {
-                       int lenNew = len + 100;
-                       XPM **setNew = new XPM *[lenNew];
-                       for (int i=0; i<maximum; i++) {
+                       maximum += 64;
+                       XPM **setNew = new XPM *[maximum];
+                       for (int i = 0; i < len; i++) {
                                setNew[i] = set[i];
                        }
                        delete []set;
                        set = setNew;
                }
                                setNew[i] = set[i];
                        }
                        delete []set;
                        set = setNew;
                }
-               set[maximum] = pxpm;
-               maximum++;
+               set[len] = pxpm;
+               len++;
        }
 }
 
 XPM *XPMSet::Get(int id) {
        }
 }
 
 XPM *XPMSet::Get(int id) {
-       for (int i=0;i<maximum;i++) {
+       for (int i = 0; i < len; i++) {
                if (set[i]->GetId() == id) {
                        return set[i];
                }
                if (set[i]->GetId() == id) {
                        return set[i];
                }
@@ -276,7 +276,7 @@ XPM *XPMSet::Get(int id) {
 
 int XPMSet::GetHeight() {
        if (height < 0) {
 
 int XPMSet::GetHeight() {
        if (height < 0) {
-               for (int i=0; i<maximum; i++) {
+               for (int i = 0; i < len; i++) {
                        if (height < set[i]->GetHeight()) {
                                height = set[i]->GetHeight();
                        }
                        if (height < set[i]->GetHeight()) {
                                height = set[i]->GetHeight();
                        }
@@ -287,7 +287,7 @@ int XPMSet::GetHeight() {
 
 int XPMSet::GetWidth() {
        if (width < 0) {
 
 int XPMSet::GetWidth() {
        if (width < 0) {
-               for (int i=0; i<maximum; i++) {
+               for (int i = 0; i < len; i++) {
                        if (width < set[i]->GetWidth()) {
                                width = set[i]->GetWidth();
                        }
                        if (width < set[i]->GetWidth()) {
                                width = set[i]->GetWidth();
                        }
index 948e557a924c7c243dfbebf1b11beb76aa66a9b1..4d3da28d36e58b67f668914df2abaf9c1dbd6826 100644 (file)
@@ -1,6 +1,6 @@
 // Scintilla source code edit control
 /** @file XPM.h
 // Scintilla source code edit control
 /** @file XPM.h
- ** Define a class that holds data in the X Pixmap (XPM) format,
+ ** Define a class that holds data in the X Pixmap (XPM) format.
  **/
 // Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
  **/
 // Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
@@ -31,11 +31,11 @@ public:
        void Init(const char *textForm);
        void Init(const char * const *linesForm);
        void Clear();
        void Init(const char *textForm);
        void Init(const char * const *linesForm);
        void Clear();
-       // Similar to same named method in ViewStyle:
+       /// Similar to same named method in ViewStyle:
        void RefreshColourPalette(Palette &pal, bool want);
        void RefreshColourPalette(Palette &pal, bool want);
-       // No palette used, so just copy the desired colours to the allocated colours:
+       /// No palette used, so just copy the desired colours to the allocated colours
        void CopyDesiredColours();
        void CopyDesiredColours();
-       // Decompose image into runs and use FillRectangle for each run:
+       /// Decompose image into runs and use FillRectangle for each run
        void Draw(Surface *surface, PRectangle &rc);
        char **InLinesForm() { return lines; }
        void SetId(int id_) { id = id_; }
        void Draw(Surface *surface, PRectangle &rc);
        char **InLinesForm() { return lines; }
        void SetId(int id_) { id = id_; }
@@ -49,18 +49,23 @@ public:
  * A collection of pixmaps indexed by integer id.
  */
 class XPMSet {
  * A collection of pixmaps indexed by integer id.
  */
 class XPMSet {
-       XPM **set;
-       int len;
-       int maximum;
-       int height;
-       int width;
+       XPM **set;      ///< The stored XPMs.
+       int len;        ///< Current number of XPMs.
+       int maximum;    ///< Current maximum number of XPMs, increased by steps if reached.
+       int height;     ///< Memorize largest height of the set.
+       int width;      ///< Memorize largest width of the set.
 public:
        XPMSet();
        ~XPMSet();
 public:
        XPMSet();
        ~XPMSet();
+       /// Remove all XPMs.
        void Clear();
        void Clear();
+       /// Add a XPM.
        void Add(int id, const char *textForm);
        void Add(int id, const char *textForm);
+       /// Get XPM by id.
        XPM *Get(int id);
        XPM *Get(int id);
+       /// Give the largest height of the set.
        int GetHeight();
        int GetHeight();
+       /// Give the largest width of the set.
        int GetWidth();
 };
 
        int GetWidth();
 };
 
index 8d03e9c92d6cd86ceedd77e1164049bfaf7349a6..2f5ea9eae121410647eb7289f10a9b6b8af080cf 100644 (file)
@@ -154,7 +154,7 @@ void wxStyledTextCtrl::Create(wxWindow *parent,
     style |= wxVSCROLL | wxHSCROLL;
 #endif
     wxControl::Create(parent, id, pos, size,
     style |= wxVSCROLL | wxHSCROLL;
 #endif
     wxControl::Create(parent, id, pos, size,
-                      style | wxWANTS_CHARS | wxCLIP_CHILDREN,
+              style | wxWANTS_CHARS | wxCLIP_CHILDREN,
               wxDefaultValidator, name);
 
 #ifdef LINK_LEXERS
               wxDefaultValidator, name);
 
 #ifdef LINK_LEXERS
@@ -619,7 +619,7 @@ void wxStyledTextCtrl::CmdKeyAssign(int key, int modifiers, int cmd) {
          SendMsg(2070, MAKELONG(key, modifiers), cmd);
 }
 
          SendMsg(2070, MAKELONG(key, modifiers), cmd);
 }
 
-// When key+modifier combination km do nothing.
+// When key+modifier combination km is pressed do nothing.
 void wxStyledTextCtrl::CmdKeyClear(int key, int modifiers) {
          SendMsg(2071, MAKELONG(key, modifiers));
 }
 void wxStyledTextCtrl::CmdKeyClear(int key, int modifiers) {
          SendMsg(2071, MAKELONG(key, modifiers));
 }
@@ -650,6 +650,7 @@ void wxStyledTextCtrl::SetCaretPeriod(int periodMilliseconds) {
 }
 
 // Set the set of characters making up words for when moving or selecting by word.
 }
 
 // Set the set of characters making up words for when moving or selecting by word.
+// First sets deaults like SetCharsDefault.
 void wxStyledTextCtrl::SetWordChars(const wxString& characters) {
     SendMsg(2077, 0, (long)(const char*)wx2stc(characters));
 }
 void wxStyledTextCtrl::SetWordChars(const wxString& characters) {
     SendMsg(2077, 0, (long)(const char*)wx2stc(characters));
 }
@@ -1049,7 +1050,7 @@ int wxStyledTextCtrl::FindText(int minPos, int maxPos,
                 int    startPos,
                 int    endPos,
                 wxDC*  draw,
                 int    startPos,
                 int    endPos,
                 wxDC*  draw,
-                wxDC*  target,  // Why does it use two? Can they be the same?
+                wxDC*  target, 
                 wxRect renderRect,
                 wxRect pageRect) {
              RangeToFormat fr;
                 wxRect renderRect,
                 wxRect pageRect) {
              RangeToFormat fr;
@@ -1305,7 +1306,7 @@ int wxStyledTextCtrl::GetTargetEnd() {
 }
 
 // Replace the target text with the argument text.
 }
 
 // Replace the target text with the argument text.
-// Text is counted so it can contain nulls.
+// Text is counted so it can contain NULs.
 // Returns the length of the replacement text.
 
      int wxStyledTextCtrl::ReplaceTarget(const wxString& text) {
 // Returns the length of the replacement text.
 
      int wxStyledTextCtrl::ReplaceTarget(const wxString& text) {
@@ -1314,7 +1315,7 @@ int wxStyledTextCtrl::GetTargetEnd() {
 }
 
 // Replace the target text with the argument text after \d processing.
 }
 
 // Replace the target text with the argument text after \d processing.
-// Text is counted so it can contain nulls.
+// Text is counted so it can contain NULs.
 // Looks for \d where d is between 1 and 9 and replaces these with the strings
 // matched in the last search operation which were surrounded by \( and \).
 // Returns the length of the replacement text including any change
 // Looks for \d where d is between 1 and 9 and replaces these with the strings
 // matched in the last search operation which were surrounded by \( and \).
 // Returns the length of the replacement text including any change
@@ -1326,7 +1327,7 @@ int wxStyledTextCtrl::GetTargetEnd() {
 }
 
 // Search for a counted string in the target and set the target to the found
 }
 
 // Search for a counted string in the target and set the target to the found
-// range. Text is counted so it can contain nulls.
+// range. Text is counted so it can contain NULs.
 // Returns length of range or -1 for failure in which case target is not moved.
 
      int wxStyledTextCtrl::SearchInTarget(const wxString& text) {
 // Returns length of range or -1 for failure in which case target is not moved.
 
      int wxStyledTextCtrl::SearchInTarget(const wxString& text) {
@@ -1533,7 +1534,7 @@ int wxStyledTextCtrl::GetScrollWidth() {
 }
 
 // Measure the pixel width of some text in a particular style.
 }
 
 // Measure the pixel width of some text in a particular style.
-// Nul terminated text argument.
+// NUL terminated text argument.
 // Does not handle tab or control characters.
 int wxStyledTextCtrl::TextWidth(int style, const wxString& text) {
     return SendMsg(2276, style, (long)(const char*)wx2stc(text));
 // Does not handle tab or control characters.
 int wxStyledTextCtrl::TextWidth(int style, const wxString& text) {
     return SendMsg(2276, style, (long)(const char*)wx2stc(text));
@@ -1884,7 +1885,7 @@ int wxStyledTextCtrl::GetXOffset() {
     return SendMsg(2398, 0, 0);
 }
 
     return SendMsg(2398, 0, 0);
 }
 
-// Set the last x chosen value to be the caret x position
+// Set the last x chosen value to be the caret x position.
 void wxStyledTextCtrl::ChooseCaretX() {
     SendMsg(2399, 0, 0);
 }
 void wxStyledTextCtrl::ChooseCaretX() {
     SendMsg(2399, 0, 0);
 }
@@ -1906,7 +1907,7 @@ void wxStyledTextCtrl::SetPrintWrapMode(int mode) {
     SendMsg(2406, mode, 0);
 }
 
     SendMsg(2406, mode, 0);
 }
 
-// Is printing line wrapped.
+// Is printing line wrapped?
 int wxStyledTextCtrl::GetPrintWrapMode() {
     return SendMsg(2407, 0, 0);
 }
 int wxStyledTextCtrl::GetPrintWrapMode() {
     return SendMsg(2407, 0, 0);
 }
@@ -1926,6 +1927,11 @@ void wxStyledTextCtrl::SetHotspotActiveUnderline(bool underline) {
     SendMsg(2412, underline, 0);
 }
 
     SendMsg(2412, underline, 0);
 }
 
+// Limit hotspots to single line so hotspots on two lines don't merge.
+void wxStyledTextCtrl::SetHotspotSingleLine(bool singleLine) {
+    SendMsg(2421, singleLine, 0);
+}
+
 // Given a valid document position, return the previous position taking code
 // page into account. Returns 0 if passed 0.
 int wxStyledTextCtrl::PositionBefore(int pos) {
 // Given a valid document position, return the previous position taking code
 // page into account. Returns 0 if passed 0.
 int wxStyledTextCtrl::PositionBefore(int pos) {
@@ -1948,6 +1954,43 @@ void wxStyledTextCtrl::CopyText(int length, const wxString& text) {
     SendMsg(2420, length, (long)(const char*)wx2stc(text));
 }
 
     SendMsg(2420, length, (long)(const char*)wx2stc(text));
 }
 
+// Set the selection mode to stream (SC_SEL_STREAM) or rectangular (SC_SEL_RECTANGLE) or
+// by lines (SC_SEL_LINES).
+void wxStyledTextCtrl::SetSelectionMode(int mode) {
+    SendMsg(2422, mode, 0);
+}
+
+// Get the mode of the current selection.
+int wxStyledTextCtrl::GetSelectionMode() {
+    return SendMsg(2423, 0, 0);
+}
+
+// Retrieve the position of the start of the selection at the given line (INVALID_POSITION if no selection on this line).
+int wxStyledTextCtrl::GetLineSelStartPosition(int line) {
+    return SendMsg(2424, line, 0);
+}
+
+// Retrieve the position of the end of the selection at the given line (INVALID_POSITION if no selection on this line).
+int wxStyledTextCtrl::GetLineSelEndPosition(int line) {
+    return SendMsg(2425, line, 0);
+}
+
+// Set the set of characters making up whitespace for when moving or selecting by word.
+// Should be called after SetWordChars.
+void wxStyledTextCtrl::SetWhitespaceChars(const wxString& characters) {
+    SendMsg(2443, 0, (long)(const char*)wx2stc(characters));
+}
+
+// Reset the set of characters for whitespace and word characters to the defaults.
+void wxStyledTextCtrl::SetCharsDefault() {
+    SendMsg(2444, 0, 0);
+}
+
+// Get currently selected item position in the auto-completion list
+int wxStyledTextCtrl::AutoCompGetCurrent() {
+    return SendMsg(2445, 0, 0);
+}
+
 // Start notifying the container of all key presses and commands.
 void wxStyledTextCtrl::StartRecord() {
     SendMsg(3001, 0, 0);
 // Start notifying the container of all key presses and commands.
 void wxStyledTextCtrl::StartRecord() {
     SendMsg(3001, 0, 0);
@@ -2336,6 +2379,11 @@ void wxStyledTextCtrl::OnListBox(wxCommandEvent& WXUNUSED(evt)) {
 }
 
 
 }
 
 
+void wxStyledTextCtrl::OnIdle(wxIdleEvent& evt) {
+    m_swx->DoOnIdle(evt);
+}
+
+
 //----------------------------------------------------------------------
 // Turn notifications from Scintilla into events
 
 //----------------------------------------------------------------------
 // Turn notifications from Scintilla into events
 
index b10b081bb71fd13d462931ce16e2a2a7a38772ac..f8fb2d1cc612284a74551aa901a0f9843d9ba98b 100644 (file)
@@ -541,6 +541,11 @@ void wxStyledTextCtrl::OnListBox(wxCommandEvent& WXUNUSED(evt)) {
 }
 
 
 }
 
 
+void wxStyledTextCtrl::OnIdle(wxIdleEvent& evt) {
+    m_swx->DoOnIdle(evt);
+}
+
+
 //----------------------------------------------------------------------
 // Turn notifications from Scintilla into events
 
 //----------------------------------------------------------------------
 // Turn notifications from Scintilla into events
 
index 0f9b62df2ae92e9fbf8114b6773fe0fed9a91917..04c205e34199ee1cf0a56ab46534bb3f08858e2e 100644 (file)
@@ -237,7 +237,8 @@ private:
     void OnEraseBackground(wxEraseEvent& evt);
     void OnMenu(wxCommandEvent& evt);
     void OnListBox(wxCommandEvent& evt);
     void OnEraseBackground(wxEraseEvent& evt);
     void OnMenu(wxCommandEvent& evt);
     void OnListBox(wxCommandEvent& evt);
-
+    void OnIdle(wxIdleEvent& evt);
+    
 
     // Turn notifications from Scintilla into events
     void NotifyChange();
 
     // Turn notifications from Scintilla into events
     void NotifyChange();
index f70374ee2fc851cf7da04ce2e4f41933380ccddb..207fd19dc0da2221b029ab8bc18de769cce81e2c 100644 (file)
@@ -57,7 +57,7 @@
 
 #define wxSTC_INVALID_POSITION -1
 
 
 #define wxSTC_INVALID_POSITION -1
 
-// Define start of Scintilla messages to be greater than all edit (EM_*) messages
+// Define start of Scintilla messages to be greater than all Windows edit (EM_*) messages
 // as many EM_ messages can be used although that use is deprecated.
 #define wxSTC_START 2000
 #define wxSTC_OPTIONAL_START 3000
 // as many EM_ messages can be used although that use is deprecated.
 #define wxSTC_START 2000
 #define wxSTC_OPTIONAL_START 3000
 #define wxSTC_INDIC_DIAGONAL 3
 #define wxSTC_INDIC_STRIKE 4
 #define wxSTC_INDIC_HIDDEN 5
 #define wxSTC_INDIC_DIAGONAL 3
 #define wxSTC_INDIC_STRIKE 4
 #define wxSTC_INDIC_HIDDEN 5
+#define wxSTC_INDIC_BOX 6
 #define wxSTC_INDIC0_MASK 0x20
 #define wxSTC_INDIC1_MASK 0x40
 #define wxSTC_INDIC2_MASK 0x80
 #define wxSTC_INDIC0_MASK 0x20
 #define wxSTC_INDIC1_MASK 0x40
 #define wxSTC_INDIC2_MASK 0x80
 // where most code reside, and the lines after the caret, eg. the body of a function.
 #define wxSTC_CARET_EVEN 0x08
 
 // where most code reside, and the lines after the caret, eg. the body of a function.
 #define wxSTC_CARET_EVEN 0x08
 
+// Selection modes
+#define wxSTC_SEL_STREAM 0
+#define wxSTC_SEL_RECTANGLE 1
+#define wxSTC_SEL_LINES 2
+
 // Maximum value of keywordSet parameter of SetKeyWords.
 #define wxSTC_KEYWORDSET_MAX 8
 
 // Maximum value of keywordSet parameter of SetKeyWords.
 #define wxSTC_KEYWORDSET_MAX 8
 
 #define wxSTC_LEX_PS 42
 #define wxSTC_LEX_NSIS 43
 #define wxSTC_LEX_MMIXAL 44
 #define wxSTC_LEX_PS 42
 #define wxSTC_LEX_NSIS 43
 #define wxSTC_LEX_MMIXAL 44
+#define wxSTC_LEX_CLW 45
+#define wxSTC_LEX_CLWNOCASE 46
+#define wxSTC_LEX_LOT 47
+#define wxSTC_LEX_YAML 48
+#define wxSTC_LEX_TEX 49
+#define wxSTC_LEX_METAPOST 50
+#define wxSTC_LEX_POWERBASIC 51
+#define wxSTC_LEX_FORTH 52
+#define wxSTC_LEX_ERLANG 53
+#define wxSTC_LEX_OCTAVE 54
 
 // When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
 // value assigned in sequence from SCLEX_AUTOMATIC+1.
 
 // When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
 // value assigned in sequence from SCLEX_AUTOMATIC+1.
 #define wxSTC_PL_STRING_QR 29
 #define wxSTC_PL_STRING_QW 30
 
 #define wxSTC_PL_STRING_QR 29
 #define wxSTC_PL_STRING_QW 30
 
-// Lexical states for SCLEX_VB, SCLEX_VBSCRIPT
+// Lexical states for SCLEX_VB, SCLEX_VBSCRIPT, SCLEX_POWERBASIC
 #define wxSTC_B_DEFAULT 0
 #define wxSTC_B_COMMENT 1
 #define wxSTC_B_NUMBER 2
 #define wxSTC_B_DEFAULT 0
 #define wxSTC_B_COMMENT 1
 #define wxSTC_B_NUMBER 2
 #define wxSTC_B_OPERATOR 6
 #define wxSTC_B_IDENTIFIER 7
 #define wxSTC_B_DATE 8
 #define wxSTC_B_OPERATOR 6
 #define wxSTC_B_IDENTIFIER 7
 #define wxSTC_B_DATE 8
+#define wxSTC_B_STRINGEOL 9
+#define wxSTC_B_KEYWORD2 10
+#define wxSTC_B_KEYWORD3 11
+#define wxSTC_B_KEYWORD4 12
 
 // Lexical states for SCLEX_PROPERTIES
 #define wxSTC_PROPS_DEFAULT 0
 
 // Lexical states for SCLEX_PROPERTIES
 #define wxSTC_PROPS_DEFAULT 0
 #define wxSTC_ERR_PHP 14
 #define wxSTC_ERR_ELF 15
 #define wxSTC_ERR_IFC 16
 #define wxSTC_ERR_PHP 14
 #define wxSTC_ERR_ELF 15
 #define wxSTC_ERR_IFC 16
+#define wxSTC_ERR_IFORT 17
+#define wxSTC_ERR_ABSF 18
 
 // Lexical states for SCLEX_BATCH
 #define wxSTC_BAT_DEFAULT 0
 
 // Lexical states for SCLEX_BATCH
 #define wxSTC_BAT_DEFAULT 0
 #define wxSTC_NNCRONTAB_ENVIRONMENT 9
 #define wxSTC_NNCRONTAB_IDENTIFIER 10
 
 #define wxSTC_NNCRONTAB_ENVIRONMENT 9
 #define wxSTC_NNCRONTAB_IDENTIFIER 10
 
+// Lexical states for SCLEX_FORTH (Forth Lexer)
+#define wxSTC_FORTH_DEFAULT 0
+#define wxSTC_FORTH_COMMENT 1
+#define wxSTC_FORTH_COMMENT_ML 2
+#define wxSTC_FORTH_IDENTIFIER 3
+#define wxSTC_FORTH_CONTROL 4
+#define wxSTC_FORTH_KEYWORD 5
+#define wxSTC_FORTH_DEFWORD 6
+#define wxSTC_FORTH_PREWORD1 7
+#define wxSTC_FORTH_PREWORD2 8
+#define wxSTC_FORTH_NUMBER 9
+#define wxSTC_FORTH_STRING 10
+#define wxSTC_FORTH_LOCALE 11
+
 // Lexical states for SCLEX_MATLAB
 #define wxSTC_MATLAB_DEFAULT 0
 #define wxSTC_MATLAB_COMMENT 1
 #define wxSTC_MATLAB_COMMAND 2
 #define wxSTC_MATLAB_NUMBER 3
 #define wxSTC_MATLAB_KEYWORD 4
 // Lexical states for SCLEX_MATLAB
 #define wxSTC_MATLAB_DEFAULT 0
 #define wxSTC_MATLAB_COMMENT 1
 #define wxSTC_MATLAB_COMMAND 2
 #define wxSTC_MATLAB_NUMBER 3
 #define wxSTC_MATLAB_KEYWORD 4
+
+// single quoted string
 #define wxSTC_MATLAB_STRING 5
 #define wxSTC_MATLAB_OPERATOR 6
 #define wxSTC_MATLAB_IDENTIFIER 7
 #define wxSTC_MATLAB_STRING 5
 #define wxSTC_MATLAB_OPERATOR 6
 #define wxSTC_MATLAB_IDENTIFIER 7
+#define wxSTC_MATLAB_DOUBLEQUOTESTRING 8
 
 // Lexical states for SCLEX_SCRIPTOL
 #define wxSTC_SCRIPTOL_DEFAULT 0
 
 // Lexical states for SCLEX_SCRIPTOL
 #define wxSTC_SCRIPTOL_DEFAULT 0
-#define wxSTC_SCRIPTOL_COMMENT 1
+#define wxSTC_SCRIPTOL_WHITE 1
 #define wxSTC_SCRIPTOL_COMMENTLINE 2
 #define wxSTC_SCRIPTOL_COMMENTLINE 2
-#define wxSTC_SCRIPTOL_COMMENTDOC 3
-#define wxSTC_SCRIPTOL_NUMBER 4
-#define wxSTC_SCRIPTOL_WORD 5
-#define wxSTC_SCRIPTOL_STRING 6
-#define wxSTC_SCRIPTOL_CHARACTER 7
-#define wxSTC_SCRIPTOL_UUID 8
-#define wxSTC_SCRIPTOL_PREPROCESSOR 9
-#define wxSTC_SCRIPTOL_OPERATOR 10
-#define wxSTC_SCRIPTOL_IDENTIFIER 11
-#define wxSTC_SCRIPTOL_STRINGEOL 12
-#define wxSTC_SCRIPTOL_VERBATIM 13
-#define wxSTC_SCRIPTOL_REGEX 14
-#define wxSTC_SCRIPTOL_COMMENTLINEDOC 15
-#define wxSTC_SCRIPTOL_WORD2 16
-#define wxSTC_SCRIPTOL_COMMENTDOCKEYWORD 17
-#define wxSTC_SCRIPTOL_COMMENTDOCKEYWORDERROR 18
-#define wxSTC_SCRIPTOL_COMMENTBASIC 19
+#define wxSTC_SCRIPTOL_PERSISTENT 3
+#define wxSTC_SCRIPTOL_CSTYLE 4
+#define wxSTC_SCRIPTOL_COMMENTBLOCK 5
+#define wxSTC_SCRIPTOL_NUMBER 6
+#define wxSTC_SCRIPTOL_STRING 7
+#define wxSTC_SCRIPTOL_CHARACTER 8
+#define wxSTC_SCRIPTOL_STRINGEOL 9
+#define wxSTC_SCRIPTOL_KEYWORD 10
+#define wxSTC_SCRIPTOL_OPERATOR 11
+#define wxSTC_SCRIPTOL_IDENTIFIER 12
+#define wxSTC_SCRIPTOL_TRIPLE 13
+#define wxSTC_SCRIPTOL_CLASSNAME 14
+#define wxSTC_SCRIPTOL_PREPROCESSOR 15
 
 // Lexical states for SCLEX_ASM
 #define wxSTC_ASM_DEFAULT 0
 
 // Lexical states for SCLEX_ASM
 #define wxSTC_ASM_DEFAULT 0
 #define wxSTC_ASM_REGISTER 8
 #define wxSTC_ASM_DIRECTIVE 9
 #define wxSTC_ASM_DIRECTIVEOPERAND 10
 #define wxSTC_ASM_REGISTER 8
 #define wxSTC_ASM_DIRECTIVE 9
 #define wxSTC_ASM_DIRECTIVEOPERAND 10
+#define wxSTC_ASM_COMMENTBLOCK 11
+#define wxSTC_ASM_CHARACTER 12
+#define wxSTC_ASM_STRINGEOL 13
+#define wxSTC_ASM_EXTINSTRUCTION 14
 
 // Lexical states for SCLEX_FORTRAN
 #define wxSTC_F_DEFAULT 0
 
 // Lexical states for SCLEX_FORTRAN
 #define wxSTC_F_DEFAULT 0
 #define wxSTC_MMIXAL_SYMBOL 16
 #define wxSTC_MMIXAL_INCLUDE 17
 
 #define wxSTC_MMIXAL_SYMBOL 16
 #define wxSTC_MMIXAL_INCLUDE 17
 
+// Lexical states for SCLEX_CLW
+#define wxSTC_CLW_DEFAULT 0
+#define wxSTC_CLW_LABEL 1
+#define wxSTC_CLW_COMMENT 2
+#define wxSTC_CLW_STRING 3
+#define wxSTC_CLW_USER_IDENTIFIER 4
+#define wxSTC_CLW_INTEGER_CONSTANT 5
+#define wxSTC_CLW_REAL_CONSTANT 6
+#define wxSTC_CLW_PICTURE_STRING 7
+#define wxSTC_CLW_KEYWORD 8
+#define wxSTC_CLW_COMPILER_DIRECTIVE 9
+#define wxSTC_CLW_BUILTIN_PROCEDURES_FUNCTION 10
+#define wxSTC_CLW_STRUCTURE_DATA_TYPE 11
+#define wxSTC_CLW_ATTRIBUTE 12
+#define wxSTC_CLW_STANDARD_EQUATE 13
+#define wxSTC_CLW_ERROR 14
+
+// Lexical states for SCLEX_LOT
+#define wxSTC_LOT_DEFAULT 0
+#define wxSTC_LOT_HEADER 1
+#define wxSTC_LOT_BREAK 2
+#define wxSTC_LOT_SET 3
+#define wxSTC_LOT_PASS 4
+#define wxSTC_LOT_FAIL 5
+#define wxSTC_LOT_ABORT 6
+
+// Lexical states for SCLEX_YAML
+#define wxSTC_YAML_DEFAULT 0
+#define wxSTC_YAML_COMMENT 1
+#define wxSTC_YAML_IDENTIFIER 2
+#define wxSTC_YAML_KEYWORD 3
+#define wxSTC_YAML_NUMBER 4
+#define wxSTC_YAML_REFERENCE 5
+#define wxSTC_YAML_DOCUMENT 6
+#define wxSTC_YAML_TEXT 7
+#define wxSTC_YAML_ERROR 8
+
+// Lexical states for SCLEX_TEX
+#define wxSTC_TEX_DEFAULT 0
+#define wxSTC_TEX_SPECIAL 1
+#define wxSTC_TEX_GROUP 2
+#define wxSTC_TEX_SYMBOL 3
+#define wxSTC_TEX_COMMAND 4
+#define wxSTC_TEX_TEXT 5
+#define wxSTC_METAPOST_DEFAULT 0
+#define wxSTC_METAPOST_SPECIAL 1
+#define wxSTC_METAPOST_GROUP 2
+#define wxSTC_METAPOST_SYMBOL 3
+#define wxSTC_METAPOST_COMMAND 4
+#define wxSTC_METAPOST_TEXT 5
+#define wxSTC_METAPOST_EXTRA 6
+
+// Lexical states for SCLEX_ERLANG
+#define wxSTC_ERLANG_DEFAULT 0
+#define wxSTC_ERLANG_COMMENT 1
+#define wxSTC_ERLANG_VARIABLE 2
+#define wxSTC_ERLANG_NUMBER 3
+#define wxSTC_ERLANG_KEYWORD 4
+#define wxSTC_ERLANG_STRING 5
+#define wxSTC_ERLANG_OPERATOR 6
+#define wxSTC_ERLANG_ATOM 7
+#define wxSTC_ERLANG_FUNCTION_NAME 8
+#define wxSTC_ERLANG_CHARACTER 9
+#define wxSTC_ERLANG_MACRO 10
+#define wxSTC_ERLANG_RECORD 11
+#define wxSTC_ERLANG_SEPARATOR 12
+#define wxSTC_ERLANG_NODE_NAME 13
+#define wxSTC_ERLANG_UNKNOWN 31
+
 
 //-----------------------------------------
 // Commands that can be bound to keystrokes
 
 //-----------------------------------------
 // Commands that can be bound to keystrokes
 // except they behave differently when word-wrap is enabled:
 // They go first to the start / end of the display line, like (Home|LineEnd)Display
 // The difference is that, the cursor is already at the point, it goes on to the start
 // except they behave differently when word-wrap is enabled:
 // They go first to the start / end of the display line, like (Home|LineEnd)Display
 // The difference is that, the cursor is already at the point, it goes on to the start
-// or end of the document line, as appropriate for (Home|LineEnd|VCHome)Extend.
+// or end of the document line, as appropriate for (Home|LineEnd|VCHome)(Extend)?.
 #define wxSTC_CMD_HOMEWRAP 2349
 #define wxSTC_CMD_HOMEWRAPEXTEND 2450
 #define wxSTC_CMD_LINEENDWRAP 2451
 #define wxSTC_CMD_HOMEWRAP 2349
 #define wxSTC_CMD_HOMEWRAPEXTEND 2450
 #define wxSTC_CMD_LINEENDWRAP 2451
 // Delete forwards from the current position to the end of the line.
 #define wxSTC_CMD_DELLINERIGHT 2396
 
 // Delete forwards from the current position to the end of the line.
 #define wxSTC_CMD_DELLINERIGHT 2396
 
-// Move caret between paragraphs (delimited by empty lines)
+// Move caret between paragraphs (delimited by empty lines).
 #define wxSTC_CMD_PARADOWN 2413
 #define wxSTC_CMD_PARADOWNEXTEND 2414
 #define wxSTC_CMD_PARAUP 2415
 #define wxSTC_CMD_PARAUPEXTEND 2416
 
 #define wxSTC_CMD_PARADOWN 2413
 #define wxSTC_CMD_PARADOWNEXTEND 2414
 #define wxSTC_CMD_PARAUP 2415
 #define wxSTC_CMD_PARAUPEXTEND 2416
 
+// Move caret down one line, extending rectangular selection to new caret position.
+#define wxSTC_CMD_LINEDOWNRECTEXTEND 2426
+
+// Move caret up one line, extending rectangular selection to new caret position.
+#define wxSTC_CMD_LINEUPRECTEXTEND 2427
+
+// Move caret left one character, extending rectangular selection to new caret position.
+#define wxSTC_CMD_CHARLEFTRECTEXTEND 2428
+
+// Move caret right one character, extending rectangular selection to new caret position.
+#define wxSTC_CMD_CHARRIGHTRECTEXTEND 2429
+
+// Move caret to first position on line, extending rectangular selection to new caret position.
+#define wxSTC_CMD_HOMERECTEXTEND 2430
+
+// Move caret to before first visible character on line.
+// If already there move to first character on line.
+// In either case, extend rectangular selection to new caret position.
+#define wxSTC_CMD_VCHOMERECTEXTEND 2431
+
+// Move caret to last position on line, extending rectangular selection to new caret position.
+#define wxSTC_CMD_LINEENDRECTEXTEND 2432
+
+// Move caret one page up, extending rectangular selection to new caret position.
+#define wxSTC_CMD_PAGEUPRECTEXTEND 2433
+
+// Move caret one page down, extending rectangular selection to new caret position.
+#define wxSTC_CMD_PAGEDOWNRECTEXTEND 2434
+
+// Move caret to top of page, or one page up if already at top of page.
+#define wxSTC_CMD_STUTTEREDPAGEUP 2435
+
+// Move caret to top of page, or one page up if already at top of page, extending selection to new caret position.
+#define wxSTC_CMD_STUTTEREDPAGEUPEXTEND 2436
+
+// Move caret to bottom of page, or one page down if already at bottom of page.
+#define wxSTC_CMD_STUTTEREDPAGEDOWN 2437
+
+// Move caret to bottom of page, or one page down if already at bottom of page, extending selection to new caret position.
+#define wxSTC_CMD_STUTTEREDPAGEDOWNEXTEND 2438
+
+// Move caret left one word, position cursor at end of word.
+#define wxSTC_CMD_WORDLEFTEND 2439
+
+// Move caret left one word, position cursor at end of word, extending selection to new caret position.
+#define wxSTC_CMD_WORDLEFTENDEXTEND 2440
+
+// Move caret right one word, position cursor at end of word.
+#define wxSTC_CMD_WORDRIGHTEND 2441
+
+// Move caret right one word, position cursor at end of word, extending selection to new caret position.
+#define wxSTC_CMD_WORDRIGHTENDEXTEND 2442
+
 
 // END of generated section
 //----------------------------------------------------------------------
 
 // END of generated section
 //----------------------------------------------------------------------
@@ -1410,7 +1571,7 @@ public:
     // When key+modifier combination km is pressed perform msg.
     void CmdKeyAssign(int key, int modifiers, int cmd);
 
     // When key+modifier combination km is pressed perform msg.
     void CmdKeyAssign(int key, int modifiers, int cmd);
 
-    // When key+modifier combination km do nothing.
+    // When key+modifier combination km is pressed do nothing.
     void CmdKeyClear(int key, int modifiers);
 
     // Drop all key mappings.
     void CmdKeyClear(int key, int modifiers);
 
     // Drop all key mappings.
@@ -1429,6 +1590,7 @@ public:
     void SetCaretPeriod(int periodMilliseconds);
 
     // Set the set of characters making up words for when moving or selecting by word.
     void SetCaretPeriod(int periodMilliseconds);
 
     // Set the set of characters making up words for when moving or selecting by word.
+    // First sets deaults like SetCharsDefault.
     void SetWordChars(const wxString& characters);
 
     // Start a sequence of actions that is undone and redone as a unit.
     void SetWordChars(const wxString& characters);
 
     // Start a sequence of actions that is undone and redone as a unit.
@@ -1663,7 +1825,7 @@ public:
                int    startPos,
                int    endPos,
                wxDC*  draw,
                int    startPos,
                int    endPos,
                wxDC*  draw,
-               wxDC*  target,  // Why does it use two? Can they be the same?
+               wxDC*  target, 
                wxRect renderRect,
                wxRect pageRect);
 
                wxRect renderRect,
                wxRect pageRect);
 
@@ -1781,12 +1943,12 @@ public:
     int GetTargetEnd();
 
     // Replace the target text with the argument text.
     int GetTargetEnd();
 
     // Replace the target text with the argument text.
-    // Text is counted so it can contain nulls.
+    // Text is counted so it can contain NULs.
     // Returns the length of the replacement text.
     int ReplaceTarget(const wxString& text);
 
     // Replace the target text with the argument text after \d processing.
     // Returns the length of the replacement text.
     int ReplaceTarget(const wxString& text);
 
     // Replace the target text with the argument text after \d processing.
-    // Text is counted so it can contain nulls.
+    // Text is counted so it can contain NULs.
     // Looks for \d where d is between 1 and 9 and replaces these with the strings
     // matched in the last search operation which were surrounded by \( and \).
     // Returns the length of the replacement text including any change
     // Looks for \d where d is between 1 and 9 and replaces these with the strings
     // matched in the last search operation which were surrounded by \( and \).
     // Returns the length of the replacement text including any change
@@ -1794,7 +1956,7 @@ public:
     int ReplaceTargetRE(const wxString& text);
 
     // Search for a counted string in the target and set the target to the found
     int ReplaceTargetRE(const wxString& text);
 
     // Search for a counted string in the target and set the target to the found
-    // range. Text is counted so it can contain nulls.
+    // range. Text is counted so it can contain NULs.
     // Returns length of range or -1 for failure in which case target is not moved.
     int SearchInTarget(const wxString& text);
 
     // Returns length of range or -1 for failure in which case target is not moved.
     int SearchInTarget(const wxString& text);
 
@@ -1919,7 +2081,7 @@ public:
     int GetScrollWidth();
 
     // Measure the pixel width of some text in a particular style.
     int GetScrollWidth();
 
     // Measure the pixel width of some text in a particular style.
-    // Nul terminated text argument.
+    // NUL terminated text argument.
     // Does not handle tab or control characters.
     int TextWidth(int style, const wxString& text);
 
     // Does not handle tab or control characters.
     int TextWidth(int style, const wxString& text);
 
@@ -2135,7 +2297,7 @@ public:
     void SetXOffset(int newOffset);
     int GetXOffset();
 
     void SetXOffset(int newOffset);
     int GetXOffset();
 
-    // Set the last x chosen value to be the caret x position
+    // Set the last x chosen value to be the caret x position.
     void ChooseCaretX();
 
     // Set the way the caret is kept visible when going sideway.
     void ChooseCaretX();
 
     // Set the way the caret is kept visible when going sideway.
@@ -2149,7 +2311,7 @@ public:
     // Set printing to line wrapped (SC_WRAP_WORD) or not line wrapped (SC_WRAP_NONE).
     void SetPrintWrapMode(int mode);
 
     // Set printing to line wrapped (SC_WRAP_WORD) or not line wrapped (SC_WRAP_NONE).
     void SetPrintWrapMode(int mode);
 
-    // Is printing line wrapped.
+    // Is printing line wrapped?
     int GetPrintWrapMode();
 
     // Set a fore colour for active hotspots.
     int GetPrintWrapMode();
 
     // Set a fore colour for active hotspots.
@@ -2161,6 +2323,9 @@ public:
     // Enable / Disable underlining active hotspots.
     void SetHotspotActiveUnderline(bool underline);
 
     // Enable / Disable underlining active hotspots.
     void SetHotspotActiveUnderline(bool underline);
 
+    // Limit hotspots to single line so hotspots on two lines don't merge.
+    void SetHotspotSingleLine(bool singleLine);
+
     // Given a valid document position, return the previous position taking code
     // page into account. Returns 0 if passed 0.
     int PositionBefore(int pos);
     // Given a valid document position, return the previous position taking code
     // page into account. Returns 0 if passed 0.
     int PositionBefore(int pos);
@@ -2175,6 +2340,29 @@ public:
     // Copy argument text to the clipboard.
     void CopyText(int length, const wxString& text);
 
     // Copy argument text to the clipboard.
     void CopyText(int length, const wxString& text);
 
+    // Set the selection mode to stream (SC_SEL_STREAM) or rectangular (SC_SEL_RECTANGLE) or
+    // by lines (SC_SEL_LINES).
+    void SetSelectionMode(int mode);
+
+    // Get the mode of the current selection.
+    int GetSelectionMode();
+
+    // Retrieve the position of the start of the selection at the given line (INVALID_POSITION if no selection on this line).
+    int GetLineSelStartPosition(int line);
+
+    // Retrieve the position of the end of the selection at the given line (INVALID_POSITION if no selection on this line).
+    int GetLineSelEndPosition(int line);
+
+    // Set the set of characters making up whitespace for when moving or selecting by word.
+    // Should be called after SetWordChars.
+    void SetWhitespaceChars(const wxString& characters);
+
+    // Reset the set of characters for whitespace and word characters to the defaults.
+    void SetCharsDefault();
+
+    // Get currently selected item position in the auto-completion list
+    int AutoCompGetCurrent();
+
     // Start notifying the container of all key presses and commands.
     void StartRecord();
 
     // Start notifying the container of all key presses and commands.
     void StartRecord();
 
@@ -2321,7 +2509,8 @@ private:
     void OnEraseBackground(wxEraseEvent& evt);
     void OnMenu(wxCommandEvent& evt);
     void OnListBox(wxCommandEvent& evt);
     void OnEraseBackground(wxEraseEvent& evt);
     void OnMenu(wxCommandEvent& evt);
     void OnListBox(wxCommandEvent& evt);
-
+    void OnIdle(wxIdleEvent& evt);
+    
 
     // Turn notifications from Scintilla into events
     void NotifyChange();
 
     // Turn notifications from Scintilla into events
     void NotifyChange();
index 6c645a2e24924700ed6893d3e1b26def4f2c9650..2979989fef8188df4271cb85d61fbf2545c2532a 100644 (file)
@@ -57,48 +57,56 @@ STCDLL_OBJECTS =  \
        stcdll_CallTip.o \
        stcdll_CellBuffer.o \
        stcdll_ContractionState.o \
        stcdll_CallTip.o \
        stcdll_CellBuffer.o \
        stcdll_ContractionState.o \
-       stcdll_Document.o \
        stcdll_DocumentAccessor.o \
        stcdll_DocumentAccessor.o \
+       stcdll_Document.o \
        stcdll_Editor.o \
        stcdll_ExternalLexer.o \
        stcdll_Indicator.o \
        stcdll_KeyMap.o \
        stcdll_KeyWords.o \
        stcdll_Editor.o \
        stcdll_ExternalLexer.o \
        stcdll_Indicator.o \
        stcdll_KeyMap.o \
        stcdll_KeyWords.o \
-       stcdll_LexAVE.o \
        stcdll_LexAda.o \
        stcdll_LexAsm.o \
        stcdll_LexAda.o \
        stcdll_LexAsm.o \
+       stcdll_LexAVE.o \
        stcdll_LexBaan.o \
        stcdll_LexBullant.o \
        stcdll_LexBaan.o \
        stcdll_LexBullant.o \
-       stcdll_LexCPP.o \
-       stcdll_LexCSS.o \
+       stcdll_LexCLW.o \
        stcdll_LexConf.o \
        stcdll_LexConf.o \
+       stcdll_LexCPP.o \
        stcdll_LexCrontab.o \
        stcdll_LexCrontab.o \
+       stcdll_LexCSS.o \
        stcdll_LexEiffel.o \
        stcdll_LexEiffel.o \
+       stcdll_LexErlang.o \
        stcdll_LexEScript.o \
        stcdll_LexEScript.o \
+       stcdll_LexForth.o \
        stcdll_LexFortran.o \
        stcdll_LexHTML.o \
        stcdll_LexLisp.o \
        stcdll_LexLout.o \
        stcdll_LexLua.o \
        stcdll_LexFortran.o \
        stcdll_LexHTML.o \
        stcdll_LexLisp.o \
        stcdll_LexLout.o \
        stcdll_LexLua.o \
-       stcdll_LexMMIXAL.o \
        stcdll_LexMatlab.o \
        stcdll_LexMatlab.o \
+       stcdll_LexMetapost.o \
+       stcdll_LexMMIXAL.o \
+       stcdll_LexMPT.o \
        stcdll_LexNsis.o \
        stcdll_LexOthers.o \
        stcdll_LexNsis.o \
        stcdll_LexOthers.o \
-       stcdll_LexPOV.o \
-       stcdll_LexPS.o \
        stcdll_LexPascal.o \
        stcdll_LexPascal.o \
+       stcdll_LexPB.o \
        stcdll_LexPerl.o \
        stcdll_LexPerl.o \
+       stcdll_LexPOV.o \
+       stcdll_LexPS.o \
        stcdll_LexPython.o \
        stcdll_LexRuby.o \
        stcdll_LexPython.o \
        stcdll_LexRuby.o \
-       stcdll_LexSQL.o \
        stcdll_LexScriptol.o \
        stcdll_LexScriptol.o \
+       stcdll_LexSQL.o \
+       stcdll_LexTeX.o \
        stcdll_LexVB.o \
        stcdll_LexVB.o \
+       stcdll_LexYAML.o \
        stcdll_LineMarker.o \
        stcdll_PropSet.o \
        stcdll_RESearch.o \
        stcdll_ScintillaBase.o \
        stcdll_LineMarker.o \
        stcdll_PropSet.o \
        stcdll_RESearch.o \
        stcdll_ScintillaBase.o \
-       stcdll_Style.o \
        stcdll_StyleContext.o \
        stcdll_StyleContext.o \
+       stcdll_Style.o \
        stcdll_UniConversion.o \
        stcdll_ViewStyle.o \
        stcdll_WindowAccessor.o \
        stcdll_UniConversion.o \
        stcdll_ViewStyle.o \
        stcdll_WindowAccessor.o \
@@ -115,48 +123,56 @@ STCLIB_OBJECTS =  \
        stclib_CallTip.o \
        stclib_CellBuffer.o \
        stclib_ContractionState.o \
        stclib_CallTip.o \
        stclib_CellBuffer.o \
        stclib_ContractionState.o \
-       stclib_Document.o \
        stclib_DocumentAccessor.o \
        stclib_DocumentAccessor.o \
+       stclib_Document.o \
        stclib_Editor.o \
        stclib_ExternalLexer.o \
        stclib_Indicator.o \
        stclib_KeyMap.o \
        stclib_KeyWords.o \
        stclib_Editor.o \
        stclib_ExternalLexer.o \
        stclib_Indicator.o \
        stclib_KeyMap.o \
        stclib_KeyWords.o \
-       stclib_LexAVE.o \
        stclib_LexAda.o \
        stclib_LexAsm.o \
        stclib_LexAda.o \
        stclib_LexAsm.o \
+       stclib_LexAVE.o \
        stclib_LexBaan.o \
        stclib_LexBullant.o \
        stclib_LexBaan.o \
        stclib_LexBullant.o \
-       stclib_LexCPP.o \
-       stclib_LexCSS.o \
+       stclib_LexCLW.o \
        stclib_LexConf.o \
        stclib_LexConf.o \
+       stclib_LexCPP.o \
        stclib_LexCrontab.o \
        stclib_LexCrontab.o \
+       stclib_LexCSS.o \
        stclib_LexEiffel.o \
        stclib_LexEiffel.o \
+       stclib_LexErlang.o \
        stclib_LexEScript.o \
        stclib_LexEScript.o \
+       stclib_LexForth.o \
        stclib_LexFortran.o \
        stclib_LexHTML.o \
        stclib_LexLisp.o \
        stclib_LexLout.o \
        stclib_LexLua.o \
        stclib_LexFortran.o \
        stclib_LexHTML.o \
        stclib_LexLisp.o \
        stclib_LexLout.o \
        stclib_LexLua.o \
-       stclib_LexMMIXAL.o \
        stclib_LexMatlab.o \
        stclib_LexMatlab.o \
+       stclib_LexMetapost.o \
+       stclib_LexMMIXAL.o \
+       stclib_LexMPT.o \
        stclib_LexNsis.o \
        stclib_LexOthers.o \
        stclib_LexNsis.o \
        stclib_LexOthers.o \
-       stclib_LexPOV.o \
-       stclib_LexPS.o \
        stclib_LexPascal.o \
        stclib_LexPascal.o \
+       stclib_LexPB.o \
        stclib_LexPerl.o \
        stclib_LexPerl.o \
+       stclib_LexPOV.o \
+       stclib_LexPS.o \
        stclib_LexPython.o \
        stclib_LexRuby.o \
        stclib_LexPython.o \
        stclib_LexRuby.o \
-       stclib_LexSQL.o \
        stclib_LexScriptol.o \
        stclib_LexScriptol.o \
+       stclib_LexSQL.o \
+       stclib_LexTeX.o \
        stclib_LexVB.o \
        stclib_LexVB.o \
+       stclib_LexYAML.o \
        stclib_LineMarker.o \
        stclib_PropSet.o \
        stclib_RESearch.o \
        stclib_ScintillaBase.o \
        stclib_LineMarker.o \
        stclib_PropSet.o \
        stclib_RESearch.o \
        stclib_ScintillaBase.o \
-       stclib_Style.o \
        stclib_StyleContext.o \
        stclib_StyleContext.o \
+       stclib_Style.o \
        stclib_UniConversion.o \
        stclib_ViewStyle.o \
        stclib_WindowAccessor.o \
        stclib_UniConversion.o \
        stclib_ViewStyle.o \
        stclib_WindowAccessor.o \
@@ -332,10 +348,10 @@ stcdll_CellBuffer.o: $(srcdir)/scintilla/src/CellBuffer.cxx
 stcdll_ContractionState.o: $(srcdir)/scintilla/src/ContractionState.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_ContractionState.o: $(srcdir)/scintilla/src/ContractionState.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_Document.o: $(srcdir)/scintilla/src/Document.cxx
+stcdll_DocumentAccessor.o: $(srcdir)/scintilla/src/DocumentAccessor.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_DocumentAccessor.o: $(srcdir)/scintilla/src/DocumentAccessor.cxx
+stcdll_Document.o: $(srcdir)/scintilla/src/Document.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_Editor.o: $(srcdir)/scintilla/src/Editor.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_Editor.o: $(srcdir)/scintilla/src/Editor.cxx
@@ -353,39 +369,48 @@ stcdll_KeyMap.o: $(srcdir)/scintilla/src/KeyMap.cxx
 stcdll_KeyWords.o: $(srcdir)/scintilla/src/KeyWords.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_KeyWords.o: $(srcdir)/scintilla/src/KeyWords.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_LexAVE.o: $(srcdir)/scintilla/src/LexAVE.cxx
-       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
-
 stcdll_LexAda.o: $(srcdir)/scintilla/src/LexAda.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexAsm.o: $(srcdir)/scintilla/src/LexAsm.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexAda.o: $(srcdir)/scintilla/src/LexAda.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexAsm.o: $(srcdir)/scintilla/src/LexAsm.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
+stcdll_LexAVE.o: $(srcdir)/scintilla/src/LexAVE.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
 stcdll_LexBaan.o: $(srcdir)/scintilla/src/LexBaan.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexBullant.o: $(srcdir)/scintilla/src/LexBullant.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexBaan.o: $(srcdir)/scintilla/src/LexBaan.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexBullant.o: $(srcdir)/scintilla/src/LexBullant.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_LexCPP.o: $(srcdir)/scintilla/src/LexCPP.cxx
+stcdll_LexCLW.o: $(srcdir)/scintilla/src/LexCLW.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_LexCSS.o: $(srcdir)/scintilla/src/LexCSS.cxx
+stcdll_LexConf.o: $(srcdir)/scintilla/src/LexConf.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_LexConf.o: $(srcdir)/scintilla/src/LexConf.cxx
+stcdll_LexCPP.o: $(srcdir)/scintilla/src/LexCPP.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexCrontab.o: $(srcdir)/scintilla/src/LexCrontab.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexCrontab.o: $(srcdir)/scintilla/src/LexCrontab.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
+stcdll_LexCSS.o: $(srcdir)/scintilla/src/LexCSS.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
 stcdll_LexEiffel.o: $(srcdir)/scintilla/src/LexEiffel.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexEiffel.o: $(srcdir)/scintilla/src/LexEiffel.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
+stcdll_LexErlang.o: $(srcdir)/scintilla/src/LexErlang.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
 stcdll_LexEScript.o: $(srcdir)/scintilla/src/LexEScript.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexEScript.o: $(srcdir)/scintilla/src/LexEScript.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
+stcdll_LexForth.o: $(srcdir)/scintilla/src/LexForth.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
 stcdll_LexFortran.o: $(srcdir)/scintilla/src/LexFortran.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexFortran.o: $(srcdir)/scintilla/src/LexFortran.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
@@ -401,10 +426,16 @@ stcdll_LexLout.o: $(srcdir)/scintilla/src/LexLout.cxx
 stcdll_LexLua.o: $(srcdir)/scintilla/src/LexLua.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexLua.o: $(srcdir)/scintilla/src/LexLua.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
+stcdll_LexMatlab.o: $(srcdir)/scintilla/src/LexMatlab.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
+stcdll_LexMetapost.o: $(srcdir)/scintilla/src/LexMetapost.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
 stcdll_LexMMIXAL.o: $(srcdir)/scintilla/src/LexMMIXAL.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexMMIXAL.o: $(srcdir)/scintilla/src/LexMMIXAL.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_LexMatlab.o: $(srcdir)/scintilla/src/LexMatlab.cxx
+stcdll_LexMPT.o: $(srcdir)/scintilla/src/LexMPT.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexNsis.o: $(srcdir)/scintilla/src/LexNsis.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexNsis.o: $(srcdir)/scintilla/src/LexNsis.cxx
@@ -413,16 +444,19 @@ stcdll_LexNsis.o: $(srcdir)/scintilla/src/LexNsis.cxx
 stcdll_LexOthers.o: $(srcdir)/scintilla/src/LexOthers.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexOthers.o: $(srcdir)/scintilla/src/LexOthers.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_LexPOV.o: $(srcdir)/scintilla/src/LexPOV.cxx
+stcdll_LexPascal.o: $(srcdir)/scintilla/src/LexPascal.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_LexPS.o: $(srcdir)/scintilla/src/LexPS.cxx
+stcdll_LexPB.o: $(srcdir)/scintilla/src/LexPB.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_LexPascal.o: $(srcdir)/scintilla/src/LexPascal.cxx
+stcdll_LexPerl.o: $(srcdir)/scintilla/src/LexPerl.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_LexPerl.o: $(srcdir)/scintilla/src/LexPerl.cxx
+stcdll_LexPOV.o: $(srcdir)/scintilla/src/LexPOV.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
+stcdll_LexPS.o: $(srcdir)/scintilla/src/LexPS.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexPython.o: $(srcdir)/scintilla/src/LexPython.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexPython.o: $(srcdir)/scintilla/src/LexPython.cxx
@@ -431,15 +465,21 @@ stcdll_LexPython.o: $(srcdir)/scintilla/src/LexPython.cxx
 stcdll_LexRuby.o: $(srcdir)/scintilla/src/LexRuby.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexRuby.o: $(srcdir)/scintilla/src/LexRuby.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
+stcdll_LexScriptol.o: $(srcdir)/scintilla/src/LexScriptol.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
 stcdll_LexSQL.o: $(srcdir)/scintilla/src/LexSQL.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexSQL.o: $(srcdir)/scintilla/src/LexSQL.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_LexScriptol.o: $(srcdir)/scintilla/src/LexScriptol.cxx
+stcdll_LexTeX.o: $(srcdir)/scintilla/src/LexTeX.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexVB.o: $(srcdir)/scintilla/src/LexVB.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LexVB.o: $(srcdir)/scintilla/src/LexVB.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
+stcdll_LexYAML.o: $(srcdir)/scintilla/src/LexYAML.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
+
 stcdll_LineMarker.o: $(srcdir)/scintilla/src/LineMarker.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_LineMarker.o: $(srcdir)/scintilla/src/LineMarker.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
@@ -452,10 +492,10 @@ stcdll_RESearch.o: $(srcdir)/scintilla/src/RESearch.cxx
 stcdll_ScintillaBase.o: $(srcdir)/scintilla/src/ScintillaBase.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_ScintillaBase.o: $(srcdir)/scintilla/src/ScintillaBase.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_Style.o: $(srcdir)/scintilla/src/Style.cxx
+stcdll_StyleContext.o: $(srcdir)/scintilla/src/StyleContext.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
-stcdll_StyleContext.o: $(srcdir)/scintilla/src/StyleContext.cxx
+stcdll_Style.o: $(srcdir)/scintilla/src/Style.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_UniConversion.o: $(srcdir)/scintilla/src/UniConversion.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $<
 
 stcdll_UniConversion.o: $(srcdir)/scintilla/src/UniConversion.cxx
@@ -491,10 +531,10 @@ stclib_CellBuffer.o: $(srcdir)/scintilla/src/CellBuffer.cxx
 stclib_ContractionState.o: $(srcdir)/scintilla/src/ContractionState.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_ContractionState.o: $(srcdir)/scintilla/src/ContractionState.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_Document.o: $(srcdir)/scintilla/src/Document.cxx
+stclib_DocumentAccessor.o: $(srcdir)/scintilla/src/DocumentAccessor.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_DocumentAccessor.o: $(srcdir)/scintilla/src/DocumentAccessor.cxx
+stclib_Document.o: $(srcdir)/scintilla/src/Document.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_Editor.o: $(srcdir)/scintilla/src/Editor.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_Editor.o: $(srcdir)/scintilla/src/Editor.cxx
@@ -512,39 +552,48 @@ stclib_KeyMap.o: $(srcdir)/scintilla/src/KeyMap.cxx
 stclib_KeyWords.o: $(srcdir)/scintilla/src/KeyWords.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_KeyWords.o: $(srcdir)/scintilla/src/KeyWords.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_LexAVE.o: $(srcdir)/scintilla/src/LexAVE.cxx
-       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
-
 stclib_LexAda.o: $(srcdir)/scintilla/src/LexAda.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexAsm.o: $(srcdir)/scintilla/src/LexAsm.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexAda.o: $(srcdir)/scintilla/src/LexAda.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexAsm.o: $(srcdir)/scintilla/src/LexAsm.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
+stclib_LexAVE.o: $(srcdir)/scintilla/src/LexAVE.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
 stclib_LexBaan.o: $(srcdir)/scintilla/src/LexBaan.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexBullant.o: $(srcdir)/scintilla/src/LexBullant.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexBaan.o: $(srcdir)/scintilla/src/LexBaan.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexBullant.o: $(srcdir)/scintilla/src/LexBullant.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_LexCPP.o: $(srcdir)/scintilla/src/LexCPP.cxx
+stclib_LexCLW.o: $(srcdir)/scintilla/src/LexCLW.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_LexCSS.o: $(srcdir)/scintilla/src/LexCSS.cxx
+stclib_LexConf.o: $(srcdir)/scintilla/src/LexConf.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_LexConf.o: $(srcdir)/scintilla/src/LexConf.cxx
+stclib_LexCPP.o: $(srcdir)/scintilla/src/LexCPP.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexCrontab.o: $(srcdir)/scintilla/src/LexCrontab.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexCrontab.o: $(srcdir)/scintilla/src/LexCrontab.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
+stclib_LexCSS.o: $(srcdir)/scintilla/src/LexCSS.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
 stclib_LexEiffel.o: $(srcdir)/scintilla/src/LexEiffel.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexEiffel.o: $(srcdir)/scintilla/src/LexEiffel.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
+stclib_LexErlang.o: $(srcdir)/scintilla/src/LexErlang.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
 stclib_LexEScript.o: $(srcdir)/scintilla/src/LexEScript.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexEScript.o: $(srcdir)/scintilla/src/LexEScript.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
+stclib_LexForth.o: $(srcdir)/scintilla/src/LexForth.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
 stclib_LexFortran.o: $(srcdir)/scintilla/src/LexFortran.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexFortran.o: $(srcdir)/scintilla/src/LexFortran.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
@@ -560,10 +609,16 @@ stclib_LexLout.o: $(srcdir)/scintilla/src/LexLout.cxx
 stclib_LexLua.o: $(srcdir)/scintilla/src/LexLua.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexLua.o: $(srcdir)/scintilla/src/LexLua.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
+stclib_LexMatlab.o: $(srcdir)/scintilla/src/LexMatlab.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
+stclib_LexMetapost.o: $(srcdir)/scintilla/src/LexMetapost.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
 stclib_LexMMIXAL.o: $(srcdir)/scintilla/src/LexMMIXAL.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexMMIXAL.o: $(srcdir)/scintilla/src/LexMMIXAL.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_LexMatlab.o: $(srcdir)/scintilla/src/LexMatlab.cxx
+stclib_LexMPT.o: $(srcdir)/scintilla/src/LexMPT.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexNsis.o: $(srcdir)/scintilla/src/LexNsis.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexNsis.o: $(srcdir)/scintilla/src/LexNsis.cxx
@@ -572,16 +627,19 @@ stclib_LexNsis.o: $(srcdir)/scintilla/src/LexNsis.cxx
 stclib_LexOthers.o: $(srcdir)/scintilla/src/LexOthers.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexOthers.o: $(srcdir)/scintilla/src/LexOthers.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_LexPOV.o: $(srcdir)/scintilla/src/LexPOV.cxx
+stclib_LexPascal.o: $(srcdir)/scintilla/src/LexPascal.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_LexPS.o: $(srcdir)/scintilla/src/LexPS.cxx
+stclib_LexPB.o: $(srcdir)/scintilla/src/LexPB.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_LexPascal.o: $(srcdir)/scintilla/src/LexPascal.cxx
+stclib_LexPerl.o: $(srcdir)/scintilla/src/LexPerl.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_LexPerl.o: $(srcdir)/scintilla/src/LexPerl.cxx
+stclib_LexPOV.o: $(srcdir)/scintilla/src/LexPOV.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
+stclib_LexPS.o: $(srcdir)/scintilla/src/LexPS.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexPython.o: $(srcdir)/scintilla/src/LexPython.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexPython.o: $(srcdir)/scintilla/src/LexPython.cxx
@@ -590,15 +648,21 @@ stclib_LexPython.o: $(srcdir)/scintilla/src/LexPython.cxx
 stclib_LexRuby.o: $(srcdir)/scintilla/src/LexRuby.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexRuby.o: $(srcdir)/scintilla/src/LexRuby.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
+stclib_LexScriptol.o: $(srcdir)/scintilla/src/LexScriptol.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
 stclib_LexSQL.o: $(srcdir)/scintilla/src/LexSQL.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexSQL.o: $(srcdir)/scintilla/src/LexSQL.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_LexScriptol.o: $(srcdir)/scintilla/src/LexScriptol.cxx
+stclib_LexTeX.o: $(srcdir)/scintilla/src/LexTeX.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexVB.o: $(srcdir)/scintilla/src/LexVB.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LexVB.o: $(srcdir)/scintilla/src/LexVB.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
+stclib_LexYAML.o: $(srcdir)/scintilla/src/LexYAML.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
+
 stclib_LineMarker.o: $(srcdir)/scintilla/src/LineMarker.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_LineMarker.o: $(srcdir)/scintilla/src/LineMarker.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
@@ -611,10 +675,10 @@ stclib_RESearch.o: $(srcdir)/scintilla/src/RESearch.cxx
 stclib_ScintillaBase.o: $(srcdir)/scintilla/src/ScintillaBase.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_ScintillaBase.o: $(srcdir)/scintilla/src/ScintillaBase.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_Style.o: $(srcdir)/scintilla/src/Style.cxx
+stclib_StyleContext.o: $(srcdir)/scintilla/src/StyleContext.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
-stclib_StyleContext.o: $(srcdir)/scintilla/src/StyleContext.cxx
+stclib_Style.o: $(srcdir)/scintilla/src/Style.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_UniConversion.o: $(srcdir)/scintilla/src/UniConversion.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $<
 
 stclib_UniConversion.o: $(srcdir)/scintilla/src/UniConversion.cxx
index ceb50296a67a96d97b99a727be1a8e92ae5ff6b9..56205b99a4c574bfef0b9b8797928f53ea18bc8d 100644 (file)
@@ -855,7 +855,6 @@ public:
     virtual int GetSelection();
     virtual int Find(const char *prefix);
     virtual void GetValue(int n, char *value, int len);
     virtual int GetSelection();
     virtual int Find(const char *prefix);
     virtual void GetValue(int n, char *value, int len);
-    virtual void Sort();
     virtual void RegisterImage(int type, const char *xpm_data);
     virtual void ClearRegisteredImages();
     virtual void SetDoubleClickAction(CallBackAction, void *);
     virtual void RegisterImage(int type, const char *xpm_data);
     virtual void ClearRegisteredImages();
     virtual void SetDoubleClickAction(CallBackAction, void *);
@@ -1008,9 +1007,6 @@ void ListBoxImpl::GetValue(int n, char *value, int len) {
     value[len-1] = '\0';
 }
 
     value[len-1] = '\0';
 }
 
-void ListBoxImpl::Sort() {
-}
-
 
 void ListBoxImpl::RegisterImage(int type, const char *xpm_data) {
     wxMemoryInputStream stream(xpm_data, strlen(xpm_data)+1);
 
 void ListBoxImpl::RegisterImage(int type, const char *xpm_data) {
     wxMemoryInputStream stream(xpm_data, strlen(xpm_data)+1);
index 26e966cf36e90d6ba10fc83cdec3268daef8f740..eaa160020815c0cae86b8a89350417bd673bca33 100644 (file)
@@ -146,7 +146,6 @@ ScintillaWX::ScintillaWX(wxStyledTextCtrl* win) {
 
 
 ScintillaWX::~ScintillaWX() {
 
 
 ScintillaWX::~ScintillaWX() {
-    SetTicking(false);
 }
 
 //----------------------------------------------------------------------
 }
 
 //----------------------------------------------------------------------
@@ -165,6 +164,8 @@ void ScintillaWX::Initialise() {
 
 void ScintillaWX::Finalise() {
     ScintillaBase::Finalise();
 
 void ScintillaWX::Finalise() {
     ScintillaBase::Finalise();
+    SetTicking(false);
+    SetIdle(false);
 }
 
 
 }
 
 
@@ -199,6 +200,19 @@ void ScintillaWX::StartDrag() {
 }
 
 
 }
 
 
+bool ScintillaWX::SetIdle(bool on) {
+    if (idler.state != on) {
+        // connect or disconnect the EVT_IDLE handler
+        if (on) 
+            stc->Connect(-1, wxEVT_IDLE, (wxObjectEventFunction)&wxStyledTextCtrl::OnIdle);
+        else
+            stc->Disconnect(-1, wxEVT_IDLE, (wxObjectEventFunction)&wxStyledTextCtrl::OnIdle);
+        idler.state = on;
+    }
+    return idler.state;
+}
+
+    
 void ScintillaWX::SetTicking(bool on) {
     wxSTCTimer* steTimer;
     if (timer.ticking != on) {
 void ScintillaWX::SetTicking(bool on) {
     wxSTCTimer* steTimer;
     if (timer.ticking != on) {
@@ -219,11 +233,13 @@ void ScintillaWX::SetTicking(bool on) {
 
 
 void ScintillaWX::SetMouseCapture(bool on) {
 
 
 void ScintillaWX::SetMouseCapture(bool on) {
-    if (on && !capturedMouse)
-        stc->CaptureMouse();
-    else if (!on && capturedMouse && stc->HasCapture())
-        stc->ReleaseMouse();
-    capturedMouse = on;
+    if (mouseDownCaptures) {
+        if (on && !capturedMouse)
+            stc->CaptureMouse();
+        else if (!on && capturedMouse && stc->HasCapture())
+            stc->ReleaseMouse();
+        capturedMouse = on;
+    }
 }
 
 
 }
 
 
@@ -652,7 +668,7 @@ void ScintillaWX::DoMiddleButtonUp(Point pt) {
     // Set the current position to the mouse click point and
     // then paste in the PRIMARY selection, if any.  wxGTK only.
     int newPos = PositionFromLocation(pt);
     // Set the current position to the mouse click point and
     // then paste in the PRIMARY selection, if any.  wxGTK only.
     int newPos = PositionFromLocation(pt);
-    MovePositionTo(newPos, 0, 1);
+    MovePositionTo(newPos, noSel, true);
 
     pdoc->BeginUndoAction();
     wxTextDataObject data;
 
     pdoc->BeginUndoAction();
     wxTextDataObject data;
@@ -775,6 +791,15 @@ void ScintillaWX::DoOnListBox() {
     AutoCompleteCompleted();
 }
 
     AutoCompleteCompleted();
 }
 
+void ScintillaWX::DoOnIdle(wxIdleEvent& evt) {
+
+    if ( Idle() )
+        evt.RequestMore();
+    else
+        SetIdle(false);
+}
 //----------------------------------------------------------------------
 
 #if wxUSE_DRAG_AND_DROP
 //----------------------------------------------------------------------
 
 #if wxUSE_DRAG_AND_DROP
index 799e58ed5a289b5bed14b76f823067038aaf29fa..1316c6661d3b965b176a8ccd46557def063ff9c8 100644 (file)
@@ -99,6 +99,7 @@ public:
     virtual void Initialise();
     virtual void Finalise();
     virtual void StartDrag();
     virtual void Initialise();
     virtual void Finalise();
     virtual void StartDrag();
+    virtual bool SetIdle(bool on);
     virtual void SetTicking(bool on);
     virtual void SetMouseCapture(bool on);
     virtual bool HaveMouseCapture();
     virtual void SetTicking(bool on);
     virtual void SetMouseCapture(bool on);
     virtual bool HaveMouseCapture();
@@ -142,7 +143,8 @@ public:
     void DoAddChar(int key);
     int  DoKeyDown(int key, bool shift, bool ctrl, bool alt, bool meta, bool* consumed);
     void DoTick() { Tick(); }
     void DoAddChar(int key);
     int  DoKeyDown(int key, bool shift, bool ctrl, bool alt, bool meta, bool* consumed);
     void DoTick() { Tick(); }
-
+    void DoOnIdle(wxIdleEvent& evt);
+    
 #if wxUSE_DRAG_AND_DROP
     bool DoDropText(long x, long y, const wxString& data);
     wxDragResult DoDragEnter(wxCoord x, wxCoord y, wxDragResult def);
 #if wxUSE_DRAG_AND_DROP
     bool DoDropText(long x, long y, const wxString& data);
     wxDragResult DoDragEnter(wxCoord x, wxCoord y, wxDragResult def);
index aa9432d377e9be65ad2fa3b19618e28436339056..070d4cbe90e78dbbe30e99f022082745b93b33b2 100644 (file)
@@ -44,6 +44,7 @@ cmdValues = [ (2300, 2349),
               (2395, 2396),
               2404,
               (2413, 2416),
               (2395, 2396),
               2404,
               (2413, 2416),
+              (2426, 2442),
               (2450, 2454),
             ]
 
               (2450, 2454),
             ]
 
@@ -275,6 +276,7 @@ methodOverrideMap = {
     'AutoCGetDropRestOfWord' : ('AutoCompGetDropRestOfWord', 0,0,0),
     'AutoCGetTypeSeparator' : ('AutoCompGetTypeSeparator', 0, 0, 0),
     'AutoCSetTypeSeparator' : ('AutoCompSetTypeSeparator', 0, 0, 0),
     'AutoCGetDropRestOfWord' : ('AutoCompGetDropRestOfWord', 0,0,0),
     'AutoCGetTypeSeparator' : ('AutoCompGetTypeSeparator', 0, 0, 0),
     'AutoCSetTypeSeparator' : ('AutoCompSetTypeSeparator', 0, 0, 0),
+    'AutoCGetCurrent'       : ('AutoCompGetCurrent', 0, 0, 0),
 
     'RegisterImage' :
     (0,
 
     'RegisterImage' :
     (0,
@@ -330,14 +332,14 @@ methodOverrideMap = {
                int    startPos,
                int    endPos,
                wxDC*  draw,
                int    startPos,
                int    endPos,
                wxDC*  draw,
-               wxDC*  target,  // Why does it use two? Can they be the same?
+               wxDC*  target, 
                wxRect renderRect,
                wxRect pageRect);''',
      ''' int %s(bool   doDraw,
                 int    startPos,
                 int    endPos,
                 wxDC*  draw,
                wxRect renderRect,
                wxRect pageRect);''',
      ''' int %s(bool   doDraw,
                 int    startPos,
                 int    endPos,
                 wxDC*  draw,
-                wxDC*  target,  // Why does it use two? Can they be the same?
+                wxDC*  target, 
                 wxRect renderRect,
                 wxRect pageRect) {
              RangeToFormat fr;
                 wxRect renderRect,
                 wxRect pageRect) {
              RangeToFormat fr;
@@ -615,8 +617,23 @@ methodOverrideMap = {
     'ParaDownExtend' : (None, 0, 0, 0),
     'ParaUp' : (None, 0, 0, 0),
     'ParaUpExtend' : (None, 0, 0, 0),
     'ParaDownExtend' : (None, 0, 0, 0),
     'ParaUp' : (None, 0, 0, 0),
     'ParaUpExtend' : (None, 0, 0, 0),
-
-
+    'LineDownRectExtend' : (None, 0, 0, 0),
+    'LineUpRectExtend' : (None, 0, 0, 0),
+    'CharLeftRectExtend' : (None, 0, 0, 0),
+    'CharRightRectExtend' : (None, 0, 0, 0),
+    'HomeRectExtend' : (None, 0, 0, 0),
+    'VCHomeRectExtend' : (None, 0, 0, 0),
+    'LineEndRectExtend' : (None, 0, 0, 0),
+    'PageUpRectExtend' : (None, 0, 0, 0),
+    'PageDownRectExtend' : (None, 0, 0, 0),
+    'StutteredPageUp' : (None, 0, 0, 0),
+    'StutteredPageUpExtend' : (None, 0, 0, 0),
+    'StutteredPageDown' : (None, 0, 0, 0),
+    'StutteredPageDownExtend' : (None, 0, 0, 0),
+    'WordLeftEnd' : (None, 0, 0, 0),
+    'WordLeftEndExtend' : (None, 0, 0, 0),
+    'WordRightEnd' : (None, 0, 0, 0),
+    'WordRightEndExtend' : (None, 0, 0, 0),
 
     '' : ('', 0, 0, 0),
 
 
     '' : ('', 0, 0, 0),
 
index 1960be5d3ddedce5e6188b5775e85b4cd5559f36..f8ebdb02a6d196c246cd290fee67d6fb7a9fdc20 100644 (file)
@@ -3,4 +3,4 @@ scintilla/include directories from the Scintilla/SCiTE source
 distribution.  All other code needed to implement Scintilla on top of
 wxWindows is located in the directory above this one.
 
 distribution.  All other code needed to implement Scintilla on top of
 wxWindows is located in the directory above this one.
 
-The current version of the Scintilla code is 1.54
+The current version of the Scintilla code is 1.58
index 4f7ba2357c3230fe6386b6335f7e5393cb457ae3..876402416880395d56f9f0b42794400b364d3812 100644 (file)
@@ -58,6 +58,7 @@ typedef void *WindowID;
 typedef void *MenuID;
 typedef void *TickerID;
 typedef void *Function;
 typedef void *MenuID;
 typedef void *TickerID;
 typedef void *Function;
+typedef void *IdlerID;
 
 /**
  * A geometric point class.
 
 /**
  * A geometric point class.
@@ -408,7 +409,6 @@ public:
        virtual int GetSelection()=0;
        virtual int Find(const char *prefix)=0;
        virtual void GetValue(int n, char *value, int len)=0;
        virtual int GetSelection()=0;
        virtual int Find(const char *prefix)=0;
        virtual void GetValue(int n, char *value, int len)=0;
-       virtual void Sort()=0;
        virtual void RegisterImage(int type, const char *xpm_data)=0;
        virtual void ClearRegisteredImages()=0;
        virtual void SetDoubleClickAction(CallBackAction, void *)=0;
        virtual void RegisterImage(int type, const char *xpm_data)=0;
        virtual void ClearRegisteredImages()=0;
        virtual void SetDoubleClickAction(CallBackAction, void *)=0;
index 20ac5f774ac3ed8fdacf5d9b8ad01cea1295f5b4..62cd5da3a93620d26ea1d84515011dd8b0643270 100644 (file)
@@ -81,7 +81,7 @@ public:
        void SetFromAllocated();
        bool InList(const char *s);
        const char *GetNearestWord(const char *wordStart, int searchLen = -1,
        void SetFromAllocated();
        bool InList(const char *s);
        const char *GetNearestWord(const char *wordStart, int searchLen = -1,
-               bool ignoreCase = false, SString wordCharacters="");
+               bool ignoreCase = false, SString wordCharacters="", int wordIndex = -1);
        char *GetNearestWords(const char *wordStart, int searchLen=-1,
                bool ignoreCase=false, char otherSeparator='\0');
 };
        char *GetNearestWords(const char *wordStart, int searchLen=-1,
                bool ignoreCase=false, char otherSeparator='\0');
 };
index 34867542f9a8bf7d55771a58c60c30ae5884fce0..44d5dcdcda215c47d92cf07d1729289f96001051 100644 (file)
 #define SCLEX_PS 42
 #define SCLEX_NSIS 43
 #define SCLEX_MMIXAL 44
 #define SCLEX_PS 42
 #define SCLEX_NSIS 43
 #define SCLEX_MMIXAL 44
+#define SCLEX_CLW 45
+#define SCLEX_CLWNOCASE 46
+#define SCLEX_LOT 47
+#define SCLEX_YAML 48
+#define SCLEX_TEX 49
+#define SCLEX_METAPOST 50
+#define SCLEX_POWERBASIC 51
+#define SCLEX_FORTH 52
+#define SCLEX_ERLANG 53
+#define SCLEX_OCTAVE 54
 #define SCLEX_AUTOMATIC 1000
 #define SCE_P_DEFAULT 0
 #define SCE_P_COMMENTLINE 1
 #define SCLEX_AUTOMATIC 1000
 #define SCE_P_DEFAULT 0
 #define SCE_P_COMMENTLINE 1
 #define SCE_B_OPERATOR 6
 #define SCE_B_IDENTIFIER 7
 #define SCE_B_DATE 8
 #define SCE_B_OPERATOR 6
 #define SCE_B_IDENTIFIER 7
 #define SCE_B_DATE 8
+#define SCE_B_STRINGEOL 9
+#define SCE_B_KEYWORD2 10
+#define SCE_B_KEYWORD3 11
+#define SCE_B_KEYWORD4 12
 #define SCE_PROPS_DEFAULT 0
 #define SCE_PROPS_COMMENT 1
 #define SCE_PROPS_SECTION 2
 #define SCE_PROPS_DEFAULT 0
 #define SCE_PROPS_COMMENT 1
 #define SCE_PROPS_SECTION 2
 #define SCE_ERR_PHP 14
 #define SCE_ERR_ELF 15
 #define SCE_ERR_IFC 16
 #define SCE_ERR_PHP 14
 #define SCE_ERR_ELF 15
 #define SCE_ERR_IFC 16
+#define SCE_ERR_IFORT 17
+#define SCE_ERR_ABSF 18
 #define SCE_BAT_DEFAULT 0
 #define SCE_BAT_COMMENT 1
 #define SCE_BAT_WORD 2
 #define SCE_BAT_DEFAULT 0
 #define SCE_BAT_COMMENT 1
 #define SCE_BAT_WORD 2
 #define SCE_NNCRONTAB_STRING 8
 #define SCE_NNCRONTAB_ENVIRONMENT 9
 #define SCE_NNCRONTAB_IDENTIFIER 10
 #define SCE_NNCRONTAB_STRING 8
 #define SCE_NNCRONTAB_ENVIRONMENT 9
 #define SCE_NNCRONTAB_IDENTIFIER 10
+#define SCE_FORTH_DEFAULT 0
+#define SCE_FORTH_COMMENT 1
+#define SCE_FORTH_COMMENT_ML 2
+#define SCE_FORTH_IDENTIFIER 3
+#define SCE_FORTH_CONTROL 4
+#define SCE_FORTH_KEYWORD 5
+#define SCE_FORTH_DEFWORD 6
+#define SCE_FORTH_PREWORD1 7
+#define SCE_FORTH_PREWORD2 8
+#define SCE_FORTH_NUMBER 9
+#define SCE_FORTH_STRING 10
+#define SCE_FORTH_LOCALE 11
 #define SCE_MATLAB_DEFAULT 0
 #define SCE_MATLAB_COMMENT 1
 #define SCE_MATLAB_COMMAND 2
 #define SCE_MATLAB_DEFAULT 0
 #define SCE_MATLAB_COMMENT 1
 #define SCE_MATLAB_COMMAND 2
 #define SCE_MATLAB_STRING 5
 #define SCE_MATLAB_OPERATOR 6
 #define SCE_MATLAB_IDENTIFIER 7
 #define SCE_MATLAB_STRING 5
 #define SCE_MATLAB_OPERATOR 6
 #define SCE_MATLAB_IDENTIFIER 7
+#define SCE_MATLAB_DOUBLEQUOTESTRING 8
 #define SCE_SCRIPTOL_DEFAULT 0
 #define SCE_SCRIPTOL_DEFAULT 0
-#define SCE_SCRIPTOL_COMMENT 1
+#define SCE_SCRIPTOL_WHITE 1
 #define SCE_SCRIPTOL_COMMENTLINE 2
 #define SCE_SCRIPTOL_COMMENTLINE 2
-#define SCE_SCRIPTOL_COMMENTDOC 3
-#define SCE_SCRIPTOL_NUMBER 4
-#define SCE_SCRIPTOL_WORD 5
-#define SCE_SCRIPTOL_STRING 6
-#define SCE_SCRIPTOL_CHARACTER 7
-#define SCE_SCRIPTOL_UUID 8
-#define SCE_SCRIPTOL_PREPROCESSOR 9
-#define SCE_SCRIPTOL_OPERATOR 10
-#define SCE_SCRIPTOL_IDENTIFIER 11
-#define SCE_SCRIPTOL_STRINGEOL 12
-#define SCE_SCRIPTOL_VERBATIM 13
-#define SCE_SCRIPTOL_REGEX 14
-#define SCE_SCRIPTOL_COMMENTLINEDOC 15
-#define SCE_SCRIPTOL_WORD2 16
-#define SCE_SCRIPTOL_COMMENTDOCKEYWORD 17
-#define SCE_SCRIPTOL_COMMENTDOCKEYWORDERROR 18
-#define SCE_SCRIPTOL_COMMENTBASIC 19
+#define SCE_SCRIPTOL_PERSISTENT 3
+#define SCE_SCRIPTOL_CSTYLE 4
+#define SCE_SCRIPTOL_COMMENTBLOCK 5
+#define SCE_SCRIPTOL_NUMBER 6
+#define SCE_SCRIPTOL_STRING 7
+#define SCE_SCRIPTOL_CHARACTER 8
+#define SCE_SCRIPTOL_STRINGEOL 9
+#define SCE_SCRIPTOL_KEYWORD 10
+#define SCE_SCRIPTOL_OPERATOR 11
+#define SCE_SCRIPTOL_IDENTIFIER 12
+#define SCE_SCRIPTOL_TRIPLE 13
+#define SCE_SCRIPTOL_CLASSNAME 14
+#define SCE_SCRIPTOL_PREPROCESSOR 15
 #define SCE_ASM_DEFAULT 0
 #define SCE_ASM_COMMENT 1
 #define SCE_ASM_NUMBER 2
 #define SCE_ASM_DEFAULT 0
 #define SCE_ASM_COMMENT 1
 #define SCE_ASM_NUMBER 2
 #define SCE_ASM_REGISTER 8
 #define SCE_ASM_DIRECTIVE 9
 #define SCE_ASM_DIRECTIVEOPERAND 10
 #define SCE_ASM_REGISTER 8
 #define SCE_ASM_DIRECTIVE 9
 #define SCE_ASM_DIRECTIVEOPERAND 10
+#define SCE_ASM_COMMENTBLOCK 11
+#define SCE_ASM_CHARACTER 12
+#define SCE_ASM_STRINGEOL 13
+#define SCE_ASM_EXTINSTRUCTION 14
 #define SCE_F_DEFAULT 0
 #define SCE_F_COMMENT 1
 #define SCE_F_NUMBER 2
 #define SCE_F_DEFAULT 0
 #define SCE_F_COMMENT 1
 #define SCE_F_NUMBER 2
 #define SCE_MMIXAL_OPERATOR 15
 #define SCE_MMIXAL_SYMBOL 16
 #define SCE_MMIXAL_INCLUDE 17
 #define SCE_MMIXAL_OPERATOR 15
 #define SCE_MMIXAL_SYMBOL 16
 #define SCE_MMIXAL_INCLUDE 17
+#define SCE_CLW_DEFAULT 0
+#define SCE_CLW_LABEL 1
+#define SCE_CLW_COMMENT 2
+#define SCE_CLW_STRING 3
+#define SCE_CLW_USER_IDENTIFIER 4
+#define SCE_CLW_INTEGER_CONSTANT 5
+#define SCE_CLW_REAL_CONSTANT 6
+#define SCE_CLW_PICTURE_STRING 7
+#define SCE_CLW_KEYWORD 8
+#define SCE_CLW_COMPILER_DIRECTIVE 9
+#define SCE_CLW_BUILTIN_PROCEDURES_FUNCTION 10
+#define SCE_CLW_STRUCTURE_DATA_TYPE 11
+#define SCE_CLW_ATTRIBUTE 12
+#define SCE_CLW_STANDARD_EQUATE 13
+#define SCE_CLW_ERROR 14
+#define SCE_LOT_DEFAULT 0
+#define SCE_LOT_HEADER 1
+#define SCE_LOT_BREAK 2
+#define SCE_LOT_SET 3
+#define SCE_LOT_PASS 4
+#define SCE_LOT_FAIL 5
+#define SCE_LOT_ABORT 6
+#define SCE_YAML_DEFAULT 0
+#define SCE_YAML_COMMENT 1
+#define SCE_YAML_IDENTIFIER 2
+#define SCE_YAML_KEYWORD 3
+#define SCE_YAML_NUMBER 4
+#define SCE_YAML_REFERENCE 5
+#define SCE_YAML_DOCUMENT 6
+#define SCE_YAML_TEXT 7
+#define SCE_YAML_ERROR 8
+#define SCE_TEX_DEFAULT 0
+#define SCE_TEX_SPECIAL 1
+#define SCE_TEX_GROUP 2
+#define SCE_TEX_SYMBOL 3
+#define SCE_TEX_COMMAND 4
+#define SCE_TEX_TEXT 5
+#define SCE_METAPOST_DEFAULT 0
+#define SCE_METAPOST_SPECIAL 1
+#define SCE_METAPOST_GROUP 2
+#define SCE_METAPOST_SYMBOL 3
+#define SCE_METAPOST_COMMAND 4
+#define SCE_METAPOST_TEXT 5
+#define SCE_METAPOST_EXTRA 6
+#define SCE_ERLANG_DEFAULT 0
+#define SCE_ERLANG_COMMENT 1
+#define SCE_ERLANG_VARIABLE 2
+#define SCE_ERLANG_NUMBER 3
+#define SCE_ERLANG_KEYWORD 4
+#define SCE_ERLANG_STRING 5
+#define SCE_ERLANG_OPERATOR 6
+#define SCE_ERLANG_ATOM 7
+#define SCE_ERLANG_FUNCTION_NAME 8
+#define SCE_ERLANG_CHARACTER 9
+#define SCE_ERLANG_MACRO 10
+#define SCE_ERLANG_RECORD 11
+#define SCE_ERLANG_SEPARATOR 12
+#define SCE_ERLANG_NODE_NAME 13
+#define SCE_ERLANG_UNKNOWN 31
 //--Autogenerated -- end of section automatically generated from Scintilla.iface
 
 #endif
 //--Autogenerated -- end of section automatically generated from Scintilla.iface
 
 #endif
index 34893c89382b259f7964bb35be47b628ae2ca81f..68c5427b616865fb82436926dd3d8d4c23f70950 100644 (file)
@@ -205,6 +205,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
 #define INDIC_DIAGONAL 3
 #define INDIC_STRIKE 4
 #define INDIC_HIDDEN 5
 #define INDIC_DIAGONAL 3
 #define INDIC_STRIKE 4
 #define INDIC_HIDDEN 5
+#define INDIC_BOX 6
 #define INDIC0_MASK 0x20
 #define INDIC1_MASK 0x40
 #define INDIC2_MASK 0x80
 #define INDIC0_MASK 0x20
 #define INDIC1_MASK 0x40
 #define INDIC2_MASK 0x80
@@ -533,6 +534,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
 #define SCI_SETHOTSPOTACTIVEFORE 2410
 #define SCI_SETHOTSPOTACTIVEBACK 2411
 #define SCI_SETHOTSPOTACTIVEUNDERLINE 2412
 #define SCI_SETHOTSPOTACTIVEFORE 2410
 #define SCI_SETHOTSPOTACTIVEBACK 2411
 #define SCI_SETHOTSPOTACTIVEUNDERLINE 2412
+#define SCI_SETHOTSPOTSINGLELINE 2421
 #define SCI_PARADOWN 2413
 #define SCI_PARADOWNEXTEND 2414
 #define SCI_PARAUP 2415
 #define SCI_PARADOWN 2413
 #define SCI_PARADOWNEXTEND 2414
 #define SCI_PARAUP 2415
@@ -541,6 +543,33 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
 #define SCI_POSITIONAFTER 2418
 #define SCI_COPYRANGE 2419
 #define SCI_COPYTEXT 2420
 #define SCI_POSITIONAFTER 2418
 #define SCI_COPYRANGE 2419
 #define SCI_COPYTEXT 2420
+#define SC_SEL_STREAM 0
+#define SC_SEL_RECTANGLE 1
+#define SC_SEL_LINES 2
+#define SCI_SETSELECTIONMODE 2422
+#define SCI_GETSELECTIONMODE 2423
+#define SCI_GETLINESELSTARTPOSITION 2424
+#define SCI_GETLINESELENDPOSITION 2425
+#define SCI_LINEDOWNRECTEXTEND 2426
+#define SCI_LINEUPRECTEXTEND 2427
+#define SCI_CHARLEFTRECTEXTEND 2428
+#define SCI_CHARRIGHTRECTEXTEND 2429
+#define SCI_HOMERECTEXTEND 2430
+#define SCI_VCHOMERECTEXTEND 2431
+#define SCI_LINEENDRECTEXTEND 2432
+#define SCI_PAGEUPRECTEXTEND 2433
+#define SCI_PAGEDOWNRECTEXTEND 2434
+#define SCI_STUTTEREDPAGEUP 2435
+#define SCI_STUTTEREDPAGEUPEXTEND 2436
+#define SCI_STUTTEREDPAGEDOWN 2437
+#define SCI_STUTTEREDPAGEDOWNEXTEND 2438
+#define SCI_WORDLEFTEND 2439
+#define SCI_WORDLEFTENDEXTEND 2440
+#define SCI_WORDRIGHTEND 2441
+#define SCI_WORDRIGHTENDEXTEND 2442
+#define SCI_SETWHITESPACECHARS 2443
+#define SCI_SETCHARSDEFAULT 2444
+#define SCI_AUTOCGETCURRENT 2445
 #define SCI_STARTRECORD 3001
 #define SCI_STOPRECORD 3002
 #define SCI_SETLEXER 4001
 #define SCI_STARTRECORD 3001
 #define SCI_STOPRECORD 3002
 #define SCI_SETLEXER 4001
index 9ca4ad539a10e6143c5935e26fc2bc1b3db5176c..06ff4e5800b64c0bac1254e080230f24435b737b 100644 (file)
@@ -2,7 +2,7 @@
 
 ## This file defines the interface to Scintilla
 
 
 ## This file defines the interface to Scintilla
 
-## Copyright 2000-2002 by Neil Hodgson <neilh@scintilla.org>
+## Copyright 2000-2003 by Neil Hodgson <neilh@scintilla.org>
 ## The License.txt file describes the conditions under which this software may be distributed.
 
 ## A line starting with ## is a pure comment and should be stripped by readers.
 ## The License.txt file describes the conditions under which this software may be distributed.
 
 ## A line starting with ## is a pure comment and should be stripped by readers.
@@ -26,7 +26,8 @@
 ## A property may be subscripted, in which case the first parameter is the subscript.
 ## fun, get, and set features have a strict syntax:
 ## <featureType><ws><returnType><ws><name>[=<number](<param>,<param>)
 ## A property may be subscripted, in which case the first parameter is the subscript.
 ## fun, get, and set features have a strict syntax:
 ## <featureType><ws><returnType><ws><name>[=<number](<param>,<param>)
-## param is <paramType><ws><paramName>[=<value>]
+## where <ws> stands for white space.
+## param may be empty (null value) or is <paramType><ws><paramName>[=<value>]
 ## Additional white space is allowed between elements.
 ## The syntax for evt is <featureType><ws><returnType><ws><name>[=<number]([<param>[,<param>]*])
 ## Feature names that contain an underscore are defined by Windows, so in these
 ## Additional white space is allowed between elements.
 ## The syntax for evt is <featureType><ws><returnType><ws><name>[=<number]([<param>[,<param>]*])
 ## Feature names that contain an underscore are defined by Windows, so in these
@@ -80,7 +81,7 @@ cat Basics
 ################################################
 ## For Scintilla.h
 val INVALID_POSITION=-1
 ################################################
 ## For Scintilla.h
 val INVALID_POSITION=-1
-# Define start of Scintilla messages to be greater than all edit (EM_*) messages
+# Define start of Scintilla messages to be greater than all Windows edit (EM_*) messages
 # as many EM_ messages can be used although that use is deprecated.
 val SCI_START=2000
 val SCI_OPTIONAL_START=3000
 # as many EM_ messages can be used although that use is deprecated.
 val SCI_START=2000
 val SCI_OPTIONAL_START=3000
@@ -131,7 +132,7 @@ fun void SelectAll=2013(,)
 fun void SetSavePoint=2014(,)
 
 # Retrieve a buffer of cells.
 fun void SetSavePoint=2014(,)
 
 # Retrieve a buffer of cells.
-# Returns the number of bytes in the buffer not including terminating nulls.
+# Returns the number of bytes in the buffer not including terminating NULs.
 fun int GetStyledText=2015(, textrange tr)
 
 # Are there any redoable actions in the undo history?
 fun int GetStyledText=2015(, textrange tr)
 
 # Are there any redoable actions in the undo history?
@@ -159,11 +160,11 @@ get int GetViewWS=2020(,)
 set void SetViewWS=2021(int viewWS,)
 
 # Find the position from a point within the window.
 set void SetViewWS=2021(int viewWS,)
 
 # Find the position from a point within the window.
-fun int PositionFromPoint=2022(int x, int y)
+fun position PositionFromPoint=2022(int x, int y)
 
 # Find the position from a point within the window but return
 # INVALID_POSITION if not close to text.
 
 # Find the position from a point within the window but return
 # INVALID_POSITION if not close to text.
-fun int PositionFromPointClose=2023(int x, int y)
+fun position PositionFromPointClose=2023(int x, int y)
 
 # Set caret to start of a line and ensure it is visible.
 fun void GotoLine=2024(int line,)
 
 # Set caret to start of a line and ensure it is visible.
 fun void GotoLine=2024(int line,)
@@ -427,7 +428,7 @@ set void SetCaretFore=2069(colour fore,)
 # When key+modifier combination km is pressed perform msg.
 fun void AssignCmdKey=2070(keymod km, int msg)
 
 # When key+modifier combination km is pressed perform msg.
 fun void AssignCmdKey=2070(keymod km, int msg)
 
-# When key+modifier combination km do nothing.
+# When key+modifier combination km is pressed do nothing.
 fun void ClearCmdKey=2071(keymod km,)
 
 # Drop all key mappings.
 fun void ClearCmdKey=2071(keymod km,)
 
 # Drop all key mappings.
@@ -446,6 +447,7 @@ get int GetCaretPeriod=2075(,)
 set void SetCaretPeriod=2076(int periodMilliseconds,)
 
 # Set the set of characters making up words for when moving or selecting by word.
 set void SetCaretPeriod=2076(int periodMilliseconds,)
 
 # Set the set of characters making up words for when moving or selecting by word.
+# First sets deaults like SetCharsDefault.
 set void SetWordChars=2077(, string characters)
 
 # Start a sequence of actions that is undone and redone as a unit.
 set void SetWordChars=2077(, string characters)
 
 # Start a sequence of actions that is undone and redone as a unit.
@@ -463,6 +465,7 @@ val INDIC_TT=2
 val INDIC_DIAGONAL=3
 val INDIC_STRIKE=4
 val INDIC_HIDDEN=5
 val INDIC_DIAGONAL=3
 val INDIC_STRIKE=4
 val INDIC_HIDDEN=5
+val INDIC_BOX=6
 val INDIC0_MASK=0x20
 val INDIC1_MASK=0x40
 val INDIC2_MASK=0x80
 val INDIC0_MASK=0x20
 val INDIC1_MASK=0x40
 val INDIC2_MASK=0x80
@@ -711,7 +714,7 @@ val SCFIND_POSIX=0x00400000
 fun position FindText=2150(int flags, findtext ft)
 
 # On Windows, will draw the document into a display context such as a printer.
 fun position FindText=2150(int flags, findtext ft)
 
 # On Windows, will draw the document into a display context such as a printer.
-fun void FormatRange=2151(bool draw, formatrange fr)
+fun position FormatRange=2151(bool draw, formatrange fr)
 
 # Retrieve the display line at the top of the display.
 get int GetFirstVisibleLine=2152(,)
 
 # Retrieve the display line at the top of the display.
 get int GetFirstVisibleLine=2152(,)
@@ -743,7 +746,7 @@ fun void SetSel=2160(position start, position end)
 
 # Retrieve the selected text.
 # Return the length of the text.
 
 # Retrieve the selected text.
 # Return the length of the text.
-fun int GetSelText=2161(,stringresult text)
+fun int GetSelText=2161(, stringresult text)
 
 # Retrieve a range of text.
 # Return the length of the text.
 
 # Retrieve a range of text.
 # Return the length of the text.
@@ -762,7 +765,7 @@ fun int PointYFromPosition=2165(, position pos)
 fun int LineFromPosition=2166(position pos,)
 
 # Retrieve the position at the start of a line.
 fun int LineFromPosition=2166(position pos,)
 
 # Retrieve the position at the start of a line.
-fun int PositionFromLine=2167(int line,)
+fun position PositionFromLine=2167(int line,)
 
 # Scroll horizontally and vertically.
 fun void LineScroll=2168(int columns, int lines)
 
 # Scroll horizontally and vertically.
 fun void LineScroll=2168(int columns, int lines)
@@ -847,12 +850,12 @@ set void SetTargetEnd=2192(position pos,)
 get position GetTargetEnd=2193(,)
 
 # Replace the target text with the argument text.
 get position GetTargetEnd=2193(,)
 
 # Replace the target text with the argument text.
-# Text is counted so it can contain nulls.
+# Text is counted so it can contain NULs.
 # Returns the length of the replacement text.
 fun int ReplaceTarget=2194(int length, string text)
 
 # Replace the target text with the argument text after \d processing.
 # Returns the length of the replacement text.
 fun int ReplaceTarget=2194(int length, string text)
 
 # Replace the target text with the argument text after \d processing.
-# Text is counted so it can contain nulls.
+# Text is counted so it can contain NULs.
 # Looks for \d where d is between 1 and 9 and replaces these with the strings
 # matched in the last search operation which were surrounded by \( and \).
 # Returns the length of the replacement text including any change
 # Looks for \d where d is between 1 and 9 and replaces these with the strings
 # matched in the last search operation which were surrounded by \( and \).
 # Returns the length of the replacement text including any change
@@ -860,7 +863,7 @@ fun int ReplaceTarget=2194(int length, string text)
 fun int ReplaceTargetRE=2195(int length, string text)
 
 # Search for a counted string in the target and set the target to the found
 fun int ReplaceTargetRE=2195(int length, string text)
 
 # Search for a counted string in the target and set the target to the found
-# range. Text is counted so it can contain nulls.
+# range. Text is counted so it can contain NULs.
 # Returns length of range or -1 for failure in which case target is not moved.
 fun int SearchInTarget=2197(int length, string text)
 
 # Returns length of range or -1 for failure in which case target is not moved.
 fun int SearchInTarget=2197(int length, string text)
 
@@ -1015,7 +1018,7 @@ set void SetScrollWidth=2274(int pixelWidth,)
 get int GetScrollWidth=2275(,)
 
 # Measure the pixel width of some text in a particular style.
 get int GetScrollWidth=2275(,)
 
 # Measure the pixel width of some text in a particular style.
-# Nul terminated text argument.
+# NUL terminated text argument.
 # Does not handle tab or control characters.
 fun int TextWidth=2276(int style, string text)
 
 # Does not handle tab or control characters.
 fun int TextWidth=2276(int style, string text)
 
@@ -1223,7 +1226,7 @@ fun void LineEndDisplayExtend=2348(,)
 # except they behave differently when word-wrap is enabled:
 # They go first to the start / end of the display line, like (Home|LineEnd)Display
 # The difference is that, the cursor is already at the point, it goes on to the start
 # except they behave differently when word-wrap is enabled:
 # They go first to the start / end of the display line, like (Home|LineEnd)Display
 # The difference is that, the cursor is already at the point, it goes on to the start
-# or end of the document line, as appropriate for (Home|LineEnd|VCHome)Extend.
+# or end of the document line, as appropriate for (Home|LineEnd|VCHome)(Extend)?.
 
 fun void HomeWrap=2349(,)
 fun void HomeWrapExtend=2450(,)
 
 fun void HomeWrap=2349(,)
 fun void HomeWrapExtend=2450(,)
@@ -1260,7 +1263,7 @@ set void SetViewEOL=2356(bool visible,)
 get int GetDocPointer=2357(,)
 
 # Change the document object used.
 get int GetDocPointer=2357(,)
 
 # Change the document object used.
-set void SetDocPointer=2358(,int pointer)
+set void SetDocPointer=2358(, int pointer)
 
 # Set which document modification events are sent to the container.
 set void SetModEventMask=2359(int mask,)
 
 # Set which document modification events are sent to the container.
 set void SetModEventMask=2359(int mask,)
@@ -1385,7 +1388,7 @@ fun void DelLineRight=2396(,)
 set void SetXOffset=2397(int newOffset,)
 get int GetXOffset=2398(,)
 
 set void SetXOffset=2397(int newOffset,)
 get int GetXOffset=2398(,)
 
-# Set the last x chosen value to be the caret x position
+# Set the last x chosen value to be the caret x position.
 fun void ChooseCaretX=2399(,)
 
 # Set the focus to this Scintilla widget.
 fun void ChooseCaretX=2399(,)
 
 # Set the focus to this Scintilla widget.
@@ -1427,7 +1430,7 @@ fun void SetYCaretPolicy=2403(int caretPolicy, int caretSlop)
 # Set printing to line wrapped (SC_WRAP_WORD) or not line wrapped (SC_WRAP_NONE).
 set void SetPrintWrapMode=2406(int mode,)
 
 # Set printing to line wrapped (SC_WRAP_WORD) or not line wrapped (SC_WRAP_NONE).
 set void SetPrintWrapMode=2406(int mode,)
 
-# Is printing line wrapped.
+# Is printing line wrapped?
 get int GetPrintWrapMode=2407(,)
 
 # Set a fore colour for active hotspots.
 get int GetPrintWrapMode=2407(,)
 
 # Set a fore colour for active hotspots.
@@ -1439,7 +1442,10 @@ set void SetHotspotActiveBack=2411(bool useSetting, colour back)
 # Enable / Disable underlining active hotspots.
 set void SetHotspotActiveUnderline=2412(bool underline,)
 
 # Enable / Disable underlining active hotspots.
 set void SetHotspotActiveUnderline=2412(bool underline,)
 
-# Move caret between paragraphs (delimited by empty lines)
+# Limit hotspots to single line so hotspots on two lines don't merge.
+set void SetHotspotSingleLine=2421(bool singleLine,)
+
+# Move caret between paragraphs (delimited by empty lines).
 fun void ParaDown=2413(,)
 fun void ParaDownExtend=2414(,)
 fun void ParaUp=2415(,)
 fun void ParaDown=2413(,)
 fun void ParaDownExtend=2414(,)
 fun void ParaUp=2415(,)
@@ -1459,6 +1465,91 @@ fun void CopyRange=2419(position start, position end)
 # Copy argument text to the clipboard.
 fun void CopyText=2420(int length, string text)
 
 # Copy argument text to the clipboard.
 fun void CopyText=2420(int length, string text)
 
+# Selection modes
+enu SelectionMode=SC_SEL_
+val SC_SEL_STREAM=0
+val SC_SEL_RECTANGLE=1
+val SC_SEL_LINES=2
+
+# Set the selection mode to stream (SC_SEL_STREAM) or rectangular (SC_SEL_RECTANGLE) or
+# by lines (SC_SEL_LINES).
+set void SetSelectionMode=2422(int mode,)
+
+# Get the mode of the current selection.
+get int GetSelectionMode=2423(,)
+
+# Retrieve the position of the start of the selection at the given line (INVALID_POSITION if no selection on this line).
+fun position GetLineSelStartPosition=2424(int line,)
+
+# Retrieve the position of the end of the selection at the given line (INVALID_POSITION if no selection on this line).
+fun position GetLineSelEndPosition=2425(int line,)
+
+## RectExtended rectangular selection moves
+# Move caret down one line, extending rectangular selection to new caret position.
+fun void LineDownRectExtend=2426(,)
+
+# Move caret up one line, extending rectangular selection to new caret position.
+fun void LineUpRectExtend=2427(,)
+
+# Move caret left one character, extending rectangular selection to new caret position.
+fun void CharLeftRectExtend=2428(,)
+
+# Move caret right one character, extending rectangular selection to new caret position.
+fun void CharRightRectExtend=2429(,)
+
+# Move caret to first position on line, extending rectangular selection to new caret position.
+fun void HomeRectExtend=2430(,)
+
+# Move caret to before first visible character on line.
+# If already there move to first character on line.
+# In either case, extend rectangular selection to new caret position.
+fun void VCHomeRectExtend=2431(,)
+
+# Move caret to last position on line, extending rectangular selection to new caret position.
+fun void LineEndRectExtend=2432(,)
+
+# Move caret one page up, extending rectangular selection to new caret position.
+fun void PageUpRectExtend=2433(,)
+
+# Move caret one page down, extending rectangular selection to new caret position.
+fun void PageDownRectExtend=2434(,)
+
+
+# Move caret to top of page, or one page up if already at top of page.
+fun void StutteredPageUp=2435(,)
+
+# Move caret to top of page, or one page up if already at top of page, extending selection to new caret position.
+fun void StutteredPageUpExtend=2436(,)
+
+# Move caret to bottom of page, or one page down if already at bottom of page.
+fun void StutteredPageDown=2437(,)
+
+# Move caret to bottom of page, or one page down if already at bottom of page, extending selection to new caret position.
+fun void StutteredPageDownExtend=2438(,)
+
+
+# Move caret left one word, position cursor at end of word.
+fun void WordLeftEnd=2439(,)
+
+# Move caret left one word, position cursor at end of word, extending selection to new caret position.
+fun void WordLeftEndExtend=2440(,)
+
+# Move caret right one word, position cursor at end of word.
+fun void WordRightEnd=2441(,)
+
+# Move caret right one word, position cursor at end of word, extending selection to new caret position.
+fun void WordRightEndExtend=2442(,)
+
+# Set the set of characters making up whitespace for when moving or selecting by word.
+# Should be called after SetWordChars.
+set void SetWhitespaceChars=2443(, string characters)
+
+# Reset the set of characters for whitespace and word characters to the defaults.
+fun void SetCharsDefault=2444(,)
+
+# Get currently selected item position in the auto-completion list
+fun int AutoCGetCurrent=2445(,)
+
 # Start notifying the container of all key presses and commands.
 fun void StartRecord=3001(,)
 
 # Start notifying the container of all key presses and commands.
 fun void StartRecord=3001(,)
 
@@ -1486,7 +1577,7 @@ set void SetKeyWords=4005(int keywordSet, string keyWords)
 # Set the lexing language of the document based on string name.
 set void SetLexerLanguage=4006(, string language)
 
 # Set the lexing language of the document based on string name.
 set void SetLexerLanguage=4006(, string language)
 
-# Load a lexer library (dll / so)
+# Load a lexer library (dll / so).
 fun void LoadLexerLibrary=4007(, string path)
 
 # Notifications
 fun void LoadLexerLibrary=4007(, string path)
 
 # Notifications
@@ -1591,6 +1682,16 @@ val SCLEX_ESCRIPT=41
 val SCLEX_PS=42
 val SCLEX_NSIS=43
 val SCLEX_MMIXAL=44
 val SCLEX_PS=42
 val SCLEX_NSIS=43
 val SCLEX_MMIXAL=44
+val SCLEX_CLW=45
+val SCLEX_CLWNOCASE=46
+val SCLEX_LOT=47
+val SCLEX_YAML=48
+val SCLEX_TEX=49
+val SCLEX_METAPOST=50
+val SCLEX_POWERBASIC=51
+val SCLEX_FORTH=52
+val SCLEX_ERLANG=53
+val SCLEX_OCTAVE=54
 
 # When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
 # value assigned in sequence from SCLEX_AUTOMATIC+1.
 
 # When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
 # value assigned in sequence from SCLEX_AUTOMATIC+1.
@@ -1796,9 +1897,10 @@ val SCE_PL_STRING_QQ=27
 val SCE_PL_STRING_QX=28
 val SCE_PL_STRING_QR=29
 val SCE_PL_STRING_QW=30
 val SCE_PL_STRING_QX=28
 val SCE_PL_STRING_QR=29
 val SCE_PL_STRING_QW=30
-# Lexical states for SCLEX_VB, SCLEX_VBSCRIPT
+# Lexical states for SCLEX_VB, SCLEX_VBSCRIPT, SCLEX_POWERBASIC
 lex VB=SCLEX_VB SCE_B_
 lex VBScript=SCLEX_VBSCRIPT SCE_B_
 lex VB=SCLEX_VB SCE_B_
 lex VBScript=SCLEX_VBSCRIPT SCE_B_
+lex PowerBasic=SCLEX_POWERBASIC SCE_B_
 val SCE_B_DEFAULT=0
 val SCE_B_COMMENT=1
 val SCE_B_NUMBER=2
 val SCE_B_DEFAULT=0
 val SCE_B_COMMENT=1
 val SCE_B_NUMBER=2
@@ -1808,6 +1910,10 @@ val SCE_B_PREPROCESSOR=5
 val SCE_B_OPERATOR=6
 val SCE_B_IDENTIFIER=7
 val SCE_B_DATE=8
 val SCE_B_OPERATOR=6
 val SCE_B_IDENTIFIER=7
 val SCE_B_DATE=8
+val SCE_B_STRINGEOL=9
+val SCE_B_KEYWORD2=10
+val SCE_B_KEYWORD3=11
+val SCE_B_KEYWORD4=12
 # Lexical states for SCLEX_PROPERTIES
 lex Properties=SCLEX_PROPERTIES SCE_PROPS_
 val SCE_PROPS_DEFAULT=0
 # Lexical states for SCLEX_PROPERTIES
 lex Properties=SCLEX_PROPERTIES SCE_PROPS_
 val SCE_PROPS_DEFAULT=0
@@ -1863,6 +1969,8 @@ val SCE_ERR_DIFF_MESSAGE=13
 val SCE_ERR_PHP=14
 val SCE_ERR_ELF=15
 val SCE_ERR_IFC=16
 val SCE_ERR_PHP=14
 val SCE_ERR_ELF=15
 val SCE_ERR_IFC=16
+val SCE_ERR_IFORT=17
+val SCE_ERR_ABSF=18
 # Lexical states for SCLEX_BATCH
 lex Batch=SCLEX_BATCH SCE_BAT_
 val SCE_BAT_DEFAULT=0
 # Lexical states for SCLEX_BATCH
 lex Batch=SCLEX_BATCH SCE_BAT_
 val SCE_BAT_DEFAULT=0
@@ -1982,6 +2090,20 @@ val SCE_NNCRONTAB_NUMBER=7
 val SCE_NNCRONTAB_STRING=8
 val SCE_NNCRONTAB_ENVIRONMENT=9
 val SCE_NNCRONTAB_IDENTIFIER=10
 val SCE_NNCRONTAB_STRING=8
 val SCE_NNCRONTAB_ENVIRONMENT=9
 val SCE_NNCRONTAB_IDENTIFIER=10
+# Lexical states for SCLEX_FORTH (Forth Lexer)
+lex Forth=SCLEX_FORTH SCE_FORTH_
+val SCE_FORTH_DEFAULT=0
+val SCE_FORTH_COMMENT=1
+val SCE_FORTH_COMMENT_ML=2
+val SCE_FORTH_IDENTIFIER=3
+val SCE_FORTH_CONTROL=4
+val SCE_FORTH_KEYWORD=5
+val SCE_FORTH_DEFWORD=6
+val SCE_FORTH_PREWORD1=7
+val SCE_FORTH_PREWORD2=8
+val SCE_FORTH_NUMBER=9
+val SCE_FORTH_STRING=10
+val SCE_FORTH_LOCALE=11
 # Lexical states for SCLEX_MATLAB
 lex MatLab=SCLEX_MATLAB SCE_MATLAB_
 val SCE_MATLAB_DEFAULT=0
 # Lexical states for SCLEX_MATLAB
 lex MatLab=SCLEX_MATLAB SCE_MATLAB_
 val SCE_MATLAB_DEFAULT=0
@@ -1989,31 +2111,29 @@ val SCE_MATLAB_COMMENT=1
 val SCE_MATLAB_COMMAND=2
 val SCE_MATLAB_NUMBER=3
 val SCE_MATLAB_KEYWORD=4
 val SCE_MATLAB_COMMAND=2
 val SCE_MATLAB_NUMBER=3
 val SCE_MATLAB_KEYWORD=4
+# single quoted string
 val SCE_MATLAB_STRING=5
 val SCE_MATLAB_OPERATOR=6
 val SCE_MATLAB_IDENTIFIER=7
 val SCE_MATLAB_STRING=5
 val SCE_MATLAB_OPERATOR=6
 val SCE_MATLAB_IDENTIFIER=7
+val SCE_MATLAB_DOUBLEQUOTESTRING=8
 # Lexical states for SCLEX_SCRIPTOL
 lex Sol=SCLEX_SCRIPTOL SCE_SCRIPTOL_
 val SCE_SCRIPTOL_DEFAULT=0
 # Lexical states for SCLEX_SCRIPTOL
 lex Sol=SCLEX_SCRIPTOL SCE_SCRIPTOL_
 val SCE_SCRIPTOL_DEFAULT=0
-val SCE_SCRIPTOL_COMMENT=1
+val SCE_SCRIPTOL_WHITE=1
 val SCE_SCRIPTOL_COMMENTLINE=2
 val SCE_SCRIPTOL_COMMENTLINE=2
-val SCE_SCRIPTOL_COMMENTDOC=3
-val SCE_SCRIPTOL_NUMBER=4
-val SCE_SCRIPTOL_WORD=5
-val SCE_SCRIPTOL_STRING=6
-val SCE_SCRIPTOL_CHARACTER=7
-val SCE_SCRIPTOL_UUID=8
-val SCE_SCRIPTOL_PREPROCESSOR=9
-val SCE_SCRIPTOL_OPERATOR=10
-val SCE_SCRIPTOL_IDENTIFIER=11
-val SCE_SCRIPTOL_STRINGEOL=12
-val SCE_SCRIPTOL_VERBATIM=13
-val SCE_SCRIPTOL_REGEX=14
-val SCE_SCRIPTOL_COMMENTLINEDOC=15
-val SCE_SCRIPTOL_WORD2=16
-val SCE_SCRIPTOL_COMMENTDOCKEYWORD=17
-val SCE_SCRIPTOL_COMMENTDOCKEYWORDERROR=18
-val SCE_SCRIPTOL_COMMENTBASIC=19
+val SCE_SCRIPTOL_PERSISTENT=3
+val SCE_SCRIPTOL_CSTYLE=4
+val SCE_SCRIPTOL_COMMENTBLOCK=5
+val SCE_SCRIPTOL_NUMBER=6
+val SCE_SCRIPTOL_STRING=7
+val SCE_SCRIPTOL_CHARACTER=8
+val SCE_SCRIPTOL_STRINGEOL=9
+val SCE_SCRIPTOL_KEYWORD=10
+val SCE_SCRIPTOL_OPERATOR=11
+val SCE_SCRIPTOL_IDENTIFIER=12
+val SCE_SCRIPTOL_TRIPLE=13
+val SCE_SCRIPTOL_CLASSNAME=14
+val SCE_SCRIPTOL_PREPROCESSOR=15
 # Lexical states for SCLEX_ASM
 lex Asm=SCLEX_ASM SCE_ASM_
 val SCE_ASM_DEFAULT=0
 # Lexical states for SCLEX_ASM
 lex Asm=SCLEX_ASM SCE_ASM_
 val SCE_ASM_DEFAULT=0
@@ -2027,6 +2147,10 @@ val SCE_ASM_MATHINSTRUCTION=7
 val SCE_ASM_REGISTER=8
 val SCE_ASM_DIRECTIVE=9
 val SCE_ASM_DIRECTIVEOPERAND=10
 val SCE_ASM_REGISTER=8
 val SCE_ASM_DIRECTIVE=9
 val SCE_ASM_DIRECTIVEOPERAND=10
+val SCE_ASM_COMMENTBLOCK=11
+val SCE_ASM_CHARACTER=12
+val SCE_ASM_STRINGEOL=13
+val SCE_ASM_EXTINSTRUCTION=14
 # Lexical states for SCLEX_FORTRAN
 lex Fortran=SCLEX_FORTRAN SCE_F_
 lex F77=SCLEX_F77 SCE_F_
 # Lexical states for SCLEX_FORTRAN
 lex Fortran=SCLEX_FORTRAN SCE_F_
 lex F77=SCLEX_F77 SCE_F_
@@ -2162,6 +2286,78 @@ val SCE_MMIXAL_HEX=14
 val SCE_MMIXAL_OPERATOR=15
 val SCE_MMIXAL_SYMBOL=16
 val SCE_MMIXAL_INCLUDE=17
 val SCE_MMIXAL_OPERATOR=15
 val SCE_MMIXAL_SYMBOL=16
 val SCE_MMIXAL_INCLUDE=17
+# Lexical states for SCLEX_CLW
+lex Clarion=SCLEX_CLW SCE_CLW_
+val SCE_CLW_DEFAULT=0
+val SCE_CLW_LABEL=1
+val SCE_CLW_COMMENT=2
+val SCE_CLW_STRING=3
+val SCE_CLW_USER_IDENTIFIER=4
+val SCE_CLW_INTEGER_CONSTANT=5
+val SCE_CLW_REAL_CONSTANT=6
+val SCE_CLW_PICTURE_STRING=7
+val SCE_CLW_KEYWORD=8
+val SCE_CLW_COMPILER_DIRECTIVE=9
+val SCE_CLW_BUILTIN_PROCEDURES_FUNCTION=10
+val SCE_CLW_STRUCTURE_DATA_TYPE=11
+val SCE_CLW_ATTRIBUTE=12
+val SCE_CLW_STANDARD_EQUATE=13
+val SCE_CLW_ERROR=14
+# Lexical states for SCLEX_LOT
+lex LOT=SCLEX_LOT SCE_LOT_
+val SCE_LOT_DEFAULT=0
+val SCE_LOT_HEADER=1
+val SCE_LOT_BREAK=2
+val SCE_LOT_SET=3
+val SCE_LOT_PASS=4
+val SCE_LOT_FAIL=5
+val SCE_LOT_ABORT=6
+# Lexical states for SCLEX_YAML
+lex YAML=SCLEX_YAML SCE_YAML_
+val SCE_YAML_DEFAULT=0
+val SCE_YAML_COMMENT=1
+val SCE_YAML_IDENTIFIER=2
+val SCE_YAML_KEYWORD=3
+val SCE_YAML_NUMBER=4
+val SCE_YAML_REFERENCE=5
+val SCE_YAML_DOCUMENT=6
+val SCE_YAML_TEXT=7
+val SCE_YAML_ERROR=8
+# Lexical states for SCLEX_TEX
+lex TeX=SCLEX_TEX SCE_TEX_
+val SCE_TEX_DEFAULT=0
+val SCE_TEX_SPECIAL=1
+val SCE_TEX_GROUP=2
+val SCE_TEX_SYMBOL=3
+val SCE_TEX_COMMAND=4
+val SCE_TEX_TEXT=5
+lex Metapost=SCLEX_METAPOST SCE_METAPOST_
+val SCE_METAPOST_DEFAULT=0
+val SCE_METAPOST_SPECIAL=1
+val SCE_METAPOST_GROUP=2
+val SCE_METAPOST_SYMBOL=3
+val SCE_METAPOST_COMMAND=4
+val SCE_METAPOST_TEXT=5
+val SCE_METAPOST_EXTRA=6
+# Lexical states for SCLEX_ERLANG
+lex Erlang=SCLEX_ERLANG SCE_ERLANG_
+val SCE_ERLANG_DEFAULT=0
+val SCE_ERLANG_COMMENT=1
+val SCE_ERLANG_VARIABLE=2
+val SCE_ERLANG_NUMBER=3
+val SCE_ERLANG_KEYWORD=4
+val SCE_ERLANG_STRING=5
+val SCE_ERLANG_OPERATOR=6
+val SCE_ERLANG_ATOM=7
+val SCE_ERLANG_FUNCTION_NAME=8
+val SCE_ERLANG_CHARACTER=9
+val SCE_ERLANG_MACRO=10
+val SCE_ERLANG_RECORD=11
+val SCE_ERLANG_SEPARATOR=12
+val SCE_ERLANG_NODE_NAME=13
+val SCE_ERLANG_UNKNOWN=31
+# Lexical states for SCLEX_OCTAVE are identical to MatLab
+lex Octave=SCLEX_OCTAVE SCE_MATLAB_
 
 # Events
 
 
 # Events
 
index 314f9bfa716df518edc06ab52628633ffdcfbc1a..2f299afffd4f30b90b7b4d3c376aaccbb90d906f 100644 (file)
@@ -48,6 +48,10 @@ void CallTip::RefreshColourPalette(Palette &pal, bool want) {
        pal.WantFind(colourLight, want);
 }
 
        pal.WantFind(colourLight, want);
 }
 
+static bool IsArrowCharacter(char ch) {
+       return (ch >= 0) && (ch <= '\002');
+}
+
 void CallTip::DrawChunk(Surface *surface, int &x, const char *s,
        int posStart, int posEnd, int ytext, PRectangle rcClient,
        bool highlight, bool draw) {
 void CallTip::DrawChunk(Surface *surface, int &x, const char *s,
        int posStart, int posEnd, int ytext, PRectangle rcClient,
        bool highlight, bool draw) {
@@ -56,7 +60,7 @@ void CallTip::DrawChunk(Surface *surface, int &x, const char *s,
        int maxEnd = 0;
        int ends[10];
        for (int i=0;i<len;i++) {
        int maxEnd = 0;
        int ends[10];
        for (int i=0;i<len;i++) {
-               if (s[i] <= '\002') {
+               if (IsArrowCharacter(s[i])) {
                        if (i > 0)
                                ends[maxEnd++] = i;
                        ends[maxEnd++] = i+1;
                        if (i > 0)
                                ends[maxEnd++] = i;
                        ends[maxEnd++] = i+1;
@@ -68,7 +72,7 @@ void CallTip::DrawChunk(Surface *surface, int &x, const char *s,
        for (int seg = 0; seg<maxEnd; seg++) {
                int endSeg = ends[seg];
                if (endSeg > startSeg) {
        for (int seg = 0; seg<maxEnd; seg++) {
                int endSeg = ends[seg];
                if (endSeg > startSeg) {
-                       if (s[startSeg] <= '\002') {
+                       if (IsArrowCharacter(s[startSeg])) {
                                xEnd = x + widthArrow;
                                offsetMain = xEnd;
                                if (draw) {
                                xEnd = x + widthArrow;
                                offsetMain = xEnd;
                                if (draw) {
index 5b36b2cadf21cf2b719b4597cee9cae1cdfc9415..8833b07bc0e7c72a97c042737b005c4cb56c80ff 100644 (file)
@@ -175,6 +175,7 @@ void ContractionState::DeleteLines(int lineDoc, int lineCount) {
                if (i != 0) // Line zero is always visible
                        lines[i].visible = lines[i + lineCount].visible;
                lines[i].expanded = lines[i + lineCount].expanded;
                if (i != 0) // Line zero is always visible
                        lines[i].visible = lines[i + lineCount].visible;
                lines[i].expanded = lines[i + lineCount].expanded;
+               lines[i].height = lines[i + lineCount].height;
        }
        linesInDoc -= lineCount;
        linesInDisplay += deltaDisplayed;
        }
        linesInDoc -= lineCount;
        linesInDisplay += deltaDisplayed;
index 487262f8add4bad246193af66d17025bb6eebb64..fb28144dd7d40021f9d97dd20e5b9bc53e009077 100644 (file)
@@ -50,7 +50,7 @@ Document::Document() {
        stylingBits = 5;
        stylingBitsMask = 0x1F;
        stylingMask = 0;
        stylingBits = 5;
        stylingBitsMask = 0x1F;
        stylingMask = 0;
-       SetWordChars(0);
+       SetDefaultCharClasses();
        endStyled = 0;
        styleClock = 0;
        enteredCount = 0;
        endStyled = 0;
        styleClock = 0;
        enteredCount = 0;
@@ -761,7 +761,7 @@ int Document::ExtendWordSelect(int pos, int delta, bool onlyWordCharacters) {
                while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == ccStart))
                        pos++;
        }
                while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == ccStart))
                        pos++;
        }
-       return pos;
+       return MovePositionOutsideChar(pos, delta);
 }
 
 /**
 }
 
 /**
@@ -791,6 +791,40 @@ int Document::NextWordStart(int pos, int delta) {
        return 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) {
+                       charClassification ccStart = WordCharClass(cb.CharAt(pos-1));
+                       if (ccStart != ccSpace) {
+                               while (pos > 0 && WordCharClass(cb.CharAt(pos - 1)) == ccStart) {
+                                       pos--;
+                               }
+                       }
+                       while (pos > 0 && WordCharClass(cb.CharAt(pos - 1)) == ccSpace) {
+                               pos--;
+                       }
+               }
+       } else {
+               while (pos < Length() && WordCharClass(cb.CharAt(pos)) == ccSpace) {
+                       pos++;
+               }
+               if (pos < Length()) {
+                       charClassification 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.
 /**
  * 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.
@@ -1012,7 +1046,7 @@ long Document::FindText(int minPos, int maxPos, const char *s,
                                }
                        }
                        pos += increment;
                                }
                        }
                        pos += increment;
-                       if (dbcsCodePage) {
+                       if (dbcsCodePage && (pos >= 0)) {
                                // Ensure trying to match from start of character
                                pos = MovePositionOutsideChar(pos, increment, false);
                        }
                                // Ensure trying to match from start of character
                                pos = MovePositionOutsideChar(pos, increment, false);
                        }
@@ -1032,10 +1066,24 @@ const char *Document::SubstituteByPosition(const char *text, int *length) {
                return 0;
        unsigned int lenResult = 0;
        for (int i = 0; i < *length; i++) {
                return 0;
        unsigned int lenResult = 0;
        for (int i = 0; i < *length; i++) {
-               if ((text[i] == '\\') && (text[i + 1] >= '1' && text[i + 1] <= '9')) {
-                       unsigned int patNum = text[i + 1] - '0';
-                       lenResult += pre->eopat[patNum] - pre->bopat[patNum];
-                       i++;
+               if (text[i] == '\\') {
+                       if (text[i + 1] >= '1' && text[i + 1] <= '9') {
+                               unsigned int patNum = text[i + 1] - '0';
+                               lenResult += pre->eopat[patNum] - pre->bopat[patNum];
+                               i++;
+                       } else {
+                               switch (text[i + 1]) {
+                               case 'a':
+                               case 'b':
+                               case 'f':
+                               case 'n':
+                               case 'r':
+                               case 't':
+                               case 'v':
+                                       i++;
+                               }
+                               lenResult++;
+                       }
                } else {
                        lenResult++;
                }
                } else {
                        lenResult++;
                }
@@ -1045,13 +1093,43 @@ const char *Document::SubstituteByPosition(const char *text, int *length) {
                return 0;
        char *o = substituted;
        for (int j = 0; j < *length; j++) {
                return 0;
        char *o = substituted;
        for (int j = 0; j < *length; j++) {
-               if ((text[j] == '\\') && (text[j + 1] >= '1' && text[j + 1] <= '9')) {
-                       unsigned int patNum = text[j + 1] - '0';
-                       unsigned int len = pre->eopat[patNum] - pre->bopat[patNum];
-                       if (pre->pat[patNum])   // Will be null if try for a match that did not occur
-                               memcpy(o, pre->pat[patNum], len);
-                       o += len;
-                       j++;
+               if (text[j] == '\\') {
+                       if (text[j + 1] >= '1' && text[j + 1] <= '9') {
+                               unsigned int patNum = text[j + 1] - '0';
+                               unsigned int len = pre->eopat[patNum] - pre->bopat[patNum];
+                               if (pre->pat[patNum])   // Will be null if try for a match that did not occur
+                                       memcpy(o, pre->pat[patNum], len);
+                               o += len;
+                               j++;
+                       } else {
+                               j++;
+                               switch (text[j]) {
+                               case 'a':
+                                       *o++ = '\a';
+                                       break;
+                               case 'b':
+                                       *o++ = '\b';
+                                       break;
+                               case 'f':
+                                       *o++ = '\f';
+                                       break;
+                               case 'n':
+                                       *o++ = '\n';
+                                       break;
+                               case 'r':
+                                       *o++ = '\r';
+                                       break;
+                               case 't':
+                                       *o++ = '\t';
+                                       break;
+                               case 'v':
+                                       *o++ = '\v';
+                                       break;
+                               default:
+                                       *o++ = '\\';
+                                       j--;
+                               }
+                       }
                } else {
                        *o++ = text[j];
                }
                } else {
                        *o++ = text[j];
                }
@@ -1085,26 +1163,27 @@ void Document::ChangeCase(Range r, bool makeUpperCase) {
        }
 }
 
        }
 }
 
-void Document::SetWordChars(unsigned char *chars) {
-       int ch;
-       for (ch = 0; ch < 256; ch++) {
+void Document::SetDefaultCharClasses() {
+       // 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;
                if (ch == '\r' || ch == '\n')
                        charClass[ch] = ccNewLine;
                else if (ch < 0x20 || ch == ' ')
                        charClass[ch] = ccSpace;
+               else if (ch >= 0x80 || isalnum(ch) || ch == '_')
+                       charClass[ch] = ccWord;
                else
                        charClass[ch] = ccPunctuation;
        }
                else
                        charClass[ch] = ccPunctuation;
        }
+}
+
+void Document::SetCharClasses(unsigned char *chars, charClassification newCharClass) {
+       // Apply the newCharClass to the specifed chars
        if (chars) {
                while (*chars) {
        if (chars) {
                while (*chars) {
-                       charClass[*chars] = ccWord;
+                       charClass[*chars] = newCharClass;
                        chars++;
                }
                        chars++;
                }
-       } else {
-               for (ch = 0; ch < 256; ch++) {
-                       if (ch >= 0x80 || isalnum(ch) || ch == '_')
-                               charClass[ch] = ccWord;
-               }
        }
 }
 
        }
 }
 
@@ -1335,14 +1414,18 @@ int Document::WordPartRight(int pos) {
        return pos;
 }
 
        return pos;
 }
 
-int Document::ExtendStyleRange(int pos, int delta) {
+bool IsLineEndChar(char c) {
+       return (c == '\n' || c == '\r');
+}
+
+int Document::ExtendStyleRange(int pos, int delta, bool singleLine) {
        int sStart = cb.StyleAt(pos);
        if (delta < 0) {
        int sStart = cb.StyleAt(pos);
        if (delta < 0) {
-               while (pos > 0 && (cb.StyleAt(pos) == sStart))
+               while (pos > 0 && (cb.StyleAt(pos) == sStart) && (!singleLine || !IsLineEndChar(cb.CharAt(pos))) )
                        pos--;
                pos++;
        } else {
                        pos--;
                pos++;
        } else {
-               while (pos < (Length()) && (cb.StyleAt(pos) == sStart))
+               while (pos < (Length()) && (cb.StyleAt(pos) == sStart) && (!singleLine || !IsLineEndChar(cb.CharAt(pos))) )
                        pos++;
        }
        return pos;
                        pos++;
        }
        return pos;
index bcdbe00ca5c888da8a9ba37982beab7f3f448285..dc9e38e21dda01e46f84716511a6ef995ca1d874 100644 (file)
@@ -87,11 +87,12 @@ public:
                        userData = 0;
                }
        };
                        userData = 0;
                }
        };
+       
+       enum charClassification { ccSpace, ccNewLine, ccWord, ccPunctuation };
 
 private:
        int refCount;
        CellBuffer cb;
 
 private:
        int refCount;
        CellBuffer cb;
-       enum charClassification { ccSpace, ccNewLine, ccWord, ccPunctuation };
        charClassification charClass[256];
        char stylingMask;
        int endStyled;
        charClassification charClass[256];
        char stylingMask;
        int endStyled;
@@ -190,6 +191,7 @@ public:
        void Indent(bool forwards);
        int ExtendWordSelect(int pos, int delta, bool onlyWordCharacters=false);
        int NextWordStart(int pos, int delta);
        void Indent(bool forwards);
        int ExtendWordSelect(int pos, int delta, bool onlyWordCharacters=false);
        int NextWordStart(int pos, int delta);
+       int NextWordEnd(int pos, int delta);
        int Length() { return cb.Length(); }
        long FindText(int minPos, int maxPos, const char *s,
                bool caseSensitive, bool word, bool wordStart, bool regExp, bool posix, int *length);
        int Length() { return cb.Length(); }
        long FindText(int minPos, int maxPos, const char *s,
                bool caseSensitive, bool word, bool wordStart, bool regExp, bool posix, int *length);
@@ -198,8 +200,9 @@ public:
        int LinesTotal();
 
        void ChangeCase(Range r, bool makeUpperCase);
        int LinesTotal();
 
        void ChangeCase(Range r, bool makeUpperCase);
-
-       void SetWordChars(unsigned char *chars);
+       
+       void SetDefaultCharClasses();
+       void SetCharClasses(unsigned char *chars, charClassification newCharClass);
        void SetStylingBits(int bits);
        void StartStyling(int position, char mask);
        bool SetStyleFor(int length, char style);
        void SetStylingBits(int bits);
        void StartStyling(int position, char mask);
        bool SetStyleFor(int length, char style);
@@ -220,7 +223,7 @@ public:
        bool IsWordPartSeparator(char ch);
        int WordPartLeft(int pos);
        int WordPartRight(int pos);
        bool IsWordPartSeparator(char ch);
        int WordPartLeft(int pos);
        int WordPartRight(int pos);
-       int ExtendStyleRange(int pos, int delta);
+       int ExtendStyleRange(int pos, int delta, bool singleLine = false);
        int ParaUp(int pos);
        int ParaDown(int pos);
 
        int ParaUp(int pos);
        int ParaDown(int pos);
 
index df260ed5126ba79716a43a99638dbeb7ac53bd50..f0f10e25a3f810eafffc9dff1629a7595980e2bd 100644 (file)
@@ -35,6 +35,9 @@ active(false), on(false), period(500) {}
 Timer::Timer() :
 ticking(false), ticksToWait(0), tickerID(0) {}
 
 Timer::Timer() :
 ticking(false), ticksToWait(0), tickerID(0) {}
 
+Idler::Idler() :
+state(false), idlerID(0) {}
+
 LineLayout::LineLayout(int maxLineLength_) :
        lineStarts(0),
        lenLineStarts(0),
 LineLayout::LineLayout(int maxLineLength_) :
        lineStarts(0),
        lenLineStarts(0),
@@ -53,6 +56,8 @@ LineLayout::LineLayout(int maxLineLength_) :
        styles(0),
        indicators(0),
        positions(0),
        styles(0),
        indicators(0),
        positions(0),
+       hsStart(0),
+       hsEnd(0),
        widthLine(wrapWidthInfinite),
        lines(1) {
        Resize(maxLineLength_);
        widthLine(wrapWidthInfinite),
        lines(1) {
        Resize(maxLineLength_);
@@ -316,6 +321,7 @@ Editor::Editor() {
        originalAnchorPos = 0;
 
        selType = selStream;
        originalAnchorPos = 0;
 
        selType = selStream;
+       moveExtendsSelection = false;
        xStartSelect = 0;
        xEndSelect = 0;
        primarySelection = true;
        xStartSelect = 0;
        xEndSelect = 0;
        primarySelection = true;
@@ -373,6 +379,8 @@ Editor::Editor() {
        wrapState = eWrapNone;
        wrapWidth = LineLayout::wrapWidthInfinite;
        docLineLastWrapped = -1;
        wrapState = eWrapNone;
        wrapWidth = LineLayout::wrapWidthInfinite;
        docLineLastWrapped = -1;
+       docLastLineToWrap = -1;
+       backgroundWrapEnabled = true;
 
        hsStart = -1;
        hsEnd = -1;
 
        hsStart = -1;
        hsEnd = -1;
@@ -393,6 +401,7 @@ Editor::~Editor() {
 }
 
 void Editor::Finalise() {
 }
 
 void Editor::Finalise() {
+       SetIdle(false);
        CancelModes();
 }
 
        CancelModes();
 }
 
@@ -408,6 +417,10 @@ void Editor::InvalidateStyleData() {
        palette.Release();
        DropGraphics();
        llc.Invalidate(LineLayout::llInvalid);
        palette.Release();
        DropGraphics();
        llc.Invalidate(LineLayout::llInvalid);
+       if (selType == selRectangle) {
+               xStartSelect = XFromPosition(anchor);
+               xEndSelect = XFromPosition(currentPos);
+       }
 }
 
 void Editor::InvalidateStyleRedraw() {
 }
 
 void Editor::InvalidateStyleRedraw() {
@@ -495,7 +508,9 @@ const char *ControlCharacterString(unsigned char ch) {
        }
 }
 
        }
 }
 
-// Convenience class to ensure LineLayout objects are always disposed.
+/**
+ * Convenience class to ensure LineLayout objects are always disposed.
+ */
 class AutoLineLayout {
        LineLayoutCache &llc;
        LineLayout *ll;
 class AutoLineLayout {
        LineLayoutCache &llc;
        LineLayout *ll;
@@ -518,6 +533,84 @@ public:
        }
 };
 
        }
 };
 
+/**
+ * Allows to iterate through the lines of a selection.
+ * Althought it can be called for a stream selection, in most cases
+ * it is inefficient and it should be used only for
+ * a rectangular or a line selection.
+ */
+class SelectionLineIterator {
+private:
+       Editor *ed;
+       int line;       ///< Current line within the iteration.
+       bool forward;   ///< True if iterating by increasing line number, false otherwise.
+       int selStart, selEnd;   ///< Positions of the start and end of the selection relative to the start of the document.
+       int minX, maxX; ///< Left and right of selection rectangle.
+
+public:
+       int lineStart, lineEnd; ///< Line numbers, first and last lines of the selection.
+       int startPos, endPos;   ///< Positions of the beginning and end of the selection on the current line.
+
+       void Reset() {
+               if (forward) {
+                       line = lineStart;
+               } else {
+                       line = lineEnd;
+               }
+       }
+
+       SelectionLineIterator(Editor *ed_, bool forward_ = true) : line(0), startPos(0), endPos(0) {
+               ed = ed_;
+               forward = forward_;
+               selStart = ed->SelectionStart();
+               selEnd = ed->SelectionEnd();
+               lineStart = ed->pdoc->LineFromPosition(selStart);
+               lineEnd = ed->pdoc->LineFromPosition(selEnd);
+               // Left of rectangle
+               minX = Platform::Minimum(ed->xStartSelect, ed->xEndSelect);
+               // Right of rectangle
+               maxX = Platform::Maximum(ed->xStartSelect, ed->xEndSelect);
+               Reset();
+       }
+       ~SelectionLineIterator() {}
+
+       void SetAt(int line) {
+               if (line < lineStart || line > lineEnd) {
+                       startPos = endPos = INVALID_POSITION;
+               } else {
+                       if (ed->selType == ed->selRectangle) {
+                               // Measure line and return character closest to minX
+                               startPos = ed->PositionFromLineX(line, minX);
+                               // Measure line and return character closest to maxX
+                               endPos = ed->PositionFromLineX(line, maxX);
+                       } else if (ed->selType == ed->selLines) {
+                               startPos = ed->pdoc->LineStart(line);
+                               endPos = ed->pdoc->LineStart(line + 1);
+                       } else {        // Stream selection, here only for completion
+                               if (line == lineStart) {
+                                       startPos = selStart;
+                               } else {
+                                       startPos = ed->pdoc->LineStart(line);
+                               }
+                               if (line == lineEnd) {
+                                       endPos = selEnd;
+                               } else {
+                                       endPos = ed->pdoc->LineStart(line + 1);
+                               }
+                       }
+               }
+       }
+       bool Iterate() {
+               SetAt(line);
+               if (forward) {
+                       line++;
+               } else {
+                       line--;
+               }
+               return startPos != INVALID_POSITION;
+       }
+};
+
 Point Editor::LocationFromPosition(int pos) {
        Point pt;
        RefreshStyleData();
 Point Editor::LocationFromPosition(int pos) {
        Point pt;
        RefreshStyleData();
@@ -681,8 +774,10 @@ int Editor::PositionFromLineX(int lineDoc, int x) {
        return retVal;
 }
 
        return retVal;
 }
 
-// If painting then abandon the painting because a wider redraw is needed.
-// Return true if calling code should stop drawing
+/**
+ * If painting then abandon the painting because a wider redraw is needed.
+ * @return true if calling code should stop drawing.
+ */
 bool Editor::AbandonPaint() {
        if ((paintState == painting) && !paintingAllText) {
                paintState = paintAbandoned;
 bool Editor::AbandonPaint() {
        if ((paintState == painting) && !paintingAllText) {
                paintState = paintAbandoned;
@@ -765,63 +860,44 @@ bool Editor::SelectionEmpty() {
        return anchor == currentPos;
 }
 
        return anchor == currentPos;
 }
 
-int Editor::SelectionStart(int line) {
-       if ((line == -1) || (selType == selStream)) {
-               return Platform::Minimum(currentPos, anchor);
-       } else { // selType == selRectangle
-               int selStart = SelectionStart();
-               int selEnd = SelectionEnd();
-               int lineStart = pdoc->LineFromPosition(selStart);
-               int lineEnd = pdoc->LineFromPosition(selEnd);
-               if (line < lineStart || line > lineEnd) {
-                       return -1;
-               } else {
-                       int minX = Platform::Minimum(xStartSelect, xEndSelect);
-                       return PositionFromLineX(line, minX);
-               }
-       }
+int Editor::SelectionStart() {
+       return Platform::Minimum(currentPos, anchor);
 }
 
 }
 
-int Editor::SelectionEnd(int line) {
-       if ((line == -1) || (selType == selStream)) {
-               return Platform::Maximum(currentPos, anchor);
-       } else { // selType == selRectangle
-               int selStart = SelectionStart();
-               int selEnd = SelectionEnd();
-               int lineStart = pdoc->LineFromPosition(selStart);
-               int lineEnd = pdoc->LineFromPosition(selEnd);
-               if (line < lineStart || line > lineEnd) {
-                       return -1;
-               } else {
-                       int maxX = Platform::Maximum(xStartSelect, xEndSelect);
-                       // measure line and return character closest to minx
-                       return PositionFromLineX(line, maxX);
-               }
-       }
+int Editor::SelectionEnd() {
+       return Platform::Maximum(currentPos, anchor);
+}
+
+void Editor::InvalidateSelection(int currentPos_, int anchor_) {
+       int firstAffected = anchor;
+       if (firstAffected > currentPos)
+               firstAffected = currentPos;
+       if (firstAffected > anchor_)
+               firstAffected = anchor_;
+       if (firstAffected > currentPos_)
+               firstAffected = currentPos_;
+       int lastAffected = anchor;
+       if (lastAffected < currentPos)
+               lastAffected = currentPos;
+       if (lastAffected < anchor_)
+               lastAffected = anchor_;
+       if (lastAffected < (currentPos_ + 1))   // +1 ensures caret repainted
+               lastAffected = (currentPos_ + 1);
+       needUpdateUI = true;
+       InvalidateRange(firstAffected, lastAffected);
 }
 
 void Editor::SetSelection(int currentPos_, int anchor_) {
        currentPos_ = pdoc->ClampPositionIntoDocument(currentPos_);
        anchor_ = pdoc->ClampPositionIntoDocument(anchor_);
        if ((currentPos != currentPos_) || (anchor != anchor_)) {
 }
 
 void Editor::SetSelection(int currentPos_, int anchor_) {
        currentPos_ = pdoc->ClampPositionIntoDocument(currentPos_);
        anchor_ = pdoc->ClampPositionIntoDocument(anchor_);
        if ((currentPos != currentPos_) || (anchor != anchor_)) {
-               int firstAffected = anchor;
-               if (firstAffected > currentPos)
-                       firstAffected = currentPos;
-               if (firstAffected > anchor_)
-                       firstAffected = anchor_;
-               if (firstAffected > currentPos_)
-                       firstAffected = currentPos_;
-               int lastAffected = anchor;
-               if (lastAffected < currentPos)
-                       lastAffected = currentPos;
-               if (lastAffected < anchor_)
-                       lastAffected = anchor_;
-               if (lastAffected < (currentPos_ + 1))   // +1 ensures caret repainted
-                       lastAffected = (currentPos_ + 1);
+               InvalidateSelection(currentPos_, anchor_);
                currentPos = currentPos_;
                anchor = anchor_;
                currentPos = currentPos_;
                anchor = anchor_;
-               needUpdateUI = true;
-               InvalidateRange(firstAffected, lastAffected);
+       }
+       if (selType == selRectangle) {
+               xStartSelect = XFromPosition(anchor);
+               xEndSelect = XFromPosition(currentPos);
        }
        ClaimSelection();
 }
        }
        ClaimSelection();
 }
@@ -829,25 +905,19 @@ void Editor::SetSelection(int currentPos_, int anchor_) {
 void Editor::SetSelection(int currentPos_) {
        currentPos_ = pdoc->ClampPositionIntoDocument(currentPos_);
        if (currentPos != currentPos_) {
 void Editor::SetSelection(int currentPos_) {
        currentPos_ = pdoc->ClampPositionIntoDocument(currentPos_);
        if (currentPos != currentPos_) {
-               int firstAffected = anchor;
-               if (firstAffected > currentPos)
-                       firstAffected = currentPos;
-               if (firstAffected > currentPos_)
-                       firstAffected = currentPos_;
-               int lastAffected = anchor;
-               if (lastAffected < currentPos)
-                       lastAffected = currentPos;
-               if (lastAffected < (currentPos_ + 1))   // +1 ensures caret repainted
-                       lastAffected = (currentPos_ + 1);
+               InvalidateSelection(currentPos_, currentPos_);
                currentPos = currentPos_;
                currentPos = currentPos_;
-               needUpdateUI = true;
-               InvalidateRange(firstAffected, lastAffected);
+       }
+       if (selType == selRectangle) {
+               xStartSelect = XFromPosition(anchor);
+               xEndSelect = XFromPosition(currentPos);
        }
        ClaimSelection();
 }
 
 void Editor::SetEmptySelection(int currentPos_) {
        selType = selStream;
        }
        ClaimSelection();
 }
 
 void Editor::SetEmptySelection(int currentPos_) {
        selType = selStream;
+       moveExtendsSelection = false;
        SetSelection(currentPos_, currentPos_);
 }
 
        SetSelection(currentPos_, currentPos_);
 }
 
@@ -867,13 +937,27 @@ bool Editor::RangeContainsProtected(int start, int end) const {
        return false;
 }
 
        return false;
 }
 
-bool Editor::SelectionContainsProtected() const {
-       // TODO: make support rectangular selection
-       return RangeContainsProtected(anchor, currentPos);
+bool Editor::SelectionContainsProtected() {
+       // DONE, but untested...: make support rectangular selection
+       bool scp = false;
+       if (selType == selStream) {
+               scp = RangeContainsProtected(anchor, currentPos);
+       } else {
+               SelectionLineIterator lineIterator(this);
+               while (lineIterator.Iterate()) {
+                       if (RangeContainsProtected(lineIterator.startPos, lineIterator.endPos)) {
+                               scp = true;
+                               break;
+                       }
+               }
+       }
+       return scp;
 }
 
 }
 
+/**
+ * Asks document to find a good position and then moves out of any invisible positions.
+ */
 int Editor::MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd) {
 int Editor::MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd) {
-       // Asks document to find a good position and then moves out of any invisible positions
        pos = pdoc->MovePositionOutsideChar(pos, moveDir, checkLineEnd);
        if (vs.ProtectionActive()) {
                int mask = pdoc->stylingBitsMask;
        pos = pdoc->MovePositionOutsideChar(pos, moveDir, checkLineEnd);
        if (vs.ProtectionActive()) {
                int mask = pdoc->stylingBitsMask;
@@ -894,18 +978,22 @@ int Editor::MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd) {
        return pos;
 }
 
        return pos;
 }
 
-int Editor::MovePositionTo(int newPos, bool extend, bool ensureVisible) {
+int Editor::MovePositionTo(int newPos, selTypes sel, bool ensureVisible) {
        int delta = newPos - currentPos;
        newPos = pdoc->ClampPositionIntoDocument(newPos);
        newPos = MovePositionOutsideChar(newPos, delta);
        int delta = newPos - currentPos;
        newPos = pdoc->ClampPositionIntoDocument(newPos);
        newPos = MovePositionOutsideChar(newPos, delta);
-       if (extend) {
+       if (sel != noSel) {
+               selType = sel;
+       }
+       if (sel != noSel || moveExtendsSelection) {
                SetSelection(newPos);
        } else {
                SetEmptySelection(newPos);
        }
        ShowCaretAtCurrentPosition();
                SetSelection(newPos);
        } else {
                SetEmptySelection(newPos);
        }
        ShowCaretAtCurrentPosition();
-       if (ensureVisible)
+       if (ensureVisible) {
                EnsureCaretVisible();
                EnsureCaretVisible();
+       }
        NotifyMove(newPos);
        return 0;
 }
        NotifyMove(newPos);
        return 0;
 }
@@ -929,7 +1017,10 @@ int Editor::MovePositionSoVisible(int pos, int moveDir) {
        }
 }
 
        }
 }
 
-// Choose the x position that the caret will try to stick to as it is moves up and down
+/**
+ * Choose the x position that the caret will try to stick to
+ * as it moves up and down.
+ */
 void Editor::SetLastXChosen() {
        Point pt = LocationFromPosition(currentPos);
        lastXChosen = pt.x;
 void Editor::SetLastXChosen() {
        Point pt = LocationFromPosition(currentPos);
        lastXChosen = pt.x;
@@ -976,12 +1067,12 @@ void Editor::MoveCaretInsideView(bool ensureVisible) {
        if (pt.y < rcClient.top) {
                MovePositionTo(PositionFromLocation(
                                   Point(lastXChosen, rcClient.top)),
        if (pt.y < rcClient.top) {
                MovePositionTo(PositionFromLocation(
                                   Point(lastXChosen, rcClient.top)),
-                              false, ensureVisible);
+                              noSel, ensureVisible);
        } else if ((pt.y + vs.lineHeight - 1) > rcClient.bottom) {
                int yOfLastLineFullyDisplayed = rcClient.top + (LinesOnScreen() - 1) * vs.lineHeight;
                MovePositionTo(PositionFromLocation(
                                   Point(lastXChosen, rcClient.top + yOfLastLineFullyDisplayed)),
        } else if ((pt.y + vs.lineHeight - 1) > rcClient.bottom) {
                int yOfLastLineFullyDisplayed = rcClient.top + (LinesOnScreen() - 1) * vs.lineHeight;
                MovePositionTo(PositionFromLocation(
                                   Point(lastXChosen, rcClient.top + yOfLastLineFullyDisplayed)),
-                              false, ensureVisible);
+                              noSel, ensureVisible);
        }
 }
 
        }
 }
 
@@ -1032,7 +1123,7 @@ This way, we favour the displaying of useful information: the begining of lines,
 where most code reside, and the lines after the caret, eg. the body of a function.
 
      |        |       |      |                                            |
 where most code reside, and the lines after the caret, eg. the body of a function.
 
      |        |       |      |                                            |
-slop | strict | jumps | even | Caret can go to the margin                 | When reaching limit (caret going out of
+slop | strict | jumps | even | Caret can go to the margin                 | When reaching limitÝ(caret going out of
      |        |       |      |                                            | visibility or going into the UZ) display is...
 -----+--------+-------+------+--------------------------------------------+--------------------------------------------------------------
   0  |   0    |   0   |   0  | Yes                                        | moved to put caret on top/on right
      |        |       |      |                                            | visibility or going into the UZ) display is...
 -----+--------+-------+------+--------------------------------------------+--------------------------------------------------------------
   0  |   0    |   0   |   0  | Yes                                        | moved to put caret on top/on right
@@ -1298,18 +1389,57 @@ void Editor::InvalidateCaret() {
                InvalidateRange(currentPos, currentPos + 1);
 }
 
                InvalidateRange(currentPos, currentPos + 1);
 }
 
-void Editor::NeedWrapping(int docLineStartWrapping) {
+void Editor::NeedWrapping(int docLineStartWrapping, int docLineEndWrapping) {
+       bool noWrap = (docLastLineToWrap == docLineLastWrapped);
        if (docLineLastWrapped > (docLineStartWrapping - 1)) {
                docLineLastWrapped = docLineStartWrapping - 1;
                if (docLineLastWrapped < -1)
                        docLineLastWrapped = -1;
                llc.Invalidate(LineLayout::llPositions);
        }
        if (docLineLastWrapped > (docLineStartWrapping - 1)) {
                docLineLastWrapped = docLineStartWrapping - 1;
                if (docLineLastWrapped < -1)
                        docLineLastWrapped = -1;
                llc.Invalidate(LineLayout::llPositions);
        }
+       if (noWrap) {
+               docLastLineToWrap = docLineEndWrapping;
+       } else if (docLastLineToWrap < docLineEndWrapping) {
+               docLastLineToWrap = docLineEndWrapping + 1;
+       }
+       if (docLastLineToWrap < -1)
+               docLastLineToWrap = -1;
+       if (docLastLineToWrap >= pdoc->LinesTotal())
+               docLastLineToWrap = pdoc->LinesTotal()-1;
+       // Wrap lines during idle.
+       if (backgroundWrapEnabled && docLastLineToWrap != docLineLastWrapped ) {
+               SetIdle(true);
+       }
 }
 
 // Check if wrapping needed and perform any needed wrapping.
 }
 
 // Check if wrapping needed and perform any needed wrapping.
+// fullwrap: if true, all lines which need wrapping will be done,
+//           in this single call.
+// priorityWrapLineStart: If greater than zero, all lines starting from
+//           here to 100 lines past will be wrapped (even if there are
+//           more lines under wrapping process in idle).
+// If it is neither fullwrap, nor priorityWrap, then 100 lines will be
+// wrapped, if there are any wrapping going on in idle. (Generally this
+// condition is called only from idler).
 // Return true if wrapping occurred.
 // Return true if wrapping occurred.
-bool Editor::WrapLines() {
+bool Editor::WrapLines(bool fullWrap, int priorityWrapLineStart) {
+       // If there are any pending wraps, do them during idle if possible.
+       if (wrapState != eWrapNone) {
+               if (docLineLastWrapped < docLastLineToWrap) {
+                       if (!(backgroundWrapEnabled && SetIdle(true))) {
+                               // Background wrapping is disabled, or idle processing
+                               // not supported.  A full wrap is required.
+                               fullWrap = true;
+                       }
+               }
+               if (!fullWrap && priorityWrapLineStart >= 0 &&
+                       // .. and if the paint window is outside pending wraps
+                       (((priorityWrapLineStart + 100) < docLineLastWrapped) ||
+                        (priorityWrapLineStart > docLastLineToWrap))) {
+                       // No priority wrap pending
+                       return false;
+               }
+       }
        int goodTopLine = topLine;
        bool wrapOccurred = false;
        if (docLineLastWrapped < pdoc->LinesTotal()) {
        int goodTopLine = topLine;
        bool wrapOccurred = false;
        if (docLineLastWrapped < pdoc->LinesTotal()) {
@@ -1332,21 +1462,47 @@ bool Editor::WrapLines() {
                        wrapWidth = rcTextArea.Width();
                        // Ensure all of the document is styled.
                        pdoc->EnsureStyledTo(pdoc->Length());
                        wrapWidth = rcTextArea.Width();
                        // Ensure all of the document is styled.
                        pdoc->EnsureStyledTo(pdoc->Length());
+                       RefreshStyleData();
                        AutoSurface surface(this);
                        if (surface) {
                        AutoSurface surface(this);
                        if (surface) {
-                               int lastLineToWrap = pdoc->LinesTotal();
-                               while (docLineLastWrapped <= lastLineToWrap) {
-                                       docLineLastWrapped++;
-                                       AutoLineLayout ll(llc, RetrieveLineLayout(docLineLastWrapped));
+                               bool priorityWrap = false;
+                               int lastLineToWrap = docLastLineToWrap;
+                               int firstLineToWrap = docLineLastWrapped;
+                               if (!fullWrap) {
+                                       if (priorityWrapLineStart >= 0) {
+                                               // This is a priority wrap.
+                                               firstLineToWrap = priorityWrapLineStart;
+                                               lastLineToWrap = firstLineToWrap + 100;
+                                               priorityWrap = true;
+                                       } else {
+                                               // This is idle wrap.
+                                               lastLineToWrap = docLineLastWrapped + 100;
+                                       }
+                                       if (lastLineToWrap >= docLastLineToWrap)
+                                               lastLineToWrap = docLastLineToWrap;
+                               } // else do a fullWrap.
+
+                               // printf("Wraplines: full = %d, priorityStart = %d (wrapping: %d to %d)\n", fullWrap, priorityWrapLineStart, firstLineToWrap, lastLineToWrap);
+                               // printf("Pending wraps: %d to %d\n", docLineLastWrapped, docLastLineToWrap);
+                               while (firstLineToWrap < lastLineToWrap) {
+                                       firstLineToWrap++;
+                                       if (!priorityWrap)
+                                               docLineLastWrapped++;
+                                       AutoLineLayout ll(llc, RetrieveLineLayout(firstLineToWrap));
                                        int linesWrapped = 1;
                                        if (ll) {
                                        int linesWrapped = 1;
                                        if (ll) {
-                                               LayoutLine(docLineLastWrapped, surface, vs, ll, wrapWidth);
+                                               LayoutLine(firstLineToWrap, surface, vs, ll, wrapWidth);
                                                linesWrapped = ll->lines;
                                        }
                                                linesWrapped = ll->lines;
                                        }
-                                       if (cs.SetHeight(docLineLastWrapped, linesWrapped)) {
+                                       if (cs.SetHeight(firstLineToWrap, linesWrapped)) {
                                                wrapOccurred = true;
                                        }
                                }
                                                wrapOccurred = true;
                                        }
                                }
+                               // If wrapping is done, bring it to resting position
+                               if (docLineLastWrapped > docLastLineToWrap) {
+                                       docLineLastWrapped = -1;
+                                       docLastLineToWrap = -1;
+                               }
                        }
                        goodTopLine = cs.DisplayFromDoc(lineDocTop);
                        if (subLineTop < cs.GetHeight(lineDocTop))
                        }
                        goodTopLine = cs.DisplayFromDoc(lineDocTop);
                        if (subLineTop < cs.GetHeight(lineDocTop))
@@ -1666,6 +1822,7 @@ LineLayout *Editor::RetrieveLineLayout(int lineNumber) {
 void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayout *ll, int width) {
        if (!ll)
                return;
 void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayout *ll, int width) {
        if (!ll)
                return;
+       PLATFORM_ASSERT(line < pdoc->LinesTotal());
        int posLineStart = pdoc->LineStart(line);
        int posLineEnd = pdoc->LineStart(line + 1);
        // If the line is very long, limit the treatment to a length that should fit in the viewport
        int posLineStart = pdoc->LineStart(line);
        int posLineEnd = pdoc->LineStart(line + 1);
        // If the line is very long, limit the treatment to a length that should fit in the viewport
@@ -1684,13 +1841,12 @@ void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayou
                        int numCharsInLine = 0;
                        // See if chars, styles, indicators, are all the same
                        bool allSame = true;
                        int numCharsInLine = 0;
                        // See if chars, styles, indicators, are all the same
                        bool allSame = true;
-                       char styleByte;
-                       int styleMask = pdoc->stylingBitsMask;
+                       const int styleMask = pdoc->stylingBitsMask;
                        // Check base line layout
                        for (int charInDoc = posLineStart; allSame && (charInDoc < posLineEnd); charInDoc++) {
                                char chDoc = pdoc->CharAt(charInDoc);
                        // Check base line layout
                        for (int charInDoc = posLineStart; allSame && (charInDoc < posLineEnd); charInDoc++) {
                                char chDoc = pdoc->CharAt(charInDoc);
-                               styleByte = pdoc->StyleAt(charInDoc);
-                               if (vstyle.viewEOL || (!IsEOLChar(chDoc != '\r'))) {
+                               if (vstyle.viewEOL || (!IsEOLChar(chDoc))) {
+                                       char styleByte = pdoc->StyleAt(charInDoc);
                                        allSame = allSame &&
                                                  (ll->styles[numCharsInLine] == static_cast<char>(styleByte & styleMask));
                                        allSame = allSame &&
                                        allSame = allSame &&
                                                  (ll->styles[numCharsInLine] == static_cast<char>(styleByte & styleMask));
                                        allSame = allSame &&
@@ -1884,7 +2040,7 @@ ColourAllocated Editor::TextBackground(ViewStyle &vsDraw, bool overrideBackgroun
                        (i >= ll->edgeColumn) &&
                        !IsEOLChar(ll->chars[i]))
                        return vsDraw.edgecolour.allocated;
                        (i >= ll->edgeColumn) &&
                        !IsEOLChar(ll->chars[i]))
                        return vsDraw.edgecolour.allocated;
-               if (inHotspot)
+               if (inHotspot && vsDraw.hotspotBackgroundSet)
                        return vsDraw.hotspotBackground.allocated;
                if (overrideBackground)
                        return background;
                        return vsDraw.hotspotBackground.allocated;
                if (overrideBackground)
                        return background;
@@ -2220,20 +2376,26 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis
        for (int indica = 0; indica <= INDIC_MAX; indica++)
                indStart[indica] = 0;
 
        for (int indica = 0; indica <= INDIC_MAX; indica++)
                indStart[indica] = 0;
 
-       for (int indicPos = 0; indicPos < ll->numCharsInLine; indicPos++) {
-               if (ll->indicators[indicPos] != ll->indicators[indicPos + 1]) {
+       for (int indicPos = lineStart; indicPos <= lineEnd; indicPos++) {
+               if ((indicPos == lineEnd) || (ll->indicators[indicPos] != ll->indicators[indicPos + 1])) {
                        int mask = 1 << pdoc->stylingBits;
                        for (int indicnum = 0; mask < 0x100; indicnum++) {
                        int mask = 1 << pdoc->stylingBits;
                        for (int indicnum = 0; mask < 0x100; indicnum++) {
-                               if ((ll->indicators[indicPos + 1] & mask) && !(ll->indicators[indicPos] & mask)) {
+                               if ((indicPos == lineEnd)) {
+                                       indStart[indicnum] = ll->positions[indicPos];
+                               } else if ((ll->indicators[indicPos + 1] & mask) && !(ll->indicators[indicPos] & mask)) {
                                        indStart[indicnum] = ll->positions[indicPos + 1];
                                }
                                        indStart[indicnum] = ll->positions[indicPos + 1];
                                }
-                               if (!(ll->indicators[indicPos + 1] & mask) && (ll->indicators[indicPos] & mask)) {
+                               if ((ll->indicators[indicPos] & mask) &&
+                                       ((indicPos == lineEnd) || !(ll->indicators[indicPos + 1] & mask))) {
+                                       int endIndicator = indicPos;
+                                       if (endIndicator >= lineEnd)
+                                               endIndicator = lineEnd-1;
                                        PRectangle rcIndic(
                                        PRectangle rcIndic(
-                                           indStart[indicnum] + xStart,
-                                           rcLine.top + vsDraw.maxAscent,
-                                           ll->positions[indicPos + 1] + xStart,
-                                           rcLine.top + vsDraw.maxAscent + 3);
-                                       vsDraw.indicators[indicnum].Draw(surface, rcIndic);
+                                               indStart[indicnum] + xStart - subLineStart,
+                                               rcLine.top + vsDraw.maxAscent,
+                                               ll->positions[endIndicator + 1] + xStart - subLineStart,
+                                               rcLine.top + vsDraw.maxAscent + 3);
+                                       vsDraw.indicators[indicnum].Draw(surface, rcIndic, rcLine);
                                }
                                mask = mask << 1;
                        }
                                }
                                mask = mask << 1;
                        }
@@ -2358,11 +2520,15 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
                needUpdateUI = false;
        }
 
                needUpdateUI = false;
        }
 
-       PaintSelMargin(surfaceWindow, rcArea);
-
-       if (WrapLines()) {
-               // The wrapping process has changed the height of some lines so abandon this
-               // paint for a complete repaint.
+       // Call priority lines wrap on a window of lines which are likely
+       // to rendered with the following paint (that is wrap the visible
+       //      lines first).
+       int startLineToWrap = cs.DocFromDisplay(topLine) - 5;
+       if (startLineToWrap < 0)
+               startLineToWrap = -1;
+       if (WrapLines(false, startLineToWrap)) {
+               // The wrapping process has changed the height of some lines so
+               // abandon this paint for a complete repaint.
                if (AbandonPaint()) {
                        return;
                }
                if (AbandonPaint()) {
                        return;
                }
@@ -2370,6 +2536,8 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
        }
        PLATFORM_ASSERT(pixmapSelPattern->Initialised());
 
        }
        PLATFORM_ASSERT(pixmapSelPattern->Initialised());
 
+       PaintSelMargin(surfaceWindow, rcArea);
+
        PRectangle rcRightMargin = rcClient;
        rcRightMargin.left = rcRightMargin.right - vs.rightMarginWidth;
        if (rcArea.Intersects(rcRightMargin)) {
        PRectangle rcRightMargin = rcClient;
        rcRightMargin.left = rcRightMargin.right - vs.rightMarginWidth;
        if (rcArea.Intersects(rcRightMargin)) {
@@ -2423,6 +2591,7 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
                //ElapsedTime etWhole;
                int lineDocPrevious = -1;       // Used to avoid laying out one document line multiple times
                AutoLineLayout ll(llc, 0);
                //ElapsedTime etWhole;
                int lineDocPrevious = -1;       // Used to avoid laying out one document line multiple times
                AutoLineLayout ll(llc, 0);
+               SelectionLineIterator lineIterator(this);
                while (visibleLine < cs.LinesDisplayed() && yposScreen < rcArea.bottom) {
 
                        int lineDoc = cs.DocFromDisplay(visibleLine);
                while (visibleLine < cs.LinesDisplayed() && yposScreen < rcArea.bottom) {
 
                        int lineDoc = cs.DocFromDisplay(visibleLine);
@@ -2442,8 +2611,14 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
                        //durLayout += et.Duration(true);
 
                        if (ll) {
                        //durLayout += et.Duration(true);
 
                        if (ll) {
-                               ll->selStart = SelectionStart(lineDoc);
-                               ll->selEnd = SelectionEnd(lineDoc);
+                               if (selType == selStream) {
+                                       ll->selStart = SelectionStart();
+                                       ll->selEnd = SelectionEnd();
+                               } else {
+                                       lineIterator.SetAt(lineDoc);
+                                       ll->selStart = lineIterator.startPos;
+                                       ll->selEnd = lineIterator.endPos;
+                               }
                                ll->containsCaret = lineDoc == lineCaret;
                                if (hideSelection) {
                                        ll->selStart = -1;
                                ll->containsCaret = lineDoc == lineCaret;
                                if (hideSelection) {
                                        ll->selStart = -1;
@@ -2466,7 +2641,7 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
                                DrawLine(surface, vs, lineDoc, visibleLine, xStart, rcLine, ll, subLine);
                                //durPaint += et.Duration(true);
 
                                DrawLine(surface, vs, lineDoc, visibleLine, xStart, rcLine, ll, subLine);
                                //durPaint += et.Duration(true);
 
-                               // Restore the precvious styles for the brace highlights in case layout is in cache.
+                               // Restore the previous styles for the brace highlights in case layout is in cache.
                                ll->RestoreBracesHighlight(rangeLine, braces);
 
                                bool expanded = cs.GetExpanded(lineDoc);
                                ll->RestoreBracesHighlight(rangeLine, braces);
 
                                bool expanded = cs.GetExpanded(lineDoc);
@@ -2917,31 +3092,28 @@ void Editor::AddCharUTF(char *s, unsigned int len, bool treatAsDBCS) {
 
 void Editor::ClearSelection() {
        if (!SelectionContainsProtected()) {
 
 void Editor::ClearSelection() {
        if (!SelectionContainsProtected()) {
-               if (selType == selRectangle) {
+               int startPos = SelectionStart();
+               if (selType == selStream) {
+                       unsigned int chars = SelectionEnd() - startPos;
+                       if (0 != chars) {
+                               pdoc->BeginUndoAction();
+                               pdoc->DeleteChars(startPos, chars);
+                               pdoc->EndUndoAction();
+                       }
+               } else {
                        pdoc->BeginUndoAction();
                        pdoc->BeginUndoAction();
-                       int lineStart = pdoc->LineFromPosition(SelectionStart());
-                       int lineEnd = pdoc->LineFromPosition(SelectionEnd());
-                       int startPos = SelectionStart();
-                       for (int line = lineEnd; line >= lineStart; line--) {
-                               startPos = SelectionStart(line);
-                               unsigned int chars = SelectionEnd(line) - startPos;
+                       SelectionLineIterator lineIterator(this, false);
+                       while (lineIterator.Iterate()) {
+                               startPos = lineIterator.startPos;
+                               unsigned int chars = lineIterator.endPos - startPos;
                                if (0 != chars) {
                                        pdoc->DeleteChars(startPos, chars);
                                }
                        }
                                if (0 != chars) {
                                        pdoc->DeleteChars(startPos, chars);
                                }
                        }
-                       SetEmptySelection(startPos);
                        pdoc->EndUndoAction();
                        selType = selStream;
                        pdoc->EndUndoAction();
                        selType = selStream;
-               } else {
-                       int startPos = SelectionStart();
-                       unsigned int chars = SelectionEnd() - startPos;
-                       SetEmptySelection(startPos);
-                       if (0 != chars) {
-                               pdoc->BeginUndoAction();
-                               pdoc->DeleteChars(startPos, chars);
-                               pdoc->EndUndoAction();
-                       }
                }
                }
+               SetEmptySelection(startPos);
        }
 }
 
        }
 }
 
@@ -3234,20 +3406,18 @@ void Editor::CheckModificationForWrap(DocModification mh) {
                llc.Invalidate(LineLayout::llCheckTextAndStyle);
                if (wrapState != eWrapNone) {
                        int lineDoc = pdoc->LineFromPosition(mh.position);
                llc.Invalidate(LineLayout::llCheckTextAndStyle);
                if (wrapState != eWrapNone) {
                        int lineDoc = pdoc->LineFromPosition(mh.position);
-                       if (mh.linesAdded == 0) {
+                       if (mh.linesAdded <= 0) {
                                AutoSurface surface(this);
                                AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc));
                                if (surface && ll) {
                                        LayoutLine(lineDoc, surface, vs, ll, wrapWidth);
                                        if (cs.GetHeight(lineDoc) != ll->lines) {
                                AutoSurface surface(this);
                                AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc));
                                if (surface && ll) {
                                        LayoutLine(lineDoc, surface, vs, ll, wrapWidth);
                                        if (cs.GetHeight(lineDoc) != ll->lines) {
-                                               NeedWrapping(lineDoc - 1);
+                                               NeedWrapping(lineDoc - 1, lineDoc + 1);
                                                Redraw();
                                        }
                                                Redraw();
                                        }
-                               } else {
-                                       NeedWrapping(lineDoc);
                                }
                        } else {
                                }
                        } else {
-                               NeedWrapping(lineDoc);
+                               NeedWrapping(lineDoc, lineDoc + 1 + mh.linesAdded);
                        }
                }
        }
                        }
                }
        }
@@ -3281,7 +3451,6 @@ void Editor::NotifyModified(Document*, DocModification mh, void *) {
        if (paintState == painting) {
                CheckForChangeOutsidePaint(Range(mh.position, mh.position + mh.length));
        }
        if (paintState == painting) {
                CheckForChangeOutsidePaint(Range(mh.position, mh.position + mh.length));
        }
-       CheckModificationForWrap(mh);
        if (mh.modificationType & SC_MOD_CHANGESTYLE) {
                if (paintState == notPainting) {
                        if (mh.position < pdoc->LineStart(topLine)) {
        if (mh.modificationType & SC_MOD_CHANGESTYLE) {
                if (paintState == notPainting) {
                        if (mh.position < pdoc->LineStart(topLine)) {
@@ -3322,6 +3491,9 @@ void Editor::NotifyModified(Document*, DocModification mh, void *) {
                        } else {
                                cs.DeleteLines(lineOfPos, -mh.linesAdded);
                        }
                        } else {
                                cs.DeleteLines(lineOfPos, -mh.linesAdded);
                        }
+               }
+               CheckModificationForWrap(mh);
+               if (mh.linesAdded != 0) {
                        // Avoid scrolling of display if change before current display
                        if (mh.position < posTopLine) {
                                int newTop = Platform::Clamp(topLine + mh.linesAdded, 0, MaxScrollPos());
                        // Avoid scrolling of display if change before current display
                        if (mh.position < posTopLine) {
                                int newTop = Platform::Clamp(topLine + mh.linesAdded, 0, MaxScrollPos());
@@ -3420,6 +3592,10 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long
        case SCI_WORDPARTLEFTEXTEND:
        case SCI_WORDPARTRIGHT:
        case SCI_WORDPARTRIGHTEXTEND:
        case SCI_WORDPARTLEFTEXTEND:
        case SCI_WORDPARTRIGHT:
        case SCI_WORDPARTRIGHTEXTEND:
+       case SCI_WORDLEFTEND:
+       case SCI_WORDLEFTENDEXTEND:
+       case SCI_WORDRIGHTEND:
+       case SCI_WORDRIGHTENDEXTEND:
        case SCI_HOME:
        case SCI_HOMEEXTEND:
        case SCI_LINEEND:
        case SCI_HOME:
        case SCI_HOMEEXTEND:
        case SCI_LINEEND:
@@ -3432,6 +3608,10 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long
        case SCI_DOCUMENTSTARTEXTEND:
        case SCI_DOCUMENTEND:
        case SCI_DOCUMENTENDEXTEND:
        case SCI_DOCUMENTSTARTEXTEND:
        case SCI_DOCUMENTEND:
        case SCI_DOCUMENTENDEXTEND:
+       case SCI_STUTTEREDPAGEUP:
+       case SCI_STUTTEREDPAGEUPEXTEND:
+       case SCI_STUTTEREDPAGEDOWN:
+       case SCI_STUTTEREDPAGEDOWNEXTEND:
        case SCI_PAGEUP:
        case SCI_PAGEUPEXTEND:
        case SCI_PAGEDOWN:
        case SCI_PAGEUP:
        case SCI_PAGEUPEXTEND:
        case SCI_PAGEDOWN:
@@ -3464,10 +3644,20 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long
        case SCI_HOMEDISPLAYEXTEND:
        case SCI_LINEENDDISPLAY:
        case SCI_LINEENDDISPLAYEXTEND:
        case SCI_HOMEDISPLAYEXTEND:
        case SCI_LINEENDDISPLAY:
        case SCI_LINEENDDISPLAYEXTEND:
-               break;
-
-               // Filter out all others like display changes.  Also, newlines are redundant
-               // with char insert messages.
+       case SCI_SETSELECTIONMODE:
+       case SCI_LINEDOWNRECTEXTEND:
+       case SCI_LINEUPRECTEXTEND:
+       case SCI_CHARLEFTRECTEXTEND:
+       case SCI_CHARRIGHTRECTEXTEND:
+       case SCI_HOMERECTEXTEND:
+       case SCI_VCHOMERECTEXTEND:
+       case SCI_LINEENDRECTEXTEND:
+       case SCI_PAGEUPRECTEXTEND:
+       case SCI_PAGEDOWNRECTEXTEND:
+               break;
+
+       // Filter out all others like display changes. Also, newlines are redundant
+       // with char insert messages.
        case SCI_NEWLINE:
        default:
                //              printf("Filtered out %ld of macro recording\n", iMessage);
        case SCI_NEWLINE:
        default:
                //              printf("Filtered out %ld of macro recording\n", iMessage);
@@ -3483,20 +3673,44 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long
        NotifyParent(scn);
 }
 
        NotifyParent(scn);
 }
 
-// Force scroll and keep position relative to top of window
-void Editor::PageMove(int direction, bool extend) {
-       Point pt = LocationFromPosition(currentPos);
-       int topLineNew = Platform::Clamp(
+/**
+ * Force scroll and keep position relative to top of window.
+ *
+ * If stuttered = true and not already at first/last row, move to first/last row of window.
+ * If stuttered = true and already at first/last row, scroll as normal.
+ */
+void Editor::PageMove(int direction, selTypes sel, bool stuttered) {
+       int topLineNew, newPos;
+
+       // I consider only the caretYSlop, and ignore the caretYPolicy-- is that a problem?
+       int currentLine = pdoc->LineFromPosition(currentPos);
+       int topStutterLine = topLine + caretYSlop;
+       int bottomStutterLine = topLine + LinesToScroll() - caretYSlop;
+
+       if (stuttered && (direction < 0 && currentLine > topStutterLine)) {
+               topLineNew = topLine;
+               newPos = PositionFromLocation(Point(lastXChosen, vs.lineHeight * caretYSlop));
+
+       } else if (stuttered && (direction > 0 && currentLine < bottomStutterLine)) {
+               topLineNew = topLine;
+               newPos = PositionFromLocation(Point(lastXChosen, vs.lineHeight * (LinesToScroll() - caretYSlop)));
+
+       } else {
+               Point pt = LocationFromPosition(currentPos);
+
+               topLineNew = Platform::Clamp(
                             topLine + direction * LinesToScroll(), 0, MaxScrollPos());
                             topLine + direction * LinesToScroll(), 0, MaxScrollPos());
-       int newPos = PositionFromLocation(
+               newPos = PositionFromLocation(
                         Point(lastXChosen, pt.y + direction * (vs.lineHeight * LinesToScroll())));
                         Point(lastXChosen, pt.y + direction * (vs.lineHeight * LinesToScroll())));
+       }
+
        if (topLineNew != topLine) {
                SetTopLine(topLineNew);
        if (topLineNew != topLine) {
                SetTopLine(topLineNew);
-               MovePositionTo(newPos, extend);
+               MovePositionTo(newPos, sel);
                Redraw();
                SetVerticalScrollPos();
        } else {
                Redraw();
                SetVerticalScrollPos();
        } else {
-               MovePositionTo(newPos, extend);
+               MovePositionTo(newPos, sel);
        }
 }
 
        }
 }
 
@@ -3504,21 +3718,19 @@ void Editor::ChangeCaseOfSelection(bool makeUpperCase) {
        pdoc->BeginUndoAction();
        int startCurrent = currentPos;
        int startAnchor = anchor;
        pdoc->BeginUndoAction();
        int startCurrent = currentPos;
        int startAnchor = anchor;
-       if (selType == selRectangle) {
-               int lineStart = pdoc->LineFromPosition(SelectionStart());
-               int lineEnd = pdoc->LineFromPosition(SelectionEnd());
-               for (int line = lineEnd; line >= lineStart; line--) {
+       if (selType == selStream) {
+               pdoc->ChangeCase(Range(SelectionStart(), SelectionEnd()),
+                                makeUpperCase);
+               SetSelection(startCurrent, startAnchor);
+       } else {
+               SelectionLineIterator lineIterator(this, false);
+               while (lineIterator.Iterate()) {
                        pdoc->ChangeCase(
                        pdoc->ChangeCase(
-                           Range(SelectionStart(line), SelectionEnd(line)),
+                           Range(lineIterator.startPos, lineIterator.endPos),
                            makeUpperCase);
                }
                // Would be nicer to keep the rectangular selection but this is complex
                            makeUpperCase);
                }
                // Would be nicer to keep the rectangular selection but this is complex
-               selType = selStream;
-               SetSelection(startCurrent, startCurrent);
-       } else {
-               pdoc->ChangeCase(Range(SelectionStart(), SelectionEnd()),
-                                makeUpperCase);
-               SetSelection(startCurrent, startAnchor);
+               SetEmptySelection(startCurrent);
        }
        pdoc->EndUndoAction();
 }
        }
        pdoc->EndUndoAction();
 }
@@ -3566,7 +3778,9 @@ void Editor::LineDuplicate() {
        delete []thisLine;
 }
 
        delete []thisLine;
 }
 
-void Editor::CancelModes() {}
+void Editor::CancelModes() {
+       moveExtendsSelection = false;
+}
 
 void Editor::NewLine() {
        ClearSelection();
 
 void Editor::NewLine() {
        ClearSelection();
@@ -3587,7 +3801,7 @@ void Editor::NewLine() {
        EnsureCaretVisible();
 }
 
        EnsureCaretVisible();
 }
 
-void Editor::CursorUpOrDown(int direction, bool extend) {
+void Editor::CursorUpOrDown(int direction, selTypes sel) {
        Point pt = LocationFromPosition(currentPos);
        int posNew = PositionFromLocation(
                         Point(lastXChosen, pt.y + direction * vs.lineHeight));
        Point pt = LocationFromPosition(currentPos);
        int posNew = PositionFromLocation(
                         Point(lastXChosen, pt.y + direction * vs.lineHeight));
@@ -3602,7 +3816,7 @@ void Editor::CursorUpOrDown(int direction, bool extend) {
                        ptNew = LocationFromPosition(posNew);
                }
        }
                        ptNew = LocationFromPosition(posNew);
                }
        }
-       MovePositionTo(posNew, extend);
+       MovePositionTo(posNew, sel);
 }
 
 int Editor::StartEndDisplayLine(int pos, bool start) {
 }
 
 int Editor::StartEndDisplayLine(int pos, bool start) {
@@ -3643,13 +3857,16 @@ int Editor::KeyCommand(unsigned int iMessage) {
                CursorUpOrDown(1);
                break;
        case SCI_LINEDOWNEXTEND:
                CursorUpOrDown(1);
                break;
        case SCI_LINEDOWNEXTEND:
-               CursorUpOrDown(1, true);
+               CursorUpOrDown(1, selStream);
+               break;
+       case SCI_LINEDOWNRECTEXTEND:
+               CursorUpOrDown(1, selRectangle);
                break;
        case SCI_PARADOWN:
                MovePositionTo(pdoc->ParaDown(currentPos));
                break;
        case SCI_PARADOWNEXTEND:
                break;
        case SCI_PARADOWN:
                MovePositionTo(pdoc->ParaDown(currentPos));
                break;
        case SCI_PARADOWNEXTEND:
-               MovePositionTo(pdoc->ParaDown(currentPos), true);
+               MovePositionTo(pdoc->ParaDown(currentPos), selStream);
                break;
        case SCI_LINESCROLLDOWN:
                ScrollTo(topLine + 1);
                break;
        case SCI_LINESCROLLDOWN:
                ScrollTo(topLine + 1);
@@ -3659,20 +3876,23 @@ int Editor::KeyCommand(unsigned int iMessage) {
                CursorUpOrDown(-1);
                break;
        case SCI_LINEUPEXTEND:
                CursorUpOrDown(-1);
                break;
        case SCI_LINEUPEXTEND:
-               CursorUpOrDown(-1, true);
+               CursorUpOrDown(-1, selStream);
+               break;
+       case SCI_LINEUPRECTEXTEND:
+               CursorUpOrDown(-1, selRectangle);
                break;
        case SCI_PARAUP:
                MovePositionTo(pdoc->ParaUp(currentPos));
                break;
        case SCI_PARAUPEXTEND:
                break;
        case SCI_PARAUP:
                MovePositionTo(pdoc->ParaUp(currentPos));
                break;
        case SCI_PARAUPEXTEND:
-               MovePositionTo(pdoc->ParaUp(currentPos), true);
+               MovePositionTo(pdoc->ParaUp(currentPos), selStream);
                break;
        case SCI_LINESCROLLUP:
                ScrollTo(topLine - 1);
                MoveCaretInsideView(false);
                break;
        case SCI_CHARLEFT:
                break;
        case SCI_LINESCROLLUP:
                ScrollTo(topLine - 1);
                MoveCaretInsideView(false);
                break;
        case SCI_CHARLEFT:
-               if (SelectionEmpty()) {
+               if (SelectionEmpty() || moveExtendsSelection) {
                        MovePositionTo(MovePositionSoVisible(currentPos - 1, -1));
                } else {
                        MovePositionTo(SelectionStart());
                        MovePositionTo(MovePositionSoVisible(currentPos - 1, -1));
                } else {
                        MovePositionTo(SelectionStart());
@@ -3680,11 +3900,15 @@ int Editor::KeyCommand(unsigned int iMessage) {
                SetLastXChosen();
                break;
        case SCI_CHARLEFTEXTEND:
                SetLastXChosen();
                break;
        case SCI_CHARLEFTEXTEND:
-               MovePositionTo(MovePositionSoVisible(currentPos - 1, -1), true);
+               MovePositionTo(MovePositionSoVisible(currentPos - 1, -1), selStream);
+               SetLastXChosen();
+               break;
+       case SCI_CHARLEFTRECTEXTEND:
+               MovePositionTo(MovePositionSoVisible(currentPos - 1, -1), selRectangle);
                SetLastXChosen();
                break;
        case SCI_CHARRIGHT:
                SetLastXChosen();
                break;
        case SCI_CHARRIGHT:
-               if (SelectionEmpty()) {
+               if (SelectionEmpty() || moveExtendsSelection) {
                        MovePositionTo(MovePositionSoVisible(currentPos + 1, 1));
                } else {
                        MovePositionTo(SelectionEnd());
                        MovePositionTo(MovePositionSoVisible(currentPos + 1, 1));
                } else {
                        MovePositionTo(SelectionEnd());
@@ -3692,7 +3916,11 @@ int Editor::KeyCommand(unsigned int iMessage) {
                SetLastXChosen();
                break;
        case SCI_CHARRIGHTEXTEND:
                SetLastXChosen();
                break;
        case SCI_CHARRIGHTEXTEND:
-               MovePositionTo(MovePositionSoVisible(currentPos + 1, 1), true);
+               MovePositionTo(MovePositionSoVisible(currentPos + 1, 1), selStream);
+               SetLastXChosen();
+               break;
+       case SCI_CHARRIGHTRECTEXTEND:
+               MovePositionTo(MovePositionSoVisible(currentPos + 1, 1), selRectangle);
                SetLastXChosen();
                break;
        case SCI_WORDLEFT:
                SetLastXChosen();
                break;
        case SCI_WORDLEFT:
@@ -3700,7 +3928,7 @@ int Editor::KeyCommand(unsigned int iMessage) {
                SetLastXChosen();
                break;
        case SCI_WORDLEFTEXTEND:
                SetLastXChosen();
                break;
        case SCI_WORDLEFTEXTEND:
-               MovePositionTo(MovePositionSoVisible(pdoc->NextWordStart(currentPos, -1), -1), true);
+               MovePositionTo(MovePositionSoVisible(pdoc->NextWordStart(currentPos, -1), -1), selStream);
                SetLastXChosen();
                break;
        case SCI_WORDRIGHT:
                SetLastXChosen();
                break;
        case SCI_WORDRIGHT:
@@ -3708,15 +3936,37 @@ int Editor::KeyCommand(unsigned int iMessage) {
                SetLastXChosen();
                break;
        case SCI_WORDRIGHTEXTEND:
                SetLastXChosen();
                break;
        case SCI_WORDRIGHTEXTEND:
-               MovePositionTo(MovePositionSoVisible(pdoc->NextWordStart(currentPos, 1), 1), true);
+               MovePositionTo(MovePositionSoVisible(pdoc->NextWordStart(currentPos, 1), 1), selStream);
+               SetLastXChosen();
+               break;
+
+       case SCI_WORDLEFTEND:
+               MovePositionTo(MovePositionSoVisible(pdoc->NextWordEnd(currentPos, -1), -1));
+               SetLastXChosen();
+               break;
+       case SCI_WORDLEFTENDEXTEND:
+               MovePositionTo(MovePositionSoVisible(pdoc->NextWordEnd(currentPos, -1), -1), selStream);
+               SetLastXChosen();
+               break;
+       case SCI_WORDRIGHTEND:
+               MovePositionTo(MovePositionSoVisible(pdoc->NextWordEnd(currentPos, 1), 1));
                SetLastXChosen();
                break;
                SetLastXChosen();
                break;
+       case SCI_WORDRIGHTENDEXTEND:
+               MovePositionTo(MovePositionSoVisible(pdoc->NextWordEnd(currentPos, 1), 1), selStream);
+               SetLastXChosen();
+               break;
+
        case SCI_HOME:
                MovePositionTo(pdoc->LineStart(pdoc->LineFromPosition(currentPos)));
                SetLastXChosen();
                break;
        case SCI_HOMEEXTEND:
        case SCI_HOME:
                MovePositionTo(pdoc->LineStart(pdoc->LineFromPosition(currentPos)));
                SetLastXChosen();
                break;
        case SCI_HOMEEXTEND:
-               MovePositionTo(pdoc->LineStart(pdoc->LineFromPosition(currentPos)), true);
+               MovePositionTo(pdoc->LineStart(pdoc->LineFromPosition(currentPos)), selStream);
+               SetLastXChosen();
+               break;
+       case SCI_HOMERECTEXTEND:
+               MovePositionTo(pdoc->LineStart(pdoc->LineFromPosition(currentPos)), selRectangle);
                SetLastXChosen();
                break;
        case SCI_LINEEND:
                SetLastXChosen();
                break;
        case SCI_LINEEND:
@@ -3724,7 +3974,11 @@ int Editor::KeyCommand(unsigned int iMessage) {
                SetLastXChosen();
                break;
        case SCI_LINEENDEXTEND:
                SetLastXChosen();
                break;
        case SCI_LINEENDEXTEND:
-               MovePositionTo(pdoc->LineEndPosition(currentPos), true);
+               MovePositionTo(pdoc->LineEndPosition(currentPos), selStream);
+               SetLastXChosen();
+               break;
+       case SCI_LINEENDRECTEXTEND:
+               MovePositionTo(pdoc->LineEndPosition(currentPos), selRectangle);
                SetLastXChosen();
                break;
        case SCI_HOMEWRAP: {
                SetLastXChosen();
                break;
        case SCI_HOMEWRAP: {
@@ -3739,7 +3993,7 @@ int Editor::KeyCommand(unsigned int iMessage) {
                        int homePos = MovePositionSoVisible(StartEndDisplayLine(currentPos, true), -1);
                        if (currentPos <= homePos)
                                homePos = pdoc->LineStart(pdoc->LineFromPosition(currentPos));
                        int homePos = MovePositionSoVisible(StartEndDisplayLine(currentPos, true), -1);
                        if (currentPos <= homePos)
                                homePos = pdoc->LineStart(pdoc->LineFromPosition(currentPos));
-                       MovePositionTo(homePos, true);
+                       MovePositionTo(homePos, selStream);
                        SetLastXChosen();
                }
                break;
                        SetLastXChosen();
                }
                break;
@@ -3755,7 +4009,7 @@ int Editor::KeyCommand(unsigned int iMessage) {
                        int endPos = MovePositionSoVisible(StartEndDisplayLine(currentPos, false), 1);
                        if (currentPos >= endPos)
                                endPos = pdoc->LineEndPosition(currentPos);
                        int endPos = MovePositionSoVisible(StartEndDisplayLine(currentPos, false), 1);
                        if (currentPos >= endPos)
                                endPos = pdoc->LineEndPosition(currentPos);
-                       MovePositionTo(endPos, true);
+                       MovePositionTo(endPos, selStream);
                        SetLastXChosen();
                }
                break;
                        SetLastXChosen();
                }
                break;
@@ -3764,7 +4018,7 @@ int Editor::KeyCommand(unsigned int iMessage) {
                SetLastXChosen();
                break;
        case SCI_DOCUMENTSTARTEXTEND:
                SetLastXChosen();
                break;
        case SCI_DOCUMENTSTARTEXTEND:
-               MovePositionTo(0, true);
+               MovePositionTo(0, selStream);
                SetLastXChosen();
                break;
        case SCI_DOCUMENTEND:
                SetLastXChosen();
                break;
        case SCI_DOCUMENTEND:
@@ -3772,20 +4026,38 @@ int Editor::KeyCommand(unsigned int iMessage) {
                SetLastXChosen();
                break;
        case SCI_DOCUMENTENDEXTEND:
                SetLastXChosen();
                break;
        case SCI_DOCUMENTENDEXTEND:
-               MovePositionTo(pdoc->Length(), true);
+               MovePositionTo(pdoc->Length(), selStream);
                SetLastXChosen();
                break;
                SetLastXChosen();
                break;
+       case SCI_STUTTEREDPAGEUP:
+               PageMove(-1, noSel, true);
+               break;
+       case SCI_STUTTEREDPAGEUPEXTEND:
+               PageMove(-1, selStream, true);
+               break;
+       case SCI_STUTTEREDPAGEDOWN:
+               PageMove(1, noSel, true);
+               break;
+       case SCI_STUTTEREDPAGEDOWNEXTEND:
+               PageMove(1, selStream, true);
+               break;
        case SCI_PAGEUP:
                PageMove(-1);
                break;
        case SCI_PAGEUPEXTEND:
        case SCI_PAGEUP:
                PageMove(-1);
                break;
        case SCI_PAGEUPEXTEND:
-               PageMove(-1, true);
+               PageMove(-1, selStream);
+               break;
+       case SCI_PAGEUPRECTEXTEND:
+               PageMove(-1, selRectangle);
                break;
        case SCI_PAGEDOWN:
                PageMove(1);
                break;
        case SCI_PAGEDOWNEXTEND:
                break;
        case SCI_PAGEDOWN:
                PageMove(1);
                break;
        case SCI_PAGEDOWNEXTEND:
-               PageMove(1, true);
+               PageMove(1, selStream);
+               break;
+       case SCI_PAGEDOWNRECTEXTEND:
+               PageMove(1, selRectangle);
                break;
        case SCI_EDITTOGGLEOVERTYPE:
                inOverstrike = !inOverstrike;
                break;
        case SCI_EDITTOGGLEOVERTYPE:
                inOverstrike = !inOverstrike;
@@ -3828,7 +4100,11 @@ int Editor::KeyCommand(unsigned int iMessage) {
                SetLastXChosen();
                break;
        case SCI_VCHOMEEXTEND:
                SetLastXChosen();
                break;
        case SCI_VCHOMEEXTEND:
-               MovePositionTo(pdoc->VCHomePosition(currentPos), true);
+               MovePositionTo(pdoc->VCHomePosition(currentPos), selStream);
+               SetLastXChosen();
+               break;
+       case SCI_VCHOMERECTEXTEND:
+               MovePositionTo(pdoc->VCHomePosition(currentPos), selRectangle);
                SetLastXChosen();
                break;
        case SCI_VCHOMEWRAP: {
                SetLastXChosen();
                break;
        case SCI_VCHOMEWRAP: {
@@ -3847,7 +4123,7 @@ int Editor::KeyCommand(unsigned int iMessage) {
                        if ((viewLineStart < currentPos) && (viewLineStart > homePos))
                                homePos = viewLineStart;
 
                        if ((viewLineStart < currentPos) && (viewLineStart > homePos))
                                homePos = viewLineStart;
 
-                       MovePositionTo(homePos, true);
+                       MovePositionTo(homePos, selStream);
                        SetLastXChosen();
                }
                break;
                        SetLastXChosen();
                }
                break;
@@ -3930,7 +4206,7 @@ int Editor::KeyCommand(unsigned int iMessage) {
                SetLastXChosen();
                break;
        case SCI_WORDPARTLEFTEXTEND:
                SetLastXChosen();
                break;
        case SCI_WORDPARTLEFTEXTEND:
-               MovePositionTo(MovePositionSoVisible(pdoc->WordPartLeft(currentPos), -1), true);
+               MovePositionTo(MovePositionSoVisible(pdoc->WordPartLeft(currentPos), -1), selStream);
                SetLastXChosen();
                break;
        case SCI_WORDPARTRIGHT:
                SetLastXChosen();
                break;
        case SCI_WORDPARTRIGHT:
@@ -3938,7 +4214,7 @@ int Editor::KeyCommand(unsigned int iMessage) {
                SetLastXChosen();
                break;
        case SCI_WORDPARTRIGHTEXTEND:
                SetLastXChosen();
                break;
        case SCI_WORDPARTRIGHTEXTEND:
-               MovePositionTo(MovePositionSoVisible(pdoc->WordPartRight(currentPos), 1), true);
+               MovePositionTo(MovePositionSoVisible(pdoc->WordPartRight(currentPos), 1), selStream);
                SetLastXChosen();
                break;
        case SCI_HOMEDISPLAY:
                SetLastXChosen();
                break;
        case SCI_HOMEDISPLAY:
@@ -3948,7 +4224,7 @@ int Editor::KeyCommand(unsigned int iMessage) {
                break;
        case SCI_HOMEDISPLAYEXTEND:
                MovePositionTo(MovePositionSoVisible(
                break;
        case SCI_HOMEDISPLAYEXTEND:
                MovePositionTo(MovePositionSoVisible(
-                                  StartEndDisplayLine(currentPos, true), -1), true);
+                                  StartEndDisplayLine(currentPos, true), -1), selStream);
                SetLastXChosen();
                break;
        case SCI_LINEENDDISPLAY:
                SetLastXChosen();
                break;
        case SCI_LINEENDDISPLAY:
@@ -3958,7 +4234,7 @@ int Editor::KeyCommand(unsigned int iMessage) {
                break;
        case SCI_LINEENDDISPLAYEXTEND:
                MovePositionTo(MovePositionSoVisible(
                break;
        case SCI_LINEENDDISPLAYEXTEND:
                MovePositionTo(MovePositionSoVisible(
-                                  StartEndDisplayLine(currentPos, false), 1), true);
+                                  StartEndDisplayLine(currentPos, false), 1), selStream);
                SetLastXChosen();
                break;
        }
                SetLastXChosen();
                break;
        }
@@ -4073,9 +4349,9 @@ void Editor::Indent(bool forwards) {
  * @return The position of the found text, -1 if not found.
  */
 long Editor::FindText(
  * @return The position of the found text, -1 if not found.
  */
 long Editor::FindText(
-    uptr_t wParam,             ///< Search modes : @c SCFIND_MATCHCASE, @c SCFIND_WHOLEWORD,
-    ///< @c SCFIND_WORDSTART, @c SCFIND_REGEXP or @c SCFIND_POSIX.
-    sptr_t lParam) {                   ///< @c TextToFind structure: The text to search for in the given range.
+       uptr_t wParam,          ///< Search modes : @c SCFIND_MATCHCASE, @c SCFIND_WHOLEWORD,
+                                               ///< @c SCFIND_WORDSTART, @c SCFIND_REGEXP or @c SCFIND_POSIX.
+       sptr_t lParam) {        ///< @c TextToFind structure: The text to search for in the given range.
 
        TextToFind *ft = reinterpret_cast<TextToFind *>(lParam);
        int lengthFound = istrlen(ft->lpstrText);
 
        TextToFind *ft = reinterpret_cast<TextToFind *>(lParam);
        int lengthFound = istrlen(ft->lpstrText);
@@ -4114,9 +4390,9 @@ void Editor::SearchAnchor() {
  * @return The position of the found text, -1 if not found.
  */
 long Editor::SearchText(
  * @return The position of the found text, -1 if not found.
  */
 long Editor::SearchText(
-    unsigned int iMessage,             ///< Accepts both @c SCI_SEARCHNEXT and @c SCI_SEARCHPREV.
-    uptr_t wParam,             ///< Search modes : @c SCFIND_MATCHCASE, @c SCFIND_WHOLEWORD,
-    ///< @c SCFIND_WORDSTART or @c SCFIND_REGEXP.
+    unsigned int iMessage,             ///< Accepts both @c SCI_SEARCHNEXT and @c SCI_SEARCHPREV.
+    uptr_t wParam,                             ///< Search modes : @c SCFIND_MATCHCASE, @c SCFIND_WHOLEWORD,
+                                                               ///< @c SCFIND_WORDSTART, @c SCFIND_REGEXP or @c SCFIND_POSIX.
     sptr_t lParam) {                   ///< The text to search for.
 
        const char *txt = reinterpret_cast<char *>(lParam);
     sptr_t lParam) {                   ///< The text to search for.
 
        const char *txt = reinterpret_cast<char *>(lParam);
@@ -4205,36 +4481,45 @@ void Editor::CopySelectionFromRange(SelectionText *ss, int start, int end) {
 }
 
 void Editor::CopySelectionRange(SelectionText *ss) {
 }
 
 void Editor::CopySelectionRange(SelectionText *ss) {
-       if (selType == selRectangle) {
+       if (selType == selStream) {
+               CopySelectionFromRange(ss, SelectionStart(), SelectionEnd());
+       } else {
                char *text = 0;
                int size = 0;
                char *text = 0;
                int size = 0;
-               int lineStart = pdoc->LineFromPosition(SelectionStart());
-               int lineEnd = pdoc->LineFromPosition(SelectionEnd());
-               int line;
-               for (line = lineStart; line <= lineEnd; line++) {
-                       size += SelectionEnd(line) - SelectionStart(line) + 1;
-                       if (pdoc->eolMode == SC_EOL_CRLF)
+               SelectionLineIterator lineIterator(this);
+               while (lineIterator.Iterate()) {
+                       size += lineIterator.endPos - lineIterator.startPos;
+                       if (selType != selLines) {
                                size++;
                                size++;
+                               if (pdoc->eolMode == SC_EOL_CRLF) {
+                                       size++;
+                               }
+                       }
                }
                if (size > 0) {
                        text = new char[size + 1];
                        if (text) {
                                int j = 0;
                }
                if (size > 0) {
                        text = new char[size + 1];
                        if (text) {
                                int j = 0;
-                               for (line = lineStart; line <= lineEnd; line++) {
-                                       for (int i = SelectionStart(line);i < SelectionEnd(line);i++) {
+                               lineIterator.Reset();
+                               while (lineIterator.Iterate()) {
+                                       for (int i = lineIterator.startPos;
+                                                i < lineIterator.endPos;
+                                                i++) {
                                                text[j++] = pdoc->CharAt(i);
                                        }
                                                text[j++] = pdoc->CharAt(i);
                                        }
-                                       if (pdoc->eolMode != SC_EOL_LF)
-                                               text[j++] = '\r';
-                                       if (pdoc->eolMode != SC_EOL_CR)
-                                               text[j++] = '\n';
+                                       if (selType != selLines) {
+                                               if (pdoc->eolMode != SC_EOL_LF) {
+                                                       text[j++] = '\r';
+                                               }
+                                               if (pdoc->eolMode != SC_EOL_CR) {
+                                                       text[j++] = '\n';
+                                               }
+                                       }
                                }
                                text[size] = '\0';
                        }
                }
                                }
                                text[size] = '\0';
                        }
                }
-               ss->Set(text, size + 1, true);
-       } else {
-               CopySelectionFromRange(ss, SelectionStart(), SelectionEnd());
+               ss->Set(text, size + 1, selType == selRectangle);
        }
 }
 
        }
 }
 
@@ -4300,17 +4585,14 @@ void Editor::DropAt(int position, const char *value, bool moving, bool rectangul
                int positionAfterDeletion = position;
                if (inDragDrop && moving) {
                        // Remove dragged out text
                int positionAfterDeletion = position;
                if (inDragDrop && moving) {
                        // Remove dragged out text
-                       if (rectangular) {
-                               int lineStart = pdoc->LineFromPosition(SelectionStart());
-                               int lineEnd = pdoc->LineFromPosition(SelectionEnd());
-                               for (int line = lineStart; line <= lineEnd; line++) {
-                                       int startPos = SelectionStart(line);
-                                       int endPos = SelectionEnd(line);
-                                       if (position >= startPos) {
-                                               if (position > endPos) {
-                                                       positionAfterDeletion -= endPos - startPos;
+                       if (rectangular || selType == selLines) {
+                               SelectionLineIterator lineIterator(this);
+                               while (lineIterator.Iterate()) {
+                                       if (position >= lineIterator.startPos) {
+                                               if (position > lineIterator.endPos) {
+                                                       positionAfterDeletion -= lineIterator.endPos - lineIterator.startPos;
                                                } else {
                                                } else {
-                                                       positionAfterDeletion -= position - startPos;
+                                                       positionAfterDeletion -= position - lineIterator.startPos;
                                                }
                                        }
                                }
                                                }
                                        }
                                }
@@ -4327,7 +4609,7 @@ void Editor::DropAt(int position, const char *value, bool moving, bool rectangul
                        PasteRectangular(position, value, istrlen(value));
                        pdoc->EndUndoAction();
                        // Should try to select new rectangle but it may not be a rectangle now so just select the drop position
                        PasteRectangular(position, value, istrlen(value));
                        pdoc->EndUndoAction();
                        // Should try to select new rectangle but it may not be a rectangle now so just select the drop position
-                       SetSelection(position, position);
+                       SetEmptySelection(position);
                } else {
                        position = MovePositionOutsideChar(position, currentPos - position);
                        if (pdoc->InsertString(position, value)) {
                } else {
                        position = MovePositionOutsideChar(position, currentPos - position);
                        if (pdoc->InsertString(position, value)) {
@@ -4336,53 +4618,65 @@ void Editor::DropAt(int position, const char *value, bool moving, bool rectangul
                        pdoc->EndUndoAction();
                }
        } else if (inDragDrop) {
                        pdoc->EndUndoAction();
                }
        } else if (inDragDrop) {
-               SetSelection(position, position);
+               SetEmptySelection(position);
        }
 }
 
        }
 }
 
-static int BeforeInOrAfter(int val, int minim, int maxim) {
-       if (val < minim)
+/**
+ * @return -1 if given position is before the selection,
+ *          1 if position is after the selection,
+ *          0 if position is inside the selection,
+ */
+int Editor::PositionInSelection(int pos) {
+       pos = MovePositionOutsideChar(pos, currentPos - pos);
+       if (pos < SelectionStart()) {
                return -1;
                return -1;
-       else if (val > maxim)
+       }
+       if (pos > SelectionEnd()) {
                return 1;
                return 1;
-       else
+       }
+       if (selType == selStream) {
                return 0;
                return 0;
-}
-
-int Editor::PositionInSelection(int pos) {
-       pos = MovePositionOutsideChar(pos, currentPos - pos);
-       if (selType == selRectangle) {
-               if (pos < SelectionStart())
+       } else {
+               SelectionLineIterator lineIterator(this);
+               lineIterator.SetAt(pdoc->LineFromPosition(pos));
+               if (pos < lineIterator.startPos) {
                        return -1;
                        return -1;
-               if (pos > SelectionEnd())
+               } else if (pos > lineIterator.endPos) {
                        return 1;
                        return 1;
-               int linePos = pdoc->LineFromPosition(pos);
-               return BeforeInOrAfter(pos, SelectionStart(linePos), SelectionEnd(linePos));
-       } else {
-               if (currentPos > anchor) {
-                       return BeforeInOrAfter(pos, anchor, currentPos);
-               } else if (currentPos < anchor) {
-                       return BeforeInOrAfter(pos, currentPos, anchor);
+               } else {
+                       return 0;
                }
        }
                }
        }
-       return 1;
 }
 
 bool Editor::PointInSelection(Point pt) {
 }
 
 bool Editor::PointInSelection(Point pt) {
-       // TODO: fix up for rectangular selection
        int pos = PositionFromLocation(pt);
        if (0 == PositionInSelection(pos)) {
        int pos = PositionFromLocation(pt);
        if (0 == PositionInSelection(pos)) {
-               if (pos == SelectionStart()) {
+               // Probably inside, but we must make a finer test
+               int selStart, selEnd;
+               if (selType == selStream) {
+                       selStart = SelectionStart();
+                       selEnd = SelectionEnd();
+               } else {
+                       SelectionLineIterator lineIterator(this);
+                       lineIterator.SetAt(pdoc->LineFromPosition(pos));
+                       selStart = lineIterator.startPos;
+                       selEnd = lineIterator.endPos;
+               }
+               if (pos == selStart) {
                        // see if just before selection
                        Point locStart = LocationFromPosition(pos);
                        // see if just before selection
                        Point locStart = LocationFromPosition(pos);
-                       if (pt.x < locStart.x)
+                       if (pt.x < locStart.x) {
                                return false;
                                return false;
+                       }
                }
                }
-               if (pos == SelectionEnd()) {
+               if (pos == selEnd) {
                        // see if just after selection
                        Point locEnd = LocationFromPosition(pos);
                        // see if just after selection
                        Point locEnd = LocationFromPosition(pos);
-                       if (pt.x > locEnd.x)
+                       if (pt.x > locEnd.x) {
                                return false;
                                return false;
+                       }
                }
                return true;
        }
                }
                return true;
        }
@@ -4430,6 +4724,7 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b
        int newPos = PositionFromLocation(pt);
        newPos = MovePositionOutsideChar(newPos, currentPos - newPos);
        inDragDrop = false;
        int newPos = PositionFromLocation(pt);
        newPos = MovePositionOutsideChar(newPos, currentPos - newPos);
        inDragDrop = false;
+       moveExtendsSelection = false;
 
        bool processed = NotifyMarginClick(pt, shift, ctrl, alt);
        if (processed)
 
        bool processed = NotifyMarginClick(pt, shift, ctrl, alt);
        if (processed)
@@ -4475,7 +4770,7 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b
                //Platform::DebugPrintf("Double click: %d - %d\n", anchor, currentPos);
                if (doubleClick) {
                        NotifyDoubleClick(pt, shift);
                //Platform::DebugPrintf("Double click: %d - %d\n", anchor, currentPos);
                if (doubleClick) {
                        NotifyDoubleClick(pt, shift);
-                       if (PositionIsHotspot(newPos))
+                       if (PointIsHotspot(newPos))
                                NotifyHotSpotDoubleClicked(newPos, shift, ctrl, alt);
                }
        } else {        // Single click
                                NotifyHotSpotDoubleClicked(newPos, shift, ctrl, alt);
                }
        } else {        // Single click
@@ -4507,7 +4802,7 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b
                        SetMouseCapture(true);
                        selectionType = selLine;
                } else {
                        SetMouseCapture(true);
                        selectionType = selLine;
                } else {
-                       if (PositionIsHotspot(newPos)) {
+                       if (PointIsHotspot(pt)) {
                                NotifyHotSpotClicked(newPos, shift, ctrl, alt);
                        }
                        if (!shift) {
                                NotifyHotSpotClicked(newPos, shift, ctrl, alt);
                        }
                        if (!shift) {
@@ -4519,13 +4814,13 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b
                                CopySelectionRange(&drag);
                                StartDrag();
                        } else {
                                CopySelectionRange(&drag);
                                StartDrag();
                        } else {
-                               xStartSelect = pt.x - vs.fixedColumnWidth + xOffset;
-                               xEndSelect = pt.x - vs.fixedColumnWidth + xOffset;
                                SetDragPosition(invalidPosition);
                                SetMouseCapture(true);
                                SetDragPosition(invalidPosition);
                                SetMouseCapture(true);
-                               if (!shift)
+                               if (!shift) {
                                        SetEmptySelection(newPos);
                                        SetEmptySelection(newPos);
+                               }
                                selType = alt ? selRectangle : selStream;
                                selType = alt ? selRectangle : selStream;
+                               xStartSelect = xEndSelect = pt.x - vs.fixedColumnWidth + xOffset;
                                selectionType = selChar;
                                originalAnchorPos = currentPos;
                        }
                                selectionType = selChar;
                                originalAnchorPos = currentPos;
                        }
@@ -4537,11 +4832,13 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b
 }
 
 bool Editor::PositionIsHotspot(int position) {
 }
 
 bool Editor::PositionIsHotspot(int position) {
-       return vs.styles[pdoc->StyleAt(position)].hotspot;
+       return vs.styles[pdoc->StyleAt(position) & pdoc->stylingBitsMask].hotspot;
 }
 
 bool Editor::PointIsHotspot(Point pt) {
 }
 
 bool Editor::PointIsHotspot(Point pt) {
-       int pos = PositionFromLocation(pt);
+       int pos = PositionFromLocationClose(pt);
+       if (pos == INVALID_POSITION)
+               return false;
        return PositionIsHotspot(pos);
 }
 
        return PositionIsHotspot(pos);
 }
 
@@ -4552,8 +4849,8 @@ void Editor::SetHotSpotRange(Point *pt) {
                // If we don't limit this to word characters then the
                // range can encompass more than the run range and then
                // the underline will not be drawn properly.
                // If we don't limit this to word characters then the
                // range can encompass more than the run range and then
                // the underline will not be drawn properly.
-               int hsStart_ = pdoc->ExtendStyleRange(pos, -1);
-               int hsEnd_ = pdoc->ExtendStyleRange(pos, 1);
+               int hsStart_ = pdoc->ExtendStyleRange(pos, -1, vs.hotspotSingleLine);
+               int hsEnd_ = pdoc->ExtendStyleRange(pos, 1, vs.hotspotSingleLine);
 
                // Only invalidate the range if the hotspot range has changed...
                if (hsStart_ != hsStart || hsEnd_ != hsEnd) {
 
                // Only invalidate the range if the hotspot range has changed...
                if (hsStart_ != hsStart || hsEnd_ != hsEnd) {
@@ -4598,7 +4895,6 @@ void Editor::ButtonMove(Point pt) {
                autoScrollTimer.ticksToWait = autoScrollDelay;
 
                // Adjust selection
                autoScrollTimer.ticksToWait = autoScrollDelay;
 
                // Adjust selection
-               xEndSelect = pt.x - vs.fixedColumnWidth + xOffset;
                int movePos = PositionFromLocation(pt);
                movePos = MovePositionOutsideChar(movePos, currentPos - movePos);
                if (posDrag >= 0) {
                int movePos = PositionFromLocation(pt);
                movePos = MovePositionOutsideChar(movePos, currentPos - movePos);
                if (posDrag >= 0) {
@@ -4608,7 +4904,17 @@ void Editor::ButtonMove(Point pt) {
                                SetSelection(movePos);
                        } else if (selectionType == selWord) {
                                // Continue selecting by word
                                SetSelection(movePos);
                        } else if (selectionType == selWord) {
                                // Continue selecting by word
-                               if (movePos >= originalAnchorPos) {     // Moved forward
+                               if (movePos == originalAnchorPos) {     // Didn't move
+                                       // No need to do anything. Previously this case was lumped
+                                       // in with "Moved forward", but that can be harmful in this
+                                       // case: a handler for the NotifyDoubleClick re-adjusts
+                                       // the selection for a fancier definition of "word" (for
+                                       // example, in Perl it is useful to include the leading
+                                       // '$', '%' or '@' on variables for word selection). In this
+                                       // the ButtonMove() called via Tick() for auto-scrolling
+                                       // could result in the fancier word selection adjustment
+                                       // being unmade.
+                               } else if (movePos > originalAnchorPos) {       // Moved forward
                                        SetSelection(pdoc->ExtendWordSelect(movePos, 1),
                                                     pdoc->ExtendWordSelect(originalAnchorPos, -1));
                                } else {        // Moved backward
                                        SetSelection(pdoc->ExtendWordSelect(movePos, 1),
                                                     pdoc->ExtendWordSelect(originalAnchorPos, -1));
                                } else {        // Moved backward
@@ -4621,6 +4927,9 @@ void Editor::ButtonMove(Point pt) {
                                LineSelection(lineMove, lineAnchor);
                        }
                }
                                LineSelection(lineMove, lineAnchor);
                        }
                }
+               // While dragging to make rectangular selection, we don't want the current
+               // position to jump to the end of smaller or empty lines.
+               xEndSelect = pt.x - vs.fixedColumnWidth + xOffset;
 
                // Autoscroll
                PRectangle rcClient = GetClientRectangle();
 
                // Autoscroll
                PRectangle rcClient = GetClientRectangle();
@@ -4659,7 +4968,6 @@ void Editor::ButtonMove(Point pt) {
                        SetHotSpotRange(NULL);
                }
        }
                        SetHotSpotRange(NULL);
                }
        }
-
 }
 
 void Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) {
 }
 
 void Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) {
@@ -4671,7 +4979,6 @@ void Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) {
                        DisplayCursor(Window::cursorText);
                        SetHotSpotRange(NULL);
                }
                        DisplayCursor(Window::cursorText);
                        SetHotSpotRange(NULL);
                }
-               xEndSelect = pt.x - vs.fixedColumnWidth + xOffset;
                ptMouseLast = pt;
                SetMouseCapture(false);
                int newPos = PositionFromLocation(pt);
                ptMouseLast = pt;
                SetMouseCapture(false);
                int newPos = PositionFromLocation(pt);
@@ -4708,6 +5015,9 @@ void Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) {
                                SetSelection(newPos);
                        }
                }
                                SetSelection(newPos);
                        }
                }
+               // Now we rely on the current pos to compute rectangular selection
+               xStartSelect = XFromPosition(anchor);
+               xEndSelect = XFromPosition(currentPos);
                lastClickTime = curTime;
                lastClick = pt;
                lastXChosen = pt.x;
                lastClickTime = curTime;
                lastClick = pt;
                lastXChosen = pt.x;
@@ -4745,6 +5055,30 @@ void Editor::Tick() {
        }
 }
 
        }
 }
 
+bool Editor::Idle() {
+
+       bool idleDone;
+
+       bool wrappingDone = (wrapState == eWrapNone) || (!backgroundWrapEnabled);
+
+       if (!wrappingDone) {
+               // Wrap lines during idle.
+               WrapLines(false, -1);
+               // No more wrapping
+               if (docLineLastWrapped == docLastLineToWrap)
+                       wrappingDone = true;
+       }
+
+       // Add more idle things to do here, but make sure idleDone is
+       // set correctly before the function returns. returning
+       // false will stop calling this idle funtion until SetIdle() is
+       // called again.
+
+       idleDone = wrappingDone; // && thatDone && theOtherThingDone...
+
+       return !idleDone;
+}
+
 void Editor::SetFocusState(bool focusState) {
        hasFocus = focusState;
        NotifyFocus(hasFocus);
 void Editor::SetFocusState(bool focusState) {
        hasFocus = focusState;
        NotifyFocus(hasFocus);
@@ -4898,6 +5232,7 @@ void Editor::SetDocPointer(Document *document) {
        pdoc->AddRef();
 
        // Ensure all positions within document
        pdoc->AddRef();
 
        // Ensure all positions within document
+       selType = selStream;
        currentPos = 0;
        anchor = 0;
        targetStart = 0;
        currentPos = 0;
        anchor = 0;
        targetStart = 0;
@@ -4914,7 +5249,9 @@ void Editor::SetDocPointer(Document *document) {
        SetScrollBars();
 }
 
        SetScrollBars();
 }
 
-// Recursively expand a fold, making lines visible except where they have an unexpanded parent
+/**
+ * Recursively expand a fold, making lines visible except where they have an unexpanded parent.
+ */
 void Editor::Expand(int &line, bool doExpand) {
        int lineMaxSubord = pdoc->GetLastChild(line);
        line++;
 void Editor::Expand(int &line, bool doExpand) {
        int lineMaxSubord = pdoc->GetLastChild(line);
        line++;
@@ -4953,12 +5290,14 @@ void Editor::ToggleContraction(int line) {
        }
 }
 
        }
 }
 
-// Recurse up from this line to find any folds that prevent this line from being visible
-// and unfold them all->
+/**
+ * Recurse up from this line to find any folds that prevent this line from being visible
+ * and unfold them all.
+ */
 void Editor::EnsureLineVisible(int lineDoc, bool enforcePolicy) {
 
        // In case in need of wrapping to ensure DisplayFromDoc works.
 void Editor::EnsureLineVisible(int lineDoc, bool enforcePolicy) {
 
        // In case in need of wrapping to ensure DisplayFromDoc works.
-       WrapLines();
+       WrapLines(true, -1);
 
        if (!cs.GetVisible(lineDoc)) {
                int lineParent = pdoc->GetFoldParent(lineDoc);
 
        if (!cs.GetVisible(lineDoc)) {
                int lineParent = pdoc->GetFoldParent(lineDoc);
@@ -5157,7 +5496,6 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                        if (selectedText.len) {
                                for (; iChar < selectedText.len; iChar++)
                                        ptr[iChar] = selectedText.s[iChar];
                        if (selectedText.len) {
                                for (; iChar < selectedText.len; iChar++)
                                        ptr[iChar] = selectedText.s[iChar];
-                               ptr[iChar] = '\0';
                        } else {
                                ptr[0] = '\0';
                        }
                        } else {
                                ptr[0] = '\0';
                        }
@@ -5307,6 +5645,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                        int cpMax = tr->chrg.cpMax;
                        if (cpMax == -1)
                                cpMax = pdoc->Length();
                        int cpMax = tr->chrg.cpMax;
                        if (cpMax == -1)
                                cpMax = pdoc->Length();
+                       PLATFORM_ASSERT(cpMax <= pdoc->Length());
                        int len = cpMax - tr->chrg.cpMin;       // No -1 as cpMin and cpMax are referring to inter character positions
                        pdoc->GetCharRange(tr->lpstrText, tr->chrg.cpMin, len);
                        // Spec says copied text is terminated with a NUL
                        int len = cpMax - tr->chrg.cpMin;       // No -1 as cpMin and cpMax are referring to inter character positions
                        pdoc->GetCharRange(tr->lpstrText, tr->chrg.cpMin, len);
                        // Spec says copied text is terminated with a NUL
@@ -5360,7 +5699,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                        if (lParam == 0)
                                return 0;
                        int insertPos = wParam;
                        if (lParam == 0)
                                return 0;
                        int insertPos = wParam;
-                       if (static_cast<short>(wParam) == -1)
+                       if (static_cast<int>(wParam) == -1)
                                insertPos = CurrentPosition();
                        int newCurrent = CurrentPosition();
                        char *sz = CharPtrFromSPtr(lParam);
                                insertPos = CurrentPosition();
                        int newCurrent = CurrentPosition();
                        char *sz = CharPtrFromSPtr(lParam);
@@ -5406,12 +5745,24 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                break;
 
        case SCI_SETWORDCHARS: {
                break;
 
        case SCI_SETWORDCHARS: {
+                       pdoc->SetDefaultCharClasses();
                        if (lParam == 0)
                                return 0;
                        if (lParam == 0)
                                return 0;
-                       pdoc->SetWordChars(reinterpret_cast<unsigned char *>(lParam));
+                       pdoc->SetCharClasses(reinterpret_cast<unsigned char *>(lParam), Document::ccWord);
                }
                break;
 
                }
                break;
 
+       case SCI_SETWHITESPACECHARS: {
+                       if (lParam == 0)
+                               return 0;
+                       pdoc->SetCharClasses(reinterpret_cast<unsigned char *>(lParam), Document::ccSpace);
+               }
+               break;
+
+       case SCI_SETCHARSDEFAULT:
+               pdoc->SetDefaultCharClasses();
+               break;
+
        case SCI_GETLENGTH:
                return pdoc->Length();
 
        case SCI_GETLENGTH:
                return pdoc->Length();
 
@@ -5468,7 +5819,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                return printWrapState;
 
        case SCI_GETSTYLEAT:
                return printWrapState;
 
        case SCI_GETSTYLEAT:
-               if (static_cast<short>(wParam) >= pdoc->Length())
+               if (static_cast<int>(wParam) >= pdoc->Length())
                        return 0;
                else
                        return pdoc->StyleAt(wParam);
                        return 0;
                else
                        return pdoc->StyleAt(wParam);
@@ -5843,8 +6194,11 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
 
        case SCI_SETMARGINWIDTHN:
                if (ValidMargin(wParam)) {
 
        case SCI_SETMARGINWIDTHN:
                if (ValidMargin(wParam)) {
-                       vs.ms[wParam].width = lParam;
-                       InvalidateStyleRedraw();
+                       // Short-circuit if the width is unchanged, to avoid unnecessary redraw.
+                       if (vs.ms[wParam].width != lParam) {
+                               vs.ms[wParam].width = lParam;
+                               InvalidateStyleRedraw();
+                       }
                }
                break;
 
                }
                break;
 
@@ -6192,6 +6546,10 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
        case SCI_WORDLEFTEXTEND:
        case SCI_WORDRIGHT:
        case SCI_WORDRIGHTEXTEND:
        case SCI_WORDLEFTEXTEND:
        case SCI_WORDRIGHT:
        case SCI_WORDRIGHTEXTEND:
+       case SCI_WORDLEFTEND:
+       case SCI_WORDLEFTENDEXTEND:
+       case SCI_WORDRIGHTEND:
+       case SCI_WORDRIGHTENDEXTEND:
        case SCI_HOME:
        case SCI_HOMEEXTEND:
        case SCI_LINEEND:
        case SCI_HOME:
        case SCI_HOMEEXTEND:
        case SCI_LINEEND:
@@ -6204,6 +6562,12 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
        case SCI_DOCUMENTSTARTEXTEND:
        case SCI_DOCUMENTEND:
        case SCI_DOCUMENTENDEXTEND:
        case SCI_DOCUMENTSTARTEXTEND:
        case SCI_DOCUMENTEND:
        case SCI_DOCUMENTENDEXTEND:
+
+       case SCI_STUTTEREDPAGEUP:
+       case SCI_STUTTEREDPAGEUPEXTEND:
+       case SCI_STUTTEREDPAGEDOWN:
+       case SCI_STUTTEREDPAGEDOWNEXTEND:
+
        case SCI_PAGEUP:
        case SCI_PAGEUPEXTEND:
        case SCI_PAGEDOWN:
        case SCI_PAGEUP:
        case SCI_PAGEUPEXTEND:
        case SCI_PAGEDOWN:
@@ -6243,6 +6607,15 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
        case SCI_HOMEDISPLAYEXTEND:
        case SCI_LINEENDDISPLAY:
        case SCI_LINEENDDISPLAYEXTEND:
        case SCI_HOMEDISPLAYEXTEND:
        case SCI_LINEENDDISPLAY:
        case SCI_LINEENDDISPLAYEXTEND:
+       case SCI_LINEDOWNRECTEXTEND:
+       case SCI_LINEUPRECTEXTEND:
+       case SCI_CHARLEFTRECTEXTEND:
+       case SCI_CHARRIGHTRECTEXTEND:
+       case SCI_HOMERECTEXTEND:
+       case SCI_VCHOMERECTEXTEND:
+       case SCI_LINEENDRECTEXTEND:
+       case SCI_PAGEUPRECTEXTEND:
+       case SCI_PAGEDOWNRECTEXTEND:
                return KeyCommand(iMessage);
 
        case SCI_BRACEHIGHLIGHT:
                return KeyCommand(iMessage);
 
        case SCI_BRACEHIGHLIGHT:
@@ -6336,7 +6709,49 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                return 0;
 
        case SCI_SELECTIONISRECTANGLE:
                return 0;
 
        case SCI_SELECTIONISRECTANGLE:
-               return (selType == selRectangle) ? 1 : 0;
+               return selType == selRectangle ? 1 : 0;
+
+       case SCI_SETSELECTIONMODE: {
+                       switch (wParam) {
+                       case SC_SEL_STREAM:
+                               moveExtendsSelection = !moveExtendsSelection || (selType != selStream);
+                               selType = selStream;
+                               break;
+                       case SC_SEL_RECTANGLE:
+                               moveExtendsSelection = !moveExtendsSelection || (selType != selRectangle);
+                               selType = selRectangle;
+                               break;
+                       case SC_SEL_LINES:
+                               moveExtendsSelection = !moveExtendsSelection || (selType != selLines);
+                               selType = selLines;
+                               break;
+                       default:
+                               moveExtendsSelection = !moveExtendsSelection || (selType != selStream);
+                               selType = selStream;
+                       }
+                       InvalidateSelection(currentPos, anchor);
+               }
+       case SCI_GETSELECTIONMODE:
+               switch (selType) {
+               case selStream:
+                       return SC_SEL_STREAM;
+               case selRectangle:
+                       return SC_SEL_RECTANGLE;
+               case selLines:
+                       return SC_SEL_LINES;
+               default:        // ?!
+                       return SC_SEL_STREAM;
+               }
+       case SCI_GETLINESELSTARTPOSITION: {
+                       SelectionLineIterator lineIterator(this);
+                       lineIterator.SetAt(wParam);
+                       return lineIterator.startPos;
+               }
+       case SCI_GETLINESELENDPOSITION: {
+                       SelectionLineIterator lineIterator(this);
+                       lineIterator.SetAt(wParam);
+                       return lineIterator.endPos;
+               }
 
        case SCI_SETOVERTYPE:
                inOverstrike = wParam != 0;
 
        case SCI_SETOVERTYPE:
                inOverstrike = wParam != 0;
@@ -6422,6 +6837,11 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                InvalidateStyleRedraw();
                break;
 
                InvalidateStyleRedraw();
                break;
 
+       case SCI_SETHOTSPOTSINGLELINE:
+               vs.hotspotSingleLine = wParam != 0;
+               InvalidateStyleRedraw();
+               break;
+
        default:
                return DefWndProc(iMessage, wParam, lParam);
        }
        default:
                return DefWndProc(iMessage, wParam, lParam);
        }
index bd4669192f7b5690a8877439155509818babf74d..08c56f7a4175205864c2936edf361c13f5c24e92 100644 (file)
@@ -31,6 +31,16 @@ public:
        Timer();
 };
 
        Timer();
 };
 
+/**
+ */
+class Idler {
+public:
+       bool state;
+       IdlerID idlerID;
+
+       Idler();
+};
+
 /**
  */
 class LineLayout {
 /**
  */
 class LineLayout {
@@ -115,6 +125,10 @@ public:
        void Dispose(LineLayout *ll);
 };
 
        void Dispose(LineLayout *ll);
 };
 
+/**
+ * Hold a piece of text selected for copying or dragging.
+ * The text is expected to hold a terminating '\0'.
+ */
 class SelectionText {
 public:
        char *s;
 class SelectionText {
 public:
        char *s;
@@ -208,6 +222,8 @@ protected:  // ScintillaBase subclass needs access to much of Editor
        Timer autoScrollTimer;
        enum { autoScrollDelay = 200 };
 
        Timer autoScrollTimer;
        enum { autoScrollDelay = 200 };
 
+       Idler idler;
+
        Point lastClick;
        unsigned int lastClickTime;
        int dwellDelay;
        Point lastClick;
        unsigned int lastClickTime;
        int dwellDelay;
@@ -244,9 +260,11 @@ protected: // ScintillaBase subclass needs access to much of Editor
        int modEventMask;
 
        SelectionText drag;
        int modEventMask;
 
        SelectionText drag;
-       enum { selStream, selRectangle, selRectangleFixed } selType;
-       int xStartSelect;
-       int xEndSelect;
+       enum selTypes { noSel, selStream, selRectangle, selLines };
+       selTypes selType;
+       bool moveExtendsSelection;
+       int xStartSelect;       ///< x position of start of rectangular selection
+       int xEndSelect;         ///< x position of end of rectangular selection
        bool primarySelection;
 
        int caretXPolicy;
        bool primarySelection;
 
        int caretXPolicy;
@@ -271,8 +289,10 @@ protected: // ScintillaBase subclass needs access to much of Editor
 
        // Wrapping support
        enum { eWrapNone, eWrapWord } wrapState;
 
        // Wrapping support
        enum { eWrapNone, eWrapWord } wrapState;
+       bool backgroundWrapEnabled;
        int wrapWidth;
        int docLineLastWrapped;
        int wrapWidth;
        int docLineLastWrapped;
+       int docLastLineToWrap;
 
        Document *pdoc;
 
 
        Document *pdoc;
 
@@ -310,15 +330,16 @@ protected:        // ScintillaBase subclass needs access to much of Editor
 
        int CurrentPosition();
        bool SelectionEmpty();
 
        int CurrentPosition();
        bool SelectionEmpty();
-       int SelectionStart(int line=-1);
-       int SelectionEnd(int line=-1);
+       int SelectionStart();
+       int SelectionEnd();
+       void InvalidateSelection(int currentPos_, int anchor_);
        void SetSelection(int currentPos_, int anchor_);
        void SetSelection(int currentPos_);
        void SetEmptySelection(int currentPos_);
        bool RangeContainsProtected(int start, int end) const;
        void SetSelection(int currentPos_, int anchor_);
        void SetSelection(int currentPos_);
        void SetEmptySelection(int currentPos_);
        bool RangeContainsProtected(int start, int end) const;
-       bool SelectionContainsProtected() const;
+       bool SelectionContainsProtected();
        int MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd=true);
        int MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd=true);
-       int MovePositionTo(int newPos, bool extend=false, bool ensureVisible=true);
+       int MovePositionTo(int newPos, selTypes sel=noSel, bool ensureVisible=true);
        int MovePositionSoVisible(int pos, int moveDir);
        void SetLastXChosen();
 
        int MovePositionSoVisible(int pos, int moveDir);
        void SetLastXChosen();
 
@@ -332,8 +353,8 @@ protected:  // ScintillaBase subclass needs access to much of Editor
        void DropCaret();
        void InvalidateCaret();
 
        void DropCaret();
        void InvalidateCaret();
 
-       void NeedWrapping(int docLineStartWrapping=0);
-       bool WrapLines();
+       void NeedWrapping(int docLineStartWrapping = 0, int docLineEndWrapping = 0x7ffffff);
+       bool WrapLines(bool fullWrap, int priorityWrapLineStart);
        void LinesJoin();
        void LinesSplit(int pixelWidth);
 
        void LinesJoin();
        void LinesSplit(int pixelWidth);
 
@@ -406,13 +427,13 @@ protected:        // ScintillaBase subclass needs access to much of Editor
        void NotifyStyleNeeded(Document *doc, void *userData, int endPos);
        void NotifyMacroRecord(unsigned int iMessage, uptr_t wParam, sptr_t lParam);
 
        void NotifyStyleNeeded(Document *doc, void *userData, int endPos);
        void NotifyMacroRecord(unsigned int iMessage, uptr_t wParam, sptr_t lParam);
 
-       void PageMove(int direction, bool extend=false);
+       void PageMove(int direction, selTypes sel=noSel, bool stuttered = false);
        void ChangeCaseOfSelection(bool makeUpperCase);
        void LineTranspose();
        void LineDuplicate();
        virtual void CancelModes();
        void NewLine();
        void ChangeCaseOfSelection(bool makeUpperCase);
        void LineTranspose();
        void LineDuplicate();
        virtual void CancelModes();
        void NewLine();
-       void CursorUpOrDown(int direction, bool extend=false);
+       void CursorUpOrDown(int direction, selTypes sel=noSel);
        int StartEndDisplayLine(int pos, bool start);
        virtual int KeyCommand(unsigned int iMessage);
        virtual int KeyDefault(int /* key */, int /*modifiers*/);
        int StartEndDisplayLine(int pos, bool start);
        virtual int KeyCommand(unsigned int iMessage);
        virtual int KeyDefault(int /* key */, int /*modifiers*/);
@@ -451,7 +472,9 @@ protected:  // ScintillaBase subclass needs access to much of Editor
        void ButtonUp(Point pt, unsigned int curTime, bool ctrl);
 
        void Tick();
        void ButtonUp(Point pt, unsigned int curTime, bool ctrl);
 
        void Tick();
+       bool Idle();
        virtual void SetTicking(bool on) = 0;
        virtual void SetTicking(bool on) = 0;
+       virtual bool SetIdle(bool) { return false; }
        virtual void SetMouseCapture(bool on) = 0;
        virtual bool HaveMouseCapture() = 0;
        void SetFocusState(bool focusState);
        virtual void SetMouseCapture(bool on) = 0;
        virtual bool HaveMouseCapture() = 0;
        void SetFocusState(bool focusState);
@@ -484,6 +507,7 @@ public:
        // Public so scintilla_set_id can use it.
        int ctrlID;
        friend class AutoSurface;
        // Public so scintilla_set_id can use it.
        int ctrlID;
        friend class AutoSurface;
+       friend class SelectionLineIterator;
 };
 
 /**
 };
 
 /**
index 88be76f2492be20f5f0b26be344e147ca65074d0..752118b7706251c005894feadf34d9ef5120b064 100644 (file)
@@ -232,8 +232,9 @@ void LexerManager::Clear()
 {
        if (NULL != first) {
                LexerLibrary *cur = first;
 {
        if (NULL != first) {
                LexerLibrary *cur = first;
-               LexerLibrary *next = first->next;
+               LexerLibrary *next;
                while (cur) {
                while (cur) {
+                       next = cur->next;
                        delete cur;
                        cur = next;
                }
                        delete cur;
                        cur = next;
                }
index 1e386b68e30111ba6aba6b0ade58898dad9ca0b1..a42abb2037de1583aec37833bad773f3f1bd17f0 100644 (file)
@@ -10,7 +10,7 @@
 #include "Scintilla.h"
 #include "Indicator.h"
 
 #include "Scintilla.h"
 #include "Indicator.h"
 
-void Indicator::Draw(Surface *surface, PRectangle &rc) {
+void Indicator::Draw(Surface *surface, const PRectangle &rc, const PRectangle &rcLine) {
        surface->PenColour(fore.allocated);
        int ymid = (rc.bottom + rc.top) / 2;
        if (style == INDIC_SQUIGGLE) {
        surface->PenColour(fore.allocated);
        int ymid = (rc.bottom + rc.top) / 2;
        if (style == INDIC_SQUIGGLE) {
@@ -57,6 +57,12 @@ void Indicator::Draw(Surface *surface, PRectangle &rc) {
                surface->LineTo(rc.right, rc.top - 4);
        } else if (style == INDIC_HIDDEN) {
                // Draw nothing
                surface->LineTo(rc.right, rc.top - 4);
        } else if (style == INDIC_HIDDEN) {
                // Draw nothing
+       } else if (style == INDIC_BOX) {
+               surface->MoveTo(rc.left, ymid+1);
+               surface->LineTo(rc.right, ymid+1);
+               surface->LineTo(rc.right, rcLine.top+1);
+               surface->LineTo(rc.left, rcLine.top+1);
+               surface->LineTo(rc.left, ymid+1);
        } else {        // Either INDIC_PLAIN or unknown
                surface->MoveTo(rc.left, ymid);
                surface->LineTo(rc.right, ymid);
        } else {        // Either INDIC_PLAIN or unknown
                surface->MoveTo(rc.left, ymid);
                surface->LineTo(rc.right, ymid);
index 56e9420bccb0bd45e76c5ff7ee85b2dfde19f64c..716db1051fe7abd142a5f2d30967eb7b704622e0 100644 (file)
@@ -16,7 +16,7 @@ public:
        ColourPair fore;
        Indicator() : style(INDIC_PLAIN), fore(ColourDesired(0,0,0)) {
        }
        ColourPair fore;
        Indicator() : style(INDIC_PLAIN), fore(ColourDesired(0,0,0)) {
        }
-       void Draw(Surface *surface, PRectangle &rc);
+       void Draw(Surface *surface, const PRectangle &rc, const PRectangle &rcLine);
 };
 
 #endif
 };
 
 #endif
index f15842af684cc509bbeac2ff8fdfec75c9e98542..950916bd08dc14764a96de579e8983bdfcd03939 100644 (file)
@@ -2,7 +2,7 @@
 /** @file KeyMap.cxx
  ** Defines a mapping between keystrokes and commands.
  **/
 /** @file KeyMap.cxx
  ** Defines a mapping between keystrokes and commands.
  **/
-// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
+// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include "Platform.h"
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include "Platform.h"
@@ -15,7 +15,7 @@ KeyMap::KeyMap() : kmap(0), len(0), alloc(0) {
        for (int i = 0; MapDefault[i].key; i++) {
                AssignCmdKey(MapDefault[i].key,
                        MapDefault[i].modifiers,
        for (int i = 0; MapDefault[i].key; i++) {
                AssignCmdKey(MapDefault[i].key,
                        MapDefault[i].modifiers,
-                       MapDefault[i].msg);
+                       MapDefault[i].msg);
        }
 }
 
        }
 }
 
@@ -35,7 +35,7 @@ void KeyMap::AssignCmdKey(int key, int modifiers, unsigned int msg) {
                KeyToCommand *ktcNew = new KeyToCommand[alloc + 5];
                if (!ktcNew)
                        return;
                KeyToCommand *ktcNew = new KeyToCommand[alloc + 5];
                if (!ktcNew)
                        return;
-               for (int k=0;k<len;k++)
+               for (int k = 0; k < len; k++)
                        ktcNew[k] = kmap[k];
                alloc += 5;
                delete []kmap;
                        ktcNew[k] = kmap[k];
                alloc += 5;
                delete []kmap;
@@ -54,7 +54,7 @@ void KeyMap::AssignCmdKey(int key, int modifiers, unsigned int msg) {
 }
 
 unsigned int KeyMap::Find(int key, int modifiers) {
 }
 
 unsigned int KeyMap::Find(int key, int modifiers) {
-       for (int i=0; i < len; i++) {
+       for (int i = 0; i < len; i++) {
                if ((key == kmap[i].key) && (modifiers == kmap[i].modifiers)) {
                        return kmap[i].msg;
                }
                if ((key == kmap[i].key) && (modifiers == kmap[i].modifiers)) {
                        return kmap[i].msg;
                }
@@ -66,41 +66,49 @@ const KeyToCommand KeyMap::MapDefault[] = {
     {SCK_DOWN,         SCI_NORM,       SCI_LINEDOWN},
     {SCK_DOWN,         SCI_SHIFT,      SCI_LINEDOWNEXTEND},
     {SCK_DOWN,         SCI_CTRL,       SCI_LINESCROLLDOWN},
     {SCK_DOWN,         SCI_NORM,       SCI_LINEDOWN},
     {SCK_DOWN,         SCI_SHIFT,      SCI_LINEDOWNEXTEND},
     {SCK_DOWN,         SCI_CTRL,       SCI_LINESCROLLDOWN},
-    {SCK_DOWN,         SCI_ALT,                SCI_PARADOWN},
-    {SCK_DOWN,         SCI_ASHIFT,     SCI_PARADOWNEXTEND},
-    {SCK_UP,                   SCI_NORM,       SCI_LINEUP},
+    {SCK_DOWN,         SCI_ASHIFT,     SCI_LINEDOWNRECTEXTEND},
+    {SCK_UP,           SCI_NORM,       SCI_LINEUP},
     {SCK_UP,                   SCI_SHIFT,      SCI_LINEUPEXTEND},
     {SCK_UP,                   SCI_CTRL,       SCI_LINESCROLLUP},
     {SCK_UP,                   SCI_SHIFT,      SCI_LINEUPEXTEND},
     {SCK_UP,                   SCI_CTRL,       SCI_LINESCROLLUP},
-    {SCK_UP,                   SCI_ALT,                SCI_PARAUP},
-    {SCK_UP,                   SCI_ASHIFT,     SCI_PARAUPEXTEND},
+    {SCK_UP,           SCI_ASHIFT,     SCI_LINEUPRECTEXTEND},
+    {'[',                      SCI_CTRL,               SCI_PARAUP},
+    {'[',                      SCI_CSHIFT,     SCI_PARAUPEXTEND},
+    {']',                      SCI_CTRL,               SCI_PARADOWN},
+    {']',                      SCI_CSHIFT,     SCI_PARADOWNEXTEND},
     {SCK_LEFT,         SCI_NORM,       SCI_CHARLEFT},
     {SCK_LEFT,         SCI_SHIFT,      SCI_CHARLEFTEXTEND},
     {SCK_LEFT,         SCI_CTRL,       SCI_WORDLEFT},
     {SCK_LEFT,         SCI_CSHIFT,     SCI_WORDLEFTEXTEND},
     {SCK_LEFT,         SCI_NORM,       SCI_CHARLEFT},
     {SCK_LEFT,         SCI_SHIFT,      SCI_CHARLEFTEXTEND},
     {SCK_LEFT,         SCI_CTRL,       SCI_WORDLEFT},
     {SCK_LEFT,         SCI_CSHIFT,     SCI_WORDLEFTEXTEND},
-    {SCK_LEFT,         SCI_ALT,                SCI_WORDPARTLEFT},
-    {SCK_LEFT,         SCI_ASHIFT,     SCI_WORDPARTLEFTEXTEND},
+    {SCK_LEFT,         SCI_ASHIFT,     SCI_CHARLEFTRECTEXTEND},
     {SCK_RIGHT,                SCI_NORM,       SCI_CHARRIGHT},
     {SCK_RIGHT,                SCI_SHIFT,      SCI_CHARRIGHTEXTEND},
     {SCK_RIGHT,                SCI_CTRL,       SCI_WORDRIGHT},
     {SCK_RIGHT,                SCI_CSHIFT,     SCI_WORDRIGHTEXTEND},
     {SCK_RIGHT,                SCI_NORM,       SCI_CHARRIGHT},
     {SCK_RIGHT,                SCI_SHIFT,      SCI_CHARRIGHTEXTEND},
     {SCK_RIGHT,                SCI_CTRL,       SCI_WORDRIGHT},
     {SCK_RIGHT,                SCI_CSHIFT,     SCI_WORDRIGHTEXTEND},
-    {SCK_RIGHT,                SCI_ALT,                SCI_WORDPARTRIGHT},
-    {SCK_RIGHT,                SCI_ASHIFT,     SCI_WORDPARTRIGHTEXTEND},
-    {SCK_HOME,                 SCI_NORM,       SCI_VCHOME},
+    {SCK_RIGHT,                SCI_ASHIFT,     SCI_CHARRIGHTRECTEXTEND},
+    {'/',              SCI_CTRL,               SCI_WORDPARTLEFT},
+    {'/',              SCI_CSHIFT,     SCI_WORDPARTLEFTEXTEND},
+    {'\\',             SCI_CTRL,               SCI_WORDPARTRIGHT},
+    {'\\',             SCI_CSHIFT,     SCI_WORDPARTRIGHTEXTEND},
+    {SCK_HOME,         SCI_NORM,       SCI_VCHOME},
     {SCK_HOME,                 SCI_SHIFT,      SCI_VCHOMEEXTEND},
     {SCK_HOME,                 SCI_CTRL,       SCI_DOCUMENTSTART},
     {SCK_HOME,                 SCI_CSHIFT,     SCI_DOCUMENTSTARTEXTEND},
     {SCK_HOME,                 SCI_ALT,        SCI_HOMEDISPLAY},
     {SCK_HOME,                 SCI_SHIFT,      SCI_VCHOMEEXTEND},
     {SCK_HOME,                 SCI_CTRL,       SCI_DOCUMENTSTART},
     {SCK_HOME,                 SCI_CSHIFT,     SCI_DOCUMENTSTARTEXTEND},
     {SCK_HOME,                 SCI_ALT,        SCI_HOMEDISPLAY},
-    {SCK_HOME,                 SCI_ASHIFT,     SCI_HOMEDISPLAYEXTEND},
-    {SCK_END,          SCI_NORM,       SCI_LINEEND},
+//    {SCK_HOME,               SCI_ASHIFT,     SCI_HOMEDISPLAYEXTEND},
+    {SCK_HOME,         SCI_ASHIFT,     SCI_VCHOMERECTEXTEND},
+    {SCK_END,          SCI_NORM,       SCI_LINEEND},
     {SCK_END,          SCI_SHIFT,      SCI_LINEENDEXTEND},
     {SCK_END,          SCI_CTRL,       SCI_DOCUMENTEND},
     {SCK_END,          SCI_CSHIFT,     SCI_DOCUMENTENDEXTEND},
     {SCK_END,          SCI_ALT,        SCI_LINEENDDISPLAY},
     {SCK_END,          SCI_SHIFT,      SCI_LINEENDEXTEND},
     {SCK_END,          SCI_CTRL,       SCI_DOCUMENTEND},
     {SCK_END,          SCI_CSHIFT,     SCI_DOCUMENTENDEXTEND},
     {SCK_END,          SCI_ALT,        SCI_LINEENDDISPLAY},
-    {SCK_END,          SCI_ASHIFT,     SCI_LINEENDDISPLAYEXTEND},
-    {SCK_PRIOR,                SCI_NORM,       SCI_PAGEUP},
+//    {SCK_END,                SCI_ASHIFT,     SCI_LINEENDDISPLAYEXTEND},
+    {SCK_END,          SCI_ASHIFT,     SCI_LINEENDRECTEXTEND},
+    {SCK_PRIOR,                SCI_NORM,       SCI_PAGEUP},
     {SCK_PRIOR,                SCI_SHIFT,      SCI_PAGEUPEXTEND},
     {SCK_PRIOR,                SCI_SHIFT,      SCI_PAGEUPEXTEND},
+    {SCK_PRIOR,                SCI_ASHIFT,     SCI_PAGEUPRECTEXTEND},
     {SCK_NEXT,                 SCI_NORM,       SCI_PAGEDOWN},
     {SCK_NEXT,                 SCI_SHIFT,      SCI_PAGEDOWNEXTEND},
     {SCK_NEXT,                 SCI_NORM,       SCI_PAGEDOWN},
     {SCK_NEXT,                 SCI_SHIFT,      SCI_PAGEDOWNEXTEND},
+    {SCK_NEXT,         SCI_ASHIFT,     SCI_PAGEDOWNRECTEXTEND},
     {SCK_DELETE,       SCI_NORM,       SCI_CLEAR},
     {SCK_DELETE,       SCI_SHIFT,      SCI_CUT},
     {SCK_DELETE,       SCI_CTRL,       SCI_DELWORDRIGHT},
     {SCK_DELETE,       SCI_NORM,       SCI_CLEAR},
     {SCK_DELETE,       SCI_SHIFT,      SCI_CUT},
     {SCK_DELETE,       SCI_CTRL,       SCI_DELWORDRIGHT},
index ae22baf2f27dc5b37f62fbd1012745f0e65a2b40..206a333b0028f3dde430854d1db31d7d66f58f1d 100644 (file)
@@ -134,6 +134,8 @@ int Scintilla_LinkLexers() {
        LINK_LEXER(lmAVE);
        LINK_LEXER(lmBaan);
        LINK_LEXER(lmBullant);
        LINK_LEXER(lmAVE);
        LINK_LEXER(lmBaan);
        LINK_LEXER(lmBullant);
+       LINK_LEXER(lmClw);
+       LINK_LEXER(lmClwNoCase);
        LINK_LEXER(lmConf);
        LINK_LEXER(lmCPP);
        LINK_LEXER(lmCPPNoCase);
        LINK_LEXER(lmConf);
        LINK_LEXER(lmCPP);
        LINK_LEXER(lmCPPNoCase);
@@ -142,7 +144,9 @@ int Scintilla_LinkLexers() {
        LINK_LEXER(lmCss);
        LINK_LEXER(lmEiffel);
        LINK_LEXER(lmEiffelkw);
        LINK_LEXER(lmCss);
        LINK_LEXER(lmEiffel);
        LINK_LEXER(lmEiffelkw);
+       LINK_LEXER(lmErlang);
        LINK_LEXER(lmESCRIPT);
        LINK_LEXER(lmESCRIPT);
+       LINK_LEXER(lmForth);
        LINK_LEXER(lmFortran);
        LINK_LEXER(lmF77);
        LINK_LEXER(lmHTML);
        LINK_LEXER(lmFortran);
        LINK_LEXER(lmF77);
        LINK_LEXER(lmHTML);
@@ -153,7 +157,10 @@ int Scintilla_LinkLexers() {
        LINK_LEXER(lmLout);
        LINK_LEXER(lmLua);
        LINK_LEXER(lmMatlab);
        LINK_LEXER(lmLout);
        LINK_LEXER(lmLua);
        LINK_LEXER(lmMatlab);
+       LINK_LEXER(lmOctave);
+       LINK_LEXER(lmMETAPOST);
        LINK_LEXER(lmMMIXAL);
        LINK_LEXER(lmMMIXAL);
+       LINK_LEXER(lmLot);
        LINK_LEXER(lmNsis);
        LINK_LEXER(lmBatch);
        LINK_LEXER(lmDiff);
        LINK_LEXER(lmNsis);
        LINK_LEXER(lmBatch);
        LINK_LEXER(lmDiff);
@@ -163,6 +170,7 @@ int Scintilla_LinkLexers() {
        LINK_LEXER(lmLatex);
        LINK_LEXER(lmNull);
        LINK_LEXER(lmPascal);
        LINK_LEXER(lmLatex);
        LINK_LEXER(lmNull);
        LINK_LEXER(lmPascal);
+       LINK_LEXER(lmPB);
        LINK_LEXER(lmPerl);
        LINK_LEXER(lmPOV);
        LINK_LEXER(lmPS);
        LINK_LEXER(lmPerl);
        LINK_LEXER(lmPOV);
        LINK_LEXER(lmPS);
@@ -170,8 +178,10 @@ int Scintilla_LinkLexers() {
        LINK_LEXER(lmRuby);
        LINK_LEXER(lmScriptol);
        LINK_LEXER(lmSQL);
        LINK_LEXER(lmRuby);
        LINK_LEXER(lmScriptol);
        LINK_LEXER(lmSQL);
+       LINK_LEXER(lmTeX);
        LINK_LEXER(lmVB);
        LINK_LEXER(lmVBScript);
        LINK_LEXER(lmVB);
        LINK_LEXER(lmVBScript);
+       LINK_LEXER(lmYAML);
 
 //--Autogenerated -- end of automatically generated section
 
 
 //--Autogenerated -- end of automatically generated section
 
index 1eecf9b31a99b8570297e32ea9d12dad72009773..93e0b3718020f95e0030a833f4f4f91b0f8ade38 100644 (file)
@@ -1,9 +1,11 @@
 // Scintilla source code edit control
 /** @file LexAsm.cxx
 // Scintilla source code edit control
 /** @file LexAsm.cxx
- ** Lexer for Assembler, just for the Masm Syntax
+ ** Lexer for Assembler, just for the MASM syntax
  ** Written by The Black Horus
  ** Written by The Black Horus
+ ** Enhancements and NASM stuff by Kein-Hong Man, 2003-10
+ ** SCE_ASM_COMMENTBLOCK and SCE_ASM_CHARACTER are for future GNU as colouring
  **/
  **/
-// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>
+// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include <stdlib.h>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include <stdlib.h>
 #include "SciLexer.h"
 
 
 #include "SciLexer.h"
 
 
-
 static inline bool IsAWordChar(const int ch) {
 static inline bool IsAWordChar(const int ch) {
-       return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_' || ch =='\\');
+       return (ch < 0x80) && (isalnum(ch) || ch == '.' ||
+               ch == '_' || ch == '?');
 }
 
 static inline bool IsAWordStart(const int ch) {
 }
 
 static inline bool IsAWordStart(const int ch) {
-       return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.');
+       return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.' ||
+               ch == '%' || ch == '@' || ch == '$' || ch == '?');
 }
 
 }
 
-inline bool isAsmOperator(char ch) {
+static inline bool IsAsmOperator(char ch) {
        if (isalnum(ch))
                return false;
        // '.' left out as it is used to make up numbers
        if (ch == '*' || ch == '/' || ch == '-' || ch == '+' ||
        if (isalnum(ch))
                return false;
        // '.' left out as it is used to make up numbers
        if (ch == '*' || ch == '/' || ch == '-' || ch == '+' ||
-               ch == '(' || ch == ')' || ch == '=' ||
-               ch == '[' || ch == ']' || ch == '<' ||
-               ch == '>' || ch == ',' ||
-               ch == '.' || ch == '%' || ch == ':')
+               ch == '(' || ch == ')' || ch == '=' || ch == '^' ||
+               ch == '[' || ch == ']' || ch == '<' || ch == '&' ||
+               ch == '>' || ch == ',' || ch == '|' || ch == '~' ||
+               ch == '%' || ch == ':')
                return true;
        return false;
 }
                return true;
        return false;
 }
@@ -52,48 +55,63 @@ static void ColouriseAsmDoc(unsigned int startPos, int length, int initStyle, Wo
        WordList &registers = *keywordlists[2];
        WordList &directive = *keywordlists[3];
        WordList &directiveOperand = *keywordlists[4];
        WordList &registers = *keywordlists[2];
        WordList &directive = *keywordlists[3];
        WordList &directiveOperand = *keywordlists[4];
+       WordList &extInstruction = *keywordlists[5];
+
+       // Do not leak onto next line
+       if (initStyle == SCE_ASM_STRINGEOL)
+               initStyle = SCE_ASM_DEFAULT;
 
        StyleContext sc(startPos, length, initStyle, styler);
 
        for (; sc.More(); sc.Forward())
        {
 
        StyleContext sc(startPos, length, initStyle, styler);
 
        for (; sc.More(); sc.Forward())
        {
+
+               // Prevent SCE_ASM_STRINGEOL from leaking back to previous line
+               if (sc.atLineStart && (sc.state == SCE_ASM_STRING)) {
+                       sc.SetState(SCE_ASM_STRING);
+               } else if (sc.atLineStart && (sc.state == SCE_ASM_CHARACTER)) {
+                       sc.SetState(SCE_ASM_CHARACTER);
+               }
+
                // Handle line continuation generically.
                if (sc.ch == '\\') {
                // Handle line continuation generically.
                if (sc.ch == '\\') {
-                       if (sc.Match("\\\n")) {
-                               sc.Forward();
-                               continue;
-                       }
-                       if (sc.Match("\\\r\n")) {
-                               sc.Forward();
+                       if (sc.chNext == '\n' || sc.chNext == '\r') {
                                sc.Forward();
                                sc.Forward();
+                               if (sc.ch == '\r' && sc.chNext == '\n') {
+                                       sc.Forward();
+                               }
                                continue;
                        }
                }
 
                // Determine if the current state should terminate.
                if (sc.state == SCE_ASM_OPERATOR) {
                                continue;
                        }
                }
 
                // Determine if the current state should terminate.
                if (sc.state == SCE_ASM_OPERATOR) {
-                       sc.SetState(SCE_ASM_DEFAULT);
+                       if (!IsAsmOperator(static_cast<char>(sc.ch))) {
+                           sc.SetState(SCE_ASM_DEFAULT);
+                       }
                }else if (sc.state == SCE_ASM_NUMBER) {
                        if (!IsAWordChar(sc.ch)) {
                                sc.SetState(SCE_ASM_DEFAULT);
                        }
                } else if (sc.state == SCE_ASM_IDENTIFIER) {
                        if (!IsAWordChar(sc.ch) ) {
                }else if (sc.state == SCE_ASM_NUMBER) {
                        if (!IsAWordChar(sc.ch)) {
                                sc.SetState(SCE_ASM_DEFAULT);
                        }
                } else if (sc.state == SCE_ASM_IDENTIFIER) {
                        if (!IsAWordChar(sc.ch) ) {
-                       char s[100];
-                       sc.GetCurrentLowered(s, sizeof(s));
-
-                       if (cpuInstruction.InList(s)) {
-                               sc.ChangeState(SCE_ASM_CPUINSTRUCTION);
-                       } else if (mathInstruction.InList(s)) {
-                               sc.ChangeState(SCE_ASM_MATHINSTRUCTION);
-                       } else if (registers.InList(s)) {
-                               sc.ChangeState(SCE_ASM_REGISTER);
-                       }  else if (directive.InList(s)) {
-                               sc.ChangeState(SCE_ASM_DIRECTIVE);
-                       } else if (directiveOperand.InList(s)) {
-                               sc.ChangeState(SCE_ASM_DIRECTIVEOPERAND);
-                       }
-                       sc.SetState(SCE_ASM_DEFAULT);
+                               char s[100];
+                               sc.GetCurrentLowered(s, sizeof(s));
+
+                               if (cpuInstruction.InList(s)) {
+                                       sc.ChangeState(SCE_ASM_CPUINSTRUCTION);
+                               } else if (mathInstruction.InList(s)) {
+                                       sc.ChangeState(SCE_ASM_MATHINSTRUCTION);
+                               } else if (registers.InList(s)) {
+                                       sc.ChangeState(SCE_ASM_REGISTER);
+                               }  else if (directive.InList(s)) {
+                                       sc.ChangeState(SCE_ASM_DIRECTIVE);
+                               } else if (directiveOperand.InList(s)) {
+                                       sc.ChangeState(SCE_ASM_DIRECTIVEOPERAND);
+                               } else if (extInstruction.InList(s)) {
+                                       sc.ChangeState(SCE_ASM_EXTINSTRUCTION);
+                               }
+                               sc.SetState(SCE_ASM_DEFAULT);
                        }
                }
                else if (sc.state == SCE_ASM_COMMENT ) {
                        }
                }
                else if (sc.state == SCE_ASM_COMMENT ) {
@@ -108,20 +126,36 @@ static void ColouriseAsmDoc(unsigned int startPos, int length, int initStyle, Wo
                        } else if (sc.ch == '\"') {
                                sc.ForwardSetState(SCE_ASM_DEFAULT);
                        } else if (sc.atLineEnd) {
                        } else if (sc.ch == '\"') {
                                sc.ForwardSetState(SCE_ASM_DEFAULT);
                        } else if (sc.atLineEnd) {
+                               sc.ChangeState(SCE_ASM_STRINGEOL);
+                               sc.ForwardSetState(SCE_ASM_DEFAULT);
+                       }
+               } else if (sc.state == SCE_ASM_CHARACTER) {
+                       if (sc.ch == '\\') {
+                               if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {
+                                       sc.Forward();
+                               }
+                       } else if (sc.ch == '\'') {
+                               sc.ForwardSetState(SCE_ASM_DEFAULT);
+                       } else if (sc.atLineEnd) {
+                               sc.ChangeState(SCE_ASM_STRINGEOL);
                                sc.ForwardSetState(SCE_ASM_DEFAULT);
                        }
                }
 
                // Determine if a new state should be entered.
                                sc.ForwardSetState(SCE_ASM_DEFAULT);
                        }
                }
 
                // Determine if a new state should be entered.
-               else if (sc.state == SCE_ASM_DEFAULT) {
+               if (sc.state == SCE_ASM_DEFAULT) {
                        if (sc.ch == ';'){
                                sc.SetState(SCE_ASM_COMMENT);
                        } else if (isdigit(sc.ch) || (sc.ch == '.' && isdigit(sc.chNext))) {
                                sc.SetState(SCE_ASM_NUMBER);
                        } else if (IsAWordStart(sc.ch)) {
                                sc.SetState(SCE_ASM_IDENTIFIER);
                        if (sc.ch == ';'){
                                sc.SetState(SCE_ASM_COMMENT);
                        } else if (isdigit(sc.ch) || (sc.ch == '.' && isdigit(sc.chNext))) {
                                sc.SetState(SCE_ASM_NUMBER);
                        } else if (IsAWordStart(sc.ch)) {
                                sc.SetState(SCE_ASM_IDENTIFIER);
-                       } else if (sc.Match('\"')) {
+                       } else if (sc.ch == '\"') {
                                sc.SetState(SCE_ASM_STRING);
                                sc.SetState(SCE_ASM_STRING);
+                       } else if (sc.ch == '\'') {
+                               sc.SetState(SCE_ASM_CHARACTER);
+                       } else if (IsAsmOperator(static_cast<char>(sc.ch))) {
+                               sc.SetState(SCE_ASM_OPERATOR);
                        }
                }
 
                        }
                }
 
@@ -135,6 +169,7 @@ static const char * const asmWordListDesc[] = {
        "Registers",
        "Directives",
        "Directive operands",
        "Registers",
        "Directives",
        "Directive operands",
+       "Extended instructions",
        0
 };
 
        0
 };
 
diff --git a/src/stc/scintilla/src/LexCLW.cxx b/src/stc/scintilla/src/LexCLW.cxx
new file mode 100644 (file)
index 0000000..e524077
--- /dev/null
@@ -0,0 +1,441 @@
+// Scintilla source code edit control
+/** @file LexClw.cxx
+ ** Lexer for Clarion.
+ **/
+// Copyright 2003 by Ron Schofield <ron@schofieldcomputer.com>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+static char MakeUpperCase(char ch) {
+       if (ch < 'a' || ch > 'z')
+               return ch;
+       else
+               return static_cast<char>(ch - 'a' + 'A');
+}
+
+static void MakeUpperCaseString(char *s) {
+       while (*s) {
+               *s = MakeUpperCase(*s);
+               s++;
+       }
+}
+
+// Is a label start character
+inline bool IsALabelStart(const int iChar) {
+       return(isalpha(iChar) || iChar == '_');
+}
+
+// Is a label character
+inline bool IsALabelCharacter(const int iChar) {
+       return(isalnum(iChar) || iChar == '_' || iChar == ':');
+}
+
+// Is the character is a ! and the the next character is not a !
+inline bool IsACommentStart(StyleContext &scDoc) {
+       return(scDoc.ch == '!' && scDoc.chNext != '!');
+}
+
+// Is the character a Clarion hex character (ABCDEF)
+inline bool IsAHexCharacter(const int iChar, bool bCaseSensitive) {
+       // Case insensitive.
+       if (!bCaseSensitive) {
+               if (strchr("ABCDEFabcdef", iChar) != NULL) {
+                       return(true);
+               }
+       }
+       // Case sensitive
+       else {
+               if (strchr("ABCDEF", iChar) != NULL) {
+                       return(true);
+               }
+       }
+       return(false);
+}
+
+// Is the character a Clarion base character (B=Binary, O=Octal, H=Hex)
+inline bool IsANumericBaseCharacter(const int iChar, bool bCaseSensitive) {
+       // Case insensitive.
+       if (!bCaseSensitive) {
+               // If character is a numeric base character
+               if (strchr("BOHboh", iChar) != NULL) {
+                       return(true);
+               }
+       }
+       // Case sensitive
+       else {
+               // If character is a numeric base character
+               if (strchr("BOH", iChar) != NULL) {
+                       return(true);
+               }
+       }
+       return(false);
+}
+
+// Set the correct numeric constant state
+inline bool SetNumericConstantState(StyleContext &scDoc) {
+       int iPoints = 0;                        // Point counter
+       char cNumericString[100];       // Numeric string buffer
+
+       // Buffer the current numberic string
+       scDoc.GetCurrent(cNumericString, sizeof(cNumericString));
+       // Loop through the string until end of string (NULL termination)
+       for (int iIndex = 0; cNumericString[iIndex] != '\0'; iIndex++) {
+               // Depending on the character
+               switch (cNumericString[iIndex]) {
+                       // Is a . (point)
+                       case '.' :
+                               // Increment point counter
+                               iPoints++;
+                               break;
+                       default :
+                               break;
+               }
+       }
+       // If points found (can be more than one for improper formatted number
+       if (iPoints > 0) {
+               return(true);
+       }
+       // Else no points found
+       else {
+               return(false);
+       }
+}
+
+// Clarion Language Colouring Procedure
+static void ColouriseClwDoc(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *wlKeywords[], Accessor &accStyler, bool bCaseSensitive) {
+
+       int iParenthesesLevel=0;                // Parenthese Level
+
+       WordList &wlClarionKeywords = *wlKeywords[0];           // Clarion Keywords
+       WordList &wlCompilerDirectives = *wlKeywords[1];        // Compiler Directives
+       WordList &wlBuiltInProcsFuncs = *wlKeywords[2];         // Builtin Procedures and Functions
+       WordList &wlStructsDataTypes = *wlKeywords[3];          // Structures and Data Types
+       WordList &wlAttributes = *wlKeywords[4];                        // Procedure Attributes
+       WordList &wlStandardEquates = *wlKeywords[5];           // Standard Equates
+       WordList &wlReservedWords = *wlKeywords[6];                     // Clarion Reserved Keywords
+
+       StyleContext scDoc(uiStartPos, iLength, iInitStyle, accStyler);
+
+       // lex source code
+    for (; scDoc.More(); scDoc.Forward())
+       {
+               //
+               // Determine if the current state should terminate.
+               //
+
+               // Label State Handling
+               if (scDoc.state == SCE_CLW_LABEL) {
+                       // If the character is not a valid label
+                       if (!IsALabelCharacter(scDoc.ch)) {
+                               // If the character is a . (dot syntax)
+                               if (scDoc.ch == '.') {
+                                       // Uncolour the . (dot) to default state, move forward one character,
+                                       // and change back to the label state.
+                                       scDoc.SetState(SCE_CLW_DEFAULT);
+                                       scDoc.Forward();
+                                       scDoc.SetState(SCE_CLW_LABEL);
+                               }
+                               // Else terminate the label state
+                               else {
+                                       char cLabel[100];               // Label buffer
+                                       // Buffer the current label string
+                                       scDoc.GetCurrent(cLabel,sizeof(cLabel));
+                                       // If case insensitive, convert string to UPPERCASE to match passed keywords.
+                                       if (!bCaseSensitive) {
+                                               MakeUpperCaseString(cLabel);
+                                       }
+                                       // If label string is in the Clarion reserved keyword list
+                                       if (wlReservedWords.InList(cLabel)){
+                                               // change to error state
+                                               scDoc.ChangeState(SCE_CLW_ERROR);
+                                       }
+                                       // Else if label string is in the compiler directive keyword list
+                                       else if (wlCompilerDirectives.InList(cLabel)) {
+                                               // change the state to compiler directive state
+                                               scDoc.ChangeState(SCE_CLW_COMPILER_DIRECTIVE);
+                                       }
+                                       // Terminate the label state and set to default state
+                                       scDoc.SetState(SCE_CLW_DEFAULT);
+                               }
+                       }
+               }
+               // Keyword State Handling
+               else if (scDoc.state == SCE_CLW_KEYWORD) {
+                       // If character is : (colon)
+                       if (scDoc.ch == ':') {
+                               char cEquate[100];              // Equate buffer
+                               // Move forward to include : (colon) in buffer
+                               scDoc.Forward();
+                               // Buffer the equate string
+                               scDoc.GetCurrent(cEquate,sizeof(cEquate));
+                               // If case insensitive, convert string to UPPERCASE to match passed keywords.
+                               if (!bCaseSensitive) {
+                                       MakeUpperCaseString(cEquate);
+                               }
+                               // If statement string is in the equate list
+                               if (wlStandardEquates.InList(cEquate)) {
+                                       // Change to equate state
+                                       scDoc.ChangeState(SCE_CLW_STANDARD_EQUATE);
+                               }
+                       }
+                       // If the character is not a valid label character
+                       else if (!IsALabelCharacter(scDoc.ch)) {
+                               char cStatement[100];           // Statement buffer
+                               // Buffer the statement string
+                               scDoc.GetCurrent(cStatement,sizeof(cStatement));
+                               // If case insensitive, convert string to UPPERCASE to match passed keywords.
+                               if (!bCaseSensitive) {
+                                       MakeUpperCaseString(cStatement);
+                               }
+                               // If statement string is in the Clarion keyword list
+                               if (wlClarionKeywords.InList(cStatement)) {
+                                       // Set to the Clarion keyword state
+                                       scDoc.ChangeState(SCE_CLW_KEYWORD);
+                               }
+                               // Else if statement string is in the compiler directive keyword list
+                               else if (wlCompilerDirectives.InList(cStatement)) {
+                                       // Set to the compiler directive state
+                                       scDoc.ChangeState(SCE_CLW_COMPILER_DIRECTIVE);
+                               }
+                               // Else if statement string is in the builtin procedures and functions keyword list
+                               else if (wlBuiltInProcsFuncs.InList(cStatement)) {
+                                       // Set to the builtin procedures and functions state
+                                       scDoc.ChangeState(SCE_CLW_BUILTIN_PROCEDURES_FUNCTION);
+                               }
+                               // Else if statement string is in the tructures and data types keyword list
+                               else if (wlStructsDataTypes.InList(cStatement)) {
+                                       // Set to the structures and data types state
+                                       scDoc.ChangeState(SCE_CLW_STRUCTURE_DATA_TYPE);
+                               }
+                               // Else if statement string is in the procedure attribute keyword list
+                               else if (wlAttributes.InList(cStatement)) {
+                                       // Set to the procedure attribute state
+                                       scDoc.ChangeState(SCE_CLW_ATTRIBUTE);
+                               }
+                               // Else if statement string is in the standard equate keyword list
+                               else if (wlStandardEquates.InList(cStatement)) {
+                                       // Set to the standard equate state
+                                       scDoc.ChangeState(SCE_CLW_STANDARD_EQUATE);
+                               }
+                               // Terminate the keyword state and set to default state
+                               scDoc.SetState(SCE_CLW_DEFAULT);
+                       }
+               }
+               // String State Handling
+               else if (scDoc.state == SCE_CLW_STRING) {
+                       // If the character is an ' (single quote)
+                       if (scDoc.ch == '\'') {
+                               // Set the state to default and move forward colouring
+                               // the ' (single quote) as default state
+                               // terminating the string state
+                               scDoc.SetState(SCE_CLW_DEFAULT);
+                               scDoc.Forward();
+                       }
+                       // If the next character is an ' (single quote)
+                       if (scDoc.chNext == '\'') {
+                               // Move forward one character and set to default state
+                               // colouring the next ' (single quote) as default state
+                               // terminating the string state
+                               scDoc.ForwardSetState(SCE_CLW_DEFAULT);
+                               scDoc.Forward();
+                       }
+               }
+               // Picture String State Handling
+               else if (scDoc.state == SCE_CLW_PICTURE_STRING) {
+                       // If the character is an ( (open parenthese)
+                       if (scDoc.ch == '(') {
+                               // Increment the parenthese level
+                               iParenthesesLevel++;
+                       }
+                       // Else if the character is a ) (close parenthese)
+                       else if (scDoc.ch == ')') {
+                               // If the parenthese level is set to zero
+                               // parentheses matched
+                               if (!iParenthesesLevel) {
+                                       scDoc.SetState(SCE_CLW_DEFAULT);
+                               }
+                               // Else parenthese level is greater than zero
+                               // still looking for matching parentheses
+                               else {
+                                       // Decrement the parenthese level
+                                       iParenthesesLevel--;
+                               }
+                       }
+               }
+               // Standard Equate State Handling
+               else if (scDoc.state == SCE_CLW_STANDARD_EQUATE) {
+                       if (!isalnum(scDoc.ch)) {
+                               scDoc.SetState(SCE_CLW_DEFAULT);
+                       }
+               }
+               // Integer Constant State Handling
+               else if (scDoc.state == SCE_CLW_INTEGER_CONSTANT) {
+                       // If the character is not a digit (0-9)
+                       // or character is not a hexidecimal character (A-F)
+                       // or character is not a . (point)
+                       // or character is not a numberic base character (B,O,H)
+                       if (!(isdigit(scDoc.ch)
+                       || IsAHexCharacter(scDoc.ch, bCaseSensitive)
+                       || scDoc.ch == '.'
+                       || IsANumericBaseCharacter(scDoc.ch, bCaseSensitive))) {
+                               // If the number was a real
+                               if (SetNumericConstantState(scDoc)) {
+                                       // Colour the matched string to the real constant state
+                                       scDoc.ChangeState(SCE_CLW_REAL_CONSTANT);
+                               }
+                               // Else the number was an integer
+                               else {
+                                       // Colour the matched string to an integer constant state
+                                       scDoc.ChangeState(SCE_CLW_INTEGER_CONSTANT);
+                               }
+                               // Terminate the integer constant state and set to default state
+                               scDoc.SetState(SCE_CLW_DEFAULT);
+                       }
+               }
+
+               //
+               // Determine if a new state should be entered.
+               //
+
+               // Beginning of Line Handling
+               if (scDoc.atLineStart) {
+                       // If column 1 character is a label start character
+                       if (IsALabelStart(scDoc.ch)) {
+                               // Set the state to label
+                               scDoc.SetState(SCE_CLW_LABEL);
+                       }
+                       // else if character is a space or tab
+                       else if (IsASpace(scDoc.ch)){
+                               // Set to default state
+                               scDoc.SetState(SCE_CLW_DEFAULT);
+                       }
+                       // else if the start of a comment or is an * (asterisk)
+                       else if (IsACommentStart(scDoc) || scDoc.ch == '*' ) {
+                               // then set the state to comment.
+                               scDoc.SetState(SCE_CLW_COMMENT);
+                       }
+                       // else the character is a ? (question mark)
+                       else if (scDoc.ch == '?') {
+                               // Change to the compiler directive state, move forward,
+                               // colouring the ? (question mark), change back to default state.
+                               scDoc.ChangeState(SCE_CLW_COMPILER_DIRECTIVE);
+                               scDoc.Forward();
+                               scDoc.SetState(SCE_CLW_DEFAULT);
+                       }
+                       // else an invalid character in column 1
+                       else {
+                               // Set to error state
+                               scDoc.SetState(SCE_CLW_ERROR);
+                       }
+               }
+               // End of Line Handling
+               else if (scDoc.atLineEnd) {
+                       // Reset to the default state at the end of each line.
+                       scDoc.SetState(SCE_CLW_DEFAULT);
+               }
+               // Default Handling
+               else {
+                       // If in default state
+                       if (scDoc.state == SCE_CLW_DEFAULT) {
+                               // If is a letter could be a possible statement
+                               if (isalpha(scDoc.ch)) {
+                                       // Set the state to Clarion Keyword and verify later
+                                       scDoc.SetState(SCE_CLW_KEYWORD);
+                               }
+                               // else is a number
+                               else if (isdigit(scDoc.ch)) {
+                                       // Set the state to Integer Constant and verify later
+                                       scDoc.SetState(SCE_CLW_INTEGER_CONSTANT);
+                               }
+                               // else if the start of a comment or a | (line continuation)
+                               else if (IsACommentStart(scDoc) || scDoc.ch == '|') {
+                                       // then set the state to comment.
+                                       scDoc.SetState(SCE_CLW_COMMENT);
+                               }
+                               // else if the character is a ' (single quote)
+                               else if (scDoc.ch == '\'') {
+                                       // If the character is also a ' (single quote)
+                                       // Embedded Apostrophe
+                                       if (scDoc.chNext == '\'') {
+                                               // Move forward colouring it as default state
+                                               scDoc.ForwardSetState(SCE_CLW_DEFAULT);
+                                       }
+                                       else {
+                                               // move to the next character and then set the state to comment.
+                                               scDoc.ForwardSetState(SCE_CLW_STRING);
+                                       }
+                               }
+                               // else the character is an @ (apersand)
+                               else if (scDoc.ch == '@') {
+                                       // Case insensitive.
+                                       if (!bCaseSensitive) {
+                                               // If character is a valid picture token character
+                                               if (strchr("DEKNPSTdeknpst", scDoc.chNext) != NULL) {
+                                                       // Set to the picture string state
+                                                       scDoc.SetState(SCE_CLW_PICTURE_STRING);
+                                               }
+                                       }
+                                       // Case sensitive
+                                       else {
+                                               // If character is a valid picture token character
+                                               if (strchr("DEKNPST", scDoc.chNext) != NULL) {
+                                                       // Set the picture string state
+                                                       scDoc.SetState(SCE_CLW_PICTURE_STRING);
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+       // lexing complete
+       scDoc.Complete();
+}
+
+// Clarion Language Case Sensitive Colouring Procedure
+static void ColouriseClwDocSensitive(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *wlKeywords[], Accessor &accStyler) {
+       ColouriseClwDoc(uiStartPos, iLength, iInitStyle, wlKeywords, accStyler, true);
+}
+
+// Clarion Language Case Insensitive Colouring Procedure
+static void ColouriseClwDocInsensitive(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *wlKeywords[], Accessor &accStyler) {
+       ColouriseClwDoc(uiStartPos, iLength, iInitStyle, wlKeywords, accStyler, false);
+}
+
+// Clarion Language Folding Procedure
+#ifdef FOLDING_IMPLEMENTED
+static void FoldClwDoc(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *wlKeywords[], Accessor &accStyler) {
+
+}
+#endif
+
+// Word List Descriptions
+static const char * const rgWordListDescriptions[] = {
+       "Clarion Keywords",
+       "Compiler Directives",
+       "Built-in Procedures and Functions",
+       "Structure and Data Types",
+       "Attributes",
+       "Standard Equates",
+       "Reserved Words",
+       0,
+};
+
+// Case Sensitive Clarion Language Lexer
+LexerModule lmClw(SCLEX_CLW, ColouriseClwDocSensitive, "clw", NULL, rgWordListDescriptions);
+
+// Case Insensitive Clarion Language Lexer
+LexerModule lmClwNoCase(SCLEX_CLWNOCASE, ColouriseClwDocInsensitive, "clwnocase", NULL, rgWordListDescriptions);
diff --git a/src/stc/scintilla/src/LexErlang.cxx b/src/stc/scintilla/src/LexErlang.cxx
new file mode 100644 (file)
index 0000000..9444eb9
--- /dev/null
@@ -0,0 +1,522 @@
+// Scintilla source code edit control
+/** @file LexErlang.cxx
+ ** Lexer for Erlang.
+ ** Written by Peter-Henry Mander, based on Matlab lexer by José Fonseca
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+/*
+   TODO:
+   o  _Param should be a new lexical type
+*/
+
+static int is_radix(int radix, int ch) {
+   int digit;
+   if ( 16 < radix || 2 > radix ) {
+      return 0;
+   }
+   if ( isdigit(ch) ) {
+      digit = ch - '0';
+   } else if ( isxdigit(ch) ) {
+      digit = toupper(ch) - 'A' + 10;
+   } else {
+      return 0;
+   }
+   if ( digit < radix ) {
+      return 1;
+   } else {
+      return 0;
+   }
+}
+
+typedef enum {
+   STATE_NULL,
+   ATOM_UNQUOTED,
+   ATOM_QUOTED,
+   ATOM_FUN_NAME,
+   NODE_NAME_UNQUOTED,
+   NODE_NAME_QUOTED,
+   MACRO_START,
+   MACRO_UNQUOTED,
+   MACRO_QUOTED,
+   RECORD_START,
+   RECORD_UNQUOTED,
+   RECORD_QUOTED,
+   NUMERAL_START,
+   NUMERAL_SIGNED,
+   NUMERAL_RADIX_LITERAL,
+   NUMERAL_SPECULATIVE_MANTISSA,
+   NUMERAL_FLOAT_MANTISSA,
+   NUMERAL_FLOAT_EXPONENT,
+   NUMERAL_FLOAT_SIGNED_EXPONENT,
+   PARSE_ERROR
+} atom_parse_state_t;
+
+static void ColouriseErlangDoc(unsigned int startPos, int length, int initStyle,
+                               WordList *keywordlists[], Accessor &styler) {
+
+       WordList &keywords = *keywordlists[0];
+
+       styler.StartAt(startPos);
+
+       StyleContext sc(startPos, length, initStyle, styler);
+   atom_parse_state_t parse_state = STATE_NULL;
+   int radix_digits = 0;
+   int exponent_digits = 0;
+       for (; sc.More(); sc.Forward()) {
+      if ( STATE_NULL != parse_state ) {
+         switch (parse_state) {
+         case STATE_NULL:
+                               sc.SetState(SCE_ERLANG_DEFAULT);
+            break;
+         case ATOM_UNQUOTED:
+            if ( '@' == sc.ch ){
+               parse_state = NODE_NAME_UNQUOTED;
+            } else if ( !isalnum(sc.ch) && sc.ch != '_' ) {
+               char s[100];
+               sc.GetCurrent(s, sizeof(s));
+               if (keywords.InList(s)) {
+                  sc.ChangeState(SCE_ERLANG_KEYWORD);
+                  sc.SetState(SCE_ERLANG_DEFAULT);
+                  parse_state = STATE_NULL;
+               } else {
+                  if ( '/' == sc.ch ) {
+                     parse_state = ATOM_FUN_NAME;
+                  } else {
+                     sc.ChangeState(SCE_ERLANG_ATOM);
+                     sc.SetState(SCE_ERLANG_DEFAULT);
+                     parse_state = STATE_NULL;
+                  }
+               }
+            }
+            break;
+         case ATOM_QUOTED:
+            if ( '@' == sc.ch ){
+               parse_state = NODE_NAME_QUOTED;
+            } else if ( '\'' == sc.ch && '\\' != sc.chPrev ) {
+               sc.ChangeState(SCE_ERLANG_ATOM);
+               sc.ForwardSetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            }
+            break;
+         case ATOM_FUN_NAME:
+            if ( !isdigit(sc.ch) ) {
+               sc.ChangeState(SCE_ERLANG_FUNCTION_NAME);
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            }
+            break;
+         case NODE_NAME_QUOTED:
+            if ( '@' == sc.ch ) {
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            } else if ( '\'' == sc.ch && '\\' != sc.chPrev ) {
+               sc.ChangeState(SCE_ERLANG_NODE_NAME);
+               sc.ForwardSetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            }
+            break;
+         case NODE_NAME_UNQUOTED:
+            if ( '@' == sc.ch ) {
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            } else if ( !isalnum(sc.ch) && sc.ch != '_' ) {
+               sc.ChangeState(SCE_ERLANG_NODE_NAME);
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            }
+            break;
+         case RECORD_START:
+            if ( '\'' == sc.ch ) {
+               parse_state = RECORD_QUOTED;
+            } else if (isalpha(sc.ch) && islower(sc.ch)) {
+               parse_state = RECORD_UNQUOTED;
+            } else { // error
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            }
+            break;
+         case RECORD_QUOTED:
+            if ( '\'' == sc.ch && '\\' != sc.chPrev ) {
+               sc.ChangeState(SCE_ERLANG_RECORD);
+               sc.ForwardSetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            }
+            break;
+         case RECORD_UNQUOTED:
+            if ( !isalpha(sc.ch) && '_' != sc.ch ) {
+               sc.ChangeState(SCE_ERLANG_RECORD);
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            }
+            break;
+         case MACRO_START:
+            if ( '\'' == sc.ch ) {
+               parse_state = MACRO_QUOTED;
+            } else if (isalpha(sc.ch)) {
+               parse_state = MACRO_UNQUOTED;
+            } else { // error
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            }
+            break;
+         case MACRO_UNQUOTED:
+            if ( !isalpha(sc.ch) && '_' != sc.ch ) {
+               sc.ChangeState(SCE_ERLANG_MACRO);
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            }
+            break;
+         case MACRO_QUOTED:
+            if ( '\'' == sc.ch && '\\' != sc.chPrev ) {
+               sc.ChangeState(SCE_ERLANG_MACRO);
+               sc.ForwardSetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            }
+            break;
+         case NUMERAL_START:
+            if ( isdigit(sc.ch) ) {
+               radix_digits *= 10;
+               radix_digits += sc.ch - '0'; // Assuming ASCII here!
+            } else if ( '#' == sc.ch ) {
+               if ( 2 > radix_digits || 16 < radix_digits) {
+                  sc.SetState(SCE_ERLANG_DEFAULT);
+                  parse_state = STATE_NULL;
+               } else {
+                  parse_state = NUMERAL_RADIX_LITERAL;
+               }
+            } else if ( '.' == sc.ch && isdigit(sc.chNext)) {
+               radix_digits = 0;
+               parse_state = NUMERAL_FLOAT_MANTISSA;
+            } else if ( 'e' == sc.ch || 'E' == sc.ch ) {
+               exponent_digits = 0;
+               parse_state = NUMERAL_FLOAT_EXPONENT;
+            } else {
+               radix_digits = 0;
+               sc.ChangeState(SCE_ERLANG_NUMBER);
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            }
+            break;
+         case NUMERAL_RADIX_LITERAL:
+            if ( !is_radix(radix_digits,sc.ch) ) {
+               radix_digits = 0;
+               if ( !isalnum(sc.ch) ) {
+                  sc.ChangeState(SCE_ERLANG_NUMBER);
+               }
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            }
+            break;
+         case NUMERAL_FLOAT_MANTISSA:
+            if ( 'e' == sc.ch || 'E' == sc.ch ) {
+               exponent_digits = 0;
+               parse_state = NUMERAL_FLOAT_EXPONENT;
+            } else if ( !isdigit(sc.ch) ) {
+               sc.ChangeState(SCE_ERLANG_NUMBER);
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            }
+            break;
+         case NUMERAL_FLOAT_EXPONENT:
+            if ( '-' == sc.ch || '+' == sc.ch ) {
+               parse_state = NUMERAL_FLOAT_SIGNED_EXPONENT;
+            } else if ( !isdigit(sc.ch) ) {
+               if ( 0 < exponent_digits ) {
+                  sc.ChangeState(SCE_ERLANG_NUMBER);
+               }
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            } else {
+               ++exponent_digits;
+            }
+            break;
+         case NUMERAL_FLOAT_SIGNED_EXPONENT:
+            if ( !isdigit(sc.ch) ) {
+               if ( 0 < exponent_digits ) {
+                  sc.ChangeState(SCE_ERLANG_NUMBER);
+               }
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            } else {
+               ++exponent_digits;
+            }
+            break;
+         case NUMERAL_SIGNED:
+            if ( !isdigit(sc.ch) ) {
+               sc.ChangeState(SCE_ERLANG_NUMBER);
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            } else if ( '.' == sc.ch ) {
+               parse_state = NUMERAL_FLOAT_MANTISSA;
+            }
+            break;
+         case NUMERAL_SPECULATIVE_MANTISSA:
+            if ( !isdigit(sc.ch) ) {
+               sc.ChangeState(SCE_ERLANG_OPERATOR);
+               sc.SetState(SCE_ERLANG_DEFAULT);
+               parse_state = STATE_NULL;
+            } else {
+               parse_state = NUMERAL_FLOAT_MANTISSA;
+            }
+            break;
+         case PARSE_ERROR:
+                               sc.SetState(SCE_ERLANG_DEFAULT);
+            parse_state = STATE_NULL;
+            break;
+         }
+      } else if (sc.state == SCE_ERLANG_OPERATOR) {
+                       if (sc.chPrev == '.') {
+                               if (sc.ch == '*' || sc.ch == '/' || sc.ch == '\\' || sc.ch == '^') {
+                                       sc.ForwardSetState(SCE_ERLANG_DEFAULT);
+                               } else if (sc.ch == '\'') {
+                                       sc.ForwardSetState(SCE_ERLANG_DEFAULT);
+                               } else {
+                                       sc.SetState(SCE_ERLANG_DEFAULT);
+                               }
+                       } else {
+                               sc.SetState(SCE_ERLANG_DEFAULT);
+                       }
+               } else if (sc.state == SCE_ERLANG_VARIABLE) {
+                       if (!isalnum(sc.ch) && sc.ch != '_') {
+            sc.SetState(SCE_ERLANG_DEFAULT);
+                       }
+               } else if (sc.state == SCE_ERLANG_STRING) {
+                       if (sc.ch == '\"' && sc.chPrev != '\\') {
+                               sc.ForwardSetState(SCE_ERLANG_DEFAULT);
+                       }
+               } else if (sc.state == SCE_ERLANG_COMMENT ) {
+                       if (sc.atLineEnd) {
+                               sc.SetState(SCE_ERLANG_DEFAULT);
+                       }
+      } else if (sc.state == SCE_ERLANG_CHARACTER ) {
+         if ( sc.chPrev == '\\' ) {
+            sc.ForwardSetState(SCE_ERLANG_DEFAULT);
+         } else if ( sc.ch != '\\' ) {
+            sc.ForwardSetState(SCE_ERLANG_DEFAULT);
+         }
+      }
+
+               if (sc.state == SCE_ERLANG_DEFAULT) {
+                       if (sc.ch == '%') {
+                               sc.SetState(SCE_ERLANG_COMMENT);
+                       } else if (sc.ch == '\"') {
+            sc.SetState(SCE_ERLANG_STRING);
+         } else if (sc.ch == '#') {
+            parse_state = RECORD_START;
+                               sc.SetState(SCE_ERLANG_UNKNOWN);
+         } else if (sc.ch == '?') {
+            parse_state = MACRO_START;
+                               sc.SetState(SCE_ERLANG_UNKNOWN);
+         } else if (sc.ch == '$') {
+                               sc.SetState(SCE_ERLANG_CHARACTER);
+         } else if (sc.ch == '\'') {
+            parse_state = ATOM_QUOTED;
+                               sc.SetState(SCE_ERLANG_UNKNOWN);
+                       } else if ( isdigit(sc.ch) ) {
+            parse_state = NUMERAL_START;
+            radix_digits = sc.ch - '0';
+                               sc.SetState(SCE_ERLANG_UNKNOWN);
+         } else if ( '.' == sc.ch ) {
+            parse_state = NUMERAL_SPECULATIVE_MANTISSA;
+                               sc.SetState(SCE_ERLANG_UNKNOWN);
+                       } else if (isalpha(sc.ch) && isupper(sc.ch)) {
+                               sc.SetState(SCE_ERLANG_VARIABLE);
+                       } else if (isalpha(sc.ch)) {
+            parse_state = ATOM_UNQUOTED;
+                               sc.SetState(SCE_ERLANG_UNKNOWN);
+                       } else if (isoperator(static_cast<char>(sc.ch)) || sc.ch == '\\') {
+                               sc.SetState(SCE_ERLANG_OPERATOR);
+                       }
+               }
+       }
+       sc.Complete();
+}
+
+static int ClassifyFoldPointErlang(
+   Accessor &styler,
+   int styleNext,
+   int keyword_start
+) {
+       int lev = 0;
+   if ( styler.Match(keyword_start,"case")
+      || (
+            styler.Match(keyword_start,"fun")
+         && SCE_ERLANG_FUNCTION_NAME != styleNext)
+      || styler.Match(keyword_start,"if")
+      || styler.Match(keyword_start,"query")
+      || styler.Match(keyword_start,"receive")
+   ) {
+      ++lev;
+   } else if ( styler.Match(keyword_start,"end") ) {
+      --lev;
+   }
+       return lev;
+}
+
+
+static void FoldErlangDoc(
+   unsigned int startPos, int length, int initStyle,
+   WordList** /*keywordlists*/, Accessor &styler
+) {
+       unsigned int endPos = startPos + length;
+       //~ int visibleChars = 0;
+       int lineCurrent = styler.GetLine(startPos);
+       int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
+       int levelCurrent = levelPrev;
+       char chNext = styler.SafeGetCharAt(startPos);
+       int styleNext = styler.StyleAt(startPos);
+       int style = initStyle;
+       int keyword_start = 0;
+
+   bool fold_keywords = true;
+   bool fold_comments = true;
+   bool fold_braces = true;
+   bool fold_function_clauses = false;
+   bool fold_clauses = false;
+
+   //int clause_level = 0;
+
+       for (unsigned int i = startPos; i < endPos; i++) {
+               char ch = chNext;
+               chNext = styler.SafeGetCharAt(i + 1);
+               int stylePrev = style;
+               style = styleNext;
+               styleNext = styler.StyleAt(i + 1);
+               bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
+
+      if ( (stylePrev != SCE_ERLANG_KEYWORD) && (style == SCE_ERLANG_KEYWORD) ) {
+         keyword_start = i;
+      }
+      if ( fold_keywords ) {
+         if ( (stylePrev == SCE_ERLANG_KEYWORD)
+            && (style != SCE_ERLANG_KEYWORD)
+            && (style != SCE_ERLANG_ATOM)
+         ) {
+            levelCurrent += ClassifyFoldPointErlang(styler,styleNext,keyword_start);
+         }
+      }
+
+      if ( fold_comments ) {
+         if (style == SCE_ERLANG_COMMENT) {
+            if ((ch == '%') && (chNext == '{')) {
+               levelCurrent++;
+            } else if ((ch == '%') && (chNext == '}')) {
+               levelCurrent--;
+            }
+         }
+      }
+
+      if ( fold_function_clauses ) {
+         if ( (SC_FOLDLEVELBASE == levelCurrent) /*&& (style == SCE_ERLANG_OPERATOR)*/ ) {
+            if ( (ch == '-') && (chNext == '>')) {
+               //~ fprintf(stderr,"levelCurrent=%d\n", levelCurrent);
+               //++clause_level;
+               //~ if ( 0 < clause_level )
+                  ++levelCurrent;
+            }
+         }
+         //~ if (  (stylePrev != SCE_ERLANG_RECORD)
+            //~ && (style != SCE_ERLANG_NUMBER)
+            //~ && (style != SCE_ERLANG_STRING)
+            //~ && (style != SCE_ERLANG_COMMENT)
+         //~ ) {
+            if ( (SC_FOLDLEVELBASE+1 == levelCurrent) && (ch == '.') ) {
+               //--clause_level;
+               //~ if ( 0 == clause_level )
+                  --levelCurrent;
+            }
+         //~ }
+      }
+
+      if ( fold_clauses ) {
+         if ( (0 < levelCurrent) && (style == SCE_ERLANG_OPERATOR) ) {
+            if ((ch == '-') && (chNext == '>')) {
+               levelCurrent++;
+            }
+            if ( (ch == ';') ) {
+               levelCurrent--;
+            }
+         }
+         if ( (stylePrev != SCE_ERLANG_RECORD)
+            && (style != SCE_ERLANG_NUMBER)
+            && (style != SCE_ERLANG_STRING)
+            && (style != SCE_ERLANG_COMMENT)
+         ) {
+            if ( (ch == '.') ) {
+               levelCurrent--;
+            }
+         }
+         if (  (stylePrev == SCE_ERLANG_KEYWORD)
+            && (style != SCE_ERLANG_KEYWORD)
+            && (style != SCE_ERLANG_ATOM)
+            && (
+               styler.Match(keyword_start,"end") // 'end' counted twice if fold_keywords too
+               || styler.Match(keyword_start,"after") )
+         ) {
+            levelCurrent--;
+         }
+      }
+
+      if ( fold_braces ) {
+         if (style == SCE_ERLANG_OPERATOR) {
+            if ( (ch == '{') || (ch == '(') || (ch == '[') ) {
+               levelCurrent++;
+            } else if ( (ch == '}') || (ch == ')') || (ch == ']') ) {
+               levelCurrent--;
+            }
+         }
+      }
+
+               if (atEOL) {
+                       int lev = levelPrev;
+                       //~ if (visibleChars == 0 && foldCompact)
+                               //~ lev |= SC_FOLDLEVELWHITEFLAG;
+                       //~ if ((levelCurrent > levelPrev) && (visibleChars > 0))
+                       if ((levelCurrent > levelPrev)) {
+                               lev |= SC_FOLDLEVELHEADERFLAG;
+         }
+                       if (lev != styler.LevelAt(lineCurrent)) {
+                               styler.SetLevel(lineCurrent, lev);
+                       }
+                       lineCurrent++;
+                       levelPrev = levelCurrent;
+                       //~ visibleChars = 0;
+               }
+               //~ if (!isspacechar(ch))
+                       //~ visibleChars++;
+
+       }
+       // Fill in the real level of the next line, keeping the current flags as they will be filled in later
+       int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
+       styler.SetLevel(lineCurrent, levelPrev | flagsNext);
+}
+
+static const char * const erlangWordListDesc[] = {
+       "Keywords",
+       0
+};
+
+LexerModule lmErlang(
+   SCLEX_ERLANG,
+   ColouriseErlangDoc,
+   "erlang",
+   FoldErlangDoc,
+   erlangWordListDesc);
+
diff --git a/src/stc/scintilla/src/LexForth.cxx b/src/stc/scintilla/src/LexForth.cxx
new file mode 100644 (file)
index 0000000..3f12815
--- /dev/null
@@ -0,0 +1,348 @@
+// Scintilla source code edit control
+/** @file LexCrontab.cxx
+ ** Lexer to use with extended crontab files used by a powerful
+ ** Windows scheduler/event monitor/automation manager nnCron.
+ ** (http://nemtsev.eserv.ru/)
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+bool is_whitespace(int ch){
+    return ch == '\n' || ch == '\r' || ch == '\t' || ch == ' ';
+}
+
+bool is_blank(int ch){
+    return ch == '\t' || ch == ' ';
+}
+//#define FORTH_DEBUG
+#ifdef FORTH_DEBUG
+static FILE *f_debug;
+#define log(x)  fputs(f_debug,x);
+#else
+#define log(x)
+#endif
+
+#define STATE_LOCALE
+#define BL ' '
+
+static Accessor *st;
+static int cur_pos,pos1,pos2,pos0,lengthDoc;
+char *buffer;
+
+char getChar(bool is_bl){
+    char ch=st->SafeGetCharAt(cur_pos);
+    if(is_bl) if(is_whitespace(ch)) ch=BL;
+    return ch;
+}
+
+char getCharBL(){
+    char ch=st->SafeGetCharAt(cur_pos);
+    return ch;
+}
+bool is_eol(char ch){
+    return ch=='\n' || ch=='\r';
+}
+
+int parse(char ch, bool skip_eol){
+// pos1 - start pos of word
+// pos2 - pos after of word
+// pos0 - start pos
+    char c=0;
+    int len;
+    bool is_bl=ch==BL;
+    pos0=pos1=pos2=cur_pos;
+    for(;cur_pos<lengthDoc && (c=getChar(is_bl))==ch; cur_pos++){
+        if(is_eol(c) && !skip_eol){
+            pos2=pos1;
+            return 0;
+        }
+    }
+    pos1=cur_pos;
+    pos2=pos1;
+    if(cur_pos==lengthDoc) return 0;
+    for(len=0;cur_pos<lengthDoc && (c=getChar(is_bl))!=ch; cur_pos++){
+        if(is_eol(c) && !skip_eol) break;
+        pos2++;
+        buffer[len++]=c;
+    }
+    if(c==ch) pos2--;
+    buffer[len]='\0';
+#ifdef FORTH_DEBUG
+    fprintf(f_debug,"parse: %c %s\n",ch,buffer);
+#endif
+    return len;
+}
+
+bool _is_number(char *s,int base){
+    for(;*s;s++){
+        int digit=((int)*s)-(int)'0';
+#ifdef FORTH_DEBUG
+    fprintf(f_debug,"digit: %c %d\n",*s,digit);
+#endif
+        if(digit>9 && base>10) digit-=7;
+        if(digit<0) return false;
+        if(digit>=base) return false;
+    }
+    return true;
+}
+
+bool is_number(char *s){
+    if(strncmp(s,"0x",2)==0) return _is_number(s+2,16);
+    return _is_number(s,10);
+}
+
+static void ColouriseForthDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler)
+{
+    st=&styler;
+    cur_pos=startPos;
+    lengthDoc = startPos + length;
+    buffer = new char[length];
+
+#ifdef FORTH_DEBUG
+    f_debug=fopen("c:\\sci.log","at");
+#endif
+
+    WordList &control = *keywordLists[0];
+    WordList &keyword = *keywordLists[1];
+    WordList &defword = *keywordLists[2];
+    WordList &preword1 = *keywordLists[3];
+    WordList &preword2 = *keywordLists[4];
+    WordList &strings = *keywordLists[5];
+
+    // go through all provided text segment
+    // using the hand-written state machine shown below
+    styler.StartAt(startPos);
+    styler.StartSegment(startPos);
+    while(parse(BL,true)!=0){
+        if(pos0!=pos1){
+            styler.ColourTo(pos0,SCE_FORTH_DEFAULT);
+            styler.ColourTo(pos1-1,SCE_FORTH_DEFAULT);
+        }
+        if(strcmp("\\",buffer)==0){
+            styler.ColourTo(pos1,SCE_FORTH_COMMENT);
+            parse(1,false);
+            styler.ColourTo(pos2,SCE_FORTH_COMMENT);
+        }else if(strcmp("(",buffer)==0){
+            styler.ColourTo(pos1,SCE_FORTH_COMMENT);
+            parse(')',true);
+            if(cur_pos<lengthDoc) cur_pos++;
+            styler.ColourTo(cur_pos,SCE_FORTH_COMMENT);
+        }else if(strcmp("[",buffer)==0){
+            styler.ColourTo(pos1,SCE_FORTH_STRING);
+            parse(']',true);
+            if(cur_pos<lengthDoc) cur_pos++;
+            styler.ColourTo(cur_pos,SCE_FORTH_STRING);
+        }else if(strcmp("{",buffer)==0){
+            styler.ColourTo(pos1,SCE_FORTH_LOCALE);
+            parse('}',false);
+            if(cur_pos<lengthDoc) cur_pos++;
+            styler.ColourTo(cur_pos,SCE_FORTH_LOCALE);
+        }else if(strings.InList(buffer)) {
+            styler.ColourTo(pos1,SCE_FORTH_STRING);
+            parse('"',false);
+            if(cur_pos<lengthDoc) cur_pos++;
+            styler.ColourTo(cur_pos,SCE_FORTH_STRING);
+        }else if(control.InList(buffer)) {
+            styler.ColourTo(pos1,SCE_FORTH_CONTROL);
+            styler.ColourTo(pos2,SCE_FORTH_CONTROL);
+        }else if(keyword.InList(buffer)) {
+            styler.ColourTo(pos1,SCE_FORTH_KEYWORD);
+            styler.ColourTo(pos2,SCE_FORTH_KEYWORD);
+        }else if(defword.InList(buffer)) {
+            styler.ColourTo(pos1,SCE_FORTH_KEYWORD);
+            styler.ColourTo(pos2,SCE_FORTH_KEYWORD);
+            parse(BL,false);
+            styler.ColourTo(pos1-1,SCE_FORTH_DEFAULT);
+            styler.ColourTo(pos1,SCE_FORTH_DEFWORD);
+            styler.ColourTo(pos2,SCE_FORTH_DEFWORD);
+        }else if(preword1.InList(buffer)) {
+            styler.ColourTo(pos1,SCE_FORTH_PREWORD1);
+            parse(BL,false);
+            styler.ColourTo(pos2,SCE_FORTH_PREWORD1);
+        }else if(preword2.InList(buffer)) {
+            styler.ColourTo(pos1,SCE_FORTH_PREWORD2);
+            parse(BL,false);
+            styler.ColourTo(pos2,SCE_FORTH_PREWORD2);
+            parse(BL,false);
+            styler.ColourTo(pos1,SCE_FORTH_STRING);
+            styler.ColourTo(pos2,SCE_FORTH_STRING);
+        }else if(is_number(buffer)){
+            styler.ColourTo(pos1,SCE_FORTH_NUMBER);
+            styler.ColourTo(pos2,SCE_FORTH_NUMBER);
+        }
+    }
+#ifdef FORTH_DEBUG
+    fclose(f_debug);
+#endif
+    delete []buffer;
+    return;
+/*
+                        if(control.InList(buffer)) {
+                            styler.ColourTo(i,SCE_FORTH_CONTROL);
+                        } else if(keyword.InList(buffer)) {
+                            styler.ColourTo(i-1,SCE_FORTH_KEYWORD );
+                        } else if(defword.InList(buffer)) {
+                            styler.ColourTo(i-1,SCE_FORTH_DEFWORD );
+//                            prev_state=SCE_FORTH_DEFWORD
+                        } else if(preword1.InList(buffer)) {
+                            styler.ColourTo(i-1,SCE_FORTH_PREWORD1 );
+//                            state=SCE_FORTH_PREWORD1;
+                        } else if(preword2.InList(buffer)) {
+                            styler.ColourTo(i-1,SCE_FORTH_PREWORD2 );
+                         } else {
+                            styler.ColourTo(i-1,SCE_FORTH_DEFAULT);
+                        }
+*/
+/*
+    chPrev=' ';
+    for (int i = startPos; i < lengthDoc; i++) {
+        char ch = chNext;
+        chNext = styler.SafeGetCharAt(i + 1);
+        if(i!=startPos) chPrev=styler.SafeGetCharAt(i - 1);
+
+        if (styler.IsLeadByte(ch)) {
+            chNext = styler.SafeGetCharAt(i + 2);
+            i++;
+            continue;
+        }
+#ifdef FORTH_DEBUG
+        fprintf(f_debug,"%c %d ",ch,state);
+#endif
+        switch(state) {
+            case SCE_FORTH_DEFAULT:
+                if(is_whitespace(ch)) {
+                    // whitespace is simply ignored here...
+                    styler.ColourTo(i,SCE_FORTH_DEFAULT);
+                    break;
+                } else if( ch == '\\' && is_blank(chNext)) {
+                    // signals the start of an one line comment...
+                    state = SCE_FORTH_COMMENT;
+                    styler.ColourTo(i,SCE_FORTH_COMMENT);
+                } else if( is_whitespace(chPrev) &&  ch == '(' &&  is_whitespace(chNext)) {
+                    // signals the start of a plain comment...
+                    state = SCE_FORTH_COMMENT_ML;
+                    styler.ColourTo(i,SCE_FORTH_COMMENT_ML);
+                } else if( isdigit(ch) ) {
+                    // signals the start of a number
+                    bufferCount = 0;
+                    buffer[bufferCount++] = ch;
+                    state = SCE_FORTH_NUMBER;
+                } else if( !is_whitespace(ch)) {
+                    // signals the start of an identifier
+                    bufferCount = 0;
+                    buffer[bufferCount++] = ch;
+                    state = SCE_FORTH_IDENTIFIER;
+                } else {
+                    // style it the default style..
+                    styler.ColourTo(i,SCE_FORTH_DEFAULT);
+                }
+                break;
+
+            case SCE_FORTH_COMMENT:
+                // if we find a newline here,
+                // we simply go to default state
+                // else continue to work on it...
+                if( ch == '\n' || ch == '\r' ) {
+                    state = SCE_FORTH_DEFAULT;
+                } else {
+                    styler.ColourTo(i,SCE_FORTH_COMMENT);
+                }
+                break;
+
+            case SCE_FORTH_COMMENT_ML:
+                if( ch == ')') {
+                    state = SCE_FORTH_DEFAULT;
+                } else {
+                    styler.ColourTo(i+1,SCE_FORTH_COMMENT_ML);
+                }
+                break;
+
+            case SCE_FORTH_IDENTIFIER:
+                // stay  in CONF_IDENTIFIER state until we find a non-alphanumeric
+                if( !is_whitespace(ch) ) {
+                    buffer[bufferCount++] = ch;
+                } else {
+                    state = SCE_FORTH_DEFAULT;
+                    buffer[bufferCount] = '\0';
+#ifdef FORTH_DEBUG
+        fprintf(f_debug,"\nid %s\n",buffer);
+#endif
+
+                    // check if the buffer contains a keyword,
+                    // and highlight it if it is a keyword...
+//                    switch(prev_state)
+//                    case SCE_FORTH_DEFAULT:
+                        if(control.InList(buffer)) {
+                            styler.ColourTo(i,SCE_FORTH_CONTROL);
+                        } else if(keyword.InList(buffer)) {
+                            styler.ColourTo(i-1,SCE_FORTH_KEYWORD );
+                        } else if(defword.InList(buffer)) {
+                            styler.ColourTo(i-1,SCE_FORTH_DEFWORD );
+//                            prev_state=SCE_FORTH_DEFWORD
+                        } else if(preword1.InList(buffer)) {
+                            styler.ColourTo(i-1,SCE_FORTH_PREWORD1 );
+//                            state=SCE_FORTH_PREWORD1;
+                        } else if(preword2.InList(buffer)) {
+                            styler.ColourTo(i-1,SCE_FORTH_PREWORD2 );
+                         } else {
+                            styler.ColourTo(i-1,SCE_FORTH_DEFAULT);
+                        }
+//                        break;
+//                    case
+
+                    // push back the faulty character
+                    chNext = styler[i--];
+                }
+                break;
+
+            case SCE_FORTH_NUMBER:
+                // stay  in CONF_NUMBER state until we find a non-numeric
+                if( isdigit(ch) ) {
+                    buffer[bufferCount++] = ch;
+                } else {
+                    state = SCE_FORTH_DEFAULT;
+                    buffer[bufferCount] = '\0';
+                    // Colourize here... (normal number)
+                    styler.ColourTo(i-1,SCE_FORTH_NUMBER);
+                    // push back a character
+                    chNext = styler[i--];
+                }
+                break;
+        }
+    }
+#ifdef FORTH_DEBUG
+    fclose(f_debug);
+#endif
+    delete []buffer;
+*/
+}
+
+static void FoldForthDoc(unsigned int, int, int, WordList *[],
+                       Accessor &) {
+}
+
+static const char * const forthWordLists[] = {
+            "control keywords",
+            "keywords",
+            "definition words",
+            "prewords with one argument",
+            "prewords with two arguments",
+            "string definition keywords",
+            0,
+        };
+
+LexerModule lmForth(SCLEX_FORTH, ColouriseForthDoc, "forth",FoldForthDoc,forthWordLists);
index e2109a0ab59c03f0434db4176badc35e53e660b0..0cc7342e69134535e4d329e3e4cd5449d77de823 100644 (file)
@@ -1,51 +1,63 @@
 // Scintilla source code edit control
 /** @file LexFortran.cxx
  ** Lexer for Fortran.
 // Scintilla source code edit control
 /** @file LexFortran.cxx
  ** Lexer for Fortran.
- ** Writen by Chuan-jian Shen, Last changed Nov. 2002
+ ** Writen by Chuan-jian Shen, Last changed Sep. 2003
  **/
 // Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
  **/
 // Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
-
+/***************************************/
 #include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
 #include <stdio.h>
 #include <stdarg.h>
 #include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
 #include <stdio.h>
 #include <stdarg.h>
-
+/***************************************/
 #include "Platform.h"
 #include "Platform.h"
-
 #include "PropSet.h"
 #include "Accessor.h"
 #include "StyleContext.h"
 #include "KeyWords.h"
 #include "Scintilla.h"
 #include "SciLexer.h"
 #include "PropSet.h"
 #include "Accessor.h"
 #include "StyleContext.h"
 #include "KeyWords.h"
 #include "Scintilla.h"
 #include "SciLexer.h"
-
+/***********************************************/
 static inline bool IsAWordChar(const int ch) {
        return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '%');
 }
 static inline bool IsAWordChar(const int ch) {
        return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '%');
 }
-
+/**********************************************/
 static inline bool IsAWordStart(const int ch) {
        return (ch < 0x80) && (isalnum(ch));
 }
 static inline bool IsAWordStart(const int ch) {
        return (ch < 0x80) && (isalnum(ch));
 }
-
+/***************************************/
 inline bool IsABlank(unsigned int ch) {
     return (ch == ' ') || (ch == 0x09) || (ch == 0x0b) ;
 }
 inline bool IsABlank(unsigned int ch) {
     return (ch == ' ') || (ch == 0x09) || (ch == 0x0b) ;
 }
-static void ColouriseFortranDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
-                            Accessor &styler, bool isFixFormat) {
-
+/***************************************/
+inline bool IsALineEnd(char ch) {
+    return ((ch == '\n') || (ch == '\r')) ;
+}
+/***************************************/
+unsigned int GetContinuedPos(unsigned int pos, Accessor &styler) {
+       while (!IsALineEnd(styler.SafeGetCharAt(pos++))) continue;
+       if (styler.SafeGetCharAt(pos) == '\n') pos++;
+       while (IsABlank(styler.SafeGetCharAt(pos++))) continue;
+       char chCur = styler.SafeGetCharAt(pos);
+       if (chCur == '&') {
+               while (IsABlank(styler.SafeGetCharAt(++pos))) continue;
+               return pos;
+       } else {
+               return pos;
+       }
+}
+/***************************************/
+static void ColouriseFortranDoc(unsigned int startPos, int length, int initStyle,
+                       WordList *keywordlists[], Accessor &styler, bool isFixFormat) {
        WordList &keywords = *keywordlists[0];
        WordList &keywords2 = *keywordlists[1];
        WordList &keywords3 = *keywordlists[2];
        WordList &keywords = *keywordlists[0];
        WordList &keywords2 = *keywordlists[1];
        WordList &keywords3 = *keywordlists[2];
-
-       int posLineStart = 0, prevState = 0;
+       /***************************************/
+       int posLineStart = 0, numNonBlank = 0, prevState = 0;
        int endPos = startPos + length;
        int endPos = startPos + length;
-
-       // backtrack to the beginning of the document, this may be slow for big documents.
-       // initStyle = SCE_F_DEFAULT;
-       // StyleContext sc(0, startPos+length, initStyle, styler);
-
+       /***************************************/
        // backtrack to the nearest keyword
        while ((startPos > 1) && (styler.StyleAt(startPos) != SCE_F_WORD)) {
                startPos--;
        // backtrack to the nearest keyword
        while ((startPos > 1) && (styler.StyleAt(startPos) != SCE_F_WORD)) {
                startPos--;
@@ -53,22 +65,47 @@ static void ColouriseFortranDoc(unsigned int startPos, int length, int initStyle
        startPos = styler.LineStart(styler.GetLine(startPos));
        initStyle = styler.StyleAt(startPos - 1);
        StyleContext sc(startPos, endPos-startPos, initStyle, styler);
        startPos = styler.LineStart(styler.GetLine(startPos));
        initStyle = styler.StyleAt(startPos - 1);
        StyleContext sc(startPos, endPos-startPos, initStyle, styler);
-
+       /***************************************/
        for (; sc.More(); sc.Forward()) {
        for (; sc.More(); sc.Forward()) {
-
-               // remember the position of the line
+               // remember the start position of the line
                if (sc.atLineStart) {
                        posLineStart = sc.currentPos;
                if (sc.atLineStart) {
                        posLineStart = sc.currentPos;
+                       numNonBlank = 0;
                        sc.SetState(SCE_F_DEFAULT);
                }
                        sc.SetState(SCE_F_DEFAULT);
                }
-
+               if (!IsASpaceOrTab(sc.ch)) numNonBlank ++;
+               /***********************************************/
+               // Handle the fix format generically
+               int toLineStart = sc.currentPos - posLineStart;
+               if (isFixFormat && (toLineStart < 6 || toLineStart > 72)) {
+                       if (toLineStart == 0 && (tolower(sc.ch) == 'c' || sc.ch == '*') || sc.ch == '!') {
+                               sc.SetState(SCE_F_COMMENT);
+                               while (!sc.atLineEnd && sc.More()) sc.Forward(); // Until line end
+                       } else if (toLineStart > 72) {
+                               sc.SetState(SCE_F_COMMENT);
+                               while (!sc.atLineEnd && sc.More()) sc.Forward(); // Until line end
+                       } else if (toLineStart < 5) {
+                               if (IsADigit(sc.ch))
+                                       sc.SetState(SCE_F_LABEL);
+                               else
+                                       sc.SetState(SCE_F_DEFAULT);
+                       } else if (toLineStart == 5) {
+                               if (!IsASpace(sc.ch) && sc.ch != '0') {
+                                       sc.SetState(SCE_F_CONTINUATION);
+                                       sc.ForwardSetState(prevState);
+                               } else
+                                       sc.SetState(SCE_F_DEFAULT);
+                       }
+                       continue;
+               }
+               /***************************************/
                // Handle line continuation generically.
                // Handle line continuation generically.
-               if (sc.ch == '&') {
+               if (!isFixFormat && sc.ch == '&') {
                        char chTemp = ' ';
                        int j = 1;
                        while (IsABlank(chTemp) && j<132) {
                                chTemp = static_cast<char>(sc.GetRelative(j));
                        char chTemp = ' ';
                        int j = 1;
                        while (IsABlank(chTemp) && j<132) {
                                chTemp = static_cast<char>(sc.GetRelative(j));
-                               j ++;
+                               j++;
                        }
                        if (chTemp == '!') {
                                sc.SetState(SCE_F_CONTINUATION);
                        }
                        if (chTemp == '!') {
                                sc.SetState(SCE_F_CONTINUATION);
@@ -76,24 +113,21 @@ static void ColouriseFortranDoc(unsigned int startPos, int length, int initStyle
                        } else if (chTemp == '\r' || chTemp == '\n') {
                                int currentState = sc.state;
                                sc.SetState(SCE_F_CONTINUATION);
                        } else if (chTemp == '\r' || chTemp == '\n') {
                                int currentState = sc.state;
                                sc.SetState(SCE_F_CONTINUATION);
-                               if (currentState == SCE_F_STRING1 || currentState == SCE_F_STRING2) {
-                                       sc.ForwardSetState(SCE_F_DEFAULT);
-                                       while (IsASpace(sc.ch) && sc.More()) sc.Forward();
-                                       if (sc.ch == '&') {
-                                               sc.SetState(SCE_F_CONTINUATION);
-                                               sc.Forward();
-                                       }
-                                       sc.SetState(currentState);
+                               sc.ForwardSetState(SCE_F_DEFAULT);
+                               while (IsASpace(sc.ch) && sc.More()) sc.Forward();
+                               if (sc.ch == '&') {
+                                       sc.SetState(SCE_F_CONTINUATION);
+                                       sc.Forward();
                                }
                                }
+                               sc.SetState(currentState);
                        }
                        }
-                       continue;
                }
                }
-
+               /***************************************/
                // Determine if the current state should terminate.
                if (sc.state == SCE_F_OPERATOR) {
                        sc.SetState(SCE_F_DEFAULT);
                } else if (sc.state == SCE_F_NUMBER) {
                // Determine if the current state should terminate.
                if (sc.state == SCE_F_OPERATOR) {
                        sc.SetState(SCE_F_DEFAULT);
                } else if (sc.state == SCE_F_NUMBER) {
-                       if (!IsAWordChar(sc.ch)) {
+                       if (!(IsAWordChar(sc.ch) || sc.ch=='\'' || sc.ch=='\"' || sc.ch=='.')) {
                                sc.SetState(SCE_F_DEFAULT);
                        }
                } else if (sc.state == SCE_F_IDENTIFIER) {
                                sc.SetState(SCE_F_DEFAULT);
                        }
                } else if (sc.state == SCE_F_IDENTIFIER) {
@@ -109,7 +143,7 @@ static void ColouriseFortranDoc(unsigned int startPos, int length, int initStyle
                                }
                                sc.SetState(SCE_F_DEFAULT);
                        }
                                }
                                sc.SetState(SCE_F_DEFAULT);
                        }
-               } else if (sc.state == SCE_F_COMMENT) {
+               } else if (sc.state == SCE_F_COMMENT || sc.state == SCE_F_PREPROCESSOR) {
                        if (sc.ch == '\r' || sc.ch == '\n') {
                                sc.SetState(SCE_F_DEFAULT);
                        }
                        if (sc.ch == '\r' || sc.ch == '\n') {
                                sc.SetState(SCE_F_DEFAULT);
                        }
@@ -123,24 +157,14 @@ static void ColouriseFortranDoc(unsigned int startPos, int length, int initStyle
                                        prevState = SCE_F_DEFAULT;
                                }
                        } else if (sc.atLineEnd) {
                                        prevState = SCE_F_DEFAULT;
                                }
                        } else if (sc.atLineEnd) {
-                               if (isFixFormat) {
-                                       sc.ForwardSetState(SCE_F_DEFAULT);
-                                       posLineStart = sc.currentPos;
-                               } else {
-                                       sc.ChangeState(SCE_F_STRINGEOL);
-                                       sc.ForwardSetState(SCE_F_DEFAULT);
-                               }
+                               sc.ChangeState(SCE_F_STRINGEOL);
+                               sc.ForwardSetState(SCE_F_DEFAULT);
                        }
                } else if (sc.state == SCE_F_STRING2) {
                        prevState = sc.state;
                        if (sc.atLineEnd) {
                        }
                } else if (sc.state == SCE_F_STRING2) {
                        prevState = sc.state;
                        if (sc.atLineEnd) {
-                               if (isFixFormat) {
-                                       sc.ForwardSetState(SCE_F_DEFAULT);
-                                       posLineStart = sc.currentPos;
-                               } else {
-                                       sc.ChangeState(SCE_F_STRINGEOL);
-                                       sc.ForwardSetState(SCE_F_DEFAULT);
-                               }
+                               sc.ChangeState(SCE_F_STRINGEOL);
+                               sc.ForwardSetState(SCE_F_DEFAULT);
                        } else if (sc.ch == '\"') {
                                if (sc.chNext == '\"') {
                                        sc.Forward();
                        } else if (sc.ch == '\"') {
                                if (sc.chNext == '\"') {
                                        sc.Forward();
@@ -156,33 +180,36 @@ static void ColouriseFortranDoc(unsigned int startPos, int length, int initStyle
                } else if (sc.state == SCE_F_CONTINUATION) {
                        sc.SetState(SCE_F_DEFAULT);
                } else if (sc.state == SCE_F_LABEL) {
                } else if (sc.state == SCE_F_CONTINUATION) {
                        sc.SetState(SCE_F_DEFAULT);
                } else if (sc.state == SCE_F_LABEL) {
-                       if (sc.currentPos >= static_cast<unsigned int>(posLineStart+5)) {
+                       if (!IsADigit(sc.ch)) {
                                sc.SetState(SCE_F_DEFAULT);
                                sc.SetState(SCE_F_DEFAULT);
+                       } else {
+                               if (isFixFormat && sc.currentPos-posLineStart > 4)
+                                       sc.SetState(SCE_F_DEFAULT);
+                               else if (numNonBlank > 5)
+                                       sc.SetState(SCE_F_DEFAULT);
                        }
                }
                        }
                }
-
+               /***************************************/
                // Determine if a new state should be entered.
                if (sc.state == SCE_F_DEFAULT) {
                // Determine if a new state should be entered.
                if (sc.state == SCE_F_DEFAULT) {
-                       int toLineStart = sc.currentPos - posLineStart;
-                       if (isFixFormat && (toLineStart < 6 || toLineStart > 72)) {
-                               if (sc.atLineStart && (tolower(sc.ch) == 'c' || sc.ch == '*') || sc.ch == '!') {
-                                       sc.SetState(SCE_F_COMMENT);
-                               } else if (toLineStart > 72) {
+                       if (sc.ch == '!') {
+                               if (sc.chNext == '$') {
+                                       sc.SetState(SCE_F_PREPROCESSOR);
+                               } else {
                                        sc.SetState(SCE_F_COMMENT);
                                        sc.SetState(SCE_F_COMMENT);
-                               } else if (toLineStart < 5 && !IsASpace(sc.ch)) {
-                                       sc.SetState(SCE_F_LABEL);
-                               } else if (toLineStart == 5 && (!IsASpace(sc.ch) && sc.ch != '0')) {
-                                       sc.SetState(SCE_F_CONTINUATION);
-                                       sc.ForwardSetState(prevState);
                                }
                                }
+                       } else if ((!isFixFormat) && IsADigit(sc.ch) && numNonBlank == 1) {
+                               sc.SetState(SCE_F_LABEL);
                        } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
                                sc.SetState(SCE_F_NUMBER);
                        } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
                                sc.SetState(SCE_F_NUMBER);
+                       } else if ((tolower(sc.ch) == 'b' || tolower(sc.ch) == 'o' ||
+                                           tolower(sc.ch) == 'z') && (sc.chNext == '\"' || sc.chNext == '\'')) {
+                               sc.SetState(SCE_F_NUMBER);
+                               sc.Forward();
                        } else if (sc.ch == '.' && isalpha(sc.chNext)) {
                                sc.SetState(SCE_F_OPERATOR2);
                        } else if (IsAWordStart(sc.ch)) {
                                sc.SetState(SCE_F_IDENTIFIER);
                        } else if (sc.ch == '.' && isalpha(sc.chNext)) {
                                sc.SetState(SCE_F_OPERATOR2);
                        } else if (IsAWordStart(sc.ch)) {
                                sc.SetState(SCE_F_IDENTIFIER);
-                       } else if (sc.ch == '!') {
-                               sc.SetState(SCE_F_COMMENT);
                        } else if (sc.ch == '\"') {
                                sc.SetState(SCE_F_STRING2);
                        } else if (sc.ch == '\'') {
                        } else if (sc.ch == '\"') {
                                sc.SetState(SCE_F_STRING2);
                        } else if (sc.ch == '\'') {
@@ -194,37 +221,46 @@ static void ColouriseFortranDoc(unsigned int startPos, int length, int initStyle
        }
        sc.Complete();
 }
        }
        sc.Complete();
 }
-
-// The folding depends on the mercy of the programer.
-static int classifyFoldPointFortran(const char* s, const char* prevWord) {
+/***************************************/
+// To determine the folding level depending on keywords
+static int classifyFoldPointFortran(const char* s, const char* prevWord, const char chNextNonBlank) {
        int lev = 0;
        int lev = 0;
-       if (strcmp(prevWord, "end") == 0) return lev;
        if ((strcmp(prevWord, "else") == 0 && strcmp(s, "if") == 0) || strcmp(s, "elseif") == 0)
                return -1;
        if (strcmp(s, "associate") == 0 || strcmp(s, "block") == 0
            || strcmp(s, "blockdata") == 0 || strcmp(s, "select") == 0
            || strcmp(s, "do") == 0 || strcmp(s, "enum") ==0
        if ((strcmp(prevWord, "else") == 0 && strcmp(s, "if") == 0) || strcmp(s, "elseif") == 0)
                return -1;
        if (strcmp(s, "associate") == 0 || strcmp(s, "block") == 0
            || strcmp(s, "blockdata") == 0 || strcmp(s, "select") == 0
            || strcmp(s, "do") == 0 || strcmp(s, "enum") ==0
-           || strcmp(s, "forall") == 0 || strcmp(s, "function") == 0
-           || strcmp(s, "interface") == 0 || strcmp(s, "module") == 0
-           || strcmp(s, "program") == 0 || strcmp(s, "subroutine") == 0
-           || strcmp(s, "then") == 0 || strcmp(s, "where") == 0) {
-               lev = 1;
-       } else if (strcmp(s, "end") == 0 || strcmp(s, "continue") == 0
-           || strcmp(s, "endassociate") == 0 || strcmp(s, "endblock") == 0
-           || strcmp(s, "endblockdata") == 0 || strcmp(s, "endselect") == 0
-           || strcmp(s, "enddo") == 0 || strcmp(s, "endenum") ==0
-           || strcmp(s, "endif") == 0
-           || strcmp(s, "endforall") == 0 || strcmp(s, "endfunction") == 0
-           || strcmp(s, "endinterface") == 0 || strcmp(s, "endmodule") == 0
-           || strcmp(s, "endprogram") == 0 || strcmp(s, "endsubroutine") == 0
-           || strcmp(s, "endwhere") == 0 || strcmp(s, "procedure") == 0 ) {
-               lev = -1;
+           || strcmp(s, "function") == 0 || strcmp(s, "interface") == 0
+               || strcmp(s, "module") == 0 || strcmp(s, "program") == 0
+               || strcmp(s, "subroutine") == 0 || strcmp(s, "then") == 0
+               || (strcmp(s, "type") == 0 && chNextNonBlank != '(') ){
+                       if (strcmp(prevWord, "end") == 0)
+                               lev = 0;
+                       else
+                               lev = 1;
+       } else if (strcmp(s, "end") == 0 && chNextNonBlank != '='
+               || strcmp(s, "endassociate") == 0 || strcmp(s, "endblock") == 0
+               || strcmp(s, "endblockdata") == 0 || strcmp(s, "endselect") == 0
+               || strcmp(s, "enddo") == 0 || strcmp(s, "endenum") ==0
+               || strcmp(s, "endif") == 0 || strcmp(s, "endforall") == 0
+               || strcmp(s, "endfunction") == 0 || strcmp(s, "endinterface") == 0
+               || strcmp(s, "endmodule") == 0 || strcmp(s, "endprogram") == 0
+               || strcmp(s, "endsubroutine") == 0 || strcmp(s, "endtype") == 0
+               || strcmp(s, "endwhere") == 0
+               || strcmp(s, "procedure") == 0 ) { // Take care of the module procedure statement
+                       lev = -1;
+       } else if (strcmp(prevWord, "end") == 0 && strcmp(s, "if") == 0){ // end if
+                       lev = 0;
        }
        return lev;
 }
        }
        return lev;
 }
-static void FoldFortranDoc(unsigned int startPos, int length, int initStyle, WordList *[], Accessor &styler) {
-       //~ bool foldComment = styler.GetPropertyInt("fold.comment") != 0;
+// Folding the code
+static void FoldFortranDoc(unsigned int startPos, int length, int initStyle,
+                                                  Accessor &styler, bool isFixFormat) {
+       //
+       // bool foldComment = styler.GetPropertyInt("fold.comment") != 0;
        // Do not know how to fold the comment at the moment.
        // Do not know how to fold the comment at the moment.
+       //
        bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
        unsigned int endPos = startPos + length;
        int visibleChars = 0;
        bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
        unsigned int endPos = startPos + length;
        int visibleChars = 0;
@@ -232,37 +268,133 @@ static void FoldFortranDoc(unsigned int startPos, int length, int initStyle, Wor
        int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
        int levelCurrent = levelPrev;
        char chNext = styler[startPos];
        int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
        int levelCurrent = levelPrev;
        char chNext = styler[startPos];
+       char chNextNonBlank;
        int styleNext = styler.StyleAt(startPos);
        int style = initStyle;
        int styleNext = styler.StyleAt(startPos);
        int style = initStyle;
-
+       /***************************************/
        int lastStart = 0;
        int lastStart = 0;
-       char prevWord[32] = "";
-
+       char prevWord[32] = "", Label[6] = "";
+       // Variables for do label folding.
+       static int doLabels[100], posLabel=-1;
+       /***************************************/
        for (unsigned int i = startPos; i < endPos; i++) {
                char ch = chNext;
                chNext = styler.SafeGetCharAt(i + 1);
        for (unsigned int i = startPos; i < endPos; i++) {
                char ch = chNext;
                chNext = styler.SafeGetCharAt(i + 1);
+               chNextNonBlank = chNext;
+               unsigned int j=i+1;
+               while(IsABlank(chNextNonBlank) && j<endPos) {
+                       j ++ ;
+                       chNextNonBlank = styler.SafeGetCharAt(j);
+               }
                int stylePrev = style;
                style = styleNext;
                styleNext = styler.StyleAt(i + 1);
                bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
                int stylePrev = style;
                style = styleNext;
                styleNext = styler.StyleAt(i + 1);
                bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
-
-               if (stylePrev == SCE_F_DEFAULT && style == SCE_F_WORD)
-               {
-                       // Store last word start point.
+               //
+               if (stylePrev == SCE_F_DEFAULT && (style == SCE_F_WORD || style == SCE_F_LABEL)) {
+                       // Store last word and label start point.
                        lastStart = i;
                }
                        lastStart = i;
                }
-
+               /***************************************/
                if (style == SCE_F_WORD) {
                        if(iswordchar(ch) && !iswordchar(chNext)) {
                                char s[32];
                if (style == SCE_F_WORD) {
                        if(iswordchar(ch) && !iswordchar(chNext)) {
                                char s[32];
-                               unsigned int j;
-                               for(j = 0; ( j < 31 ) && ( j < i-lastStart+1 ); j++) {
-                                       s[j] = static_cast<char>(tolower(styler[lastStart + j]));
+                               unsigned int k;
+                               for(k=0; (k<31 ) && (k<i-lastStart+1 ); k++) {
+                                       s[k] = static_cast<char>(tolower(styler[lastStart+k]));
+                               }
+                               s[k] = '\0';
+                               // Handle the forall and where statement and structure.
+                               if (strcmp(s, "forall") == 0 || strcmp(s, "where") == 0) {
+                                       if (strcmp(prevWord, "end") != 0) {
+                                               j = i + 1;
+                                               char chBrace = '(', chSeek = ')', ch1 = styler.SafeGetCharAt(j);
+                                               // Find the position of the first (
+                                               while (ch1 != chBrace && j<endPos) {
+                                                       j++;
+                                                       ch1 = styler.SafeGetCharAt(j);
+                                               }
+                                               char styBrace = styler.StyleAt(j);
+                                               int depth = 1;
+                                               char chAtPos;
+                                               char styAtPos;
+                                               while (j<endPos) {
+                                                       j++;
+                                                       chAtPos = styler.SafeGetCharAt(j);
+                                                       styAtPos = styler.StyleAt(j);
+                                                       if (styAtPos == styBrace) {
+                                                               if (chAtPos == chBrace) depth++;
+                                                               if (chAtPos == chSeek) depth--;
+                                                               if (depth == 0) break;
+                                                       }
+                                               }
+                                               while (j<endPos) {
+                                                       j++;
+                                                       chAtPos = styler.SafeGetCharAt(j);
+                                                       styAtPos = styler.StyleAt(j);
+                                                       if (styAtPos == SCE_F_COMMENT || IsABlank(chAtPos)) continue;
+                                                       if (isFixFormat) {
+                                                               if (!IsALineEnd(chAtPos)) {
+                                                                       break;
+                                                               } else {
+                                                                       if (lineCurrent < styler.GetLine(styler.Length()-1)) {
+                                                                               j = styler.LineStart(lineCurrent+1);
+                                                                               if (styler.StyleAt(j+5) == SCE_F_CONTINUATION) {
+                                                                                       j += 5;
+                                                                                       continue;
+                                                                               } else {
+                                                                                       levelCurrent++;
+                                                                                       break;
+                                                                               }
+                                                                       }
+                                                               }
+                                                       } else {
+                                                               if (chAtPos == '&' && styler.StyleAt(j) == SCE_F_CONTINUATION) {
+                                                                       j = GetContinuedPos(j+1, styler);
+                                                                       continue;
+                                                               } else if (IsALineEnd(chAtPos)) {
+                                                                       levelCurrent ++;
+                                                                       break;
+                                                               } else {
+                                                                       break;
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               } else {
+                                       levelCurrent += classifyFoldPointFortran(s, prevWord, chNextNonBlank);
+                                       // Store the do Labels into array
+                                       if (strcmp(s, "do") == 0 && IsADigit(chNextNonBlank)) {
+                                               unsigned int k = 0;
+                                               for (i=j; (i<j+5 && i<endPos); i++) {
+                                                       ch = styler.SafeGetCharAt(i);
+                                                       if (IsADigit(ch))
+                                                               Label[k++] = ch;
+                                                       else
+                                                               break;
+                                               }
+                                               Label[k] = '\0';
+                                               posLabel ++;
+                                               doLabels[posLabel] = atoi(Label);
+                                       }
                                }
                                }
-                               s[j] = '\0';
-                               levelCurrent += classifyFoldPointFortran(s, prevWord);
                                strcpy(prevWord, s);
                        }
                                strcpy(prevWord, s);
                        }
+               } else if (style == SCE_F_LABEL) {
+                       if(IsADigit(ch) && !IsADigit(chNext)) {
+                               for(j = 0; ( j < 5 ) && ( j < i-lastStart+1 ); j++) {
+                                       ch = styler.SafeGetCharAt(lastStart + j);
+                                       if (IsADigit(ch) && styler.StyleAt(lastStart+j) == SCE_F_LABEL)
+                                               Label[j] = ch;
+                                       else
+                                               break;
+                               }
+                               Label[j] = '\0';
+                               while (doLabels[posLabel] == atoi(Label) && posLabel > -1) {
+                                       levelCurrent--;
+                                       posLabel--;
+                               }
+                       }
                }
                if (atEOL) {
                        int lev = levelPrev;
                }
                if (atEOL) {
                        int lev = levelPrev;
@@ -278,33 +410,41 @@ static void FoldFortranDoc(unsigned int startPos, int length, int initStyle, Wor
                        visibleChars = 0;
                        strcpy(prevWord, "");
                }
                        visibleChars = 0;
                        strcpy(prevWord, "");
                }
-
-               if (!isspacechar(ch))
-                       visibleChars++;
+               /***************************************/
+               if (!isspacechar(ch)) visibleChars++;
        }
        }
-
+       /***************************************/
        // Fill in the real level of the next line, keeping the current flags as they will be filled in later
        int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
        styler.SetLevel(lineCurrent, levelPrev | flagsNext);
 }
        // Fill in the real level of the next line, keeping the current flags as they will be filled in later
        int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
        styler.SetLevel(lineCurrent, levelPrev | flagsNext);
 }
-
+/***************************************/
 static const char * const FortranWordLists[] = {
        "Primary keywords and identifiers",
        "Intrinsic functions",
        "Extended and user defined functions",
        0,
 };
 static const char * const FortranWordLists[] = {
        "Primary keywords and identifiers",
        "Intrinsic functions",
        "Extended and user defined functions",
        0,
 };
-
+/***************************************/
 static void ColouriseFortranDocFreeFormat(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
                             Accessor &styler) {
        ColouriseFortranDoc(startPos, length, initStyle, keywordlists, styler, false);
 }
 static void ColouriseFortranDocFreeFormat(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
                             Accessor &styler) {
        ColouriseFortranDoc(startPos, length, initStyle, keywordlists, styler, false);
 }
-
+/***************************************/
 static void ColouriseFortranDocFixFormat(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
                             Accessor &styler) {
        ColouriseFortranDoc(startPos, length, initStyle, keywordlists, styler, true);
 }
 static void ColouriseFortranDocFixFormat(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
                             Accessor &styler) {
        ColouriseFortranDoc(startPos, length, initStyle, keywordlists, styler, true);
 }
-
-
-LexerModule lmFortran(SCLEX_FORTRAN, ColouriseFortranDocFreeFormat, "fortran", FoldFortranDoc, FortranWordLists);
-LexerModule lmF77(SCLEX_F77, ColouriseFortranDocFixFormat, "f77", FoldFortranDoc, FortranWordLists);
+/***************************************/
+static void FoldFortranDocFreeFormat(unsigned int startPos, int length, int initStyle,
+               WordList *[], Accessor &styler) {
+       FoldFortranDoc(startPos, length, initStyle,styler, false);
+}
+/***************************************/
+static void FoldFortranDocFixFormat(unsigned int startPos, int length, int initStyle,
+               WordList *[], Accessor &styler) {
+       FoldFortranDoc(startPos, length, initStyle,styler, true);
+}
+/***************************************/
+LexerModule lmFortran(SCLEX_FORTRAN, ColouriseFortranDocFreeFormat, "fortran", FoldFortranDocFreeFormat, FortranWordLists);
+LexerModule lmF77(SCLEX_F77, ColouriseFortranDocFixFormat, "f77", FoldFortranDocFixFormat, FortranWordLists);
index 18612c9ee3558bd4574a397ce8f3d68a911a8477..3781eed83af5877c6dd18df13cdbe9a337526b07 100644 (file)
@@ -27,21 +27,31 @@ static inline bool IsAWordChar(const int ch) {
        return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.');
 }
 
        return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.');
 }
 
-inline bool IsAWordStart(const int ch) {
+static inline bool IsAWordStart(const int ch) {
        return (ch < 0x80) && (isalnum(ch) || ch == '_');
 }
 
        return (ch < 0x80) && (isalnum(ch) || ch == '_');
 }
 
-inline bool isLuaOperator(char ch) {
-       if (isalnum(ch))
+static inline bool IsANumberChar(const int ch) {
+       // Not exactly following number definition (several dots are seen as OK, etc.)
+       // but probably enough in most cases.
+       return (ch < 0x80) &&
+               (isdigit(ch) || toupper(ch) == 'E' ||
+             ch == '.' || ch == '-' || ch == '+');
+}
+
+static inline bool IsLuaOperator(int ch) {
+       if (ch >= 0x80 || isalnum(ch)) {
                return false;
                return false;
+       }
        // '.' left out as it is used to make up numbers
        if (ch == '*' || ch == '/' || ch == '-' || ch == '+' ||
                ch == '(' || ch == ')' || ch == '=' ||
                ch == '{' || ch == '}' || ch == '~' ||
                ch == '[' || ch == ']' || ch == ';' ||
                ch == '<' || ch == '>' || ch == ',' ||
        // '.' left out as it is used to make up numbers
        if (ch == '*' || ch == '/' || ch == '-' || ch == '+' ||
                ch == '(' || ch == ')' || ch == '=' ||
                ch == '{' || ch == '}' || ch == '~' ||
                ch == '[' || ch == ']' || ch == ';' ||
                ch == '<' || ch == '>' || ch == ',' ||
-               ch == '.' || ch == '^' || ch == '%' || ch == ':')
+               ch == '.' || ch == '^' || ch == '%' || ch == ':') {
                return true;
                return true;
+       }
        return false;
 }
 
        return false;
 }
 
@@ -124,11 +134,8 @@ static void ColouriseLuaDoc(
                        sc.SetState(SCE_LUA_DEFAULT);
                } else if (sc.state == SCE_LUA_NUMBER) {
                        // We stop the number definition on non-numerical non-dot non-eE non-sign char
                        sc.SetState(SCE_LUA_DEFAULT);
                } else if (sc.state == SCE_LUA_NUMBER) {
                        // We stop the number definition on non-numerical non-dot non-eE non-sign char
-                       if (!(isdigit(sc.ch) || sc.ch == '.' ||
-                                 toupper(sc.ch) == 'E' || sc.ch == '-' || sc.ch == '+')) {
-                                       // Not exactly following number definition (several dots are seen as OK, etc.)
-                                       // but probably enough in most cases.
-                                       sc.SetState(SCE_LUA_DEFAULT);
+                       if (!IsANumberChar(sc.ch)) {
+                               sc.SetState(SCE_LUA_DEFAULT);
                        }
                } else if (sc.state == SCE_LUA_IDENTIFIER) {
                        if (!IsAWordChar(sc.ch)) {
                        }
                } else if (sc.state == SCE_LUA_IDENTIFIER) {
                        if (!IsAWordChar(sc.ch)) {
@@ -233,7 +240,7 @@ static void ColouriseLuaDoc(
                                sc.Forward();
                        } else if (sc.atLineStart && sc.Match('$')) {
                                sc.SetState(SCE_LUA_PREPROCESSOR);      // Obsolete since Lua 4.0, but still in old code
                                sc.Forward();
                        } else if (sc.atLineStart && sc.Match('$')) {
                                sc.SetState(SCE_LUA_PREPROCESSOR);      // Obsolete since Lua 4.0, but still in old code
-                       } else if (isLuaOperator(static_cast<char>(sc.ch))) {
+                       } else if (IsLuaOperator(static_cast<char>(sc.ch))) {
                                sc.SetState(SCE_LUA_OPERATOR);
                        }
                }
                                sc.SetState(SCE_LUA_OPERATOR);
                        }
                }
diff --git a/src/stc/scintilla/src/LexMPT.cxx b/src/stc/scintilla/src/LexMPT.cxx
new file mode 100644 (file)
index 0000000..1058b9b
--- /dev/null
@@ -0,0 +1,182 @@
+// Scintilla source code edit control
+/** @file LexMPT.cxx
+ ** Lexer for MPT specific files. Based on LexOthers.cxx
+ ** LOT = the text log file created by the MPT application while running a test program
+ ** Other MPT specific files to be added later.
+ **/
+// Copyright 2003 by Marius Gheorghe <mgheorghe@cabletest.com>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+#include "SString.h"
+
+static int GetLotLineState(SString &line) {
+       if (line.length()) {
+               // Most of the time the first non-blank character in line determines that line's type
+               // Now finds the first non-blank character
+               unsigned i; // Declares counter here to make it persistent after the for loop
+               for (i = 0; i < line.length(); ++i) {
+                       if (!isspace(line[i]))
+                               break;
+               }
+
+               // Checks if it was a blank line
+               if (i == line.length())
+                       return SCE_LOT_DEFAULT;
+
+               switch (line[i]) {
+               case '*': // Fail measurement
+                       return SCE_LOT_FAIL;
+
+               case '+': // Header
+               case '|': // Header
+                       return SCE_LOT_HEADER;
+
+               case ':': // Set test limits
+                       return SCE_LOT_SET;
+
+               case '-': // Section break
+                       return SCE_LOT_BREAK;
+
+               default:  // Any other line
+                       // Checks for message at the end of lot file
+                       if (line.contains("PASSED")) {
+                               return SCE_LOT_PASS;
+                       }
+                       else if (line.contains("FAILED")) {
+                               return SCE_LOT_FAIL;
+                       }
+                       else if (line.contains("ABORTED")) {
+                               return SCE_LOT_ABORT;
+                       }
+                       else {
+                               return i ? SCE_LOT_PASS : SCE_LOT_DEFAULT;                      
+                       }
+               }
+       }
+       else {
+               return SCE_LOT_DEFAULT;
+       }
+}
+
+static void ColourizeLotDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {
+       styler.StartAt(startPos);
+       styler.StartSegment(startPos);
+       bool atLineStart = true;// Arms the 'at line start' flag
+       char chNext = styler.SafeGetCharAt(startPos);
+       SString line("");
+       line.setsizegrowth(256);        // Lot lines are less than 256 chars long most of the time. This should avoid reallocations
+
+       // Styles LOT document
+       unsigned int i;                 // Declared here because it's used after the for loop
+       for (i = startPos; i < startPos + length; ++i) {
+               char ch = chNext;
+               chNext = styler.SafeGetCharAt(i + 1);
+               line += ch;
+               atLineStart = false;
+
+               // LOT files are only used on the Win32 platform, thus EOL == CR+LF
+               // Searches for the end of line
+               if (ch == '\r' && chNext == '\n') {
+                       line += chNext; // Gets the '\n'
+                       ++i; // Advances past the '\n'
+                       chNext = styler.SafeGetCharAt(i + 1); // Gets character of next line
+                       styler.ColourTo(i, GetLotLineState(line));
+                       line = "";
+                       atLineStart = true; // Arms flag for next line
+               }
+       }
+
+       // Last line may not have a line ending
+       if (!atLineStart) {
+               styler.ColourTo(i - 1, GetLotLineState(line));
+       }
+}
+
+// Folds an MPT LOT file: the blocks that can be folded are:
+// sections (headed by a set line)
+// passes (contiguous pass results within a section)
+// fails (contiguous fail results within a section)
+static void FoldLotDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {
+       bool foldCompact = styler.GetPropertyInt("fold.compact", 0) != 0;
+       unsigned int endPos = startPos + length;
+       int visibleChars = 0;
+       int lineCurrent = styler.GetLine(startPos);
+
+       char chNext = styler.SafeGetCharAt(startPos);
+       int style = SCE_LOT_DEFAULT;
+       int styleNext = styler.StyleAt(startPos);
+       int lev = SC_FOLDLEVELBASE;
+
+       // Gets style of previous line if not at the beginning of the document
+       if (startPos > 1)
+               style = styler.StyleAt(startPos - 2);
+
+       for (unsigned int i = startPos; i < endPos; i++) {
+               char ch = chNext;
+               chNext = styler.SafeGetCharAt(i + 1);
+
+               if (ch == '\r' && chNext == '\n') {
+                       // TO DO:
+                       // Should really get the state of the previous line from the styler
+                       int stylePrev = style;  
+                       style = styleNext;
+                       styleNext = styler.StyleAt(i + 2);
+               
+                       switch (style) {
+/*
+                       case SCE_LOT_SET:
+                               lev = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG;
+                               break;
+*/
+                       case SCE_LOT_FAIL:
+/*
+                               if (stylePrev != SCE_LOT_FAIL) 
+                                       lev = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG;
+                               else
+                                       lev = SC_FOLDLEVELBASE + 1;
+*/
+                               lev = SC_FOLDLEVELBASE;
+                               break;
+
+                       default:
+                               if (lineCurrent == 0 || stylePrev == SCE_LOT_FAIL) 
+                                       lev = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG;
+                               else
+                                       lev = SC_FOLDLEVELBASE + 1;
+
+                               if (visibleChars == 0 && foldCompact)
+                                       lev |= SC_FOLDLEVELWHITEFLAG;
+                               break;
+                       }
+
+                       if (lev != styler.LevelAt(lineCurrent)) 
+                               styler.SetLevel(lineCurrent, lev);
+
+                       lineCurrent++;
+                       visibleChars = 0;
+               }
+
+               if (!isspacechar(ch))
+                       visibleChars++;
+       }
+
+       int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
+       styler.SetLevel(lineCurrent, lev | flagsNext);
+}
+
+static const char * const emptyWordListDesc[] = {
+       0
+};
+
+LexerModule lmLot(SCLEX_LOT, ColourizeLotDoc, "lot", FoldLotDoc, emptyWordListDesc);
index 5f4dff3b8e4661d83ceeb034ae2b457677bcca24..249fa67ce2cc65f929913a65265bd7a1506375e2 100644 (file)
@@ -2,6 +2,10 @@
 /** @file LexMatlab.cxx
  ** Lexer for Matlab.
  ** Written by José Fonseca
 /** @file LexMatlab.cxx
  ** Lexer for Matlab.
  ** Written by José Fonseca
+ **
+ ** Changes by Christoph Dalitz 2003/12/04:
+ **   - added support for Octave
+ **   - Strings can now be included both in single or double quotes
  **/
 // Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
  **/
 // Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 #include "Scintilla.h"
 #include "SciLexer.h"
 
 #include "Scintilla.h"
 #include "SciLexer.h"
 
+
+static bool IsMatlabCommentChar(int c) {
+       return (c == '%') ;
+}
+
+static bool IsOctaveCommentChar(int c) {
+       return (c == '%' || c == '#') ;
+}
+
 static bool IsMatlabComment(Accessor &styler, int pos, int len) {
 static bool IsMatlabComment(Accessor &styler, int pos, int len) {
-       return len > 0 && (styler[pos] == '%' || styler[pos] == '!') ;
+       return len > 0 && IsMatlabCommentChar(styler[pos]) ;
+}
+
+static bool IsOctaveComment(Accessor &styler, int pos, int len) {
+       return len > 0 && IsOctaveCommentChar(styler[pos]) ;
 }
 
 static inline bool IsAWordChar(const int ch) {
 }
 
 static inline bool IsAWordChar(const int ch) {
@@ -33,8 +50,10 @@ static inline bool IsAWordStart(const int ch) {
        return (ch < 0x80) && (isalnum(ch) || ch == '_');
 }
 
        return (ch < 0x80) && (isalnum(ch) || ch == '_');
 }
 
-static void ColouriseMatlabDoc(unsigned int startPos, int length, int initStyle,
-                               WordList *keywordlists[], Accessor &styler) {
+static void ColouriseMatlabOctaveDoc(
+            unsigned int startPos, int length, int initStyle,
+            WordList *keywordlists[], Accessor &styler,
+            bool (*IsCommentChar)(int)) {
 
        WordList &keywords = *keywordlists[0];
 
 
        WordList &keywords = *keywordlists[0];
 
@@ -81,9 +100,11 @@ static void ColouriseMatlabDoc(unsigned int startPos, int length, int initStyle,
                                transpose = true;
                        }
                } else if (sc.state == SCE_MATLAB_STRING) {
                                transpose = true;
                        }
                } else if (sc.state == SCE_MATLAB_STRING) {
-                       // Matlab doubles quotes to preserve them, so just end this string
-                       // state now as a following quote will start again
-                       if (sc.ch == '\'') {
+                       if (sc.ch == '\'' && sc.chPrev != '\\') {
+                               sc.ForwardSetState(SCE_MATLAB_DEFAULT);
+                       }
+               } else if (sc.state == SCE_MATLAB_DOUBLEQUOTESTRING) {
+                       if (sc.ch == '"' && sc.chPrev != '\\') {
                                sc.ForwardSetState(SCE_MATLAB_DEFAULT);
                        }
                } else if (sc.state == SCE_MATLAB_COMMENT || sc.state == SCE_MATLAB_COMMAND) {
                                sc.ForwardSetState(SCE_MATLAB_DEFAULT);
                        }
                } else if (sc.state == SCE_MATLAB_COMMENT || sc.state == SCE_MATLAB_COMMAND) {
@@ -94,7 +115,7 @@ static void ColouriseMatlabDoc(unsigned int startPos, int length, int initStyle,
                }
 
                if (sc.state == SCE_MATLAB_DEFAULT) {
                }
 
                if (sc.state == SCE_MATLAB_DEFAULT) {
-                       if (sc.ch == '%') {
+                       if (IsCommentChar(sc.ch)) {
                                sc.SetState(SCE_MATLAB_COMMENT);
                        } else if (sc.ch == '!') {
                                sc.SetState(SCE_MATLAB_COMMAND);
                                sc.SetState(SCE_MATLAB_COMMENT);
                        } else if (sc.ch == '!') {
                                sc.SetState(SCE_MATLAB_COMMAND);
@@ -104,6 +125,8 @@ static void ColouriseMatlabDoc(unsigned int startPos, int length, int initStyle,
                                } else {
                                        sc.SetState(SCE_MATLAB_STRING);
                                }
                                } else {
                                        sc.SetState(SCE_MATLAB_STRING);
                                }
+                       } else if (sc.ch == '"') {
+              sc.SetState(SCE_MATLAB_DOUBLEQUOTESTRING);
                        } else if (isdigit(sc.ch) || (sc.ch == '.' && isdigit(sc.chNext))) {
                                sc.SetState(SCE_MATLAB_NUMBER);
                        } else if (isalpha(sc.ch)) {
                        } else if (isdigit(sc.ch) || (sc.ch == '.' && isdigit(sc.chNext))) {
                                sc.SetState(SCE_MATLAB_NUMBER);
                        } else if (isalpha(sc.ch)) {
@@ -123,8 +146,20 @@ static void ColouriseMatlabDoc(unsigned int startPos, int length, int initStyle,
        sc.Complete();
 }
 
        sc.Complete();
 }
 
-static void FoldMatlabDoc(unsigned int startPos, int length, int,
-                          WordList *[], Accessor &styler) {
+static void ColouriseMatlabDoc(unsigned int startPos, int length, int initStyle,
+                               WordList *keywordlists[], Accessor &styler) {
+  ColouriseMatlabOctaveDoc(startPos, length, initStyle, keywordlists, styler, IsMatlabCommentChar);
+}
+
+static void ColouriseOctaveDoc(unsigned int startPos, int length, int initStyle,
+                               WordList *keywordlists[], Accessor &styler) {
+  ColouriseMatlabOctaveDoc(startPos, length, initStyle, keywordlists, styler, IsOctaveCommentChar);
+}
+
+static void FoldMatlabOctaveDoc(unsigned int startPos, int length, int,
+                          WordList *[], Accessor &styler,
+                          bool (*IsComment)(Accessor&,int,int)) {
+
        int endPos = startPos + length;
 
        // Backtrack to previous line in case need to fix its fold status
        int endPos = startPos + length;
 
        // Backtrack to previous line in case need to fix its fold status
@@ -136,7 +171,7 @@ static void FoldMatlabDoc(unsigned int startPos, int length, int,
                }
        }
        int spaceFlags = 0;
                }
        }
        int spaceFlags = 0;
-       int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsMatlabComment);
+       int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsComment);
        char chNext = styler[startPos];
        for (int i = startPos; i < endPos; i++) {
                char ch = chNext;
        char chNext = styler[startPos];
        for (int i = startPos; i < endPos; i++) {
                char ch = chNext;
@@ -144,7 +179,7 @@ static void FoldMatlabDoc(unsigned int startPos, int length, int,
 
                if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == endPos)) {
                        int lev = indentCurrent;
 
                if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == endPos)) {
                        int lev = indentCurrent;
-                       int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsMatlabComment);
+                       int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsComment);
                        if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {
                                // Only non whitespace lines can be headers
                                if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) {
                        if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {
                                // Only non whitespace lines can be headers
                                if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) {
@@ -152,7 +187,7 @@ static void FoldMatlabDoc(unsigned int startPos, int length, int,
                                } else if (indentNext & SC_FOLDLEVELWHITEFLAG) {
                                        // Line after is blank so check the next - maybe should continue further?
                                        int spaceFlags2 = 0;
                                } else if (indentNext & SC_FOLDLEVELWHITEFLAG) {
                                        // Line after is blank so check the next - maybe should continue further?
                                        int spaceFlags2 = 0;
-                                       int indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsMatlabComment);
+                                       int indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsComment);
                                        if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) {
                                                lev |= SC_FOLDLEVELHEADERFLAG;
                                        }
                                        if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) {
                                                lev |= SC_FOLDLEVELHEADERFLAG;
                                        }
@@ -165,9 +200,26 @@ static void FoldMatlabDoc(unsigned int startPos, int length, int,
        }
 }
 
        }
 }
 
+static void FoldMatlabDoc(unsigned int startPos, int length, int initStyle,
+                          WordList *keywordlists[], Accessor &styler) {
+  FoldMatlabOctaveDoc(startPos, length, initStyle, keywordlists, styler, IsMatlabComment);
+}
+
+static void FoldOctaveDoc(unsigned int startPos, int length, int initStyle,
+                          WordList *keywordlists[], Accessor &styler) {
+  FoldMatlabOctaveDoc(startPos, length, initStyle, keywordlists, styler, IsOctaveComment);
+}
+
 static const char * const matlabWordListDesc[] = {
        "Keywords",
        0
 };
 
 static const char * const matlabWordListDesc[] = {
        "Keywords",
        0
 };
 
+static const char * const octaveWordListDesc[] = {
+       "Keywords",
+       0
+};
+
 LexerModule lmMatlab(SCLEX_MATLAB, ColouriseMatlabDoc, "matlab", FoldMatlabDoc, matlabWordListDesc);
 LexerModule lmMatlab(SCLEX_MATLAB, ColouriseMatlabDoc, "matlab", FoldMatlabDoc, matlabWordListDesc);
+
+LexerModule lmOctave(SCLEX_OCTAVE, ColouriseOctaveDoc, "octave", FoldOctaveDoc, octaveWordListDesc);
diff --git a/src/stc/scintilla/src/LexMetapost.cxx b/src/stc/scintilla/src/LexMetapost.cxx
new file mode 100644 (file)
index 0000000..b7d482c
--- /dev/null
@@ -0,0 +1,320 @@
+// Scintilla source code edit control
+
+// File: LexMetapost.cxx - general context conformant metapost coloring scheme
+// Author: Hans Hagen - PRAGMA ADE - Hasselt NL - www.pragma-ade.com
+// Version: September 28, 2003
+
+// Copyright: 1998-2003 by Neil Hodgson <neilh@scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+// This lexer is derived from the one written for the texwork environment (1999++) which in
+// turn is inspired on texedit (1991++) which finds its roots in wdt (1986).
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+#include "StyleContext.h"
+
+// val SCE_METAPOST_DEFAULT = 0
+// val SCE_METAPOST_SPECIAL = 1
+// val SCE_METAPOST_GROUP = 2
+// val SCE_METAPOST_SYMBOL = 3
+// val SCE_METAPOST_COMMAND = 4
+// val SCE_METAPOST_TEXT = 5
+
+// Definitions in SciTEGlobal.properties:
+//
+// Metapost Highlighting
+//
+// # Default
+// style.metapost.0=fore:#7F7F00
+// # Special
+// style.metapost.1=fore:#007F7F
+// # Group
+// style.metapost.2=fore:#880000
+// # Symbol
+// style.metapost.3=fore:#7F7F00
+// # Command
+// style.metapost.4=fore:#008800
+// # Text
+// style.metapost.5=fore:#000000
+
+// lexer.tex.comment.process=0
+
+// Auxiliary functions:
+
+static inline bool endOfLine(Accessor &styler, unsigned int i) {
+       return
+      (styler[i] == '\n') || ((styler[i] == '\r') && (styler.SafeGetCharAt(i + 1) != '\n')) ;
+}
+
+static inline bool isMETAPOSTcomment(int ch) {
+       return
+      (ch == '%') ;
+}
+
+static inline bool isMETAPOSTone(int ch) {
+       return
+      (ch == '[') || (ch == ']') || (ch == '(') || (ch == ')') ||
+      (ch == ':') || (ch == '=') || (ch == '<') || (ch == '>') ||
+      (ch == '{') || (ch == '}') || (ch == '\'') || (ch == '\"') ;
+}
+
+static inline bool isMETAPOSTtwo(int ch) {
+       return
+      (ch == ';') || (ch == '$') || (ch == '@') || (ch == '#');
+}
+
+static inline bool isMETAPOSTthree(int ch) {
+       return
+      (ch == '.') || (ch == '-') || (ch == '+') || (ch == '/') ||
+      (ch == '*') || (ch == ',') || (ch == '|') || (ch == '`') ||
+      (ch == '!') || (ch == '?') || (ch == '^') || (ch == '&') ||
+      (ch == '%') ;
+}
+
+static inline bool isMETAPOSTidentifier(int ch) {
+       return
+      ((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) ||
+      (ch == '_') ;
+}
+
+static inline bool isMETAPOSTnumber(int ch) {
+       return
+      (ch >= '0') && (ch <= '9') ;
+}
+
+static inline bool isMETAPOSTstring(int ch) {
+       return
+      (ch == '\"') ;
+}
+
+static inline bool isMETAPOSTcolon(int ch) {
+       return
+               (ch == ':') ;
+}
+
+static inline bool isMETAPOSTequal(int ch) {
+       return
+               (ch == '=') ;
+}
+
+static int CheckMETAPOSTInterface(
+    unsigned int startPos,
+    int length,
+    Accessor &styler,
+       int defaultInterface) {
+
+    char lineBuffer[1024] ;
+       unsigned int linePos = 0 ;
+
+       // some day we can make something lexer.metapost.mapping=(none,0)(metapost,1)(mp,1)(metafun,2)...
+
+    if (styler.SafeGetCharAt(0) == '%') {
+        for (unsigned int i = 0; i < startPos + length; i++) {
+            lineBuffer[linePos++] = styler.SafeGetCharAt(i) ;
+            if (endOfLine(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {
+                lineBuffer[linePos] = '\0';
+                               if (strstr(lineBuffer, "interface=none")) {
+                    return 0 ;
+                               } else if (strstr(lineBuffer, "interface=metapost") || strstr(lineBuffer, "interface=mp")) {
+                    return 1 ;
+                               } else if (strstr(lineBuffer, "interface=metafun")) {
+                    return 2 ;
+                               } else if (styler.SafeGetCharAt(1) == 'D' && strstr(lineBuffer, "%D \\module")) {
+                                       // better would be to limit the search to just one line
+                                       return 2 ;
+                } else {
+                    return defaultInterface ;
+                }
+            }
+               }
+    }
+
+    return defaultInterface ;
+}
+
+static void ColouriseMETAPOSTDoc(
+    unsigned int startPos,
+    int length,
+    int,
+    WordList *keywordlists[],
+    Accessor &styler) {
+
+       styler.StartAt(startPos) ;
+       styler.StartSegment(startPos) ;
+
+       bool processComment   = styler.GetPropertyInt("lexer.metapost.comment.process",   0) == 1 ;
+    int  defaultInterface = styler.GetPropertyInt("lexer.metapost.interface.default", 1) ;
+
+       int currentInterface = CheckMETAPOSTInterface(startPos,length,styler,defaultInterface) ;
+
+       // 0  no keyword highlighting
+       // 1  metapost keyword hightlighting
+       // 2+ metafun keyword hightlighting
+
+       int extraInterface = 0 ;
+
+       if (currentInterface != 0) {
+               extraInterface = currentInterface ;
+       }
+
+       WordList &keywords  = *keywordlists[0] ;
+       WordList &keywords2 = *keywordlists[extraInterface-1] ;
+
+       StyleContext sc(startPos, length, SCE_METAPOST_TEXT, styler) ;
+
+       char key[100] ;
+
+    bool inTeX     = false ;
+       bool inComment = false ;
+       bool inString  = false ;
+       bool inClause  = false ;
+
+       bool going = sc.More() ; // needed because of a fuzzy end of file state
+
+       for (; going; sc.Forward()) {
+
+               if (! sc.More()) { going = false ; } // we need to go one behind the end of text
+
+               if (inClause) {
+                       sc.SetState(SCE_METAPOST_TEXT) ;
+                       inClause = false ;
+               }
+
+               if (inComment) {
+                       if (sc.atLineEnd) {
+                               sc.SetState(SCE_METAPOST_TEXT) ;
+                               inTeX = false ;
+                               inComment = false ;
+                               inClause = false ;
+                               inString = false ; // not correct but we want to stimulate one-lines
+                       }
+               } else if (inString) {
+                       if (isMETAPOSTstring(sc.ch)) {
+                               sc.SetState(SCE_METAPOST_SPECIAL) ;
+                               sc.ForwardSetState(SCE_METAPOST_TEXT) ;
+                               inString = false ;
+                       } else if (sc.atLineEnd) {
+                               sc.SetState(SCE_METAPOST_TEXT) ;
+                               inTeX = false ;
+                               inComment = false ;
+                               inClause = false ;
+                               inString = false ; // not correct but we want to stimulate one-lines
+                       }
+               } else {
+                       if ((! isMETAPOSTidentifier(sc.ch)) && (sc.LengthCurrent() > 0)) {
+                               if (sc.state == SCE_METAPOST_COMMAND) {
+                                       sc.GetCurrent(key, sizeof(key)) ;
+                                       if ((strcmp(key,"btex") == 0) || (strcmp(key,"verbatimtex") == 0)) {
+                                       sc.ChangeState(SCE_METAPOST_GROUP) ;
+                                               inTeX = true ;
+                                       } else if (inTeX) {
+                                               if (strcmp(key,"etex") == 0) {
+                                               sc.ChangeState(SCE_METAPOST_GROUP) ;
+                                                       inTeX = false ;
+                                               } else {
+                                               sc.ChangeState(SCE_METAPOST_TEXT) ;
+                                               }
+                                       } else {
+                                               if (keywords && keywords.InList(key)) {
+                                               sc.ChangeState(SCE_METAPOST_COMMAND) ;
+                                               } else if (keywords2 && keywords2.InList(key)) {
+                                                       sc.ChangeState(SCE_METAPOST_EXTRA) ;
+                                               } else {
+                                                       sc.ChangeState(SCE_METAPOST_TEXT) ;
+                                               }
+                                       }
+                               }
+                       }
+                       if (isMETAPOSTcomment(sc.ch)) {
+                               if (! inTeX) {
+                                       sc.SetState(SCE_METAPOST_SYMBOL) ;
+                                       sc.ForwardSetState(SCE_METAPOST_DEFAULT) ;
+                                       inComment = ! processComment ;
+                               } else {
+                                       sc.SetState(SCE_METAPOST_TEXT) ;
+                               }
+                       } else if (isMETAPOSTstring(sc.ch)) {
+                               if (! inTeX) {
+                                       sc.SetState(SCE_METAPOST_SPECIAL) ;
+                                       if (! isMETAPOSTstring(sc.chNext)) {
+                                               sc.ForwardSetState(SCE_METAPOST_TEXT) ;
+                                       }
+                                       inString = true ;
+                               } else {
+                                       sc.SetState(SCE_METAPOST_TEXT) ;
+                               }
+                       } else if (isMETAPOSTcolon(sc.ch)) {
+                               if (! inTeX) {
+                                       if (! isMETAPOSTequal(sc.chNext)) {
+                                               sc.SetState(SCE_METAPOST_COMMAND) ;
+                                               inClause = true ;
+                                       } else {
+                                               sc.SetState(SCE_METAPOST_SPECIAL) ;
+                                       }
+                               } else {
+                                       sc.SetState(SCE_METAPOST_TEXT) ;
+                               }
+                       } else if (isMETAPOSTone(sc.ch)) {
+                               if (! inTeX) {
+                                       sc.SetState(SCE_METAPOST_SPECIAL) ;
+                               } else {
+                                       sc.SetState(SCE_METAPOST_TEXT) ;
+                               }
+                       } else if (isMETAPOSTtwo(sc.ch)) {
+                               if (! inTeX) {
+                                       sc.SetState(SCE_METAPOST_GROUP) ;
+                               } else {
+                                       sc.SetState(SCE_METAPOST_TEXT) ;
+                               }
+                       } else if (isMETAPOSTthree(sc.ch)) {
+                               if (! inTeX) {
+                                       sc.SetState(SCE_METAPOST_SYMBOL) ;
+                               } else {
+                                       sc.SetState(SCE_METAPOST_TEXT) ;
+                               }
+                       } else if (isMETAPOSTidentifier(sc.ch)) {
+                               if (sc.state != SCE_METAPOST_COMMAND) {
+                                       sc.SetState(SCE_METAPOST_TEXT) ;
+                                       sc.ChangeState(SCE_METAPOST_COMMAND) ;
+                               }
+                       } else if (isMETAPOSTnumber(sc.ch)) {
+                               // rather redundant since for the moment we don't handle numbers
+                               sc.SetState(SCE_METAPOST_TEXT) ;
+                       } else if (sc.atLineEnd) {
+                               sc.SetState(SCE_METAPOST_TEXT) ;
+                               inTeX = false ;
+                               inComment = false ;
+                               inClause = false ;
+                               inString = false ;
+                       } else {
+                               sc.SetState(SCE_METAPOST_TEXT) ;
+                       }
+               }
+
+       }
+
+       sc.Complete();
+
+}
+
+// Hooks info the system:
+
+static const char * const metapostWordListDesc[] = {
+       "MetaPost",
+       "MetaFun",
+       0
+} ;
+
+LexerModule lmMETAPOST(SCLEX_METAPOST, ColouriseMETAPOSTDoc, "metapost", 0, metapostWordListDesc);
index 31ac415ad4eb7b7ebf865e55628c46853d252c62..819dd312905ade74736add7af3ac4781c450a7f7 100644 (file)
@@ -427,6 +427,12 @@ static void ColouriseErrorListLine(
                styler.ColourTo(endPos, SCE_ERR_DIFF_ADDITION);
        } else if (lineBuffer[0] == '-' && lineBuffer[1] == '-' && lineBuffer[2] == '-') {
                styler.ColourTo(endPos, SCE_ERR_DIFF_MESSAGE);
                styler.ColourTo(endPos, SCE_ERR_DIFF_ADDITION);
        } else if (lineBuffer[0] == '-' && lineBuffer[1] == '-' && lineBuffer[2] == '-') {
                styler.ColourTo(endPos, SCE_ERR_DIFF_MESSAGE);
+       } else if (strstart(lineBuffer, "cf90-")) {
+               // Absoft Pro Fortran 90/95 v8.2 error and/or warning message
+               styler.ColourTo(endPos, SCE_ERR_ABSF);
+       } else if (strstart(lineBuffer, "fortcom:")) {
+               // Intel Fortran Compiler v8.0 error/warning message
+               styler.ColourTo(endPos, SCE_ERR_IFORT);
        } else if (lineBuffer[0] == '-') {
                styler.ColourTo(endPos, SCE_ERR_DIFF_DELETION);
        } else if (strstr(lineBuffer, "File \"") && strstr(lineBuffer, ", line ")) {
        } else if (lineBuffer[0] == '-') {
                styler.ColourTo(endPos, SCE_ERR_DIFF_DELETION);
        } else if (strstr(lineBuffer, "File \"") && strstr(lineBuffer, ", line ")) {
diff --git a/src/stc/scintilla/src/LexPB.cxx b/src/stc/scintilla/src/LexPB.cxx
new file mode 100644 (file)
index 0000000..d35944e
--- /dev/null
@@ -0,0 +1,228 @@
+// Scintilla source code edit control
+/** @file LexPB.cxx
+ ** Lexer for PowerBasic by Roland Walter, roland@rowalt.de
+ ** Last update: 17.10.2003 (toggling of subs/functions now until next sub/functin - this gives better results)
+ **/
+//
+// Necessary changes in Scintilla project:
+//  - In SciLexer.h and Scintilla.iface:
+//
+//    #define SCLEX_PB 51                              //ID for PowerBasic lexer
+//    (...)
+//    #define SCE_B_DEFAULT 0                  //in both VB and PB lexer
+//    #define SCE_B_COMMENT 1                  //in both VB and PB lexer
+//    #define SCE_B_NUMBER 2                   //in both VB and PB lexer
+//    #define SCE_B_KEYWORD 3                  //in both VB and PB lexer
+//    #define SCE_B_STRING 4                   //in both VB and PB lexer
+//    #define SCE_B_PREPROCESSOR 5             //VB lexer only, unsupported by PB lexer
+//    #define SCE_B_OPERATOR 6                 //in both VB and PB lexer
+//    #define SCE_B_IDENTIFIER 7               //in both VB and PB lexer
+//    #define SCE_B_DATE 8                             //VB lexer only, unsupported by PB lexer
+
+//  - Statement added to KeyWords.cxx:      'LINK_LEXER(lmPB);'
+//  - Statement added to scintilla_vc6.mak: '$(DIR_O)\LexPB.obj: ...\src\LexPB.cxx $(LEX_HEADERS)'
+//
+// Copyright for Scintilla: 1998-2001 by Neil Hodgson <neilh@scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+static inline bool IsTypeCharacter(const int ch) {
+       return ch == '%' || ch == '&' || ch == '@' || ch == '!' || ch == '#' || ch == '$';
+}
+
+static inline bool IsAWordChar(const int ch) {
+       return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
+}
+
+static inline bool IsAWordStart(const int ch) {
+       return (ch < 0x80) && (isalnum(ch) || ch == '_');
+}
+
+bool MatchUpperCase(Accessor &styler, int pos, const char *s)   //Same as styler.Match() but uppercase comparison (a-z,A-Z and space only)
+{
+       char ch;
+       for (int i=0; *s; i++)
+       {
+               ch=styler.SafeGetCharAt(pos+i);
+               if (ch > 0x60) ch -= '\x20';
+               if (*s != ch) return false;
+               s++;
+       }
+       return true;
+}
+
+static void ColourisePBDoc(unsigned int startPos, int length, int initStyle,WordList *keywordlists[],
+                                                  Accessor &styler) {
+
+       WordList &keywords = *keywordlists[0];
+
+       styler.StartAt(startPos);
+
+       StyleContext sc(startPos, length, initStyle, styler);
+
+       for (; sc.More(); sc.Forward()) {
+
+               if (sc.state == SCE_B_OPERATOR)
+               {
+                       sc.SetState(SCE_B_DEFAULT);
+               }
+               else if (sc.state == SCE_B_KEYWORD)
+               {
+                       if (!IsAWordChar(sc.ch))
+                       {
+                               if (!IsTypeCharacter(sc.ch))
+                               {
+                                       if (sc.ch == ']') {sc.Forward();}
+                                       char s[100];
+                                       sc.GetCurrentLowered(s, sizeof(s));
+                                       if (keywords.InList(s))
+                                       {
+                                               if (strcmp(s, "rem") == 0)
+                                               {
+                                                       sc.ChangeState(SCE_B_COMMENT);
+                                                       if (sc.atLineEnd) {sc.SetState(SCE_B_DEFAULT);}
+                                               }
+                                               else
+                                               {
+                                                       sc.SetState(SCE_B_DEFAULT);
+                                               }
+                                       }
+                                       else
+                                       {
+                                               sc.ChangeState(SCE_B_IDENTIFIER);
+                                               sc.SetState(SCE_B_DEFAULT);
+                                       }
+                               }
+                       }
+               }
+               else if (sc.state == SCE_B_NUMBER)
+               {
+                       if (!IsAWordChar(sc.ch)) {sc.SetState(SCE_B_DEFAULT);}
+               }
+               else if (sc.state == SCE_B_STRING)
+               {
+                       // PB doubles quotes to preserve them, so just end this string
+                       // state now as a following quote will start again
+                       if (sc.ch == '\"')
+                       {
+                               if (tolower(sc.chNext) == 'c') {sc.Forward();}
+                               sc.ForwardSetState(SCE_B_DEFAULT);
+                       }
+               }
+               else if (sc.state == SCE_B_COMMENT)
+               {
+                       if (sc.atLineEnd) {sc.SetState(SCE_B_DEFAULT);}
+               }
+
+               if (sc.state == SCE_B_DEFAULT)
+               {
+                       if (sc.ch == '\'') {sc.SetState(SCE_B_COMMENT);}
+                       else if (sc.ch == '\"') {sc.SetState(SCE_B_STRING);}
+                       else if (sc.ch == '#')
+                       {       int n = 1;
+                               int chSeek = ' ';
+                               while ((n < 100) && (chSeek == ' ' || chSeek == '\t'))
+                               {
+                                       chSeek = sc.GetRelative(n);
+                                       n++;
+                               }
+                               sc.SetState(SCE_B_OPERATOR);
+                       }
+                       else if (sc.ch == '&' && tolower(sc.chNext) == 'h') {sc.SetState(SCE_B_NUMBER);}
+                       else if (sc.ch == '&' && tolower(sc.chNext) == 'b') {sc.SetState(SCE_B_NUMBER);}
+                       else if (sc.ch == '&' && tolower(sc.chNext) == 'o') {sc.SetState(SCE_B_NUMBER);}
+                       else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {sc.SetState(SCE_B_NUMBER);}
+                       else if (IsAWordStart(sc.ch) || (sc.ch == '[')) {sc.SetState(SCE_B_KEYWORD);}
+                       else if (isoperator(static_cast<char>(sc.ch)) || (sc.ch == '\\')) {sc.SetState(SCE_B_OPERATOR);}
+               }
+
+       }
+       sc.Complete();
+}
+
+static void FoldPBDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler)
+{
+       // No folding enabled, no reason to continue...
+       if( styler.GetPropertyInt("fold") == 0 )
+               return;
+
+       unsigned int endPos = startPos + length;
+       int lineCurrent = styler.GetLine(startPos);
+       int levelCurrent = SC_FOLDLEVELBASE;
+       if (lineCurrent > 0)
+               levelCurrent = styler.LevelAt(lineCurrent-1) >> 16;
+       int levelNext = levelCurrent;
+       char chNext = styler[startPos];
+
+       bool atEOL=1;
+       for (unsigned int i = startPos; i < endPos; i++)
+       {
+               char ch = chNext;
+               chNext = styler.SafeGetCharAt(i + 1);
+
+               if( atEOL )                     //Begin of a new line (The Sub/Function/Macro keywords may occur at begin of line only)
+               {
+                       if( MatchUpperCase(styler,i,"FUNCTION") )  //else if(
+                       {
+                               styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
+                               levelNext=SC_FOLDLEVELBASE+1;
+                       }
+                       else if( MatchUpperCase(styler,i,"CALLBACK FUNCTION") )
+                       {
+                               styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
+                               levelNext=SC_FOLDLEVELBASE+1;
+                       }
+                       else if( MatchUpperCase(styler,i,"STATIC FUNCTION") )
+                       {
+                               styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
+                               levelNext=SC_FOLDLEVELBASE+1;
+                       }
+                       else if( MatchUpperCase(styler,i,"SUB") )
+                       {
+                               styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
+                               levelNext=SC_FOLDLEVELBASE+1;
+                       }
+                       else if( MatchUpperCase(styler,i,"STATIC SUB") )
+                       {
+                               styler.SetLevel(lineCurrent, (SC_FOLDLEVELBASE << 16) | SC_FOLDLEVELHEADERFLAG);
+                               levelNext=SC_FOLDLEVELBASE+1;
+                       }
+                       //else if( MatchUpperCase(styler,i,"MACRO") )  //ToDo: What's with single-line macros?
+               }
+
+               atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
+               if( atEOL )
+               {
+                       lineCurrent++;
+                       levelCurrent = levelNext;
+               }
+       }
+
+       if (levelNext == SC_FOLDLEVELBASE)
+       {
+               int levelUse = levelCurrent;
+               int lev = levelUse | levelNext << 16;
+               styler.SetLevel(lineCurrent, lev);
+       }
+}
+
+static const char * const pbWordListDesc[] = {
+       "Keywords",
+       0
+};
+
+LexerModule lmPB(SCLEX_POWERBASIC, ColourisePBDoc, "powerbasic", FoldPBDoc, pbWordListDesc);
index 33ba6a490f999bd27a7195de599df7338f2b5985..0c1a21ab48bdd7c8fdc8f1c8e76a9184a939759c 100644 (file)
@@ -33,10 +33,18 @@ static inline bool IsAWordChar(const int ch) {
        return ch < 0x80 && (isalnum(ch) || ch == '_');
 }
 
        return ch < 0x80 && (isalnum(ch) || ch == '_');
 }
 
-inline bool IsAWordStart(const int ch) {
+static inline bool IsAWordStart(const int ch) {
        return ch < 0x80 && isalpha(ch);
 }
 
        return ch < 0x80 && isalpha(ch);
 }
 
+static inline bool IsANumberChar(const int ch) {
+       // Not exactly following number definition (several dots are seen as OK, etc.)
+       // but probably enough in most cases.
+       return (ch < 0x80) &&
+               (isdigit(ch) || toupper(ch) == 'E' ||
+             ch == '.' || ch == '-' || ch == '+');
+}
+
 static void ColourisePovDoc(
        unsigned int startPos,
        int length,
 static void ColourisePovDoc(
        unsigned int startPos,
        int length,
@@ -91,11 +99,8 @@ static void ColourisePovDoc(
                        sc.SetState(SCE_POV_DEFAULT);
                } else if (sc.state == SCE_POV_NUMBER) {
                        // We stop the number definition on non-numerical non-dot non-eE non-sign char
                        sc.SetState(SCE_POV_DEFAULT);
                } else if (sc.state == SCE_POV_NUMBER) {
                        // We stop the number definition on non-numerical non-dot non-eE non-sign char
-                       if (!(isdigit(sc.ch) || sc.ch == '.' ||
-                                 toupper(sc.ch) == 'E' || sc.ch == '-' || sc.ch == '+')) {
-                                       // Not exactly following number definition (several dots are seen as OK, etc.)
-                                       // but probably enough in most cases.
-                                       sc.SetState(SCE_POV_DEFAULT);
+                       if (!IsANumberChar(sc.ch)) {
+                               sc.SetState(SCE_POV_DEFAULT);
                        }
                } else if (sc.state == SCE_POV_IDENTIFIER) {
                        if (!IsAWordChar(sc.ch)) {
                        }
                } else if (sc.state == SCE_POV_IDENTIFIER) {
                        if (!IsAWordChar(sc.ch)) {
index 211c3b8751e83e47db835eb76ec4c0f9fc53e5c7..16a068778e774d06abdc879349c8e43886731e16 100644 (file)
@@ -2,7 +2,8 @@
 /** @file LexPerl.cxx
  ** Lexer for subset of Perl.
  **/
 /** @file LexPerl.cxx
  ** Lexer for subset of Perl.
  **/
-// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
+// Lexical analysis fixes by Kein-Hong Man <mkh@pl.jaring.my> 20031020
+// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include <stdlib.h>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include <stdlib.h>
 #include "Scintilla.h"
 #include "SciLexer.h"
 
 #include "Scintilla.h"
 #include "SciLexer.h"
 
+#define PERLNUM_DECIMAL 1
+#define PERLNUM_NON_DEC 2
+#define PERLNUM_FLOAT 3
+#define PERLNUM_VECTOR 4
+#define PERLNUM_V_VECTOR 5
+
+#define HERE_DELIM_MAX 256
+
 static inline bool isEOLChar(char ch) {
        return (ch == '\r') || (ch == '\n');
 }
 static inline bool isEOLChar(char ch) {
        return (ch == '\r') || (ch == '\n');
 }
@@ -31,9 +40,6 @@ static bool isSingleCharOp(char ch) {
 }
 
 static inline bool isPerlOperator(char ch) {
 }
 
 static inline bool isPerlOperator(char ch) {
-       if (isalnum(ch))
-               return false;
-       // '.' left out as it is used to make up numbers
        if (ch == '%' || ch == '^' || ch == '&' || ch == '*' || ch == '\\' ||
                ch == '(' || ch == ')' || ch == '-' || ch == '+' ||
                ch == '=' || ch == '|' || ch == '{' || ch == '}' ||
        if (ch == '%' || ch == '^' || ch == '&' || ch == '*' || ch == '\\' ||
                ch == '(' || ch == ')' || ch == '-' || ch == '+' ||
                ch == '=' || ch == '|' || ch == '{' || ch == '}' ||
@@ -46,18 +52,13 @@ static inline bool isPerlOperator(char ch) {
 
 static int classifyWordPerl(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {
        char s[100];
 
 static int classifyWordPerl(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {
        char s[100];
-       bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.');
        for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
                s[i] = styler[start + i];
                s[i + 1] = '\0';
        }
        char chAttr = SCE_PL_IDENTIFIER;
        for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
                s[i] = styler[start + i];
                s[i + 1] = '\0';
        }
        char chAttr = SCE_PL_IDENTIFIER;
-       if (wordIsNumber)
-               chAttr = SCE_PL_NUMBER;
-       else {
-               if (keywords.InList(s))
-                       chAttr = SCE_PL_WORD;
-       }
+       if (keywords.InList(s))
+               chAttr = SCE_PL_WORD;
        styler.ColourTo(end, chAttr);
        return chAttr;
 }
        styler.ColourTo(end, chAttr);
        return chAttr;
 }
@@ -67,6 +68,23 @@ static inline bool isEndVar(char ch) {
               ch != '_' && ch != '\'';
 }
 
               ch != '_' && ch != '\'';
 }
 
+static inline bool isNonQuote(char ch) {
+       return isalnum(ch) || ch == '_';
+}
+
+static inline char actualNumStyle(int numberStyle) {
+       switch (numberStyle) {
+       case PERLNUM_VECTOR:
+       case PERLNUM_V_VECTOR:
+               return SCE_PL_STRING;
+       case PERLNUM_DECIMAL:
+       case PERLNUM_NON_DEC:
+       case PERLNUM_FLOAT:
+       default:
+               return SCE_PL_NUMBER;
+       }
+}
+
 static bool isMatch(Accessor &styler, int lengthDoc, int pos, const char *val) {
        if ((pos + static_cast<int>(strlen(val))) >= lengthDoc) {
                return false;
 static bool isMatch(Accessor &styler, int lengthDoc, int pos, const char *val) {
        if ((pos + static_cast<int>(strlen(val))) >= lengthDoc) {
                return false;
@@ -109,12 +127,16 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                char Quote;             // the char after '<<'
                bool Quoted;            // true if Quote in ('\'','"','`')
                int DelimiterLength;    // strlen(Delimiter)
                char Quote;             // the char after '<<'
                bool Quoted;            // true if Quote in ('\'','"','`')
                int DelimiterLength;    // strlen(Delimiter)
-               char Delimiter[256];    // the Delimiter, 256: sizeof PL_tokenbuf
+               char *Delimiter;        // the Delimiter, 256: sizeof PL_tokenbuf
                HereDocCls() {
                        State = 0;
                        DelimiterLength = 0;
                HereDocCls() {
                        State = 0;
                        DelimiterLength = 0;
+                       Delimiter = new char[HERE_DELIM_MAX];
                        Delimiter[0] = '\0';
                }
                        Delimiter[0] = '\0';
                }
+               ~HereDocCls() {
+                       delete []Delimiter;
+               }
        };
        HereDocCls HereDoc;     // TODO: FIFO for stacked here-docs
 
        };
        HereDocCls HereDoc;     // TODO: FIFO for stacked here-docs
 
@@ -141,14 +163,17 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
        };
        QuoteCls Quote;
 
        };
        QuoteCls Quote;
 
-       char sooked[100];
-       int sookedpos = 0;
-       bool preferRE = true;
-       sooked[sookedpos] = '\0';
        int state = initStyle;
        int state = initStyle;
+       char numState = PERLNUM_DECIMAL;
+       int dotCount = 0;
        unsigned int lengthDoc = startPos + length;
        unsigned int lengthDoc = startPos + length;
+       //int sookedpos = 0; // these have no apparent use, see POD state
+       //char sooked[100];
+       //sooked[sookedpos] = '\0';
 
 
-       // If in a long distance lexical state, seek to the beginning  to find quote characters
+       // If in a long distance lexical state, seek to the beginning to find quote characters
+       // Perl strings can be multi-line with embedded newlines, so backtrack.
+       // Perl numbers have additional state during lexing, so backtrack too.
        if (state == SCE_PL_HERE_Q || state == SCE_PL_HERE_QQ || state == SCE_PL_HERE_QX) {
                while ((startPos > 1) && (styler.StyleAt(startPos) != SCE_PL_HERE_DELIM)) {
                        startPos--;
        if (state == SCE_PL_HERE_Q || state == SCE_PL_HERE_QQ || state == SCE_PL_HERE_QX) {
                while ((startPos > 1) && (styler.StyleAt(startPos) != SCE_PL_HERE_DELIM)) {
                        startPos--;
@@ -163,6 +188,10 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
        || state == SCE_PL_STRING_QW
        || state == SCE_PL_REGEX
        || state == SCE_PL_REGSUBST
        || state == SCE_PL_STRING_QW
        || state == SCE_PL_REGEX
        || state == SCE_PL_REGSUBST
+       || state == SCE_PL_STRING
+       || state == SCE_PL_BACKTICKS
+       || state == SCE_PL_CHARACTER
+       || state == SCE_PL_NUMBER
        ) {
                while ((startPos > 1) && (styler.StyleAt(startPos - 1) == state)) {
                        startPos--;
        ) {
                while ((startPos > 1) && (styler.StyleAt(startPos - 1) == state)) {
                        startPos--;
@@ -179,6 +208,9 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 
        for (unsigned int i = startPos; i < lengthDoc; i++) {
                char ch = chNext;
 
        for (unsigned int i = startPos; i < lengthDoc; i++) {
                char ch = chNext;
+               // if the current character is not consumed due to the completion of an
+               // earlier style, lexing can be restarted via a simple goto
+       restartLexer:
                chNext = styler.SafeGetCharAt(i + 1);
                char chNext2 = styler.SafeGetCharAt(i + 2);
 
                chNext = styler.SafeGetCharAt(i + 1);
                char chNext2 = styler.SafeGetCharAt(i + 2);
 
@@ -189,32 +221,36 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                        continue;
                }
                if ((chPrev == '\r' && ch == '\n')) {   // skip on DOS/Windows
                        continue;
                }
                if ((chPrev == '\r' && ch == '\n')) {   // skip on DOS/Windows
+                       styler.ColourTo(i, state);
                        chPrev = ch;
                        continue;
                }
 
                if (HereDoc.State == 1 && isEOLChar(ch)) {
                        // Begin of here-doc (the line after the here-doc delimiter):
                        chPrev = ch;
                        continue;
                }
 
                if (HereDoc.State == 1 && isEOLChar(ch)) {
                        // Begin of here-doc (the line after the here-doc delimiter):
+                       // Lexically, the here-doc starts from the next line after the >>, but the
+                       // first line of here-doc seem to follow the style of the last EOL sequence
                        HereDoc.State = 2;
                        HereDoc.State = 2;
-                       styler.ColourTo(i - 1, state);
                        if (HereDoc.Quoted) {
                                if (state == SCE_PL_HERE_DELIM) {
                                        // Missing quote at end of string! We are stricter than perl.
                        if (HereDoc.Quoted) {
                                if (state == SCE_PL_HERE_DELIM) {
                                        // Missing quote at end of string! We are stricter than perl.
+                                       // Colour here-doc anyway while marking this bit as an error.
                                        state = SCE_PL_ERROR;
                                        state = SCE_PL_ERROR;
-                               } else {
-                                       switch (HereDoc.Quote) {
-                                       case '\'':
-                                               state = SCE_PL_HERE_Q ;
-                                               break;
-                                       case '"':
-                                               state = SCE_PL_HERE_QQ;
-                                               break;
-                                       case '`':
-                                               state = SCE_PL_HERE_QX;
-                                               break;
-                                       }
+                               }
+                               styler.ColourTo(i - 1, state);
+                               switch (HereDoc.Quote) {
+                               case '\'':
+                                       state = SCE_PL_HERE_Q ;
+                                       break;
+                               case '"':
+                                       state = SCE_PL_HERE_QQ;
+                                       break;
+                               case '`':
+                                       state = SCE_PL_HERE_QX;
+                                       break;
                                }
                        } else {
                                }
                        } else {
+                               styler.ColourTo(i - 1, state);
                                switch (HereDoc.Quote) {
                                case '\\':
                                        state = SCE_PL_HERE_Q ;
                                switch (HereDoc.Quote) {
                                case '\\':
                                        state = SCE_PL_HERE_Q ;
@@ -226,26 +262,37 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                }
 
                if (state == SCE_PL_DEFAULT) {
                }
 
                if (state == SCE_PL_DEFAULT) {
-                       if (iswordstart(ch)) {
-                               styler.ColourTo(i - 1, state);
-                               if (ch == 's' && !isalnum(chNext)) {
+                       if (isdigit(ch) || (isdigit(chNext) &&
+                               (ch == '.' || ch == 'v'))) {
+                               state = SCE_PL_NUMBER;
+                               numState = PERLNUM_DECIMAL;
+                               dotCount = 0;
+                               if (ch == '0') {        // hex,bin,octal
+                                       if (chNext == 'x' || chNext == 'b' || isdigit(chNext)) {
+                                               numState = PERLNUM_NON_DEC;
+                                       }
+                               } else if (ch == 'v') { // vector
+                                       numState = PERLNUM_V_VECTOR;
+                               }
+                       } else if (iswordstart(ch)) {
+                               if (ch == 's' && !isNonQuote(chNext)) {
                                        state = SCE_PL_REGSUBST;
                                        Quote.New(2);
                                        state = SCE_PL_REGSUBST;
                                        Quote.New(2);
-                               } else if (ch == 'm' && !isalnum(chNext)) {
+                               } else if (ch == 'm' && !isNonQuote(chNext)) {
                                        state = SCE_PL_REGEX;
                                        Quote.New(1);
                                        state = SCE_PL_REGEX;
                                        Quote.New(1);
-                               } else if (ch == 'q' && !isalnum(chNext)) {
+                               } else if (ch == 'q' && !isNonQuote(chNext)) {
                                        state = SCE_PL_STRING_Q;
                                        Quote.New(1);
                                        state = SCE_PL_STRING_Q;
                                        Quote.New(1);
-                               } else if (ch == 'y' && !isalnum(chNext)) {
+                               } else if (ch == 'y' && !isNonQuote(chNext)) {
                                        state = SCE_PL_REGSUBST;
                                        Quote.New(2);
                                        state = SCE_PL_REGSUBST;
                                        Quote.New(2);
-                               } else if (ch == 't' && chNext == 'r' && !isalnum(chNext2)) {
+                               } else if (ch == 't' && chNext == 'r' && !isNonQuote(chNext2)) {
                                        state = SCE_PL_REGSUBST;
                                        Quote.New(2);
                                        i++;
                                        chNext = chNext2;
                                        state = SCE_PL_REGSUBST;
                                        Quote.New(2);
                                        i++;
                                        chNext = chNext2;
-                               } else if (ch == 'q' && (chNext == 'q' || chNext == 'r' || chNext == 'w' || chNext == 'x') && !isalnum(chNext2)) {
+                               } else if (ch == 'q' && (chNext == 'q' || chNext == 'r' || chNext == 'w' || chNext == 'x') && !isNonQuote(chNext2)) {
                                        if      (chNext == 'q') state = SCE_PL_STRING_QQ;
                                        else if (chNext == 'x') state = SCE_PL_STRING_QX;
                                        else if (chNext == 'r') state = SCE_PL_STRING_QR;
                                        if      (chNext == 'q') state = SCE_PL_STRING_QQ;
                                        else if (chNext == 'x') state = SCE_PL_STRING_QX;
                                        else if (chNext == 'r') state = SCE_PL_STRING_QR;
@@ -253,9 +300,12 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                        i++;
                                        chNext = chNext2;
                                        Quote.New(1);
                                        i++;
                                        chNext = chNext2;
                                        Quote.New(1);
+                               } else if (ch == 'x' && (chNext == '=' ||       // repetition
+                                          (chNext != '_' && !isalnum(chNext)) ||
+                                          (isdigit(chPrev) && isdigit(chNext)))) {
+                                       styler.ColourTo(i, SCE_PL_OPERATOR);
                                } else {
                                        state = SCE_PL_WORD;
                                } else {
                                        state = SCE_PL_WORD;
-                                       preferRE = false;
                                        if ((!iswordchar(chNext) && chNext != '\'')
                                                || (chNext == '.' && chNext2 == '.')) {
                                                // We need that if length of word == 1!
                                        if ((!iswordchar(chNext) && chNext != '\'')
                                                || (chNext == '.' && chNext2 == '.')) {
                                                // We need that if length of word == 1!
@@ -265,10 +315,8 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                        }
                                }
                        } else if (ch == '#') {
                                        }
                                }
                        } else if (ch == '#') {
-                               styler.ColourTo(i - 1, state);
                                state = SCE_PL_COMMENTLINE;
                        } else if (ch == '\"') {
                                state = SCE_PL_COMMENTLINE;
                        } else if (ch == '\"') {
-                               styler.ColourTo(i - 1, state);
                                state = SCE_PL_STRING;
                                Quote.New(1);
                                Quote.Open(ch);
                                state = SCE_PL_STRING;
                                Quote.New(1);
                                Quote.Open(ch);
@@ -277,31 +325,32 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                        // Archaic call
                                        styler.ColourTo(i, state);
                                } else {
                                        // Archaic call
                                        styler.ColourTo(i, state);
                                } else {
-                                       styler.ColourTo(i - 1, state);
                                        state = SCE_PL_CHARACTER;
                                        Quote.New(1);
                                        Quote.Open(ch);
                                }
                        } else if (ch == '`') {
                                        state = SCE_PL_CHARACTER;
                                        Quote.New(1);
                                        Quote.Open(ch);
                                }
                        } else if (ch == '`') {
-                               styler.ColourTo(i - 1, state);
                                state = SCE_PL_BACKTICKS;
                                Quote.New(1);
                                Quote.Open(ch);
                        } else if (ch == '$') {
                                state = SCE_PL_BACKTICKS;
                                Quote.New(1);
                                Quote.Open(ch);
                        } else if (ch == '$') {
-                               preferRE = false;
-                               styler.ColourTo(i - 1, state);
                                if ((chNext == '{') || isspacechar(chNext)) {
                                        styler.ColourTo(i, SCE_PL_SCALAR);
                                } else {
                                        state = SCE_PL_SCALAR;
                                if ((chNext == '{') || isspacechar(chNext)) {
                                        styler.ColourTo(i, SCE_PL_SCALAR);
                                } else {
                                        state = SCE_PL_SCALAR;
-                                       i++;
-                                       ch = chNext;
-                                       chNext = chNext2;
+                                       if (chNext == '`' && chNext2 == '`') {
+                                               i += 2;
+                                               ch = styler.SafeGetCharAt(i);
+                                               chNext = styler.SafeGetCharAt(i + 1);
+                                       } else {
+                                               i++;
+                                               ch = chNext;
+                                               chNext = chNext2;
+                                       }
                                }
                        } else if (ch == '@') {
                                }
                        } else if (ch == '@') {
-                               preferRE = false;
-                               styler.ColourTo(i - 1, state);
-                               if (isalpha(chNext) || chNext == '#' || chNext == '$' || chNext == '_') {
+                               if (isalpha(chNext) || chNext == '#' || chNext == '$'
+                                                   || chNext == '_' || chNext == '+') {
                                        state = SCE_PL_ARRAY;
                                } else if (chNext != '{' && chNext != '[') {
                                        styler.ColourTo(i, SCE_PL_ARRAY);
                                        state = SCE_PL_ARRAY;
                                } else if (chNext != '{' && chNext != '[') {
                                        styler.ColourTo(i, SCE_PL_ARRAY);
@@ -311,8 +360,6 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                        styler.ColourTo(i, SCE_PL_ARRAY);
                                }
                        } else if (ch == '%') {
                                        styler.ColourTo(i, SCE_PL_ARRAY);
                                }
                        } else if (ch == '%') {
-                               preferRE = false;
-                               styler.ColourTo(i - 1, state);
                                if (isalpha(chNext) || chNext == '#' || chNext == '$' || chNext == '_') {
                                        state = SCE_PL_HASH;
                                } else if (chNext == '{') {
                                if (isalpha(chNext) || chNext == '#' || chNext == '$' || chNext == '_') {
                                        state = SCE_PL_HASH;
                                } else if (chNext == '{') {
@@ -321,56 +368,189 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                        styler.ColourTo(i, SCE_PL_OPERATOR);
                                }
                        } else if (ch == '*') {
                                        styler.ColourTo(i, SCE_PL_OPERATOR);
                                }
                        } else if (ch == '*') {
-                               styler.ColourTo(i - 1, state);
-                               state = SCE_PL_SYMBOLTABLE;
-                       } else if (ch == '/' && preferRE) {
-                               styler.ColourTo(i - 1, state);
-                               state = SCE_PL_REGEX;
-                               Quote.New(1);
-                               Quote.Open(ch);
+                               if (isalpha(chNext) || chNext == '_' || chNext == '{') {
+                                       state = SCE_PL_SYMBOLTABLE;
+                               } else {
+                                       if (chNext == '*') {    // exponentiation
+                                               i++;
+                                               ch = chNext;
+                                               chNext = chNext2;
+                                       }
+                                       styler.ColourTo(i, SCE_PL_OPERATOR);
+                               }
+                       } else if (ch == '/') {
+                               // Explicit backward peeking to set a consistent preferRE for
+                               // any slash found, so no longer need to track preferRE state.
+                               // Find first previous significant lexed element and interpret.
+                               bool preferRE = false;
+                               unsigned int bk = (i > 0)? i - 1: 0;
+                               char bkch;
+                               styler.Flush();
+                               while ((bk > 0) && (styler.StyleAt(bk) == SCE_PL_DEFAULT ||
+                                       styler.StyleAt(bk) == SCE_PL_COMMENTLINE)) {
+                                       bk--;
+                               }
+                               if (bk == 0) {
+                                       preferRE = true;
+                               } else {
+                                       int bkstyle = styler.StyleAt(bk);
+                                       switch(bkstyle) {
+                                       case SCE_PL_OPERATOR:
+                                               preferRE = true;
+                                               bkch = styler.SafeGetCharAt(bk);
+                                               if (bkch == ')' || bkch == ']') {
+                                                       preferRE = false;
+                                               } else if (bkch == '}') {
+                                                       // backtrack further, count balanced brace pairs
+                                                       // if a brace pair found, see if it's a variable
+                                                       int braceCount = 1;
+                                                       while (--bk > 0) {
+                                                               bkstyle = styler.StyleAt(bk);
+                                                               if (bkstyle == SCE_PL_OPERATOR) {
+                                                                       bkch = styler.SafeGetCharAt(bk);
+                                                                       if (bkch == '}') {
+                                                                               braceCount++;
+                                                                       } else if (bkch == '{') {
+                                                                               if (--braceCount == 0)
+                                                                                       break;
+                                                                       }
+                                                               }
+                                                       }
+                                                       if (bk == 0) {
+                                                               // at beginning, true
+                                                       } else if (braceCount == 0) {
+                                                               // balanced { found, check for variable
+                                                               bkstyle = styler.StyleAt(bk - 1);
+                                                               if (bkstyle == SCE_PL_SCALAR
+                                                                || bkstyle == SCE_PL_ARRAY
+                                                                || bkstyle == SCE_PL_HASH
+                                                                || bkstyle == SCE_PL_SYMBOLTABLE) {
+                                                                       preferRE = false;
+                                                               }
+                                                       }
+                                               }
+                                               break;
+                                       // other styles uses the default, preferRE=false
+                                       case SCE_PL_IDENTIFIER:
+                                       case SCE_PL_POD:
+                                       case SCE_PL_WORD:
+                                       case SCE_PL_HERE_Q:
+                                       case SCE_PL_HERE_QQ:
+                                       case SCE_PL_HERE_QX:
+                                               preferRE = true;
+                                               break;
+                                       }
+                               }
+                               if (preferRE) {
+                                       state = SCE_PL_REGEX;
+                                       Quote.New(1);
+                                       Quote.Open(ch);
+                               } else {
+                                       styler.ColourTo(i, SCE_PL_OPERATOR);
+                               }
                        } else if (ch == '<' && chNext == '<') {
                        } else if (ch == '<' && chNext == '<') {
-                               styler.ColourTo(i - 1, state);
                                state = SCE_PL_HERE_DELIM;
                                HereDoc.State = 0;
                                state = SCE_PL_HERE_DELIM;
                                HereDoc.State = 0;
-                       } else if (ch == '='
+                       } else if (ch == '='    // POD
                                   && isalpha(chNext)
                                   && (isEOLChar(chPrev))) {
                                   && isalpha(chNext)
                                   && (isEOLChar(chPrev))) {
-                               styler.ColourTo(i - 1, state);
                                state = SCE_PL_POD;
                                state = SCE_PL_POD;
-                               sookedpos = 0;
-                               sooked[sookedpos] = '\0';
-                       } else if (ch == '-'
+                               //sookedpos = 0;
+                               //sooked[sookedpos] = '\0';
+                       } else if (ch == '-'    // file test operators
                                   && isSingleCharOp(chNext)
                                   && !isalnum((chNext2 = styler.SafeGetCharAt(i+2)))) {
                                   && isSingleCharOp(chNext)
                                   && !isalnum((chNext2 = styler.SafeGetCharAt(i+2)))) {
-                               styler.ColourTo(i - 1, state);
                                styler.ColourTo(i + 1, SCE_PL_WORD);
                                state = SCE_PL_DEFAULT;
                                styler.ColourTo(i + 1, SCE_PL_WORD);
                                state = SCE_PL_DEFAULT;
-                               preferRE = false;
-                               i += 2;
-                               ch = chNext2;
-                               chNext = chNext2 = styler.SafeGetCharAt(i + 1);
+                               i++;
+                               ch = chNext;
+                               chNext = chNext2;
                        } else if (isPerlOperator(ch)) {
                        } else if (isPerlOperator(ch)) {
-                               if (ch == ')' || ch == ']')
-                                       preferRE = false;
-                               else
-                                       preferRE = true;
-                               styler.ColourTo(i - 1, state);
+                               if (ch == '.' && chNext == '.') { // .. and ...
+                                       i++;
+                                       if (chNext2 == '.') { i++; }
+                                       state = SCE_PL_DEFAULT;
+                                       ch = styler.SafeGetCharAt(i);
+                                       chNext = styler.SafeGetCharAt(i + 1);
+                               }
                                styler.ColourTo(i, SCE_PL_OPERATOR);
                                styler.ColourTo(i, SCE_PL_OPERATOR);
+                       } else {
+                               // keep colouring defaults to make restart easier
+                               styler.ColourTo(i, SCE_PL_DEFAULT);
+                       }
+               } else if (state == SCE_PL_NUMBER) {
+                       if (ch == '.') {
+                               if (chNext == '.') {
+                                       // double dot is always an operator
+                                       goto numAtEnd;
+                               } else if (numState == PERLNUM_NON_DEC || numState == PERLNUM_FLOAT) {
+                                       // non-decimal number or float exponent, consume next dot
+                                       styler.ColourTo(i - 1, SCE_PL_NUMBER);
+                                       styler.ColourTo(i, SCE_PL_OPERATOR);
+                                       state = SCE_PL_DEFAULT;
+                               } else { // decimal or vectors allows dots
+                                       dotCount++;
+                                       if (numState == PERLNUM_DECIMAL) {
+                                               if (dotCount > 1) {
+                                                       if (isdigit(chNext)) { // really a vector
+                                                               numState = PERLNUM_VECTOR;
+                                                       } else  // number then dot
+                                                               goto numAtEnd;
+                                               }
+                                       } else { // vectors
+                                               if (!isdigit(chNext))   // vector then dot
+                                                       goto numAtEnd;
+                                       }
+                               }
+                       } else if (ch == '_' && numState == PERLNUM_DECIMAL) {
+                               if (!isdigit(chNext)) {
+                                       goto numAtEnd;
+                               }
+                       } else if (isalnum(ch)) {
+                               if (numState == PERLNUM_VECTOR || numState == PERLNUM_V_VECTOR) {
+                                       if (isalpha(ch)) {
+                                               if (dotCount == 0) { // change to word
+                                                       state = SCE_PL_WORD;
+                                               } else { // vector then word
+                                                       goto numAtEnd;
+                                               }
+                                       }
+                               } else if (numState == PERLNUM_DECIMAL) {
+                                       if (ch == 'E' || ch == 'e') { // exponent
+                                               numState = PERLNUM_FLOAT;
+                                               if (chNext == '+' || chNext == '-') {
+                                                       i++;
+                                                       ch = chNext;
+                                                       chNext = chNext2;
+                                               }
+                                       } else if (!isdigit(ch)) { // number then word
+                                               goto numAtEnd;
+                                       }
+                               } else if (numState == PERLNUM_FLOAT) {
+                                       if (!isdigit(ch)) { // float then word
+                                               goto numAtEnd;
+                                       }
+                               } else {// (numState == PERLNUM_NON_DEC)
+                                       // allow alphanum for bin,hex,oct for now
+                               }
+                       } else {
+                               // complete current number or vector
+                       numAtEnd:
+                               styler.ColourTo(i - 1, actualNumStyle(numState));
+                               state = SCE_PL_DEFAULT;
+                               goto restartLexer;
                        }
                } else if (state == SCE_PL_WORD) {
                        if ((!iswordchar(chNext) && chNext != '\'')
                                || (chNext == '.' && chNext2 == '.')) {
                                // ".." is always an operator if preceded by a SCE_PL_WORD.
                                // Archaic Perl has quotes inside names
                        }
                } else if (state == SCE_PL_WORD) {
                        if ((!iswordchar(chNext) && chNext != '\'')
                                || (chNext == '.' && chNext2 == '.')) {
                                // ".." is always an operator if preceded by a SCE_PL_WORD.
                                // Archaic Perl has quotes inside names
-                               if (isMatch(styler, lengthDoc, styler.GetStartSegment(), "__DATA__")) {
-                                       styler.ColourTo(i, SCE_PL_DATASECTION);
-                                       state = SCE_PL_DATASECTION;
-                               } else if (isMatch(styler, lengthDoc, styler.GetStartSegment(), "__END__")) {
+                               if (isMatch(styler, lengthDoc, styler.GetStartSegment(), "__DATA__")
+                                || isMatch(styler, lengthDoc, styler.GetStartSegment(), "__END__")) {
                                        styler.ColourTo(i, SCE_PL_DATASECTION);
                                        state = SCE_PL_DATASECTION;
                                } else {
                                        styler.ColourTo(i, SCE_PL_DATASECTION);
                                        state = SCE_PL_DATASECTION;
                                } else {
-                                       if (classifyWordPerl(styler.GetStartSegment(), i, keywords, styler) == SCE_PL_WORD)
-                                               preferRE = true;
+                                       classifyWordPerl(styler.GetStartSegment(), i, keywords, styler);
                                        state = SCE_PL_DEFAULT;
                                        ch = ' ';
                                }
                                        state = SCE_PL_DEFAULT;
                                        ch = ' ';
                                }
@@ -380,6 +560,10 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                if (isEOLChar(ch)) {
                                        styler.ColourTo(i - 1, state);
                                        state = SCE_PL_DEFAULT;
                                if (isEOLChar(ch)) {
                                        styler.ColourTo(i - 1, state);
                                        state = SCE_PL_DEFAULT;
+                                       goto restartLexer;
+                               } else if (isEOLChar(chNext)) {
+                                       styler.ColourTo(i, state);
+                                       state = SCE_PL_DEFAULT;
                                }
                        } else if (state == SCE_PL_HERE_DELIM) {
                                //
                                }
                        } else if (state == SCE_PL_HERE_DELIM) {
                                //
@@ -398,9 +582,16 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                // There must be no space between the << and the identifier.
                                // (If you put a space it will be treated as a null identifier,
                                // which is valid, and matches the first empty line.)
                                // There must be no space between the << and the identifier.
                                // (If you put a space it will be treated as a null identifier,
                                // which is valid, and matches the first empty line.)
+                               // (This is deprecated, -w warns of this syntax)
                                // The terminating string must appear by itself (unquoted and with no
                                // surrounding whitespace) on the terminating line.
                                //
                                // The terminating string must appear by itself (unquoted and with no
                                // surrounding whitespace) on the terminating line.
                                //
+                               // From Bash info:
+                               // ---------------
+                               // Specifier format is: <<[-]WORD
+                               // Optional '-' is for removal of leading tabs from here-doc.
+                               // Whitespace acceptable after <<[-] operator.
+                               //
                                if (HereDoc.State == 0) { // '<<' encountered
                                        HereDoc.State = 1;
                                        HereDoc.Quote = chNext;
                                if (HereDoc.State == 0) { // '<<' encountered
                                        HereDoc.State = 1;
                                        HereDoc.Quote = chNext;
@@ -412,15 +603,16 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                                ch = chNext;
                                                chNext = chNext2;
                                                HereDoc.Quoted = true;
                                                ch = chNext;
                                                chNext = chNext2;
                                                HereDoc.Quoted = true;
-                                       } else if (chNext == '\\') { // ref?
-                                               i++;
-                                               ch = chNext;
-                                               chNext = chNext2;
-                                       } else if (isalnum(chNext) || chNext == '_') { // an unquoted here-doc delimiter
-                                       }
-                                       else if (isspacechar(chNext)) { // deprecated here-doc delimiter || TODO: left shift operator
-                                       }
-                                       else { // TODO: ???
+                                       } else if (isalpha(chNext) || chNext == '_') {
+                                               // an unquoted here-doc delimiter, no special handling
+                                       } else if (isspacechar(chNext) || isdigit(chNext) || chNext == '\\'
+                                               || chNext == '=' || chNext == '$' || chNext == '@') {
+                                               // left shift << or <<= operator cases
+                                               styler.ColourTo(i, SCE_PL_OPERATOR);
+                                               state = SCE_PL_DEFAULT;
+                                               HereDoc.State = 0;
+                                       } else {
+                                               // symbols terminates; deprecated zero-length delimiter
                                        }
 
                                } else if (HereDoc.State == 1) { // collect the delimiter
                                        }
 
                                } else if (HereDoc.State == 1) { // collect the delimiter
@@ -428,9 +620,6 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                                if (ch == HereDoc.Quote) { // closing quote => end of delimiter
                                                        styler.ColourTo(i, state);
                                                        state = SCE_PL_DEFAULT;
                                                if (ch == HereDoc.Quote) { // closing quote => end of delimiter
                                                        styler.ColourTo(i, state);
                                                        state = SCE_PL_DEFAULT;
-                                                       i++;
-                                                       ch = chNext;
-                                                       chNext = chNext2;
                                                } else {
                                                        if (ch == '\\' && chNext == HereDoc.Quote) { // escaped quote
                                                                i++;
                                                } else {
                                                        if (ch == '\\' && chNext == HereDoc.Quote) { // escaped quote
                                                                i++;
@@ -447,24 +636,27 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                                } else {
                                                        styler.ColourTo(i - 1, state);
                                                        state = SCE_PL_DEFAULT;
                                                } else {
                                                        styler.ColourTo(i - 1, state);
                                                        state = SCE_PL_DEFAULT;
+                                                       goto restartLexer;
                                                }
                                        }
                                                }
                                        }
-                                       if (HereDoc.DelimiterLength >= static_cast<int>(sizeof(HereDoc.Delimiter)) - 1) {
+                                       if (HereDoc.DelimiterLength >= HERE_DELIM_MAX - 1) {
                                                styler.ColourTo(i - 1, state);
                                                state = SCE_PL_ERROR;
                                                styler.ColourTo(i - 1, state);
                                                state = SCE_PL_ERROR;
+                                               goto restartLexer;
                                        }
                                }
                        } else if (HereDoc.State == 2) {
                                // state == SCE_PL_HERE_Q || state == SCE_PL_HERE_QQ || state == SCE_PL_HERE_QX
                                if (isEOLChar(chPrev) && isMatch(styler, lengthDoc, i, HereDoc.Delimiter)) {
                                        i += HereDoc.DelimiterLength;
                                        }
                                }
                        } else if (HereDoc.State == 2) {
                                // state == SCE_PL_HERE_Q || state == SCE_PL_HERE_QQ || state == SCE_PL_HERE_QX
                                if (isEOLChar(chPrev) && isMatch(styler, lengthDoc, i, HereDoc.Delimiter)) {
                                        i += HereDoc.DelimiterLength;
-                                       chNext = styler.SafeGetCharAt(i);
-                                       if (isEOLChar(chNext)) {
+                                       chPrev = styler.SafeGetCharAt(i - 1);
+                                       ch = styler.SafeGetCharAt(i);
+                                       if (isEOLChar(ch)) {
                                                styler.ColourTo(i - 1, state);
                                                state = SCE_PL_DEFAULT;
                                                HereDoc.State = 0;
                                                styler.ColourTo(i - 1, state);
                                                state = SCE_PL_DEFAULT;
                                                HereDoc.State = 0;
+                                               goto restartLexer;
                                        }
                                        }
-                                       ch = chNext;
                                        chNext = styler.SafeGetCharAt(i + 1);
                                }
                        } else if (state == SCE_PL_POD) {
                                        chNext = styler.SafeGetCharAt(i + 1);
                                }
                        } else if (state == SCE_PL_POD) {
@@ -474,33 +666,30 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                                i += 4;
                                                state = SCE_PL_DEFAULT;
                                                ch = styler.SafeGetCharAt(i);
                                                i += 4;
                                                state = SCE_PL_DEFAULT;
                                                ch = styler.SafeGetCharAt(i);
-                                               chNext = styler.SafeGetCharAt(i + 1);
+                                               //chNext = styler.SafeGetCharAt(i + 1);
+                                               goto restartLexer;
                                        }
                                }
                                        }
                                }
-                       } else if (state == SCE_PL_SCALAR) {
-                               if (isEndVar(ch)) {
-                                       if (i == (styler.GetStartSegment() + 1)) {
+                       } else if (state == SCE_PL_SCALAR       // variable names
+                               || state == SCE_PL_ARRAY
+                               || state == SCE_PL_HASH
+                               || state == SCE_PL_SYMBOLTABLE) {
+                               if (ch == ':' && chNext == ':') {       // skip ::
+                                       i++;
+                                       ch = chNext;
+                                       chNext = chNext2;
+                               }
+                               else if (isEndVar(ch)) {
+                                       if ((state == SCE_PL_SCALAR || state == SCE_PL_ARRAY)
+                                           && i == (styler.GetStartSegment() + 1)) {
                                                // Special variable: $(, $_ etc.
                                                styler.ColourTo(i, state);
                                                // Special variable: $(, $_ etc.
                                                styler.ColourTo(i, state);
+                                               state = SCE_PL_DEFAULT;
                                        } else {
                                                styler.ColourTo(i - 1, state);
                                        } else {
                                                styler.ColourTo(i - 1, state);
+                                               state = SCE_PL_DEFAULT;
+                                               goto restartLexer;
                                        }
                                        }
-                                       state = SCE_PL_DEFAULT;
-                               }
-                       } else if (state == SCE_PL_ARRAY) {
-                               if (isEndVar(ch)) {
-                                       styler.ColourTo(i - 1, state);
-                                       state = SCE_PL_DEFAULT;
-                               }
-                       } else if (state == SCE_PL_HASH) {
-                               if (isEndVar(ch)) {
-                                       styler.ColourTo(i - 1, state);
-                                       state = SCE_PL_DEFAULT;
-                               }
-                       } else if (state == SCE_PL_SYMBOLTABLE) {
-                               if (isEndVar(ch)) {
-                                       styler.ColourTo(i - 1, state);
-                                       state = SCE_PL_DEFAULT;
                                }
                        } else if (state == SCE_PL_REGEX
                                || state == SCE_PL_STRING_QR
                                }
                        } else if (state == SCE_PL_REGEX
                                || state == SCE_PL_STRING_QR
@@ -627,29 +816,6 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
                                        Quote.Count++;
                                }
                        }
                                        Quote.Count++;
                                }
                        }
-
-                       if (state == SCE_PL_DEFAULT) {    // One of the above succeeded
-                               if (ch == '#') {
-                                       state = SCE_PL_COMMENTLINE;
-                               } else if (ch == '\"') {
-                                       state = SCE_PL_STRING;
-                                       Quote.New(1);
-                                       Quote.Open(ch);
-                               } else if (ch == '\'') {
-                                       state = SCE_PL_CHARACTER;
-                                       Quote.New(1);
-                                       Quote.Open(ch);
-                               } else if (iswordstart(ch)) {
-                                       state = SCE_PL_WORD;
-                                       preferRE = false;
-                               } else if (isPerlOperator(ch)) {
-                                       if (ch == ')' || ch == ']')
-                                               preferRE = false;
-                                       else
-                                               preferRE = true;
-                                       styler.ColourTo(i, SCE_PL_OPERATOR);
-                               }
-                       }
                }
                if (state == SCE_PL_ERROR) {
                        break;
                }
                if (state == SCE_PL_ERROR) {
                        break;
index 43a874968d5f6c18aedccdff15ad9740a5326e20..692a47adefe6c02def9653cb8944c5e0f49d2bc7 100644 (file)
@@ -96,6 +96,11 @@ static int GetRbStringState(Accessor &styler, int i, int *nextIndex) {
                return SCE_P_DEFAULT;
        }
 
                return SCE_P_DEFAULT;
        }
 
+       if (i>0 && styler.SafeGetCharAt(i-1) == '$') {
+               *nextIndex = i + 1;
+               return SCE_P_DEFAULT;
+       }
+
        if (ch == chNext && ch == styler.SafeGetCharAt(i + 2)) {
                *nextIndex = i + 3;
 
        if (ch == chNext && ch == styler.SafeGetCharAt(i + 2)) {
                *nextIndex = i + 3;
 
index 3f65b12097a161e3b295f7844b76e85bfaa702e4..144176855eeb149847ed4ef262a3bcb3cf85a140 100644 (file)
@@ -88,7 +88,10 @@ static void ColouriseSQLDoc(unsigned int startPos, int length,
                        } else if (ch == '-' && chNext == '-') {
                                styler.ColourTo(i - 1, state);
                                state = SCE_C_COMMENTLINE;
                        } else if (ch == '-' && chNext == '-') {
                                styler.ColourTo(i - 1, state);
                                state = SCE_C_COMMENTLINE;
-                       } else if ((ch == '\'') || (ch == '"')) {
+                       } else if (ch == '\'') {
+                               styler.ColourTo(i - 1, state);
+                               state = SCE_C_CHARACTER;
+                       } else if (ch == '"') {
                                styler.ColourTo(i - 1, state);
                                state = SCE_C_STRING;
                        } else if (isoperator(ch)) {
                                styler.ColourTo(i - 1, state);
                                state = SCE_C_STRING;
                        } else if (isoperator(ch)) {
@@ -103,7 +106,9 @@ static void ColouriseSQLDoc(unsigned int startPos, int length,
                                        state = SCE_C_COMMENT;
                                } else if (ch == '-' && chNext == '-') {
                                        state = SCE_C_COMMENTLINE;
                                        state = SCE_C_COMMENT;
                                } else if (ch == '-' && chNext == '-') {
                                        state = SCE_C_COMMENTLINE;
-                               } else if ((ch == '\'') || (ch == '"'))  {
+                               } else if (ch == '\'') {
+                                       state = SCE_C_CHARACTER;
+                               } else if (ch == '"') {
                                        state = SCE_C_STRING;
                                } else if (isoperator(ch)) {
                                        styler.ColourTo(i, SCE_C_OPERATOR);
                                        state = SCE_C_STRING;
                                } else if (isoperator(ch)) {
                                        styler.ColourTo(i, SCE_C_OPERATOR);
@@ -123,7 +128,7 @@ static void ColouriseSQLDoc(unsigned int startPos, int length,
                                        styler.ColourTo(i - 1, state);
                                        state = SCE_C_DEFAULT;
                                }
                                        styler.ColourTo(i - 1, state);
                                        state = SCE_C_DEFAULT;
                                }
-                       } else if (state == SCE_C_STRING) {
+                       } else if (state == SCE_C_CHARACTER) {
                                if (ch == '\'') {
                                        if ( chNext == '\'' ) {
                                                i++;
                                if (ch == '\'') {
                                        if ( chNext == '\'' ) {
                                                i++;
@@ -134,7 +139,9 @@ static void ColouriseSQLDoc(unsigned int startPos, int length,
                                        }
                                        ch = chNext;
                                        chNext = styler.SafeGetCharAt(i + 1);
                                        }
                                        ch = chNext;
                                        chNext = styler.SafeGetCharAt(i + 1);
-                               } else if (ch == '"') {
+                               }
+                       } else if (state == SCE_C_STRING) {
+                               if (ch == '"') {
                                        if (chNext == '"') {
                                                i++;
                                        } else {
                                        if (chNext == '"') {
                                                i++;
                                        } else {
@@ -151,7 +158,9 @@ static void ColouriseSQLDoc(unsigned int startPos, int length,
                                        state = SCE_C_COMMENT;
                                } else if (ch == '-' && chNext == '-') {
                                        state = SCE_C_COMMENTLINE;
                                        state = SCE_C_COMMENT;
                                } else if (ch == '-' && chNext == '-') {
                                        state = SCE_C_COMMENTLINE;
-                               } else if ((ch == '\'') || (ch == '"')) {
+                               } else if (ch == '\'') {
+                                       state = SCE_C_CHARACTER;
+                               } else if (ch == '"') {
                                        state = SCE_C_STRING;
                                } else if (iswordstart(ch)) {
                                        state = SCE_C_WORD;
                                        state = SCE_C_STRING;
                                } else if (iswordstart(ch)) {
                                        state = SCE_C_WORD;
index fda10e316c61bea044cf1c55e4a9499290f557e2..faaa2d46dfad78c264fd4d52d8fa51b0b614a402 100644 (file)
 
 static void ClassifyWordSol(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord)
 {
 
 static void ClassifyWordSol(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord)
 {
-       char s[100];
-       bool wordIsNumber = isdigit(styler[start]) != 0;
-       for (unsigned int i = 0; i < end - start + 1 && i < 30; i++)
-    {
-               s[i] = styler[start + i];
-               s[i + 1] = '\0';
-       }
-       char chAttr = SCE_P_IDENTIFIER;
-    if (0 == strcmp(prevWord, "class"))       chAttr = SCE_P_CLASSNAME;
-    else if (wordIsNumber)                    chAttr = SCE_P_NUMBER;
-    else if (keywords.InList(s))              chAttr = SCE_P_WORD;
+    char s[100];
+    bool wordIsNumber = isdigit(styler[start]) != 0;
+    for (unsigned int i = 0; i < end - start + 1 && i < 30; i++)
+     {
+           s[i] = styler[start + i];
+           s[i + 1] = '\0';
+     }
+    char chAttr = SCE_SCRIPTOL_IDENTIFIER;
+    if (0 == strcmp(prevWord, "class"))       chAttr = SCE_SCRIPTOL_CLASSNAME;
+    else if (wordIsNumber)                    chAttr = SCE_SCRIPTOL_NUMBER;
+    else if (keywords.InList(s))              chAttr = SCE_SCRIPTOL_KEYWORD;
     else for (unsigned int i = 0; i < end - start + 1; i++)  // test dotted idents
     {
     else for (unsigned int i = 0; i < end - start + 1; i++)  // test dotted idents
     {
-               if (styler[start + i] == '.')
+        if (styler[start + i] == '.')
         {
         {
-                       styler.ColourTo(start + i - 1, chAttr);
-                       styler.ColourTo(start + i, SCE_P_OPERATOR);
-               }
-       }
-       styler.ColourTo(end, chAttr);
-       strcpy(prevWord, s);
+            styler.ColourTo(start + i - 1, chAttr);
+            styler.ColourTo(start + i, SCE_SCRIPTOL_OPERATOR);
+        }
+    }
+    styler.ColourTo(end, chAttr);
+    strcpy(prevWord, s);
 }
 
 static bool IsSolComment(Accessor &styler, int pos, int len)
 {
 }
 
 static bool IsSolComment(Accessor &styler, int pos, int len)
 {
-//    return len > 0 && styler[pos]=='`';
    char c;
    if(len > 0)
    {
    char c;
    if(len > 0)
    {
@@ -63,60 +62,62 @@ static bool IsSolComment(Accessor &styler, int pos, int len)
    return false;
 }
 
    return false;
 }
 
-static bool IsSolStringStart(char ch, char /*chNext*/)
+static bool IsSolStringStart(char ch)
 {
     if (ch == '\'' || ch == '"')  return true;
 {
     if (ch == '\'' || ch == '"')  return true;
-    //chNext = chNext;  // for future use
-
-       return false;
+    return false;
 }
 
 }
 
-static bool IsSolWordStart(char ch, char chNext)
+static bool IsSolWordStart(char ch)
 {
 {
-    return (iswordchar(ch) && !IsSolStringStart(ch, chNext));
+    return (iswordchar(ch) && !IsSolStringStart(ch));
 }
 
 }
 
-/* Return the state to use for the string starting at i; *nextIndex will be set to the first index following the quote(s) */
+
 static int GetSolStringState(Accessor &styler, int i, int *nextIndex)
 {
        char ch = styler.SafeGetCharAt(i);
        char chNext = styler.SafeGetCharAt(i + 1);
 
 static int GetSolStringState(Accessor &styler, int i, int *nextIndex)
 {
        char ch = styler.SafeGetCharAt(i);
        char chNext = styler.SafeGetCharAt(i + 1);
 
-       if (ch != '"' && ch != '\'') {
-               *nextIndex = i + 1;
-               return SCE_P_DEFAULT;
+        if (ch != '\"' && ch != '\'')
+        {
+            *nextIndex = i + 1;
+            return SCE_SCRIPTOL_DEFAULT;
        }
        }
-
+        // ch is either single or double quotes in string
+        // code below seem non-sense but is here for future extensions
        if (ch == chNext && ch == styler.SafeGetCharAt(i + 2))
        if (ch == chNext && ch == styler.SafeGetCharAt(i + 2))
-    {
-       *nextIndex = i + 3;
-       if (ch == '"') return SCE_P_TRIPLEDOUBLE;
-       else           return SCE_P_TRIPLE;
+        {
+          *nextIndex = i + 3;
+          if(ch == '\"') return SCE_SCRIPTOL_TRIPLE;
+          if(ch == '\'') return SCE_SCRIPTOL_TRIPLE;
+          return SCE_SCRIPTOL_STRING;
        }
        }
-    else
-    {
-       *nextIndex = i + 1;
-       if (ch == '"') return SCE_P_STRING;
-       else           return SCE_P_CHARACTER;
+        else
+        {
+          *nextIndex = i + 1;
+          if (ch == '"') return SCE_SCRIPTOL_STRING;
+          else           return SCE_SCRIPTOL_STRING;
        }
 }
 
        }
 }
 
+
 static void ColouriseSolDoc(unsigned int startPos, int length, int initStyle,
 static void ColouriseSolDoc(unsigned int startPos, int length, int initStyle,
-                                                  WordList *keywordlists[], Accessor &styler)
+                            WordList *keywordlists[], Accessor &styler)
  {
 
        int lengthDoc = startPos + length;
  {
 
        int lengthDoc = startPos + length;
+        char stringType = '\"';
 
 
-       // Backtrack to previous line in case need to fix its tab whinging
        if (startPos > 0)
        if (startPos > 0)
-    {
-               int lineCurrent = styler.GetLine(startPos);
-               if (lineCurrent > 0)
         {
         {
-           startPos = styler.LineStart(lineCurrent-1);
-           if (startPos == 0) initStyle = SCE_P_DEFAULT;
-           else               initStyle = styler.StyleAt(startPos-1);
-               }
+            int lineCurrent = styler.GetLine(startPos);
+            if (lineCurrent > 0)
+            {
+              startPos = styler.LineStart(lineCurrent-1);
+              if (startPos == 0) initStyle = SCE_SCRIPTOL_DEFAULT;
+              else               initStyle = styler.StyleAt(startPos-1);
+            }
        }
 
        styler.StartAt(startPos, 127);
        }
 
        styler.StartAt(startPos, 127);
@@ -126,241 +127,216 @@ static void ColouriseSolDoc(unsigned int startPos, int length, int initStyle,
        int whingeLevel = styler.GetPropertyInt("tab.timmy.whinge.level");
        char prevWord[200];
        prevWord[0] = '\0';
        int whingeLevel = styler.GetPropertyInt("tab.timmy.whinge.level");
        char prevWord[200];
        prevWord[0] = '\0';
-    if (length == 0)  return ;
+        if (length == 0)  return;
 
        int state = initStyle & 31;
 
        int nextIndex = 0;
 
        int state = initStyle & 31;
 
        int nextIndex = 0;
-       char chPrev = ' ';
-       //char chPrev2 = ' ';
-       char chNext = styler[startPos];
+        char chPrev  = ' ';
+        char chPrev2 = ' ';
+        char chNext  = styler[startPos];
        styler.StartSegment(startPos);
        bool atStartLine = true;
        int spaceFlags = 0;
        for (int i = startPos; i < lengthDoc; i++)
        styler.StartSegment(startPos);
        bool atStartLine = true;
        int spaceFlags = 0;
        for (int i = startPos; i < lengthDoc; i++)
-    {
+        {
 
 
-      if (atStartLine)
-      {
+         if (atStartLine)
+         {
          char chBad = static_cast<char>(64);
          char chGood = static_cast<char>(0);
          char chFlags = chGood;
 
          if (whingeLevel == 1)
          {
          char chBad = static_cast<char>(64);
          char chGood = static_cast<char>(0);
          char chFlags = chGood;
 
          if (whingeLevel == 1)
          {
-                               chFlags = (spaceFlags & wsInconsistent) ? chBad : chGood;
+             chFlags = (spaceFlags & wsInconsistent) ? chBad : chGood;
          }
          else if (whingeLevel == 2)
          {
          }
          else if (whingeLevel == 2)
          {
-                               chFlags = (spaceFlags & wsSpaceTab) ? chBad : chGood;
+             chFlags = (spaceFlags & wsSpaceTab) ? chBad : chGood;
          }
          else if (whingeLevel == 3)
          {
          }
          else if (whingeLevel == 3)
          {
-                               chFlags = (spaceFlags & wsSpace) ? chBad : chGood;
+             chFlags = (spaceFlags & wsSpace) ? chBad : chGood;
          }
          else if (whingeLevel == 4)
          {
          }
          else if (whingeLevel == 4)
          {
-                               chFlags = (spaceFlags & wsTab) ? chBad : chGood;
+              chFlags = (spaceFlags & wsTab) ? chBad : chGood;
          }
          styler.SetFlags(chFlags, static_cast<char>(state));
          atStartLine = false;
        }
 
          }
          styler.SetFlags(chFlags, static_cast<char>(state));
          atStartLine = false;
        }
 
-               char ch = chNext;
-               chNext = styler.SafeGetCharAt(i + 1);
+       char ch = chNext;
+       chNext = styler.SafeGetCharAt(i + 1);
 
 
-               if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc))
-        {
-                       if ((state == SCE_P_DEFAULT) || (state == SCE_P_TRIPLE) || (state == SCE_P_TRIPLEDOUBLE))
-            {
-                               styler.ColourTo(i, state);
-                       }
-                       atStartLine = true;
-         }
+       if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc))
+       {
+          if ((state == SCE_SCRIPTOL_DEFAULT) ||
+              (state == SCE_SCRIPTOL_TRIPLE) ||
+              (state == SCE_SCRIPTOL_COMMENTBLOCK))
+          {
+              styler.ColourTo(i, state);
+          }
+          atStartLine = true;
+        }
 
 
-               if (styler.IsLeadByte(ch))
-        {
-                       chNext = styler.SafeGetCharAt(i + 2);
-                       chPrev = ' ';
-                       //chPrev2 = ' ';
-                       i += 1;
-                       continue;
-               }
+        if (styler.IsLeadByte(ch))
+         {
+             chNext = styler.SafeGetCharAt(i + 2);
+             chPrev  = ' ';
+             chPrev2 = ' ';
+             i += 1;
+             continue;
+         }
 
 
-               if (state == SCE_P_STRINGEOL)
-        {
-                       if (ch != '\r' && ch != '\n')
+        if (state == SCE_SCRIPTOL_STRINGEOL)
+         {
+             if (ch != '\r' && ch != '\n')
              {
              {
-                               styler.ColourTo(i - 1, state);
-                               state = SCE_P_DEFAULT;
+                    styler.ColourTo(i - 1, state);
+                    state = SCE_SCRIPTOL_DEFAULT;
              }
              }
-        }
+         }
 
 
-               if (state == SCE_P_DEFAULT)
-        {
-            if (IsSolWordStart(ch, chNext))
+        if (state == SCE_SCRIPTOL_DEFAULT)
+         {
+            if (IsSolWordStart(ch))
             {
             {
-                               styler.ColourTo(i - 1, state);
-                               state = SCE_P_WORD;
+                 styler.ColourTo(i - 1, state);
+                 state = SCE_SCRIPTOL_KEYWORD;
             }
             else if (ch == '`')
             {
             }
             else if (ch == '`')
             {
-                               styler.ColourTo(i - 1, state);
-                state = SCE_P_COMMENTLINE;
+                styler.ColourTo(i - 1, state);
+                state = SCE_SCRIPTOL_COMMENTLINE;
             }
             else if (ch == '/')
             {
             }
             else if (ch == '/')
             {
-                               styler.ColourTo(i - 1, state);
-                if(chNext == '/') state = SCE_P_COMMENTLINE;
-                if(chNext == '*') state = SCE_P_COMMENTBLOCK;
+                styler.ColourTo(i - 1, state);
+                if(chNext == '/') state = SCE_SCRIPTOL_CSTYLE;
+                if(chNext == '*') state = SCE_SCRIPTOL_COMMENTBLOCK;
             }
 
             }
 
-            else if (ch == '=' && chNext == 'b')
-            {
-                               // =begin indicates the start of a comment (doc) block
-               if(styler.SafeGetCharAt(i + 2) == 'e' && styler.SafeGetCharAt(i + 3) == 'g' && styler.SafeGetCharAt(i + 4) == 'i' && styler.SafeGetCharAt(i + 5) == 'n')
-               {
-                                       styler.ColourTo(i - 1, state);
-                                       state = SCE_P_TRIPLEDOUBLE; //SCE_C_COMMENT;
-               }
-            }
-            else if (IsSolStringStart(ch, chNext))
+            else if (IsSolStringStart(ch))
             {
                styler.ColourTo(i - 1, state);
                state = GetSolStringState(styler, i, &nextIndex);
             {
                styler.ColourTo(i - 1, state);
                state = GetSolStringState(styler, i, &nextIndex);
+               if(state == SCE_SCRIPTOL_STRING)
+               {
+                 stringType = ch;
+               }
                if (nextIndex != i + 1)
                {
                if (nextIndex != i + 1)
                {
-                                       i = nextIndex - 1;
-                                       ch = ' ';
-                                       //chPrev = ' ';
-                                       chNext = styler.SafeGetCharAt(i + 1);
+                   i = nextIndex - 1;
+                   ch = ' ';
+                   chPrev = ' ';
+                   chNext = styler.SafeGetCharAt(i + 1);
                }
                }
-                       }
+           }
             else if (isoperator(ch))
             {
             else if (isoperator(ch))
             {
-                               styler.ColourTo(i - 1, state);
-                               styler.ColourTo(i, SCE_P_OPERATOR);
-                       }
+                 styler.ColourTo(i - 1, state);
+                 styler.ColourTo(i, SCE_SCRIPTOL_OPERATOR);
+            }
           }
           }
-          else if (state == SCE_P_WORD)
+          else if (state == SCE_SCRIPTOL_KEYWORD)
           {
               if (!iswordchar(ch))
               {
                  ClassifyWordSol(styler.GetStartSegment(), i - 1, keywords, styler, prevWord);
           {
               if (!iswordchar(ch))
               {
                  ClassifyWordSol(styler.GetStartSegment(), i - 1, keywords, styler, prevWord);
-                 state = SCE_P_DEFAULT;
+                 state = SCE_SCRIPTOL_DEFAULT;
                  if (ch == '`')
                  {
                  if (ch == '`')
                  {
-                     state = chNext == '`' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE;
+                     state = chNext == '`' ? SCE_SCRIPTOL_PERSISTENT : SCE_SCRIPTOL_COMMENTLINE;
                  }
                  }
-                 else if (IsSolStringStart(ch, chNext))
+                 else if (IsSolStringStart(ch))
                  {
                     styler.ColourTo(i - 1, state);
                     state = GetSolStringState(styler, i, &nextIndex);
                  {
                     styler.ColourTo(i - 1, state);
                     state = GetSolStringState(styler, i, &nextIndex);
-                                       if (nextIndex != i + 1)
+                    if (nextIndex != i + 1)
                     {
                     {
-                                               i = nextIndex - 1;
-                                               ch = ' ';
-                                               //chPrev = ' ';
-                                               chNext = styler.SafeGetCharAt(i + 1);
-                                       }
+                       i = nextIndex - 1;
+                       ch = ' ';
+                       chPrev = ' ';
+                       chNext = styler.SafeGetCharAt(i + 1);
+                     }
                  }
                  else if (isoperator(ch))
                  {
                  }
                  else if (isoperator(ch))
                  {
-                                       styler.ColourTo(i, SCE_P_OPERATOR);
+                     styler.ColourTo(i, SCE_SCRIPTOL_OPERATOR);
                  }
              }
           }
           else
           {
                  }
              }
           }
           else
           {
-            if (state == SCE_P_COMMENTLINE)
+            if (state == SCE_SCRIPTOL_COMMENTLINE ||
+                state == SCE_SCRIPTOL_PERSISTENT ||
+                state == SCE_SCRIPTOL_CSTYLE)
             {
             {
-                               if (ch == '\r' || ch == '\n')
+                 if (ch == '\r' || ch == '\n')
                  {
                  {
-                                       styler.ColourTo(i - 1, state);
-                                       state = SCE_P_DEFAULT;
+                     styler.ColourTo(i - 1, state);
+                     state = SCE_SCRIPTOL_DEFAULT;
                  }
             }
                  }
             }
-            else if(state == SCE_P_COMMENTBLOCK)
+            else if(state == SCE_SCRIPTOL_COMMENTBLOCK)
             {
             {
-              if(ch == '*' && chNext == '/') state = SCE_P_DEFAULT;
+              if(chPrev == '*' && ch == '/')
+              {
+                styler.ColourTo(i, state);
+                state = SCE_SCRIPTOL_DEFAULT;
+              }
             }
             }
-            else if (state == SCE_P_STRING)
+            else if ((state == SCE_SCRIPTOL_STRING) ||
+                     (state == SCE_SCRIPTOL_CHARACTER))
             {
             {
-                               if ((ch == '\r' || ch == '\n') && (chPrev != '\\'))
+               if ((ch == '\r' || ch == '\n') && (chPrev != '\\'))
                 {
                 {
-                                       styler.ColourTo(i - 1, state);
-                                       state = SCE_P_STRINGEOL;
-                               }
+                    styler.ColourTo(i - 1, state);
+                    state = SCE_SCRIPTOL_STRINGEOL;
+                }
                 else if (ch == '\\')
                 {
                    if (chNext == '\"' || chNext == '\'' || chNext == '\\')
                    {
                 else if (ch == '\\')
                 {
                    if (chNext == '\"' || chNext == '\'' || chNext == '\\')
                    {
-                                               i++;
-                                               ch = chNext;
-                                               chNext = styler.SafeGetCharAt(i + 1);
+                        i++;
+                        ch = chNext;
+                        chNext = styler.SafeGetCharAt(i + 1);
                    }
                    }
-                               }
-                else if (ch == '\"')
-                {
-                                       styler.ColourTo(i, state);
-                                       state = SCE_P_DEFAULT;
-                               }
-                       }
-            else if (state == SCE_P_CHARACTER)
-             {
-                               if ((ch == '\r' || ch == '\n') && (chPrev != '\\'))
-                 {
-                                       styler.ColourTo(i - 1, state);
-                                       state = SCE_P_STRINGEOL;
                  }
                  }
-                 else if (ch == '\\')
-                 {
-                                       if (chNext == '\"' || chNext == '\'' || chNext == '\\')
-                    {
-                                               i++;
-                                               ch = chNext;
-                                               chNext = styler.SafeGetCharAt(i + 1);
-                                       }
-                               }
-                else if (ch == '\'')
+                else if ((ch == '\"') || (ch == '\''))
                 {
                 {
-                                       styler.ColourTo(i, state);
-                                       state = SCE_P_DEFAULT;
-                               }
-            }
-            /*
-            else if (state == SCE_P_TRIPLE)
+                    // must match the entered quote type
+                    if(ch == stringType)
+                    {
+                      styler.ColourTo(i, state);
+                      state = SCE_SCRIPTOL_DEFAULT;
+                    }
+                 }
+             }
+             else if (state == SCE_SCRIPTOL_TRIPLE)
              {
              {
-                               if (ch == '\'' && chPrev == '\'' && chPrev2 == '\'')
+                if ((ch == '\'' && chPrev == '\'' && chPrev2 == '\'') ||
+                    (ch == '\"' && chPrev == '\"' && chPrev2 == '\"'))
                  {
                     styler.ColourTo(i, state);
                  {
                     styler.ColourTo(i, state);
-                                       state = SCE_P_DEFAULT;
-                 }
-              }
-            else if (state == SCE_P_TRIPLEDOUBLE)
-              {
-                               // =end terminates the comment block
-                               if (ch == 'd' && chPrev == 'n' && chPrev2 == 'e')
-                {
-                                       if  (styler.SafeGetCharAt(i - 3) == '=')
-                     {
-                                               styler.ColourTo(i, state);
-                                               state = SCE_P_DEFAULT;
-                     }
+                    state = SCE_SCRIPTOL_DEFAULT;
                  }
                  }
-                       }
-            */
-               }
-               //chPrev2 = chPrev;
-               chPrev = ch;
+             }
+            
+           }
+          chPrev2 = chPrev;
+          chPrev = ch;
        }
        }
-       if (state == SCE_P_WORD)
-    {
-       ClassifyWordSol(styler.GetStartSegment(), lengthDoc-1, keywords, styler, prevWord);
+        if (state == SCE_SCRIPTOL_KEYWORD)
+        {
+            ClassifyWordSol(styler.GetStartSegment(),
+                 lengthDoc-1, keywords, styler, prevWord);
        }
        }
-    else
-    {
-               styler.ColourTo(lengthDoc-1, state);
+        else
+        {
+            styler.ColourTo(lengthDoc-1, state);
        }
 }
 
        }
 }
 
@@ -369,57 +345,58 @@ static void FoldSolDoc(unsigned int startPos, int length, int initStyle,
  {
        int lengthDoc = startPos + length;
 
  {
        int lengthDoc = startPos + length;
 
-       // Backtrack to previous line in case need to fix its fold status
        int lineCurrent = styler.GetLine(startPos);
        int lineCurrent = styler.GetLine(startPos);
-       if (startPos > 0) {
-               if (lineCurrent > 0)
+       if (startPos > 0)
         {
         {
-                       lineCurrent--;
-                       startPos = styler.LineStart(lineCurrent);
-                       if (startPos == 0)
-                               initStyle = SCE_P_DEFAULT;
-                       else
-                               initStyle = styler.StyleAt(startPos-1);
-               }
+          if (lineCurrent > 0)
+          {
+               lineCurrent--;
+               startPos = styler.LineStart(lineCurrent);
+               if (startPos == 0)
+                    initStyle = SCE_SCRIPTOL_DEFAULT;
+               else
+                    initStyle = styler.StyleAt(startPos-1);
+           }
        }
        int state = initStyle & 31;
        int spaceFlags = 0;
         int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsSolComment);
        }
        int state = initStyle & 31;
        int spaceFlags = 0;
         int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsSolComment);
-       if ((state == SCE_P_TRIPLE) || (state == SCE_P_TRIPLEDOUBLE))
-               indentCurrent |= SC_FOLDLEVELWHITEFLAG;
+        if ((state == SCE_SCRIPTOL_TRIPLE))
+             indentCurrent |= SC_FOLDLEVELWHITEFLAG;
        char chNext = styler[startPos];
        for (int i = startPos; i < lengthDoc; i++)
        char chNext = styler[startPos];
        for (int i = startPos; i < lengthDoc; i++)
-    {
+         {
                char ch = chNext;
                chNext = styler.SafeGetCharAt(i + 1);
                int style = styler.StyleAt(i) & 31;
 
                if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc))
                char ch = chNext;
                chNext = styler.SafeGetCharAt(i + 1);
                int style = styler.StyleAt(i) & 31;
 
                if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc))
-        {
-                       int lev = indentCurrent;
-            int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsSolComment);
-                       if ((style == SCE_P_TRIPLE) || (style== SCE_P_TRIPLEDOUBLE))
-                               indentNext |= SC_FOLDLEVELWHITEFLAG;
-                       if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG))
-            {
-                               // Only non whitespace lines can be headers
-                               if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK))
-                {
-                                       lev |= SC_FOLDLEVELHEADERFLAG;
-                               } else if (indentNext & SC_FOLDLEVELWHITEFLAG)
                 {
                 {
-                                       // Line after is blank so check the next - maybe should continue further?
-                                       int spaceFlags2 = 0;
-                    int indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsSolComment);
-                                       if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK))
+                   int lev = indentCurrent;
+                   int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsSolComment);
+                   if (style == SCE_SCRIPTOL_TRIPLE)
+                        indentNext |= SC_FOLDLEVELWHITEFLAG;
+                   if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG))
                     {
                     {
-                                               lev |= SC_FOLDLEVELHEADERFLAG;
-                                       }
-                               }
-                       }
-                       indentCurrent = indentNext;
-                       styler.SetLevel(lineCurrent, lev);
-                       lineCurrent++;
+                        // Only non whitespace lines can be headers
+                        if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK))
+                        {
+                              lev |= SC_FOLDLEVELHEADERFLAG;
+                        }
+                        else if (indentNext & SC_FOLDLEVELWHITEFLAG)
+                        {
+                             // Line after is blank so check the next - maybe should continue further?
+                             int spaceFlags2 = 0;
+                             int indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsSolComment);
+                             if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK))
+                             {
+                                   lev |= SC_FOLDLEVELHEADERFLAG;
+                              }
+                        }
+                    }
+                   indentCurrent = indentNext;
+                   styler.SetLevel(lineCurrent, lev);
+                   lineCurrent++;
                }
        }
 }
                }
        }
 }
diff --git a/src/stc/scintilla/src/LexTeX.cxx b/src/stc/scintilla/src/LexTeX.cxx
new file mode 100644 (file)
index 0000000..a5b0946
--- /dev/null
@@ -0,0 +1,288 @@
+// Scintilla source code edit control
+
+// File: LexTeX.cxx - general context conformant tex coloring scheme
+// Author: Hans Hagen - PRAGMA ADE - Hasselt NL - www.pragma-ade.com
+// Version: September 28, 2003
+
+// Copyright: 1998-2003 by Neil Hodgson <neilh@scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+// This lexer is derived from the one written for the texwork environment (1999++) which in
+// turn is inspired on texedit (1991++) which finds its roots in wdt (1986).
+
+// If you run into strange boundary cases, just tell me and I'll look into it.
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+#include "StyleContext.h"
+
+// val SCE_TEX_DEFAULT = 0
+// val SCE_TEX_SPECIAL = 1
+// val SCE_TEX_GROUP   = 2
+// val SCE_TEX_SYMBOL  = 3
+// val SCE_TEX_COMMAND = 4
+// val SCE_TEX_TEXT    = 5
+
+// Definitions in SciTEGlobal.properties:
+//
+// TeX Highlighting
+//
+// # Default
+// style.tex.0=fore:#7F7F00
+// # Special
+// style.tex.1=fore:#007F7F
+// # Group
+// style.tex.2=fore:#880000
+// # Symbol
+// style.tex.3=fore:#7F7F00
+// # Command
+// style.tex.4=fore:#008800
+// # Text
+// style.tex.5=fore:#000000
+
+// lexer.tex.interface.default=0
+// lexer.tex.comment.process=0
+
+// todo: lexer.tex.auto.if
+
+// Auxiliary functions:
+
+static inline bool endOfLine(Accessor &styler, unsigned int i) {
+       return
+      (styler[i] == '\n') || ((styler[i] == '\r') && (styler.SafeGetCharAt(i + 1) != '\n')) ;
+}
+
+static inline bool isTeXzero(int ch) {
+       return
+      (ch == '%') ;
+}
+
+static inline bool isTeXone(int ch) {
+       return
+      (ch == '[') || (ch == ']') || (ch == '=') || (ch == '#') ||
+      (ch == '(') || (ch == ')') || (ch == '<') || (ch == '>') ||
+      (ch == '"') ;
+}
+
+static inline bool isTeXtwo(int ch) {
+       return
+      (ch == '{') || (ch == '}') || (ch == '$') ;
+}
+
+static inline bool isTeXthree(int ch) {
+       return
+      (ch == '~') || (ch == '^') || (ch == '_') || (ch == '&') ||
+      (ch == '-') || (ch == '+') || (ch == '\"') || (ch == '`') ||
+      (ch == '/') || (ch == '|') || (ch == '%') ;
+}
+
+static inline bool isTeXfour(int ch) {
+       return
+      (ch == '\\') ;
+}
+
+static inline bool isTeXfive(int ch) {
+       return
+      ((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) ||
+      (ch == '@') || (ch == '!') || (ch == '?') ;
+}
+
+static inline bool isTeXsix(int ch) {
+       return
+      (ch == ' ') ;
+}
+
+static inline bool isTeXseven(int ch) {
+       return
+      (ch == '^') ;
+}
+
+// Interface determination
+
+static int CheckTeXInterface(
+    unsigned int startPos,
+    int length,
+    Accessor &styler,
+       int defaultInterface) {
+
+    char lineBuffer[1024] ;
+       unsigned int linePos = 0 ;
+
+    // some day we can make something lexer.tex.mapping=(all,0)(nl,1)(en,2)...
+
+    if (styler.SafeGetCharAt(0) == '%') {
+        for (unsigned int i = 0; i < startPos + length; i++) {
+            lineBuffer[linePos++] = styler.SafeGetCharAt(i) ;
+            if (endOfLine(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {
+                lineBuffer[linePos] = '\0';
+                if (strstr(lineBuffer, "interface=all")) {
+                    return 0 ;
+                               } else if (strstr(lineBuffer, "interface=tex")) {
+                    return 1 ;
+                } else if (strstr(lineBuffer, "interface=nl")) {
+                    return 2 ;
+                } else if (strstr(lineBuffer, "interface=en")) {
+                    return 3 ;
+                } else if (strstr(lineBuffer, "interface=de")) {
+                    return 4 ;
+                } else if (strstr(lineBuffer, "interface=cz")) {
+                    return 5 ;
+                } else if (strstr(lineBuffer, "interface=it")) {
+                    return 6 ;
+                } else if (strstr(lineBuffer, "interface=ro")) {
+                    return 7 ;
+                } else if (strstr(lineBuffer, "interface=latex")) {
+                                       // we will move latex cum suis up to 91+ when more keyword lists are supported
+                    return 8 ;
+                               } else if (styler.SafeGetCharAt(1) == 'D' && strstr(lineBuffer, "%D \\module")) {
+                                       // better would be to limit the search to just one line
+                                       return 3 ;
+                } else {
+                    return defaultInterface ;
+                }
+            }
+               }
+    }
+
+    return defaultInterface ;
+}
+
+static void ColouriseTeXDoc(
+    unsigned int startPos,
+    int length,
+    int,
+    WordList *keywordlists[],
+    Accessor &styler) {
+
+       styler.StartAt(startPos) ;
+       styler.StartSegment(startPos) ;
+
+       bool processComment   = styler.GetPropertyInt("lexer.tex.comment.process",   0) == 1 ;
+    bool useKeywords      = styler.GetPropertyInt("lexer.tex.use.keywords",      1) == 1 ;
+       bool autoIf           = styler.GetPropertyInt("lexer.tex.auto.if",           1) == 1 ;
+    int  defaultInterface = styler.GetPropertyInt("lexer.tex.interface.default", 1) ;
+
+       char key[100] ;
+       int  k ;
+       bool newifDone = false ;
+       bool inComment = false ;
+
+       int currentInterface = CheckTeXInterface(startPos,length,styler,defaultInterface) ;
+
+    if (currentInterface == 0) {
+        useKeywords = false ;
+        currentInterface = 1 ;
+    }
+
+    WordList &keywords = *keywordlists[currentInterface-1] ;
+
+       StyleContext sc(startPos, length, SCE_TEX_TEXT, styler);
+
+       bool going = sc.More() ; // needed because of a fuzzy end of file state
+
+       for (; going; sc.Forward()) {
+
+               if (! sc.More()) { going = false ; } // we need to go one behind the end of text
+
+               if (inComment) {
+                       if (sc.atLineEnd) {
+                               sc.SetState(SCE_TEX_TEXT) ;
+                               newifDone = false ;
+                               inComment = false ;
+                       }
+               } else {
+                       if (! isTeXfive(sc.ch)) {
+                               if (sc.state == SCE_TEX_COMMAND) {
+                                       if (sc.LengthCurrent() == 1) { // \<noncstoken>
+                                               if (isTeXseven(sc.ch) && isTeXseven(sc.chNext)) {
+                                                       sc.Forward(2) ; // \^^ and \^^<token>
+                                               }
+                                               sc.ForwardSetState(SCE_TEX_TEXT) ;
+                                       } else {
+                                               sc.GetCurrent(key, sizeof(key)-1) ;
+                                               k = strlen(key) ;
+                                               memmove(key,key+1,k) ; // shift left over escape token
+                                               key[k] = '\0' ;
+                                               k-- ;
+                                               if (! keywords || ! useKeywords) {
+                                                       sc.SetState(SCE_TEX_COMMAND) ;
+                                                       newifDone = false ;
+                                               } else if (k == 1) { //\<cstoken>
+                                                       sc.SetState(SCE_TEX_COMMAND) ;
+                                                       newifDone = false ;
+                                               } else if (keywords.InList(key)) {
+                                               sc.SetState(SCE_TEX_COMMAND) ;
+                                                       newifDone = autoIf && (strcmp(key,"newif") == 0) ;
+                                               } else if (autoIf && ! newifDone && (key[0] == 'i') && (key[1] == 'f') && keywords.InList("if")) {
+                                               sc.SetState(SCE_TEX_COMMAND) ;
+                                               } else {
+                                                       sc.ChangeState(SCE_TEX_TEXT) ;
+                                                       sc.SetState(SCE_TEX_TEXT) ;
+                                                       newifDone = false ;
+                                               }
+                                       }
+                               }
+                               if (isTeXzero(sc.ch)) {
+                                       sc.SetState(SCE_TEX_SYMBOL) ;
+                                       sc.ForwardSetState(SCE_TEX_DEFAULT) ;
+                                       inComment = ! processComment ;
+                                       newifDone = false ;
+                               } else if (isTeXseven(sc.ch) && isTeXseven(sc.chNext)) {
+                                       sc.SetState(SCE_TEX_TEXT) ;
+                                       sc.ForwardSetState(SCE_TEX_TEXT) ;
+                               } else if (isTeXone(sc.ch)) {
+                                       sc.SetState(SCE_TEX_SPECIAL) ;
+                                       newifDone = false ;
+                               } else if (isTeXtwo(sc.ch)) {
+                                       sc.SetState(SCE_TEX_GROUP) ;
+                                       newifDone = false ;
+                               } else if (isTeXthree(sc.ch)) {
+                                       sc.SetState(SCE_TEX_SYMBOL) ;
+                                       newifDone = false ;
+                               } else if (isTeXfour(sc.ch)) {
+                                       sc.SetState(SCE_TEX_COMMAND) ;
+                               } else if (isTeXsix(sc.ch)) {
+                                       sc.SetState(SCE_TEX_TEXT) ;
+                               } else if (sc.atLineEnd) {
+                                       sc.SetState(SCE_TEX_TEXT) ;
+                                       newifDone = false ;
+                                       inComment = false ;
+                               } else {
+                                       sc.SetState(SCE_TEX_TEXT) ;
+                               }
+                       } else if (sc.state != SCE_TEX_COMMAND) {
+                               sc.SetState(SCE_TEX_TEXT) ;
+                       }
+               }
+       }
+       sc.ChangeState(SCE_TEX_TEXT) ;
+       sc.Complete();
+
+}
+
+
+// Hooks into the system:
+
+static const char * const texWordListDesc[] = {
+    "TeX, eTeX, pdfTeX, Omega"
+    "ConTeXt Dutch",
+    "ConTeXt English",
+    "ConTeXt German",
+    "ConTeXt Czech",
+    "ConTeXt Italian",
+    "ConTeXt Romanian",
+       0,
+} ;
+
+LexerModule lmTeX(SCLEX_TEX, ColouriseTeXDoc, "tex", 0, texWordListDesc);
index 72fdb9c3cf86c4699fb6f812614f2728f9f32261..93bdedbd897b77c946d6527e972dd266e9ca50fe 100644 (file)
@@ -2,7 +2,7 @@
 /** @file LexVB.cxx
  ** Lexer for Visual Basic and VBScript.
  **/
 /** @file LexVB.cxx
  ** Lexer for Visual Basic and VBScript.
  **/
-// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
+// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include <stdlib.h>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include <stdlib.h>
@@ -24,16 +24,19 @@ static bool IsVBComment(Accessor &styler, int pos, int len) {
        return len>0 && styler[pos]=='\'';
 }
 
        return len>0 && styler[pos]=='\'';
 }
 
-static inline bool IsTypeCharacter(const int ch) {
+static inline bool IsTypeCharacter(int ch) {
        return ch == '%' || ch == '&' || ch == '@' || ch == '!' || ch == '#' || ch == '$';
 }
 
        return ch == '%' || ch == '&' || ch == '@' || ch == '!' || ch == '#' || ch == '$';
 }
 
-static inline bool IsAWordChar(const int ch) {
-       return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
+// Extended to accept accented characters
+static inline bool IsAWordChar(int ch) {
+       return ch >= 0x80 ||
+              (isalnum(ch) || ch == '.' || ch == '_');
 }
 
 }
 
-static inline bool IsAWordStart(const int ch) {
-       return (ch < 0x80) && (isalnum(ch) || ch == '_');
+static inline bool IsAWordStart(int ch) {
+       return ch >= 0x80 ||
+              (isalnum(ch) || ch == '_');
 }
 
 static inline bool IsADateCharacter(const int ch) {
 }
 
 static inline bool IsADateCharacter(const int ch) {
@@ -45,6 +48,9 @@ static void ColouriseVBDoc(unsigned int startPos, int length, int initStyle,
                            WordList *keywordlists[], Accessor &styler, bool vbScriptSyntax) {
 
        WordList &keywords = *keywordlists[0];
                            WordList *keywordlists[], Accessor &styler, bool vbScriptSyntax) {
 
        WordList &keywords = *keywordlists[0];
+       WordList &keywords2 = *keywordlists[1];
+       WordList &keywords3 = *keywordlists[2];
+       WordList &keywords4 = *keywordlists[3];
 
        styler.StartAt(startPos);
 
 
        styler.StartAt(startPos);
 
@@ -56,26 +62,37 @@ static void ColouriseVBDoc(unsigned int startPos, int length, int initStyle,
 
                if (sc.state == SCE_B_OPERATOR) {
                        sc.SetState(SCE_B_DEFAULT);
 
                if (sc.state == SCE_B_OPERATOR) {
                        sc.SetState(SCE_B_DEFAULT);
-               } else if (sc.state == SCE_B_KEYWORD) {
+               } else if (sc.state == SCE_B_IDENTIFIER) {
                        if (!IsAWordChar(sc.ch)) {
                        if (!IsAWordChar(sc.ch)) {
-                               if (vbScriptSyntax || !IsTypeCharacter(sc.ch)) {
-                                       if (sc.ch == ']')
-                                               sc.Forward();
-                                       char s[100];
-                                       sc.GetCurrentLowered(s, sizeof(s));
+                               // In Basic (except VBScript), a variable name or a function name
+                               // can end with a special character indicating the type of the value
+                               // held or returned.
+                               bool skipType = false;
+                               if (!vbScriptSyntax && IsTypeCharacter(sc.ch)) {
+                                       sc.Forward();   // Skip it
+                                       skipType = true;
+                               }
+                               if (sc.ch == ']') {
+                                       sc.Forward();
+                               }
+                               char s[100];
+                               sc.GetCurrentLowered(s, sizeof(s));
+                               if (skipType) {
+                                       s[strlen(s) - 1] = '\0';
+                               }
+                               if (strcmp(s, "rem") == 0) {
+                                       sc.ChangeState(SCE_B_COMMENT);
+                               } else {
                                        if (keywords.InList(s)) {
                                        if (keywords.InList(s)) {
-                                               if (strcmp(s, "rem") == 0) {
-                                                       sc.ChangeState(SCE_B_COMMENT);
-                                                       if (sc.atLineEnd) {
-                                                               sc.SetState(SCE_B_DEFAULT);
-                                                       }
-                                               } else {
-                                                       sc.SetState(SCE_B_DEFAULT);
-                                               }
-                                       } else {
-                                               sc.ChangeState(SCE_B_IDENTIFIER);
-                                               sc.SetState(SCE_B_DEFAULT);
-                                       }
+                                               sc.ChangeState(SCE_B_KEYWORD);
+                                       } else if (keywords2.InList(s)) {
+                                               sc.ChangeState(SCE_B_KEYWORD2);
+                                       } else if (keywords3.InList(s)) {
+                                               sc.ChangeState(SCE_B_KEYWORD3);
+                                       } else if (keywords4.InList(s)) {
+                                               sc.ChangeState(SCE_B_KEYWORD4);
+                                       }       // Else, it is really an identifier...
+                                       sc.SetState(SCE_B_DEFAULT);
                                }
                        }
                } else if (sc.state == SCE_B_NUMBER) {
                                }
                        }
                } else if (sc.state == SCE_B_NUMBER) {
@@ -90,6 +107,9 @@ static void ColouriseVBDoc(unsigned int startPos, int length, int initStyle,
                                        sc.Forward();
                                }
                                sc.ForwardSetState(SCE_B_DEFAULT);
                                        sc.Forward();
                                }
                                sc.ForwardSetState(SCE_B_DEFAULT);
+                       } else if (sc.atLineEnd) {
+                               sc.ChangeState(SCE_B_STRINGEOL);
+                               sc.ForwardSetState(SCE_B_DEFAULT);
                        }
                } else if (sc.state == SCE_B_COMMENT) {
                        if (sc.atLineEnd) {
                        }
                } else if (sc.state == SCE_B_COMMENT) {
                        if (sc.atLineEnd) {
@@ -132,7 +152,7 @@ static void ColouriseVBDoc(unsigned int startPos, int length, int initStyle,
                        } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
                                sc.SetState(SCE_B_NUMBER);
                        } else if (IsAWordStart(sc.ch) || (sc.ch == '[')) {
                        } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
                                sc.SetState(SCE_B_NUMBER);
                        } else if (IsAWordStart(sc.ch) || (sc.ch == '[')) {
-                               sc.SetState(SCE_B_KEYWORD);
+                               sc.SetState(SCE_B_IDENTIFIER);
                        } else if (isoperator(static_cast<char>(sc.ch)) || (sc.ch == '\\')) {
                                sc.SetState(SCE_B_OPERATOR);
                        }
                        } else if (isoperator(static_cast<char>(sc.ch)) || (sc.ch == '\\')) {
                                sc.SetState(SCE_B_OPERATOR);
                        }
@@ -202,6 +222,9 @@ static void ColouriseVBScriptDoc(unsigned int startPos, int length, int initStyl
 
 static const char * const vbWordListDesc[] = {
        "Keywords",
 
 static const char * const vbWordListDesc[] = {
        "Keywords",
+       "user1",
+       "user2",
+       "user3",
        0
 };
 
        0
 };
 
diff --git a/src/stc/scintilla/src/LexYAML.cxx b/src/stc/scintilla/src/LexYAML.cxx
new file mode 100644 (file)
index 0000000..e3053f8
--- /dev/null
@@ -0,0 +1,305 @@
+// Scintilla source code edit control
+/** @file LexYAML.cxx
+ ** Lexer for YAML.
+ **/
+// Copyright 2003- by Sean O'Dell <sean@celsoft.com>
+// Release under the same license as Scintilla/SciTE.
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+static const char * const yamlWordListDesc[] = {
+       "Keywords",
+       0
+};
+
+static inline bool AtEOL(Accessor &styler, unsigned int i) {
+       return (styler[i] == '\n') ||
+               ((styler[i] == '\r') && (styler.SafeGetCharAt(i + 1) != '\n'));
+}
+
+static unsigned int SpaceCount(char* lineBuffer) {
+       if (lineBuffer == NULL)
+               return 0;
+       
+       char* headBuffer = lineBuffer;
+       
+       while (*headBuffer == ' ')
+               headBuffer++;
+       
+       return headBuffer - lineBuffer;
+}
+
+#define YAML_STATE_BITSIZE 16
+#define YAML_STATE_MASK                        (0xFFFF0000)
+#define YAML_STATE_DOCUMENT            (1 << YAML_STATE_BITSIZE)
+#define YAML_STATE_VALUE                       (2 << YAML_STATE_BITSIZE)
+#define YAML_STATE_COMMENT             (3 << YAML_STATE_BITSIZE)
+#define YAML_STATE_TEXT_PARENT (4 << YAML_STATE_BITSIZE)
+#define YAML_STATE_TEXT                        (5 << YAML_STATE_BITSIZE)
+
+static void ColouriseYAMLLine(
+       char *lineBuffer,
+       unsigned int currentLine,
+       unsigned int lengthLine,
+       unsigned int startLine,
+       unsigned int endPos,
+       WordList &keywords,
+       Accessor &styler) {
+           
+       unsigned int i = 0;
+       bool bInQuotes = false;
+       unsigned int indentAmount = SpaceCount(lineBuffer);
+               
+       if (currentLine > 0) {
+               int parentLineState = styler.GetLineState(currentLine - 1);
+       
+               if ((parentLineState&YAML_STATE_MASK) == YAML_STATE_TEXT || (parentLineState&YAML_STATE_MASK) == YAML_STATE_TEXT_PARENT) {
+                       unsigned int parentIndentAmount = parentLineState&(~YAML_STATE_MASK);
+                       if (indentAmount > parentIndentAmount) {
+                               styler.SetLineState(currentLine, YAML_STATE_TEXT | parentIndentAmount);
+                               styler.ColourTo(endPos, SCE_YAML_TEXT);
+                               return;
+                       }
+               }
+       }
+       styler.SetLineState(currentLine, 0);
+       if (strncmp(lineBuffer, "---", 3) == 0) {       // Document marker
+               styler.SetLineState(currentLine, YAML_STATE_DOCUMENT);
+               styler.ColourTo(endPos, SCE_YAML_DOCUMENT);
+               return;
+       }
+       // Skip initial spaces
+       while ((i < lengthLine) && lineBuffer[i] == ' ') { // YAML always uses space, never TABS or anything else
+               i++;
+       }
+       if (lineBuffer[i] == '\t') { // if we skipped all spaces, and we are NOT inside a text block, this is wrong
+               styler.ColourTo(endPos, SCE_YAML_ERROR);
+               return;
+       }
+       if (lineBuffer[i] == '#') {     // Comment
+               styler.SetLineState(currentLine, YAML_STATE_COMMENT);
+               styler.ColourTo(endPos, SCE_YAML_COMMENT);
+               return;
+       }
+       while (i < lengthLine) {
+               if (lineBuffer[i] == '\'' || lineBuffer[i] == '\"') {
+                       bInQuotes = !bInQuotes;
+               } else if (lineBuffer[i] == ':' && !bInQuotes) {
+                       styler.ColourTo(startLine + i, SCE_YAML_IDENTIFIER);
+                       // Non-folding scalar
+                       i++;
+                       while ((i < lengthLine) && isspacechar(lineBuffer[i]))
+                               i++;
+                       unsigned int endValue = lengthLine - 1;
+                       while ((endValue >= i) && isspacechar(lineBuffer[endValue]))
+                               endValue--;
+                       lineBuffer[endValue + 1] = '\0';
+                       if (lineBuffer[i] == '|' || lineBuffer[i] == '>') {
+                               i++;
+                               if (lineBuffer[i] == '+' || lineBuffer[i] == '-')
+                                       i++;
+                               while ((i < lengthLine) && isspacechar(lineBuffer[i]))
+                                       i++;
+                               if (lineBuffer[i] == '\0') {
+                                       styler.SetLineState(currentLine, YAML_STATE_TEXT_PARENT | indentAmount);
+                                       styler.ColourTo(endPos, SCE_YAML_DEFAULT);
+                                       return;
+                               } else if (lineBuffer[i] == '#') {
+                                       styler.SetLineState(currentLine, YAML_STATE_TEXT_PARENT | indentAmount);
+                                       styler.ColourTo(startLine + i - 1, SCE_YAML_DEFAULT);
+                                       styler.ColourTo(endPos, SCE_YAML_COMMENT);
+                                       return;
+                               } else {
+                                       styler.ColourTo(endPos, SCE_YAML_ERROR);
+                                       return;
+                               }
+                       }
+                       styler.SetLineState(currentLine, YAML_STATE_VALUE);
+                       if (lineBuffer[i] == '&' || lineBuffer[i] == '*') {
+                               styler.ColourTo(endPos, SCE_YAML_REFERENCE);
+                               return;
+                       }
+                       if (keywords.InList(&lineBuffer[i])) { // Convertible value (true/false, etc.)
+                               styler.ColourTo(endPos, SCE_YAML_KEYWORD);
+                               return;
+                       } else {
+                               unsigned int i2 = i;
+                               while ((i < lengthLine) && lineBuffer[i]) {
+                                       if (!isdigit(lineBuffer[i]) && lineBuffer[i] != '-' && lineBuffer[i] != '.' && lineBuffer[i] != ',') {
+                                               styler.ColourTo(endPos, SCE_YAML_DEFAULT);
+                                               return;
+                                       }
+                                       i++;
+                               }
+                               if (i > i2) {
+                                       styler.ColourTo(endPos, SCE_YAML_NUMBER);
+                                       return;
+                               }
+                       }
+                       break; // shouldn't get here, but just in case, the rest of the line is coloured the default
+               }
+               i++;
+       }
+       styler.ColourTo(endPos, SCE_YAML_DEFAULT);
+}
+
+static void ColouriseYAMLDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler) {
+       char lineBuffer[1024];
+       styler.StartAt(startPos);
+       styler.StartSegment(startPos);
+       unsigned int linePos = 0;
+       unsigned int startLine = startPos;
+       unsigned int endPos = startPos + length;
+       unsigned int maxPos = styler.Length();
+       unsigned int lineCurrent = styler.GetLine(startPos);
+       
+       for (unsigned int i = startPos; i < maxPos && i < endPos; i++) {
+               lineBuffer[linePos++] = styler[i];
+               if (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {
+                       // End of line (or of line buffer) met, colourise it
+                       lineBuffer[linePos] = '\0';
+                       ColouriseYAMLLine(lineBuffer, lineCurrent, linePos, startLine, i, *keywordLists[0], styler);
+                       linePos = 0;
+                       startLine = i + 1;
+                       lineCurrent++;
+               }
+       }
+       if (linePos > 0) {      // Last line does not have ending characters
+               ColouriseYAMLLine(lineBuffer, lineCurrent, linePos, startLine, startPos + length - 1, *keywordLists[0], styler);
+       }
+}
+
+static bool IsCommentLine(int line, Accessor &styler) {
+       int pos = styler.LineStart(line);
+       if (styler[pos] == '#')
+               return true;
+       return false;
+}
+
+static void FoldYAMLDoc(unsigned int startPos, int length, int /*initStyle - unused*/,
+                      WordList *[], Accessor &styler) {
+       const int maxPos = startPos + length;
+       const int maxLines = styler.GetLine(maxPos - 1);             // Requested last line
+       const int docLines = styler.GetLine(styler.Length() - 1);  // Available last line
+       const bool foldComment = styler.GetPropertyInt("fold.comment.yaml") != 0;
+
+       // Backtrack to previous non-blank line so we can determine indent level
+       // for any white space lines
+       // and so we can fix any preceding fold level (which is why we go back
+       // at least one line in all cases)
+       int spaceFlags = 0;
+       int lineCurrent = styler.GetLine(startPos);
+       int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, NULL);
+       while (lineCurrent > 0) {
+               lineCurrent--;
+               indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, NULL);
+               if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG) &&
+                       (!IsCommentLine(lineCurrent, styler)))
+                       break;
+       }
+       int indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK;
+
+       // Set up initial loop state
+       int prevComment = 0;
+       if (lineCurrent >= 1)
+               prevComment = foldComment && IsCommentLine(lineCurrent - 1, styler);
+
+       // Process all characters to end of requested range
+       // or comment that hangs over the end of the range.  Cap processing in all cases
+       // to end of document (in case of unclosed comment at end).
+       while ((lineCurrent <= docLines) && ((lineCurrent <= maxLines) || prevComment)) {
+
+               // Gather info
+               int lev = indentCurrent;
+               int lineNext = lineCurrent + 1;
+               int indentNext = indentCurrent;
+               if (lineNext <= docLines) {
+                       // Information about next line is only available if not at end of document
+                       indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);
+       }
+               const int comment = foldComment && IsCommentLine(lineCurrent, styler);
+               const int comment_start = (comment && !prevComment && (lineNext <= docLines) &&
+                                          IsCommentLine(lineNext, styler) && (lev > SC_FOLDLEVELBASE));
+               const int comment_continue = (comment && prevComment);
+               if (!comment)
+                       indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK;
+               if (indentNext & SC_FOLDLEVELWHITEFLAG)
+                       indentNext = SC_FOLDLEVELWHITEFLAG | indentCurrentLevel;
+
+               if (comment_start) {
+                       // Place fold point at start of a block of comments
+                       lev |= SC_FOLDLEVELHEADERFLAG;
+               } else if (comment_continue) {
+                       // Add level to rest of lines in the block
+                       lev = lev + 1;
+               }
+
+               // Skip past any blank lines for next indent level info; we skip also
+               // comments (all comments, not just those starting in column 0)
+               // which effectively folds them into surrounding code rather
+               // than screwing up folding.
+
+               while ((lineNext < docLines) &&
+                       ((indentNext & SC_FOLDLEVELWHITEFLAG) ||
+                        (lineNext <= docLines && IsCommentLine(lineNext, styler)))) {
+
+                       lineNext++;
+                       indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);
+               }
+
+               const int levelAfterComments = indentNext & SC_FOLDLEVELNUMBERMASK;
+               const int levelBeforeComments = Platform::Maximum(indentCurrentLevel,levelAfterComments);
+
+               // Now set all the indent levels on the lines we skipped
+               // Do this from end to start.  Once we encounter one line
+               // which is indented more than the line after the end of
+               // the comment-block, use the level of the block before
+
+               int skipLine = lineNext;
+               int skipLevel = levelAfterComments;
+
+               while (--skipLine > lineCurrent) {
+                       int skipLineIndent = styler.IndentAmount(skipLine, &spaceFlags, NULL);
+
+                       if ((skipLineIndent & SC_FOLDLEVELNUMBERMASK) > levelAfterComments)
+                               skipLevel = levelBeforeComments;
+
+                       int whiteFlag = skipLineIndent & SC_FOLDLEVELWHITEFLAG;
+
+                       styler.SetLevel(skipLine, skipLevel | whiteFlag);
+               }
+
+               // Set fold header on non-comment line
+               if (!comment && !(indentCurrent & SC_FOLDLEVELWHITEFLAG) ) {
+                       if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK))
+                               lev |= SC_FOLDLEVELHEADERFLAG;
+               }
+
+               // Keep track of block comment state of previous line
+               prevComment = comment_start || comment_continue;
+
+               // Set fold level for this line and move to next line
+               styler.SetLevel(lineCurrent, lev);
+               indentCurrent = indentNext;
+               lineCurrent = lineNext;
+       }
+
+       // NOTE: Cannot set level of last line here because indentCurrent doesn't have
+       // header flag set; the loop above is crafted to take care of this case!
+       //styler.SetLevel(lineCurrent, indentCurrent);
+}
+
+LexerModule lmYAML(SCLEX_YAML, ColouriseYAMLDoc, "yaml", FoldYAMLDoc, yamlWordListDesc);
index 021a6572739172bb6868a3c8518be713356bf297..658d5046a431cd6532e050a42dd626dae6162ca2 100644 (file)
@@ -562,7 +562,7 @@ bool WordList::InList(const char *s) {
  * The length of the word to compare is passed too.
  * Letter case can be ignored or preserved (default).
  */
  * The length of the word to compare is passed too.
  * Letter case can be ignored or preserved (default).
  */
-const char *WordList::GetNearestWord(const char *wordStart, int searchLen /*= -1*/, bool ignoreCase /*= false*/, SString wordCharacters /*='/0' */) {
+const char *WordList::GetNearestWord(const char *wordStart, int searchLen /*= -1*/, bool ignoreCase /*= false*/, SString wordCharacters /*='/0' */, int wordIndex /*= -1 */) {
        int start = 0; // lower bound of the api array block to search
        int end = len - 1; // upper bound of the api array block to search
        int pivot; // index of api array element just being compared
        int start = 0; // lower bound of the api array block to search
        int end = len - 1; // upper bound of the api array block to search
        int pivot; // index of api array element just being compared
@@ -580,8 +580,33 @@ const char *WordList::GetNearestWord(const char *wordStart, int searchLen /*= -1
                        pivot = (start + end) >> 1;
                        word = wordsNoCase[pivot];
                        cond = CompareNCaseInsensitive(wordStart, word, searchLen);
                        pivot = (start + end) >> 1;
                        word = wordsNoCase[pivot];
                        cond = CompareNCaseInsensitive(wordStart, word, searchLen);
-                       if (!cond && (!wordCharacters.contains(word[searchLen])))
+                       if (!cond && (!wordCharacters.contains(word[searchLen]))) {
+                               // Found a word in a binary fashion. Now checks if a specific index was requested
+                               if (wordIndex < 0)
                                        return word; // result must not be freed with free()
                                        return word; // result must not be freed with free()
+
+                               // Finds first word in a series of equal words
+                               int first = pivot;
+                               end = pivot - 1;
+                               while (start <= end) {
+                                       pivot = (start + end) >> 1;
+                                       word = wordsNoCase[pivot];
+                                       cond = CompareNCaseInsensitive(wordStart, word, searchLen);
+                                       if (!cond && (!wordCharacters.contains(word[searchLen]))) {
+                                               // Found another word
+                                               first = pivot;
+                                               end = pivot - 1;
+                                       } 
+                                       else if (cond > 0) 
+                                               start = pivot + 1;
+                                       else if (cond <= 0)
+                                               break;
+                               }
+
+                               // Gets the word at the requested index
+                               word = wordsNoCase[first + wordIndex];
+                               return word;
+                       }
                        else if (cond > 0)
                                start = pivot + 1;
                        else if (cond <= 0)
                        else if (cond > 0)
                                start = pivot + 1;
                        else if (cond <= 0)
@@ -592,8 +617,33 @@ const char *WordList::GetNearestWord(const char *wordStart, int searchLen /*= -1
                        pivot = (start + end) >> 1;
                        word = words[pivot];
                        cond = strncmp(wordStart, word, searchLen);
                        pivot = (start + end) >> 1;
                        word = words[pivot];
                        cond = strncmp(wordStart, word, searchLen);
-                       if (!cond && (!wordCharacters.contains(word[searchLen])))
-                               return word; // result must not be freed with free()
+                       if (!cond && (!wordCharacters.contains(word[searchLen]))) {
+                               // Found a word in a binary fashion. Now checks if a specific index was requested
+                               if (wordIndex < 0)
+                                       return word; // result must not be freed with free()
+
+                               // Finds first word in a series of equal words
+                               int first = pivot;
+                               end = pivot - 1;
+                               while (start <= end) {
+                                       pivot = (start + end) >> 1;
+                                       word = words[pivot];
+                                       cond = strncmp(wordStart, word, searchLen);
+                                       if (!cond && (!wordCharacters.contains(word[searchLen]))) {
+                                               // Found another word
+                                               first = pivot;
+                                               end = pivot - 1;
+                                       } 
+                                       else if (cond > 0) 
+                                               start = pivot + 1;
+                                       else if (cond <= 0)
+                                               break;
+                               }
+
+                               // Gets the word at the requested index
+                               word = words[first + wordIndex];
+                               return word;
+                       }
                        else if (cond > 0)
                                start = pivot + 1;
                        else if (cond <= 0)
                        else if (cond > 0)
                                start = pivot + 1;
                        else if (cond <= 0)
index 3ca61bb9cec295647b059cc43c4bf8f1e4034ef1..b7ea71bfb9631d81d3b92743c6626b2dfda35cee 100644 (file)
  *      Dept. of Computer Science
  *      York University
  *
  *      Dept. of Computer Science
  *      York University
  *
- * Original code available from http://www.cs.yorku.ca/~oz/ 
+ * Original code available from http://www.cs.yorku.ca/~oz/
  * Translation to C++ by Neil Hodgson neilh@scintilla.org
  * Removed all use of register.
  * Converted to modern function prototypes.
  * Translation to C++ by Neil Hodgson neilh@scintilla.org
  * Removed all use of register.
  * Converted to modern function prototypes.
- * Put all global/static variables into an object so this code can be 
+ * Put all global/static variables into an object so this code can be
  * used from multiple threads etc.
  *
  * These routines are the PUBLIC DOMAIN equivalents of regex
  * used from multiple threads etc.
  *
  * These routines are the PUBLIC DOMAIN equivalents of regex
  * see Henry Spencer's regexp routines, or GNU Emacs pattern
  * matching module.
  *
  * see Henry Spencer's regexp routines, or GNU Emacs pattern
  * matching module.
  *
- * Modification history:
- *
- * $Log$
- * Revision 1.8  2003/09/18 05:05:38  RD
- * Updated to Scintilla 1.54
- * Applied most of patch #806092
- * Added new wxSTC sample from Otto Wyss
- *
- * Revision 1.9  2003/03/21 10:36:08  nyamatongwe
- * Detect patterns too long in regular expression search.
- *
- * Revision 1.8  2003/03/04 10:53:59  nyamatongwe
- * Patch from Jakub to optionally implement more POSIX compatible regular
- * expressions. \(..\) changes to (..)
- * Fixes problem where find previous would not find earlier matches on same
- * line.
- *
- * Revision 1.8  2003/03/03 20:12:56  vrana
- * Added posix syntax.
- *
- * Revision 1.7  2002/09/28 00:33:28  nyamatongwe
- * Fixed problem with character ranges caused by expansion to 8 bits.
- *
- * Revision 1.6  2001/04/29 13:32:10  nyamatongwe
- * Addition of new target methods - versions of ReplaceTarget that take counted
- * strings to allow for nulls, SearchInTarget and Get/SetSearchFlags to use a
- * series of calls rather than a structure.
- * Handling of \000 in search and replace.
- * Handling of /escapes within character ranges of regular expressions.
- * Some handling of bare ^ and $ regular expressions.
- *
- * Revision 1.5  2001/04/20 07:36:09  nyamatongwe
- * Removed DEBUG code that failed to compile on GTK+.
- *
- * Revision 1.4  2001/04/13 03:52:13  nyamatongwe
- * Added URL to find original code to comments.
- *
- * Revision 1.3  2001/04/06 12:24:21  nyamatongwe
- * Made regular expression searching work on a line by line basis, made ^ and
- * $ work, made [set] work, and added a case insensitive option.
- *
- * Revision 1.2  2001/04/05 01:58:04  nyamatongwe
- * Replace target functionality to make find and replace operations faster
- * by diminishing screen updates and allow for \d patterns in the replacement
- * text.
- *
- * Revision 1.1  2001/04/04 12:52:44  nyamatongwe
- * Moved to public domain regular expresion implementation.
- *
- * Revision 1.4  1991/10/17  03:56:42  oz
- * miscellaneous changes, small cleanups etc.
- *
- * Revision 1.3  1989/04/01  14:18:09  oz
- * Change all references to a dfa: this is actually an nfa.
- *
- * Revision 1.2  88/08/28  15:36:04  oz
- * Use a complement bitmap to represent NCL.
- * This removes the need to have seperate 
- * code in the PMatch case block - it is 
- * just CCL code now.
- * 
- * Use the actual CCL code in the CLO
- * section of PMatch. No need for a recursive
- * PMatch call.
- * 
- * Use a bitmap table to set char bits in an
- * 8-bit chunk.
- * 
+ * Modification history removed.
+ *
  * Interfaces:
  *      RESearch::Compile:        compile a regular expression into a NFA.
  *
  * Interfaces:
  *      RESearch::Compile:        compile a regular expression into a NFA.
  *
  *                     void re_fail(msg, op)
  *                     char *msg;
  *                     char op;
  *                     void re_fail(msg, op)
  *                     char *msg;
  *                     char op;
- *  
+ *
  * Regular Expressions:
  *
  *      [1]     char    matches itself, unless it is a special
  * Regular Expressions:
  *
  *      [1]     char    matches itself, unless it is a special
  *
  *      [3]     \       matches the character following it, except
  *                     when followed by a left or right round bracket,
  *
  *      [3]     \       matches the character following it, except
  *                     when followed by a left or right round bracket,
- *                     a digit 1 to 9 or a left or right angle bracket. 
+ *                     a digit 1 to 9 or a left or right angle bracket.
  *                     (see [7], [8] and [9])
  *                     (see [7], [8] and [9])
- *                     It is used as an escape character for all 
+ *                     It is used as an escape character for all
  *                     other meta-characters, and itself. When used
  *                     in a set ([4]), it is treated as an ordinary
  *                     character.
  *
  *      [4]     [set]   matches one of the characters in the set.
  *                      If the first character in the set is "^",
  *                     other meta-characters, and itself. When used
  *                     in a set ([4]), it is treated as an ordinary
  *                     character.
  *
  *      [4]     [set]   matches one of the characters in the set.
  *                      If the first character in the set is "^",
- *                      it matches a character NOT in the set, i.e. 
- *                     complements the set. A shorthand S-E is 
- *                     used to specify a set of characters S upto 
- *                     E, inclusive. The special characters "]" and 
- *                     "-" have no special meaning if they appear 
+ *                      it matches a character NOT in the set, i.e.
+ *                     complements the set. A shorthand S-E is
+ *                     used to specify a set of characters S upto
+ *                     E, inclusive. The special characters "]" and
+ *                     "-" have no special meaning if they appear
  *                     as the first chars in the set.
  *                      examples:        match:
  *
  *                     as the first chars in the set.
  *                      examples:        match:
  *
  * Notes:
  *
  *     This implementation uses a bit-set representation for character
  * Notes:
  *
  *     This implementation uses a bit-set representation for character
- *     classes for speed and compactness. Each character is represented 
- *     by one bit in a 128-bit block. Thus, CCL always takes a 
+ *     classes for speed and compactness. Each character is represented
+ *     by one bit in a 128-bit block. Thus, CCL always takes a
  *     constant 16 bytes in the internal nfa, and RESearch::Execute does a single
  *     bit comparison to locate the character in the set.
  *
  *     constant 16 bytes in the internal nfa, and RESearch::Execute does a single
  *     bit comparison to locate the character in the set.
  *
  *     compile:        CHR f CHR o CLO CHR o END CLO ANY END END
  *     matches:        fo foo fooo foobar fobar foxx ...
  *
  *     compile:        CHR f CHR o CLO CHR o END CLO ANY END END
  *     matches:        fo foo fooo foobar fobar foxx ...
  *
- *     pattern:        fo[ob]a[rz]     
+ *     pattern:        fo[ob]a[rz]
  *     compile:        CHR f CHR o CCL bitset CHR a CCL bitset END
  *     matches:        fobar fooar fobaz fooaz
  *
  *     compile:        CHR f CHR o CCL bitset CHR a CCL bitset END
  *     matches:        fobar fooar fobaz fooaz
  *
  * The following defines are not meant to be changeable.
  * They are for readability only.
  */
  * The following defines are not meant to be changeable.
  * They are for readability only.
  */
-#define BLKIND 0170
+#define BLKIND 0370
 #define BITIND 07
 
 #define ASCIIB 0177
 #define BITIND 07
 
 #define ASCIIB 0177
 const char bitarr[] = {1,2,4,8,16,32,64,'\200'};
 
 #define badpat(x)      (*nfa = END, x)
 const char bitarr[] = {1,2,4,8,16,32,64,'\200'};
 
 #define badpat(x)      (*nfa = END, x)
+
 RESearch::RESearch() {
        Init();
 }
 RESearch::RESearch() {
        Init();
 }
@@ -361,7 +295,7 @@ const char *RESearch::Compile(const char *pat, int length, bool caseSensitive, b
        int n;
        char mask;              /* xor mask -CCL/NCL */
        int c1, c2;
        int n;
        char mask;              /* xor mask -CCL/NCL */
        int c1, c2;
-               
+
        if (!pat || !length)
                if (sta)
                        return 0;
        if (!pat || !length)
                if (sta)
                        return 0;
@@ -403,7 +337,7 @@ const char *RESearch::Compile(const char *pat, int length, bool caseSensitive, b
 
                        i++;
                        if (*++p == '^') {
 
                        i++;
                        if (*++p == '^') {
-                               mask = '\377';  
+                               mask = '\377';
                                i++;
                                p++;
                        } else
                                i++;
                                p++;
                        } else
@@ -447,7 +381,7 @@ const char *RESearch::Compile(const char *pat, int length, bool caseSensitive, b
 
                        for (n = 0; n < BITBLK; bittab[n++] = (char) 0)
                                *mp++ = static_cast<char>(mask ^ bittab[n]);
 
                        for (n = 0; n < BITBLK; bittab[n++] = (char) 0)
                                *mp++ = static_cast<char>(mask ^ bittab[n]);
-       
+
                        break;
 
                case '*':               /* match 0 or more.. */
                        break;
 
                case '*':               /* match 0 or more.. */
@@ -592,7 +526,7 @@ const char *RESearch::Compile(const char *pat, int length, bool caseSensitive, b
  * RESearch::Execute:
  *     execute nfa to find a match.
  *
  * RESearch::Execute:
  *     execute nfa to find a match.
  *
- *     special cases: (nfa[0]) 
+ *     special cases: (nfa[0])
  *             BOL
  *                     Match only once, starting from the
  *                     beginning.
  *             BOL
  *                     Match only once, starting from the
  *                     beginning.
@@ -617,7 +551,7 @@ int RESearch::Execute(CharacterIndexer &ci, int lp, int endp) {
 
        bol = lp;
        failure = 0;
 
        bol = lp;
        failure = 0;
-       
+
        Clear();
 
        switch(*ap) {
        Clear();
 
        switch(*ap) {
@@ -658,7 +592,7 @@ int RESearch::Execute(CharacterIndexer &ci, int lp, int endp) {
        return 1;
 }
 
        return 1;
 }
 
-/* 
+/*
  * PMatch: internal routine for the hard part
  *
  *     This code is partly snarfed from an early grep written by
  * PMatch: internal routine for the hard part
  *
  *     This code is partly snarfed from an early grep written by
@@ -684,7 +618,7 @@ int RESearch::Execute(CharacterIndexer &ci, int lp, int endp) {
  *
  *     At the end of a successful match, bopat[n] and eopat[n]
  *     are set to the beginning and end of subpatterns matched
  *
  *     At the end of a successful match, bopat[n] and eopat[n]
  *     are set to the beginning and end of subpatterns matched
- *     by tagged expressions (n = 1 to 9).     
+ *     by tagged expressions (n = 1 to 9).
  *
  */
 
  *
  */
 
@@ -695,23 +629,23 @@ extern void re_fail(char *,char);
  * and EOW. the reason for not using ctype macros is that we can
  * let the user add into our own table. see RESearch::ModifyWord. This table
  * is not in the bitset form, since we may wish to extend it in the
  * and EOW. the reason for not using ctype macros is that we can
  * let the user add into our own table. see RESearch::ModifyWord. This table
  * is not in the bitset form, since we may wish to extend it in the
- * future for other character classifications. 
+ * future for other character classifications.
  *
  *     TRUE for 0-9 A-Z a-z _
  */
 static char chrtyp[MAXCHR] = {
  *
  *     TRUE for 0-9 A-Z a-z _
  */
 static char chrtyp[MAXCHR] = {
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 
-       0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
+       0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+       1, 0, 0, 0, 0, 1, 0, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 0, 0, 0, 0, 0
        };
 
        1, 1, 1, 0, 0, 0, 0, 0
        };
 
@@ -833,10 +767,10 @@ int RESearch::PMatch(CharacterIndexer &ci, int lp, int endp, char *ap) {
  *     the compact bitset representation for the default table]
  */
 
  *     the compact bitset representation for the default table]
  */
 
-static char deftab[16] = {     
-       0, 0, 0, 0, 0, 0, '\377', 003, '\376', '\377', '\377', '\207',  
-       '\376', '\377', '\377', 007 
-}; 
+static char deftab[16] = {
+       0, 0, 0, 0, 0, 0, '\377', 003, '\376', '\377', '\377', '\207',
+       '\376', '\377', '\377', 007
+};
 
 void RESearch::ModifyWord(char *s) {
        int i;
 
 void RESearch::ModifyWord(char *s) {
        int i;
@@ -883,7 +817,7 @@ int RESearch::Substitute(CharacterIndexer &ci, char *src, char *dst) {
                                pin = c - '0';
                                break;
                        }
                                pin = c - '0';
                                break;
                        }
-                       
+
                default:
                        *dst++ = c;
                        continue;
                default:
                        *dst++ = c;
                        continue;
index 039539ad3c3ece57230f7b9d8581a68ef7fa4d2d..e42b5dc65ea0b0e065295df708d615e6a3e0729b 100644 (file)
@@ -198,16 +198,18 @@ void ScintillaBase::AutoCompleteStart(int lenEntered, const char *list) {
 
        if (ac.chooseSingle && (listType == 0)) {
                if (list && !strchr(list, ac.GetSeparator())) {
 
        if (ac.chooseSingle && (listType == 0)) {
                if (list && !strchr(list, ac.GetSeparator())) {
+                       const char *typeSep = strchr(list, ac.GetTypesep());
+                       size_t lenInsert = (typeSep) ? (typeSep-list) : strlen(list);
                        if (ac.ignoreCase) {
                                SetEmptySelection(currentPos - lenEntered);
                                pdoc->DeleteChars(currentPos, lenEntered);
                                SetEmptySelection(currentPos);
                        if (ac.ignoreCase) {
                                SetEmptySelection(currentPos - lenEntered);
                                pdoc->DeleteChars(currentPos, lenEntered);
                                SetEmptySelection(currentPos);
-                               pdoc->InsertString(currentPos, list);
-                               SetEmptySelection(currentPos + static_cast<int>(strlen(list)));
+                               pdoc->InsertString(currentPos, list, lenInsert);
+                               SetEmptySelection(currentPos + lenInsert);
                        } else {
                                SetEmptySelection(currentPos);
                        } else {
                                SetEmptySelection(currentPos);
-                               pdoc->InsertString(currentPos, list + lenEntered);
-                               SetEmptySelection(currentPos + static_cast<int>(strlen(list + lenEntered)));
+                               pdoc->InsertString(currentPos, list + lenEntered, lenInsert - lenEntered);
+                               SetEmptySelection(currentPos + lenInsert - lenEntered);
                        }
                        return;
                }
                        }
                        return;
                }
@@ -345,6 +347,10 @@ void ScintillaBase::AutoCompleteCompleted() {
        pdoc->EndUndoAction();
 }
 
        pdoc->EndUndoAction();
 }
 
+int ScintillaBase::AutoCompleteGetCurrent() {
+       return ac.lb->GetSelection();
+}
+
 void ScintillaBase::CallTipShow(Point pt, const char *defn) {
        AutoCompleteCancel();
        pt.y += vs.lineHeight;
 void ScintillaBase::CallTipShow(Point pt, const char *defn) {
        AutoCompleteCancel();
        pt.y += vs.lineHeight;
@@ -497,6 +503,9 @@ sptr_t ScintillaBase::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lPara
                ac.Select(reinterpret_cast<char *>(lParam));
                break;
 
                ac.Select(reinterpret_cast<char *>(lParam));
                break;
 
+       case SCI_AUTOCGETCURRENT:
+               return AutoCompleteGetCurrent();
+
        case SCI_AUTOCSETCANCELATSTART:
                ac.cancelAtStartPos = wParam != 0;
                break;
        case SCI_AUTOCSETCANCELATSTART:
                ac.cancelAtStartPos = wParam != 0;
                break;
@@ -557,7 +566,7 @@ sptr_t ScintillaBase::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lPara
                return ac.GetTypesep();
 
        case SCI_CALLTIPSHOW:
                return ac.GetTypesep();
 
        case SCI_CALLTIPSHOW:
-               CallTipShow(LocationFromPosition(wParam), 
+               CallTipShow(LocationFromPosition(wParam),
                        reinterpret_cast<const char *>(lParam));
                break;
 
                        reinterpret_cast<const char *>(lParam));
                break;
 
index bb09e3f5b314f6764407a5925881d1f3db95d7cb..6ea23ab5a3718bb1632182d5e0a4f96233c679f8 100644 (file)
@@ -65,6 +65,7 @@ protected:
        void AutoCompleteStart(int lenEntered, const char *list);
        void AutoCompleteCancel();
        void AutoCompleteMove(int delta);
        void AutoCompleteStart(int lenEntered, const char *list);
        void AutoCompleteCancel();
        void AutoCompleteMove(int delta);
+       int AutoCompleteGetCurrent();
        void AutoCompleteCharacterAdded(char ch);
        void AutoCompleteCharacterDeleted();
        void AutoCompleteCompleted();
        void AutoCompleteCharacterAdded(char ch);
        void AutoCompleteCharacterDeleted();
        void AutoCompleteCompleted();
index eb8e54f2f8b3759d6acafc41111a1c47e6b0a231..e2a65e09e4c685d64770401cfaa90710275a5105 100644 (file)
@@ -84,6 +84,7 @@ ViewStyle::ViewStyle(const ViewStyle &source) {
        hotspotBackgroundSet = source.hotspotBackgroundSet;
        hotspotBackground.desired = source.hotspotBackground.desired;
        hotspotUnderline = source.hotspotUnderline;
        hotspotBackgroundSet = source.hotspotBackgroundSet;
        hotspotBackground.desired = source.hotspotBackground.desired;
        hotspotUnderline = source.hotspotUnderline;
+       hotspotSingleLine = source.hotspotSingleLine;
 
        whitespaceForegroundSet = source.whitespaceForegroundSet;
        whitespaceForeground.desired = source.whitespaceForeground.desired;
 
        whitespaceForegroundSet = source.whitespaceForegroundSet;
        whitespaceForeground.desired = source.whitespaceForeground.desired;
@@ -164,6 +165,7 @@ void ViewStyle::Init() {
        hotspotBackgroundSet = false;
        hotspotBackground.desired = ColourDesired(0xff, 0xff, 0xff);
        hotspotUnderline = true;
        hotspotBackgroundSet = false;
        hotspotBackground.desired = ColourDesired(0xff, 0xff, 0xff);
        hotspotUnderline = true;
+       hotspotSingleLine = true;
 
        leftMarginWidth = 1;
        rightMarginWidth = 1;
 
        leftMarginWidth = 1;
        rightMarginWidth = 1;
index ff38efef2eb5ca328d52bbf274d5942080963930..5f27cc08cb33fbf583336a1647c5ae91f7a45d95 100644 (file)
@@ -68,6 +68,7 @@ public:
        bool hotspotBackgroundSet;
        ColourPair hotspotBackground;
        bool hotspotUnderline;
        bool hotspotBackgroundSet;
        ColourPair hotspotBackground;
        bool hotspotUnderline;
+       bool hotspotSingleLine;
        /// Margins are ordered: Line Numbers, Selection Margin, Spacing Margin
        enum { margins=3 };
        int leftMarginWidth;    ///< Spacing margin on left of text
        /// Margins are ordered: Line Numbers, Selection Margin, Spacing Margin
        enum { margins=3 };
        int leftMarginWidth;    ///< Spacing margin on left of text
index c3f66c2e405d84fc26bc4b92bc437b3249a5055c..e693736a21c3e50831cf2d876b91d523d43f4037 100644 (file)
@@ -1,6 +1,6 @@
 // Scintilla source code edit control
 /** @file XPM.cxx
 // Scintilla source code edit control
 /** @file XPM.cxx
- ** Define a class that holds data in the X Pixmap (XPM) format,
+ ** Define a class that holds data in the X Pixmap (XPM) format.
  **/
 // Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
  **/
 // Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
@@ -33,7 +33,7 @@ static size_t MeasureLength(const char *s) {
 ColourAllocated XPM::ColourFromCode(int ch) {
        return colourCodeTable[ch]->allocated;
 #ifdef SLOW
 ColourAllocated XPM::ColourFromCode(int ch) {
        return colourCodeTable[ch]->allocated;
 #ifdef SLOW
-       for (int i=0;i<nColours;i++) {
+       for (int i=0; i<nColours; i++) {
                if (codes[i] == ch) {
                        return colours[i].allocated;
                }
                if (codes[i] == ch) {
                        return colours[i].allocated;
                }
@@ -49,13 +49,13 @@ void XPM::FillRun(Surface *surface, int code, int startX, int y, int x) {
        }
 }
 
        }
 }
 
-XPM::XPM(const char *textForm) : 
-       data(0),        codes(0), colours(0), lines(0) {
+XPM::XPM(const char *textForm) :
+       data(0), codes(0), colours(0), lines(0) {
        Init(textForm);
 }
 
 XPM::XPM(const char * const *linesForm) :
        Init(textForm);
 }
 
 XPM::XPM(const char * const *linesForm) :
-       data(0),        codes(0), colours(0), lines(0) {
+       data(0), codes(0), colours(0), lines(0) {
        Init(linesForm);
 }
 
        Init(linesForm);
 }
 
@@ -116,7 +116,7 @@ void XPM::Init(const char * const *linesForm) {
                *nextBit++ = '\0';
        }
 
                *nextBit++ = '\0';
        }
 
-       for (int code=0;code<256; code++) {
+       for (int code=0; code<256; code++) {
                colourCodeTable[code] = 0;
        }
 
                colourCodeTable[code] = 0;
        }
 
@@ -149,7 +149,7 @@ void XPM::RefreshColourPalette(Palette &pal, bool want) {
        if (!data || !codes || !colours || !lines) {
                return;
        }
        if (!data || !codes || !colours || !lines) {
                return;
        }
-       for (int i=0;i<nColours;i++) {
+       for (int i=0; i<nColours; i++) {
                pal.WantFind(colours[i], want);
        }
 }
                pal.WantFind(colours[i], want);
        }
 }
@@ -158,7 +158,7 @@ void XPM::CopyDesiredColours() {
        if (!data || !codes || !colours || !lines) {
                return;
        }
        if (!data || !codes || !colours || !lines) {
                return;
        }
-       for (int i=0;i<nColours;i++) {
+       for (int i=0; i<nColours; i++) {
                colours[i].Copy();
        }
 }
                colours[i].Copy();
        }
 }
@@ -222,7 +222,7 @@ XPMSet::~XPMSet() {
 }
 
 void XPMSet::Clear() {
 }
 
 void XPMSet::Clear() {
-       for (int i=0;i<maximum;i++) {
+       for (int i = 0; i < len; i++) {
                delete set[i];
        }
        delete []set;
                delete set[i];
        }
        delete []set;
@@ -239,34 +239,34 @@ void XPMSet::Add(int id, const char *textForm) {
        width = -1;
 
        // Replace if this id already present
        width = -1;
 
        // Replace if this id already present
-       for (int i=0;i<maximum;i++) {
+       for (int i = 0; i < len; i++) {
                if (set[i]->GetId() == id) {
                        set[i]->Init(textForm);
                        return;
                }
        }
 
                if (set[i]->GetId() == id) {
                        set[i]->Init(textForm);
                        return;
                }
        }
 
-       // No present, so add to end
+       // Not present, so add to end
        XPM *pxpm = new XPM(textForm);
        if (pxpm) {
                pxpm->SetId(id);
                pxpm->CopyDesiredColours();
                if (len == maximum) {
        XPM *pxpm = new XPM(textForm);
        if (pxpm) {
                pxpm->SetId(id);
                pxpm->CopyDesiredColours();
                if (len == maximum) {
-                       int lenNew = len + 100;
-                       XPM **setNew = new XPM *[lenNew];
-                       for (int i=0; i<maximum; i++) {
+                       maximum += 64;
+                       XPM **setNew = new XPM *[maximum];
+                       for (int i = 0; i < len; i++) {
                                setNew[i] = set[i];
                        }
                        delete []set;
                        set = setNew;
                }
                                setNew[i] = set[i];
                        }
                        delete []set;
                        set = setNew;
                }
-               set[maximum] = pxpm;
-               maximum++;
+               set[len] = pxpm;
+               len++;
        }
 }
 
 XPM *XPMSet::Get(int id) {
        }
 }
 
 XPM *XPMSet::Get(int id) {
-       for (int i=0;i<maximum;i++) {
+       for (int i = 0; i < len; i++) {
                if (set[i]->GetId() == id) {
                        return set[i];
                }
                if (set[i]->GetId() == id) {
                        return set[i];
                }
@@ -276,7 +276,7 @@ XPM *XPMSet::Get(int id) {
 
 int XPMSet::GetHeight() {
        if (height < 0) {
 
 int XPMSet::GetHeight() {
        if (height < 0) {
-               for (int i=0; i<maximum; i++) {
+               for (int i = 0; i < len; i++) {
                        if (height < set[i]->GetHeight()) {
                                height = set[i]->GetHeight();
                        }
                        if (height < set[i]->GetHeight()) {
                                height = set[i]->GetHeight();
                        }
@@ -287,7 +287,7 @@ int XPMSet::GetHeight() {
 
 int XPMSet::GetWidth() {
        if (width < 0) {
 
 int XPMSet::GetWidth() {
        if (width < 0) {
-               for (int i=0; i<maximum; i++) {
+               for (int i = 0; i < len; i++) {
                        if (width < set[i]->GetWidth()) {
                                width = set[i]->GetWidth();
                        }
                        if (width < set[i]->GetWidth()) {
                                width = set[i]->GetWidth();
                        }
index 948e557a924c7c243dfbebf1b11beb76aa66a9b1..4d3da28d36e58b67f668914df2abaf9c1dbd6826 100644 (file)
@@ -1,6 +1,6 @@
 // Scintilla source code edit control
 /** @file XPM.h
 // Scintilla source code edit control
 /** @file XPM.h
- ** Define a class that holds data in the X Pixmap (XPM) format,
+ ** Define a class that holds data in the X Pixmap (XPM) format.
  **/
 // Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
  **/
 // Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
@@ -31,11 +31,11 @@ public:
        void Init(const char *textForm);
        void Init(const char * const *linesForm);
        void Clear();
        void Init(const char *textForm);
        void Init(const char * const *linesForm);
        void Clear();
-       // Similar to same named method in ViewStyle:
+       /// Similar to same named method in ViewStyle:
        void RefreshColourPalette(Palette &pal, bool want);
        void RefreshColourPalette(Palette &pal, bool want);
-       // No palette used, so just copy the desired colours to the allocated colours:
+       /// No palette used, so just copy the desired colours to the allocated colours
        void CopyDesiredColours();
        void CopyDesiredColours();
-       // Decompose image into runs and use FillRectangle for each run:
+       /// Decompose image into runs and use FillRectangle for each run
        void Draw(Surface *surface, PRectangle &rc);
        char **InLinesForm() { return lines; }
        void SetId(int id_) { id = id_; }
        void Draw(Surface *surface, PRectangle &rc);
        char **InLinesForm() { return lines; }
        void SetId(int id_) { id = id_; }
@@ -49,18 +49,23 @@ public:
  * A collection of pixmaps indexed by integer id.
  */
 class XPMSet {
  * A collection of pixmaps indexed by integer id.
  */
 class XPMSet {
-       XPM **set;
-       int len;
-       int maximum;
-       int height;
-       int width;
+       XPM **set;      ///< The stored XPMs.
+       int len;        ///< Current number of XPMs.
+       int maximum;    ///< Current maximum number of XPMs, increased by steps if reached.
+       int height;     ///< Memorize largest height of the set.
+       int width;      ///< Memorize largest width of the set.
 public:
        XPMSet();
        ~XPMSet();
 public:
        XPMSet();
        ~XPMSet();
+       /// Remove all XPMs.
        void Clear();
        void Clear();
+       /// Add a XPM.
        void Add(int id, const char *textForm);
        void Add(int id, const char *textForm);
+       /// Get XPM by id.
        XPM *Get(int id);
        XPM *Get(int id);
+       /// Give the largest height of the set.
        int GetHeight();
        int GetHeight();
+       /// Give the largest width of the set.
        int GetWidth();
 };
 
        int GetWidth();
 };
 
index 8d03e9c92d6cd86ceedd77e1164049bfaf7349a6..2f5ea9eae121410647eb7289f10a9b6b8af080cf 100644 (file)
@@ -154,7 +154,7 @@ void wxStyledTextCtrl::Create(wxWindow *parent,
     style |= wxVSCROLL | wxHSCROLL;
 #endif
     wxControl::Create(parent, id, pos, size,
     style |= wxVSCROLL | wxHSCROLL;
 #endif
     wxControl::Create(parent, id, pos, size,
-                      style | wxWANTS_CHARS | wxCLIP_CHILDREN,
+              style | wxWANTS_CHARS | wxCLIP_CHILDREN,
               wxDefaultValidator, name);
 
 #ifdef LINK_LEXERS
               wxDefaultValidator, name);
 
 #ifdef LINK_LEXERS
@@ -619,7 +619,7 @@ void wxStyledTextCtrl::CmdKeyAssign(int key, int modifiers, int cmd) {
          SendMsg(2070, MAKELONG(key, modifiers), cmd);
 }
 
          SendMsg(2070, MAKELONG(key, modifiers), cmd);
 }
 
-// When key+modifier combination km do nothing.
+// When key+modifier combination km is pressed do nothing.
 void wxStyledTextCtrl::CmdKeyClear(int key, int modifiers) {
          SendMsg(2071, MAKELONG(key, modifiers));
 }
 void wxStyledTextCtrl::CmdKeyClear(int key, int modifiers) {
          SendMsg(2071, MAKELONG(key, modifiers));
 }
@@ -650,6 +650,7 @@ void wxStyledTextCtrl::SetCaretPeriod(int periodMilliseconds) {
 }
 
 // Set the set of characters making up words for when moving or selecting by word.
 }
 
 // Set the set of characters making up words for when moving or selecting by word.
+// First sets deaults like SetCharsDefault.
 void wxStyledTextCtrl::SetWordChars(const wxString& characters) {
     SendMsg(2077, 0, (long)(const char*)wx2stc(characters));
 }
 void wxStyledTextCtrl::SetWordChars(const wxString& characters) {
     SendMsg(2077, 0, (long)(const char*)wx2stc(characters));
 }
@@ -1049,7 +1050,7 @@ int wxStyledTextCtrl::FindText(int minPos, int maxPos,
                 int    startPos,
                 int    endPos,
                 wxDC*  draw,
                 int    startPos,
                 int    endPos,
                 wxDC*  draw,
-                wxDC*  target,  // Why does it use two? Can they be the same?
+                wxDC*  target, 
                 wxRect renderRect,
                 wxRect pageRect) {
              RangeToFormat fr;
                 wxRect renderRect,
                 wxRect pageRect) {
              RangeToFormat fr;
@@ -1305,7 +1306,7 @@ int wxStyledTextCtrl::GetTargetEnd() {
 }
 
 // Replace the target text with the argument text.
 }
 
 // Replace the target text with the argument text.
-// Text is counted so it can contain nulls.
+// Text is counted so it can contain NULs.
 // Returns the length of the replacement text.
 
      int wxStyledTextCtrl::ReplaceTarget(const wxString& text) {
 // Returns the length of the replacement text.
 
      int wxStyledTextCtrl::ReplaceTarget(const wxString& text) {
@@ -1314,7 +1315,7 @@ int wxStyledTextCtrl::GetTargetEnd() {
 }
 
 // Replace the target text with the argument text after \d processing.
 }
 
 // Replace the target text with the argument text after \d processing.
-// Text is counted so it can contain nulls.
+// Text is counted so it can contain NULs.
 // Looks for \d where d is between 1 and 9 and replaces these with the strings
 // matched in the last search operation which were surrounded by \( and \).
 // Returns the length of the replacement text including any change
 // Looks for \d where d is between 1 and 9 and replaces these with the strings
 // matched in the last search operation which were surrounded by \( and \).
 // Returns the length of the replacement text including any change
@@ -1326,7 +1327,7 @@ int wxStyledTextCtrl::GetTargetEnd() {
 }
 
 // Search for a counted string in the target and set the target to the found
 }
 
 // Search for a counted string in the target and set the target to the found
-// range. Text is counted so it can contain nulls.
+// range. Text is counted so it can contain NULs.
 // Returns length of range or -1 for failure in which case target is not moved.
 
      int wxStyledTextCtrl::SearchInTarget(const wxString& text) {
 // Returns length of range or -1 for failure in which case target is not moved.
 
      int wxStyledTextCtrl::SearchInTarget(const wxString& text) {
@@ -1533,7 +1534,7 @@ int wxStyledTextCtrl::GetScrollWidth() {
 }
 
 // Measure the pixel width of some text in a particular style.
 }
 
 // Measure the pixel width of some text in a particular style.
-// Nul terminated text argument.
+// NUL terminated text argument.
 // Does not handle tab or control characters.
 int wxStyledTextCtrl::TextWidth(int style, const wxString& text) {
     return SendMsg(2276, style, (long)(const char*)wx2stc(text));
 // Does not handle tab or control characters.
 int wxStyledTextCtrl::TextWidth(int style, const wxString& text) {
     return SendMsg(2276, style, (long)(const char*)wx2stc(text));
@@ -1884,7 +1885,7 @@ int wxStyledTextCtrl::GetXOffset() {
     return SendMsg(2398, 0, 0);
 }
 
     return SendMsg(2398, 0, 0);
 }
 
-// Set the last x chosen value to be the caret x position
+// Set the last x chosen value to be the caret x position.
 void wxStyledTextCtrl::ChooseCaretX() {
     SendMsg(2399, 0, 0);
 }
 void wxStyledTextCtrl::ChooseCaretX() {
     SendMsg(2399, 0, 0);
 }
@@ -1906,7 +1907,7 @@ void wxStyledTextCtrl::SetPrintWrapMode(int mode) {
     SendMsg(2406, mode, 0);
 }
 
     SendMsg(2406, mode, 0);
 }
 
-// Is printing line wrapped.
+// Is printing line wrapped?
 int wxStyledTextCtrl::GetPrintWrapMode() {
     return SendMsg(2407, 0, 0);
 }
 int wxStyledTextCtrl::GetPrintWrapMode() {
     return SendMsg(2407, 0, 0);
 }
@@ -1926,6 +1927,11 @@ void wxStyledTextCtrl::SetHotspotActiveUnderline(bool underline) {
     SendMsg(2412, underline, 0);
 }
 
     SendMsg(2412, underline, 0);
 }
 
+// Limit hotspots to single line so hotspots on two lines don't merge.
+void wxStyledTextCtrl::SetHotspotSingleLine(bool singleLine) {
+    SendMsg(2421, singleLine, 0);
+}
+
 // Given a valid document position, return the previous position taking code
 // page into account. Returns 0 if passed 0.
 int wxStyledTextCtrl::PositionBefore(int pos) {
 // Given a valid document position, return the previous position taking code
 // page into account. Returns 0 if passed 0.
 int wxStyledTextCtrl::PositionBefore(int pos) {
@@ -1948,6 +1954,43 @@ void wxStyledTextCtrl::CopyText(int length, const wxString& text) {
     SendMsg(2420, length, (long)(const char*)wx2stc(text));
 }
 
     SendMsg(2420, length, (long)(const char*)wx2stc(text));
 }
 
+// Set the selection mode to stream (SC_SEL_STREAM) or rectangular (SC_SEL_RECTANGLE) or
+// by lines (SC_SEL_LINES).
+void wxStyledTextCtrl::SetSelectionMode(int mode) {
+    SendMsg(2422, mode, 0);
+}
+
+// Get the mode of the current selection.
+int wxStyledTextCtrl::GetSelectionMode() {
+    return SendMsg(2423, 0, 0);
+}
+
+// Retrieve the position of the start of the selection at the given line (INVALID_POSITION if no selection on this line).
+int wxStyledTextCtrl::GetLineSelStartPosition(int line) {
+    return SendMsg(2424, line, 0);
+}
+
+// Retrieve the position of the end of the selection at the given line (INVALID_POSITION if no selection on this line).
+int wxStyledTextCtrl::GetLineSelEndPosition(int line) {
+    return SendMsg(2425, line, 0);
+}
+
+// Set the set of characters making up whitespace for when moving or selecting by word.
+// Should be called after SetWordChars.
+void wxStyledTextCtrl::SetWhitespaceChars(const wxString& characters) {
+    SendMsg(2443, 0, (long)(const char*)wx2stc(characters));
+}
+
+// Reset the set of characters for whitespace and word characters to the defaults.
+void wxStyledTextCtrl::SetCharsDefault() {
+    SendMsg(2444, 0, 0);
+}
+
+// Get currently selected item position in the auto-completion list
+int wxStyledTextCtrl::AutoCompGetCurrent() {
+    return SendMsg(2445, 0, 0);
+}
+
 // Start notifying the container of all key presses and commands.
 void wxStyledTextCtrl::StartRecord() {
     SendMsg(3001, 0, 0);
 // Start notifying the container of all key presses and commands.
 void wxStyledTextCtrl::StartRecord() {
     SendMsg(3001, 0, 0);
@@ -2336,6 +2379,11 @@ void wxStyledTextCtrl::OnListBox(wxCommandEvent& WXUNUSED(evt)) {
 }
 
 
 }
 
 
+void wxStyledTextCtrl::OnIdle(wxIdleEvent& evt) {
+    m_swx->DoOnIdle(evt);
+}
+
+
 //----------------------------------------------------------------------
 // Turn notifications from Scintilla into events
 
 //----------------------------------------------------------------------
 // Turn notifications from Scintilla into events
 
index b10b081bb71fd13d462931ce16e2a2a7a38772ac..f8fb2d1cc612284a74551aa901a0f9843d9ba98b 100644 (file)
@@ -541,6 +541,11 @@ void wxStyledTextCtrl::OnListBox(wxCommandEvent& WXUNUSED(evt)) {
 }
 
 
 }
 
 
+void wxStyledTextCtrl::OnIdle(wxIdleEvent& evt) {
+    m_swx->DoOnIdle(evt);
+}
+
+
 //----------------------------------------------------------------------
 // Turn notifications from Scintilla into events
 
 //----------------------------------------------------------------------
 // Turn notifications from Scintilla into events
 
index 0f9b62df2ae92e9fbf8114b6773fe0fed9a91917..04c205e34199ee1cf0a56ab46534bb3f08858e2e 100644 (file)
@@ -237,7 +237,8 @@ private:
     void OnEraseBackground(wxEraseEvent& evt);
     void OnMenu(wxCommandEvent& evt);
     void OnListBox(wxCommandEvent& evt);
     void OnEraseBackground(wxEraseEvent& evt);
     void OnMenu(wxCommandEvent& evt);
     void OnListBox(wxCommandEvent& evt);
-
+    void OnIdle(wxIdleEvent& evt);
+    
 
     // Turn notifications from Scintilla into events
     void NotifyChange();
 
     // Turn notifications from Scintilla into events
     void NotifyChange();