From 65ec6247df6af7b6489257b1ac04ca2242dc14ec Mon Sep 17 00:00:00 2001
From: Robin Dunn <robin@alldunn.com>
Date: Sat, 1 Sep 2001 03:06:33 +0000
Subject: [PATCH] Upgraded to version 1.39 of Scintilla, and upated
 wxStyledTextCtrl accordingly.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11533 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 contrib/include/wx/stc/stc.h                  |  429 ++-
 contrib/src/stc/PlatWX.cpp                    |   37 +-
 contrib/src/stc/ScintillaWX.cpp               |   39 +-
 contrib/src/stc/ScintillaWX.h                 |    4 +-
 contrib/src/stc/gen_iface.py                  |   50 +-
 contrib/src/stc/scintilla/README.txt          |    2 +-
 contrib/src/stc/scintilla/include/Accessor.h  |   23 +-
 contrib/src/stc/scintilla/include/KeyWords.h  |   50 +-
 contrib/src/stc/scintilla/include/Platform.h  |  117 +-
 contrib/src/stc/scintilla/include/PosRegExp.h |  138 -
 contrib/src/stc/scintilla/include/PropSet.h   |  220 +-
 contrib/src/stc/scintilla/include/SString.h   |  255 ++
 contrib/src/stc/scintilla/include/SciLexer.h  |  106 +-
 contrib/src/stc/scintilla/include/Scintilla.h |  145 +-
 .../src/stc/scintilla/include/Scintilla.iface |  320 +-
 .../stc/scintilla/include/ScintillaWidget.h   |   23 +-
 contrib/src/stc/scintilla/include/WinDefs.h   |   18 +-
 .../stc/scintilla/include/WindowAccessor.h    |   13 +-
 .../src/stc/scintilla/src/AutoComplete.cxx    |   53 +-
 contrib/src/stc/scintilla/src/AutoComplete.h  |   44 +-
 contrib/src/stc/scintilla/src/CallTip.cxx     |   18 +-
 contrib/src/stc/scintilla/src/CallTip.h       |   17 +-
 contrib/src/stc/scintilla/src/CellBuffer.cxx  |   67 +-
 contrib/src/stc/scintilla/src/CellBuffer.h    |  103 +-
 .../stc/scintilla/src/ContractionState.cxx    |    6 +-
 .../src/stc/scintilla/src/ContractionState.h  |   15 +-
 contrib/src/stc/scintilla/src/Document.cxx    |  591 +++-
 contrib/src/stc/scintilla/src/Document.h      |   99 +-
 .../stc/scintilla/src/DocumentAccessor.cxx    |   35 +-
 .../src/stc/scintilla/src/DocumentAccessor.h  |   21 +-
 contrib/src/stc/scintilla/src/Editor.cxx      | 1109 +++++--
 contrib/src/stc/scintilla/src/Editor.h        |   93 +-
 contrib/src/stc/scintilla/src/Indicator.cxx   |    6 +-
 contrib/src/stc/scintilla/src/Indicator.h     |    8 +-
 contrib/src/stc/scintilla/src/KeyMap.cxx      |   12 +-
 contrib/src/stc/scintilla/src/KeyMap.h        |   11 +-
 contrib/src/stc/scintilla/src/KeyWords.cxx    |  149 +-
 contrib/src/stc/scintilla/src/LexAVE.cxx      |  188 ++
 contrib/src/stc/scintilla/src/LexAda.cxx      |  198 ++
 contrib/src/stc/scintilla/src/LexCPP.cxx      |  566 ++--
 contrib/src/stc/scintilla/src/LexConf.cxx     |  177 ++
 contrib/src/stc/scintilla/src/LexEiffel.cxx   |  321 ++
 contrib/src/stc/scintilla/src/LexHTML.cxx     |  383 ++-
 contrib/src/stc/scintilla/src/LexLisp.cxx     |  195 ++
 contrib/src/stc/scintilla/src/LexLua.cxx      |  521 ++--
 contrib/src/stc/scintilla/src/LexOthers.cxx   |  422 ++-
 contrib/src/stc/scintilla/src/LexPascal.cxx   |  222 ++
 contrib/src/stc/scintilla/src/LexPerl.cxx     |  534 ++--
 contrib/src/stc/scintilla/src/LexPython.cxx   |  333 +-
 contrib/src/stc/scintilla/src/LexRuby.cxx     |  355 +++
 contrib/src/stc/scintilla/src/LexSQL.cxx      |   22 +-
 contrib/src/stc/scintilla/src/LexVB.cxx       |   80 +-
 contrib/src/stc/scintilla/src/LineMarker.cxx  |  152 +-
 contrib/src/stc/scintilla/src/LineMarker.h    |    8 +-
 contrib/src/stc/scintilla/src/PosRegExp.cxx   | 1181 -------
 contrib/src/stc/scintilla/src/PropSet.cxx     |  818 +++--
 contrib/src/stc/scintilla/src/RESearch.cxx    |  865 ++++++
 contrib/src/stc/scintilla/src/RESearch.h      |   60 +
 contrib/src/stc/scintilla/src/SVector.h       |   42 +-
 .../src/stc/scintilla/src/ScintillaBase.cxx   |  206 +-
 contrib/src/stc/scintilla/src/ScintillaBase.h |   21 +-
 contrib/src/stc/scintilla/src/Style.cxx       |   75 +-
 contrib/src/stc/scintilla/src/Style.h         |   21 +-
 .../src/stc/scintilla/src/UniConversion.cxx   |    7 +-
 contrib/src/stc/scintilla/src/UniConversion.h |    7 +-
 contrib/src/stc/scintilla/src/ViewStyle.cxx   |   42 +-
 contrib/src/stc/scintilla/src/ViewStyle.h     |   25 +-
 .../src/stc/scintilla/src/WindowAccessor.cxx  |    8 +-
 contrib/src/stc/stc.cpp                       |  460 ++-
 contrib/src/stc/stc.cpp.in                    |  204 +-
 contrib/src/stc/stc.h.in                      |   96 +-
 include/wx/stc/stc.h                          |  429 ++-
 src/stc/PlatWX.cpp                            |   37 +-
 src/stc/ScintillaWX.cpp                       |   39 +-
 src/stc/ScintillaWX.h                         |    4 +-
 src/stc/gen_iface.py                          |   50 +-
 src/stc/scintilla/README.txt                  |    2 +-
 src/stc/scintilla/include/Accessor.h          |   23 +-
 src/stc/scintilla/include/KeyWords.h          |   50 +-
 src/stc/scintilla/include/Platform.h          |  117 +-
 src/stc/scintilla/include/PosRegExp.h         |  138 -
 src/stc/scintilla/include/PropSet.h           |  220 +-
 src/stc/scintilla/include/SString.h           |  255 ++
 src/stc/scintilla/include/SciLexer.h          |  106 +-
 src/stc/scintilla/include/Scintilla.h         |  145 +-
 src/stc/scintilla/include/Scintilla.iface     |  320 +-
 src/stc/scintilla/include/ScintillaWidget.h   |   23 +-
 src/stc/scintilla/include/WinDefs.h           |   18 +-
 src/stc/scintilla/include/WindowAccessor.h    |   13 +-
 src/stc/scintilla/src/AutoComplete.cxx        |   53 +-
 src/stc/scintilla/src/AutoComplete.h          |   44 +-
 src/stc/scintilla/src/CallTip.cxx             |   18 +-
 src/stc/scintilla/src/CallTip.h               |   17 +-
 src/stc/scintilla/src/CellBuffer.cxx          |   67 +-
 src/stc/scintilla/src/CellBuffer.h            |  103 +-
 src/stc/scintilla/src/ContractionState.cxx    |    6 +-
 src/stc/scintilla/src/ContractionState.h      |   15 +-
 src/stc/scintilla/src/Document.cxx            |  591 +++-
 src/stc/scintilla/src/Document.h              |   99 +-
 src/stc/scintilla/src/DocumentAccessor.cxx    |   35 +-
 src/stc/scintilla/src/DocumentAccessor.h      |   21 +-
 src/stc/scintilla/src/Editor.cxx              | 1109 +++++--
 src/stc/scintilla/src/Editor.h                |   93 +-
 src/stc/scintilla/src/Indicator.cxx           |    6 +-
 src/stc/scintilla/src/Indicator.h             |    8 +-
 src/stc/scintilla/src/KeyMap.cxx              |   12 +-
 src/stc/scintilla/src/KeyMap.h                |   11 +-
 src/stc/scintilla/src/KeyWords.cxx            |  149 +-
 src/stc/scintilla/src/LexAVE.cxx              |  188 ++
 src/stc/scintilla/src/LexAda.cxx              |  198 ++
 src/stc/scintilla/src/LexCPP.cxx              |  566 ++--
 src/stc/scintilla/src/LexConf.cxx             |  177 ++
 src/stc/scintilla/src/LexEiffel.cxx           |  321 ++
 src/stc/scintilla/src/LexHTML.cxx             |  383 ++-
 src/stc/scintilla/src/LexLisp.cxx             |  195 ++
 src/stc/scintilla/src/LexLua.cxx              |  521 ++--
 src/stc/scintilla/src/LexOthers.cxx           |  422 ++-
 src/stc/scintilla/src/LexPascal.cxx           |  222 ++
 src/stc/scintilla/src/LexPerl.cxx             |  534 ++--
 src/stc/scintilla/src/LexPython.cxx           |  333 +-
 src/stc/scintilla/src/LexRuby.cxx             |  355 +++
 src/stc/scintilla/src/LexSQL.cxx              |   22 +-
 src/stc/scintilla/src/LexVB.cxx               |   80 +-
 src/stc/scintilla/src/LineMarker.cxx          |  152 +-
 src/stc/scintilla/src/LineMarker.h            |    8 +-
 src/stc/scintilla/src/PosRegExp.cxx           | 1181 -------
 src/stc/scintilla/src/PropSet.cxx             |  818 +++--
 src/stc/scintilla/src/RESearch.cxx            |  865 ++++++
 src/stc/scintilla/src/RESearch.h              |   60 +
 src/stc/scintilla/src/SVector.h               |   42 +-
 src/stc/scintilla/src/ScintillaBase.cxx       |  206 +-
 src/stc/scintilla/src/ScintillaBase.h         |   21 +-
 src/stc/scintilla/src/Style.cxx               |   75 +-
 src/stc/scintilla/src/Style.h                 |   21 +-
 src/stc/scintilla/src/UniConversion.cxx       |    7 +-
 src/stc/scintilla/src/UniConversion.h         |    7 +-
 src/stc/scintilla/src/ViewStyle.cxx           |   42 +-
 src/stc/scintilla/src/ViewStyle.h             |   25 +-
 src/stc/scintilla/src/WindowAccessor.cxx      |    8 +-
 src/stc/stc.cpp                               |  460 ++-
 src/stc/stc.cpp.in                            |  204 +-
 src/stc/stc.h.in                              |   96 +-
 wxPython/CHANGES.txt                          |    3 +-
 wxPython/contrib/stc/stc_.cpp                 | 2764 +++++++++++++----
 wxPython/contrib/stc/stc_.i                   |   71 +-
 wxPython/contrib/stc/stc_.py                  |  365 ++-
 wxPython/demo/data/stc.h                      | 1396 ---------
 wxPython/demo/data/stc.h.html                 | 2589 ++++++++-------
 wxPython/demo/wxStyledTextCtrl_1.py           |    3 +-
 wxPython/demo/wxStyledTextCtrl_2.py           |    2 +-
 150 files changed, 22461 insertions(+), 11254 deletions(-)
 delete mode 100644 contrib/src/stc/scintilla/include/PosRegExp.h
 create mode 100644 contrib/src/stc/scintilla/include/SString.h
 create mode 100644 contrib/src/stc/scintilla/src/LexAVE.cxx
 create mode 100644 contrib/src/stc/scintilla/src/LexAda.cxx
 create mode 100644 contrib/src/stc/scintilla/src/LexConf.cxx
 create mode 100644 contrib/src/stc/scintilla/src/LexEiffel.cxx
 create mode 100644 contrib/src/stc/scintilla/src/LexLisp.cxx
 create mode 100644 contrib/src/stc/scintilla/src/LexPascal.cxx
 create mode 100644 contrib/src/stc/scintilla/src/LexRuby.cxx
 delete mode 100644 contrib/src/stc/scintilla/src/PosRegExp.cxx
 create mode 100644 contrib/src/stc/scintilla/src/RESearch.cxx
 create mode 100644 contrib/src/stc/scintilla/src/RESearch.h
 delete mode 100644 src/stc/scintilla/include/PosRegExp.h
 create mode 100644 src/stc/scintilla/include/SString.h
 create mode 100644 src/stc/scintilla/src/LexAVE.cxx
 create mode 100644 src/stc/scintilla/src/LexAda.cxx
 create mode 100644 src/stc/scintilla/src/LexConf.cxx
 create mode 100644 src/stc/scintilla/src/LexEiffel.cxx
 create mode 100644 src/stc/scintilla/src/LexLisp.cxx
 create mode 100644 src/stc/scintilla/src/LexPascal.cxx
 create mode 100644 src/stc/scintilla/src/LexRuby.cxx
 delete mode 100644 src/stc/scintilla/src/PosRegExp.cxx
 create mode 100644 src/stc/scintilla/src/RESearch.cxx
 create mode 100644 src/stc/scintilla/src/RESearch.h
 delete mode 100644 wxPython/demo/data/stc.h

diff --git a/contrib/include/wx/stc/stc.h b/contrib/include/wx/stc/stc.h
index f9b26bdb8a..8dfe9a92f4 100644
--- a/contrib/include/wx/stc/stc.h
+++ b/contrib/include/wx/stc/stc.h
@@ -57,6 +57,28 @@
 #define wxSTC_MARK_ARROWDOWN 6
 #define wxSTC_MARK_MINUS 7
 #define wxSTC_MARK_PLUS 8
+
+// Shapes used for outlining column
+#define wxSTC_MARK_VLINE 9
+#define wxSTC_MARK_LCORNER 10
+#define wxSTC_MARK_TCORNER 11
+#define wxSTC_MARK_BOXPLUS 12
+#define wxSTC_MARK_BOXPLUSCONNECTED 13
+#define wxSTC_MARK_BOXMINUS 14
+#define wxSTC_MARK_BOXMINUSCONNECTED 15
+#define wxSTC_MARK_LCORNERCURVE 16
+#define wxSTC_MARK_TCORNERCURVE 17
+#define wxSTC_MARK_CIRCLEPLUS 18
+#define wxSTC_MARK_CIRCLEPLUSCONNECTED 19
+#define wxSTC_MARK_CIRCLEMINUS 20
+#define wxSTC_MARK_CIRCLEMINUSCONNECTED 21
+
+// Markers used for outlining column
+#define wxSTC_MARKNUM_FOLDEREND 25
+#define wxSTC_MARKNUM_FOLDEROPENMID 26
+#define wxSTC_MARKNUM_FOLDERMIDTAIL 27
+#define wxSTC_MARKNUM_FOLDERTAIL 28
+#define wxSTC_MARKNUM_FOLDERSUB 29
 #define wxSTC_MARKNUM_FOLDER 30
 #define wxSTC_MARKNUM_FOLDEROPEN 31
 #define wxSTC_MARGIN_SYMBOL 0
@@ -90,6 +112,9 @@
 #define wxSTC_CHARSET_ARABIC 178
 #define wxSTC_CHARSET_VIETNAMESE 163
 #define wxSTC_CHARSET_THAI 222
+#define wxSTC_CASE_MIXED 0
+#define wxSTC_CASE_UPPER 1
+#define wxSTC_CASE_LOWER 2
 #define wxSTC_INDIC_MAX 7
 #define wxSTC_INDIC_PLAIN 0
 #define wxSTC_INDIC_SQUIGGLE 1
@@ -109,12 +134,15 @@
 
 // PrintColourMode - force black text on white background for printing.
 #define wxSTC_PRINT_BLACKONWHITE 2
-#define wxSTC_FIND_DOWN 1
+
+// PrintColourMode - text stays coloured, but all background is forced to be white for printing.
+#define wxSTC_PRINT_COLOURONWHITE 3
+
+// PrintColourMode - only the default-background is forced to be white for printing.
+#define wxSTC_PRINT_COLOURONWHITEDEFAULTBG 4
 #define wxSTC_FIND_WHOLEWORD 2
 #define wxSTC_FIND_MATCHCASE 4
 #define wxSTC_FIND_WORDSTART 0x00100000
-
-// SCFIND_REGEXP is not yet implemented.
 #define wxSTC_FIND_REGEXP 0x00200000
 #define wxSTC_CMD_UNDO 2176
 #define wxSTC_CMD_CUT 2177
@@ -124,6 +152,7 @@
 #define wxSTC_FOLDLEVELWHITEFLAG 0x1000
 #define wxSTC_FOLDLEVELHEADERFLAG 0x2000
 #define wxSTC_FOLDLEVELNUMBERMASK 0x0FFF
+#define wxSTC_TIME_FOREVER 10000000
 #define wxSTC_CMD_LINEDOWN 2300
 #define wxSTC_CMD_LINEDOWNEXTEND 2301
 #define wxSTC_CMD_LINEUP 2302
@@ -173,15 +202,31 @@
 #define wxSTC_EDGE_BACKGROUND 2
 
 // Show caret within N lines of edge when it's scrolled to view
+// If CARET_SLOP not set then centre caret on screen when it's
+// scrolled to view
 #define wxSTC_CARET_SLOP 0x01
 
-// Center caret on screen when it's scrolled to view
+// Value not used
 #define wxSTC_CARET_CENTER 0x02
 
-// OR this with CARET_CENTER to reposition even when visible, or
-// OR this with CARET_SLOP to reposition whenever outside slop border
+// If CARET_SLOP also set then reposition whenever outside slop border
+// If CARET_SLOP not set then recentre even when visible
 #define wxSTC_CARET_STRICT 0x04
 
+// If CARET_XEVEN set then both left and right margins are given equal weight
+// rather than favouring left following behaviour.
+#define wxSTC_CARET_XEVEN 0x08
+
+// If CARET_XJUMPS set then when caret reaches the margin the display jumps
+// enough to leave the caret solidly within the display.
+#define wxSTC_CARET_XJUMPS 0x10
+#define wxSTC_CURSORNORMAL -1
+#define wxSTC_CURSORWAIT 3
+
+// Constants for use with SetVisiblePolicy, similar to SetCaretPolicy
+#define wxSTC_VISIBLE_SLOP 0x01
+#define wxSTC_VISIBLE_STRICT 0x04
+
 // Notifications
 // Type of modification and the action which caused the modification
 // These are defined as a bit mask to make it easy to specify which notifications are wanted.
@@ -241,6 +286,19 @@
 #define wxSTC_LEX_LATEX 14
 #define wxSTC_LEX_LUA 15
 #define wxSTC_LEX_DIFF 16
+#define wxSTC_LEX_CONF 17
+#define wxSTC_LEX_PASCAL 18
+#define wxSTC_LEX_AVE 19
+#define wxSTC_LEX_ADA 20
+#define wxSTC_LEX_LISP 21
+#define wxSTC_LEX_RUBY 22
+#define wxSTC_LEX_EIFFEL 23
+#define wxSTC_LEX_EIFFELKW 24
+#define wxSTC_LEX_TCL 25
+
+// When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
+// value assigned in sequence from SCLEX_AUTOMATIC+1.
+#define wxSTC_LEX_AUTOMATIC 1000
 
 // Lexical states for SCLEX_PYTHON
 #define wxSTC_P_DEFAULT 0
@@ -273,6 +331,9 @@
 #define wxSTC_C_IDENTIFIER 11
 #define wxSTC_C_STRINGEOL 12
 #define wxSTC_C_VERBATIM 13
+#define wxSTC_C_REGEX 14
+#define wxSTC_C_COMMENTLINEDOC 15
+#define wxSTC_C_WORD2 16
 
 // Lexical states for SCLEX_HTML, SCLEX_XML
 #define wxSTC_H_DEFAULT 0
@@ -300,6 +361,12 @@
 // More HTML
 #define wxSTC_H_VALUE 19
 
+// X-Code
+#define wxSTC_H_XCCOMMENT 20
+
+// SGML
+#define wxSTC_H_SGML 21
+
 // Embedded Javascript
 #define wxSTC_HJ_START 40
 #define wxSTC_HJ_DEFAULT 41
@@ -313,6 +380,7 @@
 #define wxSTC_HJ_SINGLESTRING 49
 #define wxSTC_HJ_SYMBOLS 50
 #define wxSTC_HJ_STRINGEOL 51
+#define wxSTC_HJ_REGEX 52
 
 // ASP Javascript
 #define wxSTC_HJA_START 55
@@ -327,6 +395,7 @@
 #define wxSTC_HJA_SINGLESTRING 64
 #define wxSTC_HJA_SYMBOLS 65
 #define wxSTC_HJA_STRINGEOL 66
+#define wxSTC_HJA_REGEX 67
 
 // Embedded VBScript
 #define wxSTC_HB_START 70
@@ -387,11 +456,12 @@
 #define wxSTC_HPHP_VARIABLE 123
 #define wxSTC_HPHP_COMMENT 124
 #define wxSTC_HPHP_COMMENTLINE 125
-#define wxSTC_HPHP_STRINGEOL 126
+#define wxSTC_HPHP_HSTRING_VARIABLE 126
+#define wxSTC_HPHP_OPERATOR 127
 
 // Lexical states for SCLEX_PERL
 #define wxSTC_PL_DEFAULT 0
-#define wxSTC_PL_HERE 1
+#define wxSTC_PL_ERROR 1
 #define wxSTC_PL_COMMENTLINE 2
 #define wxSTC_PL_POD 3
 #define wxSTC_PL_NUMBER 4
@@ -406,12 +476,20 @@
 #define wxSTC_PL_ARRAY 13
 #define wxSTC_PL_HASH 14
 #define wxSTC_PL_SYMBOLTABLE 15
-#define wxSTC_PL_REF 16
 #define wxSTC_PL_REGEX 17
 #define wxSTC_PL_REGSUBST 18
 #define wxSTC_PL_LONGQUOTE 19
 #define wxSTC_PL_BACKTICKS 20
 #define wxSTC_PL_DATASECTION 21
+#define wxSTC_PL_HERE_DELIM 22
+#define wxSTC_PL_HERE_Q 23
+#define wxSTC_PL_HERE_QQ 24
+#define wxSTC_PL_HERE_QX 25
+#define wxSTC_PL_STRING_Q 26
+#define wxSTC_PL_STRING_QQ 27
+#define wxSTC_PL_STRING_QX 28
+#define wxSTC_PL_STRING_QR 29
+#define wxSTC_PL_STRING_QW 30
 
 // Lexical states for SCLEX_LATEX
 #define wxSTC_L_DEFAULT 0
@@ -434,6 +512,8 @@
 #define wxSTC_LUA_OPERATOR 10
 #define wxSTC_LUA_IDENTIFIER 11
 #define wxSTC_LUA_STRINGEOL 12
+
+// Lexical states for SCLEX_ERRORLIST
 #define wxSTC_ERR_DEFAULT 0
 #define wxSTC_ERR_PYTHON 1
 #define wxSTC_ERR_GCC 2
@@ -441,6 +521,88 @@
 #define wxSTC_ERR_CMD 4
 #define wxSTC_ERR_BORLAND 5
 #define wxSTC_ERR_PERL 6
+#define wxSTC_ERR_NET 7
+#define wxSTC_ERR_LUA 8
+#define wxSTC_ERR_DIFF_CHANGED 10
+#define wxSTC_ERR_DIFF_ADDITION 11
+#define wxSTC_ERR_DIFF_DELETION 12
+#define wxSTC_ERR_DIFF_MESSAGE 13
+
+// Lexical states for SCLEX_BATCH
+#define wxSTC_BAT_DEFAULT 0
+#define wxSTC_BAT_COMMENT 1
+#define wxSTC_BAT_WORD 2
+#define wxSTC_BAT_LABEL 3
+#define wxSTC_BAT_HIDE 4
+#define wxSTC_BAT_COMMAND 5
+#define wxSTC_BAT_IDENTIFIER 6
+#define wxSTC_BAT_OPERATOR 7
+
+// Lexical states for SCLEX_MAKEFILE
+#define wxSTC_MAKE_DEFAULT 0
+#define wxSTC_MAKE_COMMENT 1
+#define wxSTC_MAKE_PREPROCESSOR 2
+#define wxSTC_MAKE_IDENTIFIER 3
+#define wxSTC_MAKE_OPERATOR 4
+#define wxSTC_MAKE_TARGET 5
+#define wxSTC_MAKE_IDEOL 9
+
+// Lexical states for the SCLEX_CONF (Apache Configuration Files Lexer)
+#define wxSTC_CONF_DEFAULT 0
+#define wxSTC_CONF_COMMENT 1
+#define wxSTC_CONF_NUMBER 2
+#define wxSTC_CONF_IDENTIFIER 3
+#define wxSTC_CONF_EXTENSION 4
+#define wxSTC_CONF_PARAMETER 5
+#define wxSTC_CONF_STRING 6
+#define wxSTC_CONF_OPERATOR 7
+#define wxSTC_CONF_IP 8
+#define wxSTC_CONF_DIRECTIVE 9
+
+// Avenue
+#define wxSTC_AVE_DEFAULT 0
+#define wxSTC_AVE_COMMENT 1
+#define wxSTC_AVE_NUMBER 2
+#define wxSTC_AVE_WORD 3
+#define wxSTC_AVE_KEYWORD 4
+#define wxSTC_AVE_STATEMENT 5
+#define wxSTC_AVE_STRING 6
+#define wxSTC_AVE_ENUM 7
+#define wxSTC_AVE_STRINGEOL 8
+#define wxSTC_AVE_IDENTIFIER 9
+#define wxSTC_AVE_OPERATOR 10
+
+// Lexical states for SCLEX_ADA
+#define wxSTC_ADA_DEFAULT 0
+#define wxSTC_ADA_COMMENT 1
+#define wxSTC_ADA_NUMBER 2
+#define wxSTC_ADA_WORD 3
+#define wxSTC_ADA_STRING 4
+#define wxSTC_ADA_CHARACTER 5
+#define wxSTC_ADA_OPERATOR 6
+#define wxSTC_ADA_IDENTIFIER 7
+#define wxSTC_ADA_STRINGEOL 8
+
+// Lexical states for SCLEX_LISP
+#define wxSTC_LISP_DEFAULT 0
+#define wxSTC_LISP_COMMENT 1
+#define wxSTC_LISP_NUMBER 2
+#define wxSTC_LISP_KEYWORD 3
+#define wxSTC_LISP_STRING 6
+#define wxSTC_LISP_STRINGEOL 8
+#define wxSTC_LISP_IDENTIFIER 9
+#define wxSTC_LISP_OPERATOR 10
+
+// Lexical states for SCLEX_EIFFEL and SCLEX_EIFFELKW
+#define wxSTC_EIFFEL_DEFAULT 0
+#define wxSTC_EIFFEL_COMMENTLINE 1
+#define wxSTC_EIFFEL_NUMBER 2
+#define wxSTC_EIFFEL_WORD 3
+#define wxSTC_EIFFEL_STRING 4
+#define wxSTC_EIFFEL_CHARACTER 5
+#define wxSTC_EIFFEL_OPERATOR 6
+#define wxSTC_EIFFEL_IDENTIFIER 7
+#define wxSTC_EIFFEL_STRINGEOL 8
 
 // END of generated section
 //----------------------------------------------------------------------
@@ -556,6 +718,10 @@ public:
     // Find the position from a point within the window.
     int PositionFromPoint(wxPoint pt);
 
+    // Find the position from a point within the window but return
+    // INVALID_POSITION if not close to text.
+    int PositionFromPointClose(int x, int y);
+
     // Set caret to start of a line and ensure it is visible.
     void GotoLine(int line);
 
@@ -573,8 +739,8 @@ public:
     // Retrieve the position of the last correctly styled character.
     int GetEndStyled();
 
-    // Convert all line endings in the document to use the current mode.
-    void ConvertEOLs();
+    // Convert all line endings in the document to one mode.
+    void ConvertEOLs(int eolMode);
 
     // Retrieve the current end of line mode - one of CRLF, CR, or LF.
     int GetEOLMode();
@@ -693,6 +859,9 @@ public:
     // Set a style to be underlined or not.
     void StyleSetUnderline(int style, bool underline);
 
+    // Set a style to be mixed case, or to force upper or lower case.
+    void StyleSetCase(int style, int caseForce);
+
     // Set the foreground colour of the selection and whether to use this setting.
     void SetSelForeground(bool useSetting, const wxColour& fore);
 
@@ -763,6 +932,18 @@ public:
     // Retrieve the last line number that has line state.
     int GetMaxLineState();
 
+    // Is the background of the line containing the caret in a different colour?
+    bool GetCaretLineVisible();
+
+    // Display the background of the line containing the caret in a different colour.
+    void SetCaretLineVisible(bool show);
+
+    // Get the colour of the background of the line containing the caret.
+    wxColour GetCaretLineBack();
+
+    // Set the colour of the background of the line containing the caret.
+    void SetCaretLineBack(const wxColour& back);
+
     // Display a auto-completion list.
     // The lenEntered parameter indicates how many characters before
     // the caret should be used to provide context.
@@ -816,6 +997,15 @@ public:
     // Retrieve state of ignore case flag.
     bool AutoCompGetIgnoreCase();
 
+    // Display a list of strings and send notification when user chooses one.
+    void UserListShow(int listType, const wxString& itemList);
+
+    // Set whether or not autocompletion is hidden automatically when nothing matches
+    void AutoCompSetAutoHide(bool autoHide);
+
+    // Retrieve whether or not autocompletion is hidden automatically when nothing matches
+    bool AutoCompGetAutoHide();
+
     // Set the number of spaces used for one level of indentation.
     void SetIndent(int indentSize);
 
@@ -923,13 +1113,13 @@ public:
     int GetLineCount();
 
     // Sets the size in pixels of the left margin.
-    void SetMarginLeft(int width);
+    void SetMarginLeft(int pixelWidth);
 
     // Returns the size in pixels of the left margin.
     int GetMarginLeft();
 
     // Sets the size in pixels of the right margin.
-    void SetMarginRight(int width);
+    void SetMarginRight(int pixelWidth);
 
     // Returns the size in pixels of the right margin.
     int GetMarginRight();
@@ -1006,6 +1196,48 @@ public:
     // Returns true if overtype mode is active otherwise false is returned.
     bool GetOvertype();
 
+    // Set the width of the insert mode caret
+    void SetCaretWidth(int pixelWidth);
+
+    // Returns the width of the insert mode caret
+    int GetCaretWidth();
+
+    // Sets the position that starts the target which is used for updating the
+    // document without affecting the scroll position.
+    void SetTargetStart(int pos);
+
+    // Get the position that starts the target.
+    int GetTargetStart();
+
+    // Sets the position that ends the target which is used for updating the
+    // document without affecting the scroll position.
+    void SetTargetEnd(int pos);
+
+    // Get the position that ends the target.
+    int GetTargetEnd();
+
+    // Replace the target text with the argument text.
+    // Returns the length of the replacement text.
+    int ReplaceTarget(const wxString& text);
+
+    // Replace the target text with the argument text after \d processing.
+    // 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
+    // caused by processing the \d patterns.
+    int ReplaceTargetRE(const wxString& text);
+
+    // Search for a counted string in the target and set the target to the found
+    // range.
+    // Returns length of range or -1 for failure in which case target is not moved.
+    int SearchInTarget(const wxString& text);
+
+    // Set the search flags used by SearchInTarget
+    void SetSearchFlags(int flags);
+
+    // Get the search flags used by SearchInTarget
+    int GetSearchFlags();
+
     // Show a call tip containing a definition near position pos.
     void CallTipShow(int pos, const wxString& definition);
 
@@ -1068,6 +1300,31 @@ public:
     // Set some debugging options for folding
     void SetFoldFlags(int flags);
 
+    // Ensure a particular line is visible by expanding any header line hiding it.
+    // Use the currently set visibility policy to determine which range to display.
+    void EnsureVisibleEnforcePolicy(int line);
+
+    // Sets whether a tab pressed when caret is within indentation indents
+    void SetTabIndents(bool tabIndents);
+
+    // Does a tab pressed when caret is within indentation indent?
+    bool GetTabIndents();
+
+    // Sets whether a backspace pressed when caret is within indentation unindents
+    void SetBackSpaceUnIndents(bool bsUnIndents);
+
+    // Does a backspace pressed when caret is within indentation unindent?
+    bool GetBackSpaceUnIndents();
+
+    // Sets the time the mouse must sit still to generate a mouse dwell event
+    void SetMouseDwellTime(int periodMilliseconds);
+
+    // Retrieve the time the mouse must sit still to generate a mouse dwell event
+    int GetMouseDwellTime();
+
+    // Move the caret inside current view if it's not there already
+    void MoveCaretInsideView();
+
     // How many characters are on a line, not including end of line characters.
     int LineLength(int line);
 
@@ -1119,9 +1376,11 @@ public:
     void SearchAnchor();
 
     // Find some text starting at the search anchor.
+    // Does not ensure the selection is visible.
     int SearchNext(int flags, const wxString& text);
 
     // Find some text starting at the search anchor and moving backwards.
+    // Does not ensure the selection is visible.
     int SearchPrev(int flags, const wxString& text);
 
     // Set the way the line the caret is on is kept visible.
@@ -1157,6 +1416,51 @@ public:
     // Get which document modification events are sent to the container.
     int GetModEventMask();
 
+    // Change internal focus flag
+    void SetFocus(bool focus);
+
+    // Get internal focus flag
+    bool GetFocus();
+
+    // Change error status - 0 = OK
+    void SetStatus(int statusCode);
+
+    // Get error status
+    int GetStatus();
+
+    // Set whether the mouse is captured when its button is pressed
+    void SetMouseDownCaptures(bool captures);
+
+    // Get whether mouse gets captured
+    bool GetMouseDownCaptures();
+
+    // Sets the cursor to one of the SC_CURSOR* values
+    void SetCursor(int cursorType);
+
+    // Get cursor type
+    int GetCursor();
+
+    // Move to the previous change in capitalistion
+    void WordPartLeft();
+
+    // Move to the previous change in capitalistion extending selection to new caret position.
+    void WordPartLeftExtend();
+
+    // Move to the change next in capitalistion
+    void WordPartRight();
+
+    // Move to the next change in capitalistion extending selection to new caret position.
+    void WordPartRightExtend();
+
+    // Set the way the display area is determined when a particular line is to be moved to.
+    void SetVisiblePolicy(int visiblePolicy, int visibleSlop);
+
+    // Delete back from the current position to the start of the line
+    void DelLineLeft();
+
+    // Delete forwards from the current position to the end of the line
+    void DelLineRight();
+
     // Start notifying the container of all key presses and commands.
     void StartRecord();
 
@@ -1178,6 +1482,9 @@ public:
     // Set up the key words used by the lexer.
     void SetKeyWords(int keywordSet, const wxString& keyWords);
 
+    // Set the lexing language of the document based on string name.
+    void SetLexerLanguage(const wxString& language);
+
 // END of generated section
 //----------------------------------------------------------------------
 // Others...
@@ -1243,6 +1550,10 @@ public:
     // Scroll enough to make the given column visible
     void ScrollToColumn(int column);
 
+
+    // Send a message to Scintilla
+    long SendMsg(int msg, long wp=0, long lp=0);
+
 //----------------------------------------------------------------------
 
 
@@ -1255,7 +1566,7 @@ private:
     void OnMouseLeftDown(wxMouseEvent& evt);
     void OnMouseMove(wxMouseEvent& evt);
     void OnMouseLeftUp(wxMouseEvent& evt);
-    void OnMouseRightUp(wxMouseEvent& evt);
+    void OnContextMenu(wxContextMenuEvent& evt);
     void OnMouseWheel(wxMouseEvent& evt);
     void OnChar(wxKeyEvent& evt);
     void OnKeyDown(wxKeyEvent& evt);
@@ -1271,8 +1582,6 @@ private:
     void NotifyChange();
     void NotifyParent(SCNotification* scn);
 
-    long SendMsg(int msg, long wp=0, long lp=0);
-
 private:
     DECLARE_EVENT_TABLE()
     DECLARE_CLASS(wxStyledTextCtrl)
@@ -1307,6 +1616,9 @@ public:
     void SetMessage(int val)         { m_message = val; }
     void SetWParam(int val)          { m_wParam = val; }
     void SetLParam(int val)          { m_lParam = val; }
+    void SetListType(int val)        { m_listType = val; }
+    void SetX(int val)               { m_x = val; }
+    void SetY(int val)               { m_y = val; }
 
     int  GetPosition() const         { return m_position; }
     int  GetKey()  const             { return m_key; }
@@ -1322,6 +1634,9 @@ public:
     int  GetMessage() const          { return m_message; }
     int  GetWParam() const           { return m_wParam; }
     int  GetLParam() const           { return m_lParam; }
+    int  GetListType() const         { return m_listType; }
+    int  GetX() const                { return m_x; }
+    int  GetY() const                { return m_y; }
 
     bool GetShift() const;
     bool GetControl() const;
@@ -1350,42 +1665,56 @@ private:
     int  m_message;             // wxEVT_STC_MACRORECORD
     int  m_wParam;
     int  m_lParam;
+
+    int m_listType;
+    int m_x;
+    int m_y;
 #endif
 };
 
 #ifndef SWIG
 BEGIN_DECLARE_EVENT_TYPES()
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_CHANGE, 1650)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_STYLENEEDED, 1651)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_CHARADDED, 1652)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_UPDATEUI, 1653)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_SAVEPOINTREACHED, 1654)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_SAVEPOINTLEFT, 1655)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_ROMODIFYATTEMPT, 1656)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_DOUBLECLICK, 1657)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_MODIFIED, 1658)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_KEY, 1659)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_MACRORECORD, 1660)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_MARGINCLICK, 1661)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_NEEDSHOWN, 1662)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_POSCHANGED, 1663)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_CHANGE,                  1650)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_STYLENEEDED,             1651)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_CHARADDED,               1652)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_SAVEPOINTREACHED,        1653)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_SAVEPOINTLEFT,           1654)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_ROMODIFYATTEMPT,         1655)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_KEY,                     1656)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_DOUBLECLICK,             1657)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_UPDATEUI,                1658)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_MODIFIED,                1659)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_MACRORECORD,             1660)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_MARGINCLICK,             1661)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_NEEDSHOWN,               1662)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_POSCHANGED,              1663)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_PAINTED,                 1664)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_USERLISTSELECTION,       1665)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_URIDROPPED,              1666)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_DWELLSTART,              1667)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_DWELLEND,                1668)
 END_DECLARE_EVENT_TYPES()
 #else
     enum {
         wxEVT_STC_CHANGE,
         wxEVT_STC_STYLENEEDED,
         wxEVT_STC_CHARADDED,
-        wxEVT_STC_UPDATEUI,
         wxEVT_STC_SAVEPOINTREACHED,
         wxEVT_STC_SAVEPOINTLEFT,
         wxEVT_STC_ROMODIFYATTEMPT,
+        wxEVT_STC_KEY,
         wxEVT_STC_DOUBLECLICK,
+        wxEVT_STC_UPDATEUI,
         wxEVT_STC_MODIFIED,
-        wxEVT_STC_KEY,
         wxEVT_STC_MACRORECORD,
         wxEVT_STC_MARGINCLICK,
         wxEVT_STC_NEEDSHOWN,
-        wxEVT_STC_POSCHANGED
+        wxEVT_STC_POSCHANGED,
+        wxEVT_STC_PAINTED,
+        wxEVT_STC_USERLISTSELECTION,
+        wxEVT_STC_URIDROPPED,
+        wxEVT_STC_DWELLSTART,
+        wxEVT_STC_DWELLEND,
     };
 #endif
 
@@ -1394,20 +1723,26 @@ END_DECLARE_EVENT_TYPES()
 #ifndef SWIG
 typedef void (wxEvtHandler::*wxStyledTextEventFunction)(wxStyledTextEvent&);
 
-#define EVT_STC_CHANGE(id, fn)           DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_CHANGE, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_STYLENEEDED(id, fn)      DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_STYLENEEDED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_CHARADDED(id, fn)        DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_CHARADDED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_UPDATEUI(id, fn)         DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_UPDATEUI, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_SAVEPOINTREACHED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_SAVEPOINTREACHED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_SAVEPOINTLEFT(id, fn)    DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_SAVEPOINTLEFT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_ROMODIFYATTEMPT(id, fn)  DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_ROMODIFYATTEMPT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_DOUBLECLICK(id, fn)      DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DOUBLECLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_MODIFIED(id, fn)         DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MODIFIED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_KEY(id, fn)              DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_KEY, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_MACRORECORD(id, fn)      DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MACRORECORD, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_MARGINCLICK(id, fn)      DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MARGINCLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_NEEDSHOWN(id, fn)        DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_NEEDSHOWN, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_POSCHANGED(id, fn)       DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_POSCHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_CHANGE(id, fn)                  DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_CHANGE,                id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_STYLENEEDED(id, fn)             DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_STYLENEEDED,           id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_CHARADDED(id, fn)               DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_CHARADDED,             id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_SAVEPOINTREACHED(id, fn)        DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_SAVEPOINTREACHED,      id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_SAVEPOINTLEFT(id, fn)           DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_SAVEPOINTLEFT,         id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_ROMODIFYATTEMPT(id, fn)         DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_ROMODIFYATTEMPT,       id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_KEY(id, fn)                     DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_KEY,                   id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_DOUBLECLICK(id, fn)             DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DOUBLECLICK,           id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_UPDATEUI(id, fn)                DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_UPDATEUI,              id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_MODIFIED(id, fn)                DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MODIFIED,              id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_MACRORECORD(id, fn)             DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MACRORECORD,           id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_MARGINCLICK(id, fn)             DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MARGINCLICK,           id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_NEEDSHOWN(id, fn)               DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_NEEDSHOWN,             id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_POSCHANGED(id, fn)              DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_POSCHANGED,            id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_PAINTED(id, fn)                 DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_PAINTED,               id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_USERLISTSELECTION(id, fn)       DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_USERLISTSELECTION,     id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_URIDROPPED(id, fn)              DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_URIDROPPED,            id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_DWELLSTART(id, fn)              DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DWELLSTART,            id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_DWELLEND(id, fn)                DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DWELLEND,              id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+
 
 #endif
 
diff --git a/contrib/src/stc/PlatWX.cpp b/contrib/src/stc/PlatWX.cpp
index 2b478141af..862d16456d 100644
--- a/contrib/src/stc/PlatWX.cpp
+++ b/contrib/src/stc/PlatWX.cpp
@@ -112,6 +112,8 @@ Font::~Font() {
 }
 
 void Font::Create(const char *faceName, int characterSet, int size, bool bold, bool italic) {
+    // TODO:  what to do about the characterSet?
+
     Release();
     id = new wxFont(size,
                     wxDEFAULT,
@@ -161,13 +163,11 @@ void Surface::Init() {
     Release();
     hdc = new wxMemoryDC();
     hdcOwned = true;
-    // **** ::SetTextAlign(hdc, TA_BASELINE);
 }
 
 void Surface::Init(SurfaceID hdc_) {
     Release();
     hdc = hdc_;
-    // **** ::SetTextAlign(hdc, TA_BASELINE);
 }
 
 void Surface::InitPixMap(int width, int height, Surface *surface_) {
@@ -176,7 +176,6 @@ void Surface::InitPixMap(int width, int height, Surface *surface_) {
     hdcOwned = true;
     bitmap = new wxBitmap(width, height);
     ((wxMemoryDC*)hdc)->SelectObject(*bitmap);
-    // **** ::SetTextAlign(hdc, TA_BASELINE);
 }
 
 void Surface::PenColour(Colour fore) {
@@ -353,7 +352,7 @@ int Surface::AverageCharWidth(Font &font) {
 }
 
 int Surface::SetPalette(Palette *pal, bool inBackGround) {
-    return 0;  // **** figure out what to do with palettes...
+    return 0;
 }
 
 void Surface::SetClip(PRectangle rc) {
@@ -697,6 +696,36 @@ void Platform::DebugPrintf(const char *format, ...) {
 #endif
 }
 
+
+static bool assertionPopUps = true;
+
+bool Platform::ShowAssertionPopUps(bool assertionPopUps_) {
+	bool ret = assertionPopUps;
+	assertionPopUps = assertionPopUps_;
+	return ret;
+}
+
+void Platform::Assert(const char *c, const char *file, int line) {
+	char buffer[2000];
+	sprintf(buffer, "Assertion [%s] failed at %s %d", c, file, line);
+	if (assertionPopUps) {
+		int idButton = wxMessageBox(buffer, "Assertion failure",
+                                            wxICON_HAND | wxOK);
+//  		if (idButton == IDRETRY) {
+//  			::DebugBreak();
+//  		} else if (idButton == IDIGNORE) {
+//  			// all OK
+//  		} else {
+//  			abort();
+//  		}
+	} else {
+		strcat(buffer, "\r\n");
+		Platform::DebugDisplay(buffer);
+		abort();
+	}
+}
+
+
 int Platform::Clamp(int val, int minVal, int maxVal) {
     if (val > maxVal)
         val = maxVal;
diff --git a/contrib/src/stc/ScintillaWX.cpp b/contrib/src/stc/ScintillaWX.cpp
index 30a896b903..127c172a90 100644
--- a/contrib/src/stc/ScintillaWX.cpp
+++ b/contrib/src/stc/ScintillaWX.cpp
@@ -93,7 +93,6 @@ END_EVENT_TABLE()
 ScintillaWX::ScintillaWX(wxStyledTextCtrl* win) {
     capturedMouse = false;
     wMain = win;
-    wDraw = win;
     stc   = win;
     wheelRotation = 0;
     Initialise();
@@ -170,8 +169,8 @@ bool ScintillaWX::HaveMouseCapture() {
 
 void ScintillaWX::ScrollText(int linesToMove) {
     int dy = vs.lineHeight * (linesToMove);
-    // TODO: calculate the rectangle to refreshed...
     wMain.GetID()->ScrollWindow(0, dy);
+    wMain.GetID()->Update();
 }
 
 void ScintillaWX::SetVerticalScrollPos() {
@@ -261,7 +260,7 @@ bool ScintillaWX::CanPaste() {
 }
 
 void ScintillaWX::CreateCallTipWindow(PRectangle) {
-    ct.wCallTip = new wxSTCCallTip(wDraw.GetID(), -1, &ct);
+    ct.wCallTip = new wxSTCCallTip(wMain.GetID(), -1, &ct);
     ct.wDraw = ct.wCallTip;
 }
 
@@ -365,17 +364,27 @@ void ScintillaWX::DoVScroll(int type, int pos) {
 }
 
 
-void ScintillaWX::DoMouseWheel(int rotation, int delta, int linesPerAction) {
+void ScintillaWX::DoMouseWheel(int rotation, int delta, int linesPerAction, int ctrlDown) {
     int topLineNew = topLine;
     int lines;
 
-    wheelRotation += rotation;
-    lines = wheelRotation / delta;
-    wheelRotation -= lines * delta;
-    if (lines != 0) {
-        lines *= linesPerAction;
-        topLineNew -= lines;
-        ScrollTo(topLineNew);
+    if (ctrlDown) {  // Zoom the fonts if Ctrl key down
+        if (rotation < 0) {
+            KeyCommand(SCI_ZOOMIN);
+        }
+        else {
+            KeyCommand(SCI_ZOOMOUT);
+        }
+    }
+    else { // otherwise just scroll the window
+        wheelRotation += rotation;
+        lines = wheelRotation / delta;
+        wheelRotation -= lines * delta;
+        if (lines != 0) {
+            lines *= linesPerAction;
+            topLineNew -= lines;
+            ScrollTo(topLineNew);
+        }
     }
 }
 
@@ -387,11 +396,11 @@ void ScintillaWX::DoSize(int width, int height) {
 }
 
 void ScintillaWX::DoLoseFocus(){
-    DropCaret();
+    SetFocusState(false);
 }
 
 void ScintillaWX::DoGainFocus(){
-    ShowCaretAtCurrentPosition();
+    SetFocusState(true);
 }
 
 void ScintillaWX::DoSysColourChange() {
@@ -418,7 +427,7 @@ void ScintillaWX::DoAddChar(char ch) {
     //    AutoCompleteChanged(ch);
 }
 
-int  ScintillaWX::DoKeyDown(int key, bool shift, bool ctrl, bool alt) {
+int  ScintillaWX::DoKeyDown(int key, bool shift, bool ctrl, bool alt, bool* consumed) {
     switch (key) {
         case WXK_DOWN: key = SCK_DOWN; break;
         case WXK_UP: key = SCK_UP; break;
@@ -442,7 +451,7 @@ int  ScintillaWX::DoKeyDown(int key, bool shift, bool ctrl, bool alt) {
         case WXK_SHIFT: key = 0; break;
     }
 
-    return KeyDown(key, shift, ctrl, alt);
+    return KeyDown(key, shift, ctrl, alt, consumed);
 }
 
 
diff --git a/contrib/src/stc/ScintillaWX.h b/contrib/src/stc/ScintillaWX.h
index fdd4f98dbd..00528bcd0a 100644
--- a/contrib/src/stc/ScintillaWX.h
+++ b/contrib/src/stc/ScintillaWX.h
@@ -119,9 +119,9 @@ public:
     void DoButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt);
     void DoButtonUp(Point pt, unsigned int curTime, bool ctrl);
     void DoButtonMove(Point pt);
-    void DoMouseWheel(int rotation, int delta, int linesPerAction);
+    void DoMouseWheel(int rotation, int delta, int linesPerAction, int ctrlDown);
     void DoAddChar(char ch);
-    int  DoKeyDown(int key, bool shift, bool ctrl, bool alt);
+    int  DoKeyDown(int key, bool shift, bool ctrl, bool alt, bool* consumed);
     void DoTick() { Tick(); }
 
     bool DoDropText(long x, long y, const wxString& data);
diff --git a/contrib/src/stc/gen_iface.py b/contrib/src/stc/gen_iface.py
index eba0f3c586..e198bdc6e0 100644
--- a/contrib/src/stc/gen_iface.py
+++ b/contrib/src/stc/gen_iface.py
@@ -12,15 +12,15 @@
 #----------------------------------------------------------------------------
 
 
-import sys, string, re
+import sys, string, re, os
 from fileinput import FileInput
 
 
-IFACE         = './scintilla/include/Scintilla.iface'
-H_TEMPLATE    = './stc.h.in'
-CPP_TEMPLATE  = './stc.cpp.in'
-H_DEST        = '../../include/wx/stc/stc.h'
-CPP_DEST      = './stc.cpp'
+IFACE         = os.path.abspath('./scintilla/include/Scintilla.iface')
+H_TEMPLATE    = os.path.abspath('./stc.h.in')
+CPP_TEMPLATE  = os.path.abspath('./stc.cpp.in')
+H_DEST        = os.path.abspath('../../include/wx/stc/stc.h')
+CPP_DEST      = os.path.abspath('./stc.cpp')
 
 
 # Value prefixes to convert
@@ -215,6 +215,9 @@ methodOverrideMap = {
     'AutoCGetChooseSingle' : ('AutoCompGetChooseSingle', 0, 0, 0),
     'AutoCSetIgnoreCase' : ('AutoCompSetIgnoreCase', 0, 0, 0),
     'AutoCGetIgnoreCase' : ('AutoCompGetIgnoreCase', 0, 0, 0),
+    'AutoCSetAutoHide' : ('AutoCompSetAutoHide', 0, 0, 0),
+    'AutoCGetAutoHide' : ('AutoCompGetAutoHide', 0, 0, 0),
+
 
     'SetHScrollBar' : ('SetUseHorizontalScrollBar', 0, 0, 0),
     'GetHScrollBar' : ('GetUseHorizontalScrollBar', 0, 0, 0),
@@ -360,6 +363,38 @@ methodOverrideMap = {
     'CallTipSetBack' : ('CallTipSetBackground', 0, 0, 0),
 
 
+    'ReplaceTarget' : (0,
+                       'int %s(const wxString& text);',
+
+                       '''
+                       int %s(const wxString& text) {
+                           return SendMsg(%s, text.Len(), (long)text.c_str());
+                       ''',
+
+                       0),
+
+    'ReplaceTargetRE' : (0,
+                       'int %s(const wxString& text);',
+
+                       '''
+                       int %s(const wxString& text) {
+                           return SendMsg(%s, text.Len(), (long)text.c_str());
+                       ''',
+
+                       0),
+
+    'SearchInTarget' : (0,
+                       'int %s(const wxString& text);',
+
+                       '''
+                       int %s(const wxString& text) {
+                           return SendMsg(%s, text.Len(), (long)text.c_str());
+                       ''',
+
+                       0),
+
+
+
     # Remove all methods that are key commands since they can be
     # executed with CmdKeyExecute
     'LineDown' : (None, 0, 0, 0),
@@ -417,7 +452,7 @@ methodOverrideMap = {
     'SetDocPointer' : (0,
                        'void %s(void* docPointer);',
                        '''void %s(void* docPointer) {
-                           SendMsg(%s, (long)docPointer);''',
+                           SendMsg(%s, 0, (long)docPointer);''',
                        0),
 
     'CreateDocument' : (0,
@@ -685,4 +720,3 @@ if __name__ == '__main__':
 
 #----------------------------------------------------------------------------
 
-
diff --git a/contrib/src/stc/scintilla/README.txt b/contrib/src/stc/scintilla/README.txt
index b88d57495c..598da70f58 100644
--- a/contrib/src/stc/scintilla/README.txt
+++ b/contrib/src/stc/scintilla/README.txt
@@ -3,5 +3,5 @@ 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.
 
-The current version of the Scintilla code is 1.32
+The current version of the Scintilla code is 1.39
 
diff --git a/contrib/src/stc/scintilla/include/Accessor.h b/contrib/src/stc/scintilla/include/Accessor.h
index b4b7e62ecf..17c9510672 100644
--- a/contrib/src/stc/scintilla/include/Accessor.h
+++ b/contrib/src/stc/scintilla/include/Accessor.h
@@ -1,6 +1,8 @@
-// SciTE - Scintilla based Text Editor
-// Accessor.h - rapid easy access to contents of a Scintilla
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file Accessor.h
+ ** Rapid easy access to contents of a Scintilla.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 enum { wsSpace = 1, wsTab = 2, wsSpaceTab = 4, wsInconsistent=8};
@@ -9,12 +11,16 @@ class Accessor;
 
 typedef bool (*PFNIsCommentLeader)(Accessor &styler, int pos, int len);
 
-// Interface to data in a Scintilla
+/**
+ * Interface to data in a Scintilla.
+ */
 class Accessor {
 protected:
 	enum {extremePosition=0x7FFFFFFF};
-	// bufferSize is a trade off between time taken to copy the characters and retrieval overhead
-	// slopSize positions the buffer before the desired position in case there is some backtracking
+	/** @a bufferSize is a trade off between time taken to copy the characters
+	 * and retrieval overhead.
+	 * @a slopSize positions the buffer before the desired position
+	 * in case there is some backtracking. */
 	enum {bufferSize=4000, slopSize=bufferSize/8};
 	char buf[bufferSize+1];
 	int startPos;
@@ -23,6 +29,7 @@ protected:
 
 	virtual bool InternalIsLeadByte(char ch)=0;
 	virtual void Fill(int position)=0;
+
 public:
 	Accessor() : startPos(extremePosition), endPos(0), codePage(0) {}
 	virtual ~Accessor() {}
@@ -32,8 +39,8 @@ public:
 		}
 		return buf[position - startPos];
 	}
+	/** Safe version of operator[], returning a defined value for invalid position. */
 	char SafeGetCharAt(int position, char chDefault=' ') {
-		// Safe version of operator[], returning a defined value for invalid position 
 		if (position < startPos || position >= endPos) {
 			Fill(position);
 			if (position < startPos || position >= endPos) {
@@ -57,6 +64,7 @@ public:
 	virtual int GetLineState(int line)=0;
 	virtual int SetLineState(int line, int state)=0;
 	virtual int GetPropertyInt(const char *key, int defaultValue=0)=0;
+	virtual char *GetProperties()=0;
 
 	// Style setting
 	virtual void StartAt(unsigned int start, char chMask=31)=0;
@@ -67,4 +75,3 @@ public:
 	virtual void SetLevel(int line, int level)=0;
 	virtual int IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader = 0)=0;
 };
-
diff --git a/contrib/src/stc/scintilla/include/KeyWords.h b/contrib/src/stc/scintilla/include/KeyWords.h
index 3159dcc1b4..869b59d267 100644
--- a/contrib/src/stc/scintilla/include/KeyWords.h
+++ b/contrib/src/stc/scintilla/include/KeyWords.h
@@ -1,32 +1,59 @@
-// SciTE - Scintilla based Text Editor
-// KeyWords.h - colourise for particular languages
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file KeyWords.h
+ ** Colourise for particular languages.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 typedef void (*LexerFunction)(unsigned int startPos, int lengthDoc, int initStyle,
                   WordList *keywordlists[], Accessor &styler);
                   
+/**
+ * A LexerModule is responsible for lexing and folding a particular language.
+ * The class maintains a list of LexerModules which can be searched to find a
+ * module appropriate to a particular language.
+ */
 class LexerModule {
-	static LexerModule *base;
+protected:
 	LexerModule *next;
 	int language;
-	LexerFunction fn;
+	const char *languageName;
+	LexerFunction fnLexer;
+	LexerFunction fnFolder;
+	
+	static LexerModule *base;
+	static int nextLanguage;
+
 public:
-	LexerModule(int language_, LexerFunction fn_);
-	static void Colourise(unsigned int startPos, int lengthDoc, int initStyle,
-                  int language, WordList *keywordlists[], Accessor &styler);
+	LexerModule(int language_, LexerFunction fnLexer_, 
+		const char *languageName_=0, LexerFunction fnFolder_=0);
+	int GetLanguage() { return language; }
+	virtual void Lex(unsigned int startPos, int lengthDoc, int initStyle,
+                  WordList *keywordlists[], Accessor &styler);
+	virtual void Fold(unsigned int startPos, int lengthDoc, int initStyle,
+                  WordList *keywordlists[], Accessor &styler);
+	static LexerModule *Find(int language);
+	static LexerModule *Find(const char *languageName);
 };
 
+/**
+ * Check if a character is a space.
+ * This is ASCII specific but is safe with chars >= 0x80.
+ */
+inline bool isspacechar(unsigned char ch) {
+    return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d));
+}
+
 inline bool iswordchar(char ch) {
-	return isalnum(ch) || ch == '.' || ch == '_';
+	return isascii(ch) && (isalnum(ch) || ch == '.' || ch == '_');
 }
 
 inline bool iswordstart(char ch) {
-	return isalnum(ch) || ch == '_';
+	return isascii(ch) && (isalnum(ch) || ch == '_');
 }
 
 inline bool isoperator(char ch) {
-	if (isalnum(ch))
+	if (isascii(ch) && isalnum(ch))
 		return false;
 	// '.' left out as it is used to make up numbers
 	if (ch == '%' || ch == '^' || ch == '&' || ch == '*' ||
@@ -38,4 +65,3 @@ inline bool isoperator(char ch) {
 		return true;
 	return false;
 }
-
diff --git a/contrib/src/stc/scintilla/include/Platform.h b/contrib/src/stc/scintilla/include/Platform.h
index de9cf202a1..74de63174f 100644
--- a/contrib/src/stc/scintilla/include/Platform.h
+++ b/contrib/src/stc/scintilla/include/Platform.h
@@ -1,18 +1,21 @@
 // Scintilla source code edit control
-// Platform.h - interface to platform facilities
-// Also includes some basic utilities
-// Implemented in PlatGTK.cxx for GTK+/Linux, PlatWin.cxx for Windows, and PlatWX.cxx for wxWindows
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file Platform.h
+ ** Interface to platform facilities. Also includes some basic utilities.
+ ** Implemented in PlatGTK.cxx for GTK+/Linux, PlatWin.cxx for Windows, and PlatWX.cxx for wxWindows.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef PLATFORM_H
 #define PLATFORM_H
 
-// PLAT_GTK = GTK+ on Linux, PLAT_WIN = Win32 API on Win32 OS
+// PLAT_GTK = GTK+ on Linux or Win32
+// PLAT_GTK_WIN32 is defined additionally when running PLAT_GTK under Win32
+// PLAT_WIN = Win32 API on Win32 OS
 // PLAT_WX is wxWindows on any supported platform
-// Could also have PLAT_GTKWIN = GTK+ on Win32 OS in future
 
 #define PLAT_GTK 0
+#define PLAT_GTK_WIN32 0
 #define PLAT_WIN 0
 #define PLAT_WX  0
 
@@ -24,6 +27,11 @@
 #undef PLAT_GTK
 #define PLAT_GTK 1
 
+#ifdef _MSC_VER
+#undef PLAT_GTK_WIN32
+#define PLAT_GTK_WIN32 1
+#endif
+
 #else
 #undef PLAT_WIN
 #define PLAT_WIN 1
@@ -34,6 +42,9 @@
 // Include the main header for each platform
 
 #if PLAT_GTK
+#ifdef _MSC_VER
+#pragma warning(disable: 4505 4514 4710 4800)
+#endif
 #include <gtk/gtk.h>
 #include <gdk/gdkkeysyms.h>
 #endif
@@ -42,7 +53,7 @@
 #define _WIN32_WINNT  0x0400 // Otherwise some required stuff gets ifdef'd out
 // Vassili Bourdo: shut up annoying Visual C++ warnings:
 #ifdef _MSC_VER
-#pragma warning(disable: 4800 4244 4309)
+#pragma warning(disable: 4244 4309 4710 4800)
 #endif
 #include <windows.h>
 #include <commctrl.h>
@@ -80,23 +91,28 @@ typedef wxWindow* WindowID;
 typedef wxMenu* MenuID;
 #endif
 
-// Point is exactly the same as the Win32 POINT and GTK+ GdkPoint so can be used interchangeably
-
+/**
+ * A geometric point class.
+ * Point is exactly the same as the Win32 POINT and GTK+ GdkPoint so can be used interchangeably.
+ */
 class Point {
 public:
 	int x;
 	int y;
-	
+
 	Point(int x_=0, int y_=0) : x(x_), y(y_) {
 	}
 
 	// Other automatically defined methods (assignment, copy constructor, destructor) are fine
-	
+
 	static Point FromLong(long lpoint);
 };
 
-// PRectangle is exactly the same as the Win32 RECT so can be used interchangeably
-// PRectangles contain their top and left sides, but not their right and bottom sides
+/**
+ * A geometric rectangle class.
+ * PRectangle is exactly the same as the Win32 RECT so can be used interchangeably.
+ * PRectangles contain their top and left sides, but not their right and bottom sides.
+ */
 class PRectangle {
 public:
 	int left;
@@ -110,6 +126,10 @@ public:
 
 	// Other automatically defined methods (assignment, copy constructor, destructor) are fine
 
+	bool operator==(PRectangle &rc) {
+		return (rc.left == left) && (rc.right == right) &&
+			(rc.top == top) && (rc.bottom == bottom);
+	}
 	bool Contains(Point pt) {
 		return (pt.x >= left) && (pt.x <= right) &&
 			(pt.y >= top) && (pt.y <= bottom);
@@ -131,6 +151,9 @@ wxRect wxRectFromPRectangle(PRectangle prc);
 PRectangle PRectangleFromwxRect(wxRect rc);
 #endif
 
+/**
+ * A colour class.
+ */
 class Colour {
 	ColourID co;
 public:
@@ -141,15 +164,17 @@ public:
 	unsigned int GetRed();
 	unsigned int GetGreen();
 	unsigned int GetBlue();
-	
+
 	friend class Surface;
 	friend class Palette;
 };
 
-// Colour pairs hold a desired colour and the colour that the graphics engine
-// allocates to approximate the desired colour.
-// To make palette management more automatic, ColourPairs could register at 
-// construction time with a palette management object.
+/**
+ * Colour pairs hold a desired colour and the colour that the graphics engine
+ * allocates to approximate the desired colour.
+ * To make palette management more automatic, ColourPairs could register at
+ * construction time with a palette management object.
+ */
 struct ColourPair {
 	Colour desired;
 	Colour allocated;
@@ -162,6 +187,9 @@ struct ColourPair {
 
 class Window;	// Forward declaration for Palette
 
+/**
+ * Colour palette management.
+ */
 class Palette {
 	int used;
 	enum {numEntries = 100};
@@ -176,22 +204,27 @@ class Palette {
 #endif
 public:
 	bool allowRealization;
-	
+
 	Palette();
 	~Palette();
 
 	void Release();
-	
-	// This method either adds a colour to the list of wanted colours (want==true)
-	// or retrieves the allocated colour back to the ColourPair.
-	// This is one method to make it easier to keep the code for wanting and retrieving in sync.
+
+	/**
+	 * This method either adds a colour to the list of wanted colours (want==true)
+	 * or retrieves the allocated colour back to the ColourPair.
+	 * This is one method to make it easier to keep the code for wanting and retrieving in sync.
+	 */
 	void WantFind(ColourPair &cp, bool want);
 
 	void Allocate(Window &w);
-	
+
 	friend class Surface;
 };
 
+/**
+ * Font management.
+ */
 class Font {
 protected:
 	FontID id;
@@ -214,7 +247,9 @@ public:
 	friend class Surface;
 };
 
-// A surface abstracts a place to draw
+/**
+ * A surface abstracts a place to draw.
+ */
 class Surface {
 private:
 	bool unicodeMode;
@@ -256,7 +291,7 @@ private:
 public:
 	Surface();
 	~Surface();
-	
+
 	void Init();
 	void Init(SurfaceID hdc_);
 	void InitPixMap(int width, int height, Surface *surface_);
@@ -287,7 +322,7 @@ public:
 	int ExternalLeading(Font &font_);
 	int Height(Font &font_);
 	int AverageCharWidth(Font &font_);
-	
+
 	int SetPalette(Palette *pal, bool inBackGround);
 	void SetClip(PRectangle rc);
 	void FlushCachedState();
@@ -297,8 +332,10 @@ public:
 	}
 };
 
-// Class to hide the details of window manipulation
-// Does not own the window which will normally have a longer life than this object
+/**
+ * Class to hide the details of window manipulation.
+ * Does not own the window which will normally have a longer life than this object.
+ */
 class Window {
 	friend class ListBox;
 protected:
@@ -333,6 +370,9 @@ public:
 #endif
 };
 
+/**
+ * Listbox management.
+ */
 class ListBox : public Window {
 #if PLAT_GTK
 	WindowID list;
@@ -360,6 +400,9 @@ public:
 	void Sort();
 };
 
+/**
+ * Menu management.
+ */
 class Menu {
 	MenuID id;
 public:
@@ -370,8 +413,10 @@ public:
 	void Show(Point pt, Window &w);
 };
 
-// Platform class used to retrieve system wide parameters such as double click speed
-// and chrome colour. Not a creatable object, more of a module with several functions.
+/**
+ * Platform class used to retrieve system wide parameters such as double click speed
+ * and chrome colour. Not a creatable object, more of a module with several functions.
+ */
 class Platform {
 	// Private so Platform objects can not be copied
 	Platform(const Platform &) {}
@@ -390,7 +435,7 @@ public:
 	static bool IsKeyDown(int key);
 	static long SendScintilla(
 		WindowID w, unsigned int msg, unsigned long wParam=0, long lParam=0);
-	
+
 	// These are utility functions not really tied to a platform
 	static int Minimum(int a, int b);
 	static int Maximum(int a, int b);
@@ -405,7 +450,15 @@ public:
 		return static_cast<short>(x & 0xffff);
 	}
 	static void DebugPrintf(const char *format, ...);
+	static bool ShowAssertionPopUps(bool assertionPopUps_);
+	static void Assert(const char *c, const char *file, int line);
 	static int Clamp(int val, int minVal, int maxVal);
 };
 
+#ifdef  NDEBUG
+#define PLATFORM_ASSERT(c) ((void)0)
+#else
+#define PLATFORM_ASSERT(c) ((c) ? (void)(0) : Platform::Assert(#c, __FILE__, __LINE__))
+#endif
+
 #endif
diff --git a/contrib/src/stc/scintilla/include/PosRegExp.h b/contrib/src/stc/scintilla/include/PosRegExp.h
deleted file mode 100644
index b915b1ed49..0000000000
--- a/contrib/src/stc/scintilla/include/PosRegExp.h
+++ /dev/null
@@ -1,138 +0,0 @@
-#ifndef POSREGEXP_H
-#define POSREGEXP_H
-
-#define MatchesNum 0x10
-
-enum EOps
-{
-  ReBlockOps = 0x1000,
-  ReMul,              // *
-  RePlus,             // +
-  ReQuest,            // ?
-  ReNGMul,            // *?
-  ReNGPlus,           // +?
-  ReNGQuest,          // ??
-  ReRangeN,           // {n,}
-  ReRangeNM,          // {n,m}
-  ReNGRangeN,         // {n,}?
-  ReNGRangeNM,        // {n,m}?
-  ReOr,               // |
-  ReBehind  = 0x1100, // ?#n
-  ReNBehind = 0x1200, // ?~n
-  ReAhead   = 0x1300, // ?=
-  ReNAhead  = 0x1400, // ?!
-
-  ReSymbolOps = 0x2000,
-  ReEmpty,
-  ReSymb,             // a b \W \s ...
-  ReEnum,             // []
-  ReNEnum,            // [^]
-  ReBrackets,         // (...)
-  ReBkTrace = 0x2100, // \yN
-  ReBkBrack = 0x2200 // \N
-};
-
-enum ESymbols
-{
-  ReAnyChr = 0x4000,  // .
-  ReSoL,              // ^
-  ReEoL,              // $
-  ReDigit,            // \d
-  ReNDigit,           // \D
-  ReWordSymb,         // \w
-  ReNWordSymb,        // \W
-  ReWSpace,           // \s
-  ReNWSpace,          // \S
-  ReUCase,            // \u
-  ReNUCase ,          // \l
-  ReWBound,           // \b
-  ReNWBound,          // \B
-  RePreNW,            // \c
-  ReStart,            // \m
-  ReEnd,              // \M
-
-  ReChr    = 0x0      // Char in Lower Byte
-};
-enum ETempSymb
-{
-  ReTemp = 0x7000,
-  ReLBrack, ReRBrack,
-  ReEnumS, ReEnumE, ReNEnumS,
-  ReRangeS, ReRangeE, ReNGRangeE, ReFrToEnum
-};
-
-#define BackSlash '\\'
-
-typedef union SCharData
-{
-  int  IArr[8];
-  char CArr[32];
-  void SetBit(unsigned char Bit);
-  void ClearBit(unsigned char Bit);
-  bool GetBit(unsigned char Bit);
-} *PCharData;
-
-typedef struct SRegInfo
-{
-  SRegInfo();
-  ~SRegInfo();
-
-  EOps   Op;
-  union{
-    SRegInfo *Param;
-    int Symb;
-    PCharData ChrClass;
-  }un;
-  int s,e;
-  SRegInfo *Parent;
-  SRegInfo *Next;
-} *PRegInfo;
-
-typedef struct SMatches
-{
-  int s[MatchesNum];
-  int e[MatchesNum];
-  int CurMatch;
-} *PMatches;
-
-typedef class PosRegExp
-{
-  PRegInfo Info;
-  PMatches BkTrace;
-  bool NoCase,Extend,NoMoves;
-  bool Error;
-  int  *Exprn;
-  int  posParse;
-  int  posEnd,posStart;
-  int  posBkStr;
-  int  FirstChar;
-
-  bool SetExprLow(const char *Expr);
-  bool SetStructs(PRegInfo &Info,int st,int end);
-  void Optimize();
-  bool CheckSymb(int Symb,bool Inc);
-  bool LowParse(PRegInfo Re);
-  bool LowParseRe(PRegInfo &Next);
-  bool LowCheckNext(PRegInfo Re);
-  bool ParseRe(int posStr);
-  bool QuickCheck();
-public:
-  PMatches Matches;
-  int Ok, CurMatch;
-
-  void *param;
-  char (*CharAt)(int pos, void *param);
-
-  PosRegExp();
-  ~PosRegExp();
-
-  bool isok();
-  bool SetNoMoves(bool Moves);
-  bool SetBkTrace(int posStr,PMatches Trace);
-  bool SetExpr(const char *Expr);
-  bool Parse(int posStr, int posStop, PMatches Mtch);
-  bool Parse(int posStr,int posSol, int posEol, PMatches Mtch, int Moves = -1);
-  bool Evaluate(char *Expr, int posStr, PMatches Mtch, char **Res);
-} *PPosRegExp;
-
-#endif /* POSREGEXP_H */
diff --git a/contrib/src/stc/scintilla/include/PropSet.h b/contrib/src/stc/scintilla/include/PropSet.h
index 025174f8ab..6f6bf410f1 100644
--- a/contrib/src/stc/scintilla/include/PropSet.h
+++ b/contrib/src/stc/scintilla/include/PropSet.h
@@ -1,188 +1,17 @@
-// SciTE - Scintilla based Text Editor
-// PropSet.h - a java style properties file module
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file PropSet.h
+ ** A Java style properties file module.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef PROPSET_H
 #define PROPSET_H
+#include "SString.h"
 
 bool EqualCaseInsensitive(const char *a, const char *b);
 
-#if PLAT_WIN
-#define strcasecmp  stricmp
-#define strncasecmp strnicmp
-#endif
-
-#ifdef __WXMSW__
-#define strcasecmp  stricmp
-#define strncasecmp strnicmp
-#endif
-
-// Define another string class.
-// While it would be 'better' to use std::string, that doubles the executable size.
-
-inline char *StringDup(const char *s, int len=-1) {
-	if (!s)
-		return 0;
-	if (len == -1)
-		len = strlen(s);
-	char *sNew = new char[len + 1];
-	if (sNew) {
-		strncpy(sNew, s, len);
-		sNew[len] = '\0';
-	}
-	return sNew;
-}
-
-class SString {
-	char *s;
-	int ssize;
-public:
-	typedef const char* const_iterator;
-	typedef int size_type;
-	static size_type npos;
-	const char* begin(void) const {
-		return s;
-	}
-	const char* end(void) const {
-		return &s[ssize];
-	}
-	size_type size(void) const {
-		if (s)
-			return ssize;
-		else
-			return 0;
-	}
-	SString &assign(const char* sother, int size_ = -1) {
-		char *t = s;
-		s = StringDup(sother,size_);
-		ssize = (s) ? strlen(s) : 0;
-		delete []t;
-		return *this;
-	}
-	SString &assign(const SString& sother, int size_ = -1) {
-		return assign(sother.s,size_);
-	}
-	SString &assign(const_iterator ibeg, const_iterator iend) {
-		return assign(ibeg,iend - ibeg);
-	}
-	SString() {
-		s = 0;
-		ssize = 0;
-	}
-	SString(const SString &source) {
-		s = StringDup(source.s);
-		ssize = (s) ? strlen(s) : 0;
-	}
-	SString(const char *s_) {
-		s = StringDup(s_);
-		ssize = (s) ? strlen(s) : 0;
-	}
-	SString(int i) {
-		char number[100];
-		sprintf(number, "%0d", i);
-		s = StringDup(number);
-		ssize = (s) ? strlen(s) : 0;
-	}
-	~SString() {
-		delete []s;
-		s = 0;
-		ssize = 0;
-	}
-	SString &operator=(const SString &source) {
-		if (this != &source) {
-			delete []s;
-			s = StringDup(source.s);
-			ssize = (s) ? strlen(s) : 0;
-		}
-		return *this;
-	}
-	bool operator==(const SString &other) const {
-		if ((s == 0) && (other.s == 0))
-			return true;
-		if ((s == 0) || (other.s == 0))
-			return false;
-		return strcmp(s, other.s) == 0;
-	}
-	bool operator!=(const SString &other) const {
-		return !operator==(other);
-	}
-	bool operator==(const char *sother) const {
-		if ((s == 0) && (sother == 0))
-			return true;
-		if ((s == 0) || (sother == 0))
-			return false;
-		return strcmp(s, sother) == 0;
-	}
-	bool operator!=(const char *sother) const {
-		return !operator==(sother);
-	}
-	const char *c_str() const {
-		if (s)
-			return s;
-		else
-			return "";
-	}
-	int length() const {
-		if (s)
-			return strlen(s);
-		else
-			return 0;
-	}
-	char operator[](int i) const {
-		if (s)
-			return s[i];
-		else
-			return '\0';
-	}
-	SString &operator +=(const char *sother) {
-		return append(sother,-1);
-	}
-	SString &operator +=(const SString &sother) {
-		return append(sother.s,sother.ssize);
-	}
-	SString &operator +=(char ch) {
-		return append(&ch,1);
-	}
-	SString &append(const char* sother, int lenOther) {
-		int len = length();
-		if(lenOther < 0)
-			lenOther = strlen(sother);
-		char *sNew = new char[len + lenOther + 1];
-		if (sNew) {
-			if (s)
-				memcpy(sNew, s, len);
-			strncpy(&sNew[len], sother, lenOther);
-			sNew[len + lenOther] = '\0';
-			delete []s;
-			s = sNew;
-			ssize = (s) ? strlen(s) : 0;
-		}
-		return *this;
-	}
-	int value() const {
-		if (s)
-			return atoi(s);
-		else
-			return 0;
-	}
-	void substitute(char find, char replace) {
-		char *t = s;
-		while (t) {
-			t = strchr(t, find);
-			if (t)
-				*t = replace;
-		}
-	}
-	// I don't think this really belongs here -- Neil
-	void correctPath() {
-#ifdef unix
-		substitute('\\', '/');
-#else
-		substitute('/', '\\');
-#endif
-	}
-};
+bool isprefix(const char *target, const char *prefix);
 
 struct Property {
 	unsigned int hash;
@@ -192,53 +21,66 @@ struct Property {
 	Property() : hash(0), key(0), val(0), next(0) {}
 };
 
+/**
+ */
 class PropSet {
 private:
 	enum { hashRoots=31 };
 	Property *props[hashRoots];
+	Property *enumnext;
+	int enumhash;
 public:
 	PropSet *superPS;
 	PropSet();
 	~PropSet();
-	void Set(const char *key, const char *val);
-	void Set(char *keyval);
+	void Set(const char *key, const char *val, int lenKey=-1, int lenVal=-1);
+	void Set(const char *keyVal);
+	void SetMultiple(const char *s);
 	SString Get(const char *key);
 	SString GetExpanded(const char *key);
-	SString Expand(const char *withvars);
+	SString Expand(const char *withVars);
 	int GetInt(const char *key, int defaultValue=0);
 	SString GetWild(const char *keybase, const char *filename);
 	SString GetNewExpand(const char *keybase, const char *filename);
 	void Clear();
-	void ReadFromMemory(const char *data, int len, const char *directoryForImports=0);
-	void Read(const char *filename, const char *directoryForImports);
+	char *ToString();	// Caller must delete[] the return value
+	bool GetFirst(char **key, char **val);
+	bool GetNext(char **key, char **val);
 };
 
+/**
+ */
 class WordList {
 public:
-	// Each word contains at least one character - a empty word acts as sentinal at the end.
+	// Each word contains at least one character - a empty word acts as sentinel at the end.
 	char **words;
 	char **wordsNoCase;
 	char *list;
 	int len;
-	bool onlyLineEnds;	// Delimited by any white space or only line ends
+	bool onlyLineEnds;	///< Delimited by any white space or only line ends
 	bool sorted;
 	int starts[256];
-	WordList(bool onlyLineEnds_ = false) :
+	WordList(bool onlyLineEnds_ = false) : 
 		words(0), wordsNoCase(0), list(0), len(0), onlyLineEnds(onlyLineEnds_), sorted(false) {}
 	~WordList() { Clear(); }
-	operator bool() { return words ? true : false; }
-	const char *operator[](int ind) { return words[ind]; }
+	operator bool() { return len ? true : false; }
+	char *operator[](int ind) { return words[ind]; }
 	void Clear();
 	void Set(const char *s);
 	char *Allocate(int size);
 	void SetFromAllocated();
 	bool InList(const char *s);
 	const char *GetNearestWord(const char *wordStart, int searchLen = -1, bool ignoreCase = false);
-	char *GetNearestWords(const char *wordStart, int searchLen = -1, bool ignoreCase = false);
+	char *GetNearestWords(const char *wordStart, int searchLen=-1, 
+		bool ignoreCase=false, char otherSeparator='\0');
 };
 
 inline bool nonFuncChar(char ch) {
 	return strchr("\t\n\r !\"#$%&'()*+,-./:;<=>?@[\\]^`{|}~", ch) != NULL;
 }
 
+inline bool IsAlphabetic(unsigned int ch) {
+	return ((ch >= 'A') && (ch <= 'Z')) || ((ch >= 'a') && (ch <= 'z'));
+}
+
 #endif
diff --git a/contrib/src/stc/scintilla/include/SString.h b/contrib/src/stc/scintilla/include/SString.h
new file mode 100644
index 0000000000..aeb5940502
--- /dev/null
+++ b/contrib/src/stc/scintilla/include/SString.h
@@ -0,0 +1,255 @@
+// SciTE - Scintilla based Text Editor
+/** @file SString.h
+ ** A simple string class.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#ifndef SSTRING_H
+#define SSTRING_H
+
+// These functions are implemented because each platform calls them something different
+int CompareCaseInsensitive(const char *a, const char *b);
+int CompareNCaseInsensitive(const char *a, const char *b, int len);
+bool EqualCaseInsensitive(const char *a, const char *b);
+
+// Define another string class.
+// While it would be 'better' to use std::string, that doubles the executable size.
+// An SString may contain embedded nul characters.
+
+/**
+ * Duplicate a C string.
+ * Allocate memory of the given size, or big enough to fit the string if length isn't given;
+ * then copy the given string in the allocated memory.
+ * @return the pointer to the new string
+ */
+inline char *StringDup(
+	const char *s,	///< The string to duplicate
+	int len=-1)		///< The length of memory to allocate. Optional.
+{
+	if (!s)
+		return 0;
+	if (len == -1)
+		len = strlen(s);
+	char *sNew = new char[len + 1];
+	if (sNew) {
+		strncpy(sNew, s, len);
+		sNew[len] = '\0';
+	}
+	return sNew;
+}
+
+/**
+ * @brief A simple string class.
+ * Hold the length of the string for quick operations,
+ * can have a buffer bigger than the string to avoid too many memory allocations and copies.
+ * May have embedded zeroes as a result of @a substitute, but rely too heavily on C string
+ * functions to allow reliable manipulations of these strings.
+ **/
+class SString {
+	char *s;			///< The C string
+	int sSize;	///< The size of the buffer, less 1: ie. the maximum size of the string
+	int sLen;	///< The size of the string in s
+	int sizeGrowth;	///< Minimum growth size when appending strings
+	enum { sizeGrowthDefault = 64 };
+
+public:
+	typedef int size_type;
+
+	SString() : s(0), sSize(0), sLen(0), sizeGrowth(sizeGrowthDefault) {
+	}
+	SString(const SString &source) : sizeGrowth(sizeGrowthDefault) {
+		s = StringDup(source.s);
+		sSize = sLen = (s) ? strlen(s) : 0;
+	}
+	SString(const char *s_) : sizeGrowth(sizeGrowthDefault) {
+		s = StringDup(s_);
+		sSize = sLen = (s) ? strlen(s) : 0;
+	}
+	SString(const char *s_, int first, int last) : sizeGrowth(sizeGrowthDefault) {
+		s = StringDup(s_ + first, last - first);
+		sSize = sLen = (s) ? strlen(s) : 0;
+	}
+	SString(int i) : sizeGrowth(sizeGrowthDefault) {
+		char number[32];
+		sprintf(number, "%0d", i);
+		s = StringDup(number);
+		sSize = sLen = (s) ? strlen(s) : 0;
+	}
+	~SString() {
+		delete []s;
+		s = 0;
+		sSize = 0;
+		sLen = 0;
+	}
+	void clear(void) {
+		if (s) {
+			*s = '\0';
+		}
+		sLen = 0;
+	}
+	/** Size of buffer. */
+	size_type size(void) const {	///<
+		if (s)
+			return sSize;
+		else
+			return 0;
+	}
+	/** Size of string in buffer. */
+	int length() const {
+		return sLen;
+	}
+	SString &assign(const char* sOther, int sSize_ = -1) {
+		if (!sOther) {
+			sSize_ = 0;
+		}
+		if (sSize_ < 0) {
+			sSize_ = strlen(sOther);
+		}
+		if (sSize > 0 && sSize_ <= sSize) {	// Does not allocate new buffer if the current is big enough
+			if (s && sSize_) {
+				strncpy(s, sOther, sSize_);
+			}
+			s[sSize_] = '\0';
+			sLen = sSize_;
+		} else {
+			delete []s;
+			s = StringDup(sOther, sSize_);
+			if (s) {
+				sSize = sSize_;	// Allow buffer bigger than real string, thus providing space to grow
+				sLen = strlen(s);
+			} else {
+				sSize = sLen = 0;
+			}
+		}
+		return *this;
+	}
+	SString &assign(const SString& sOther, int sSize_ = -1) {
+		return assign(sOther.s, sSize_);
+	}
+	SString &operator=(const char *source) {
+		return assign(source);
+	}
+	SString &operator=(const SString &source) {
+		if (this != &source) {
+			assign(source.c_str());
+		}
+		return *this;
+	}
+	bool operator==(const SString &sOther) const {
+		if ((s == 0) && (sOther.s == 0))
+			return true;
+		if ((s == 0) || (sOther.s == 0))
+			return false;
+		return strcmp(s, sOther.s) == 0;
+	}
+	bool operator!=(const SString &sOther) const {
+		return !operator==(sOther);
+	}
+	bool operator==(const char *sOther) const {
+		if ((s == 0) && (sOther == 0))
+			return true;
+		if ((s == 0) || (sOther == 0))
+			return false;
+		return strcmp(s, sOther) == 0;
+	}
+	bool operator!=(const char *sOther) const {
+		return !operator==(sOther);
+	}
+	bool contains(char ch) {
+		if (s && *s)
+			return strchr(s, ch) != 0;
+		else
+			return false;
+	}
+	void setsizegrowth(int sizeGrowth_) {
+		sizeGrowth = sizeGrowth_;
+	}
+	const char *c_str() const {
+		if (s)
+			return s;
+		else
+			return "";
+	}
+	/** Give ownership of buffer to caller which must use delete[] to free buffer. */
+	char *detach() {
+		char *sRet = s;
+		s = 0;
+		sSize = 0;
+		sLen = 0;
+		return sRet;
+	}
+	char operator[](int i) const {
+		if (s && i < sSize)	// Or < sLen? Depends on the use, both are OK
+			return s[i];
+		else
+			return '\0';
+	}
+	SString &append(const char* sOther, int sLenOther=-1, char sep=0) {
+		if (sLenOther < 0)
+			sLenOther = strlen(sOther);
+		int lenSep = 0;
+		if (sLen && sep)	// Only add a separator if not empty
+			lenSep = 1;
+		int lenNew = sLen + sLenOther + lenSep;
+		if (lenNew + 1 < sSize) {
+			// Conservative about growing the buffer: don't do it, unless really needed
+			if (lenSep) {
+				s[sLen] = sep;
+				sLen++;
+			}
+			strncpy(&s[sLen], sOther, sLenOther);
+			s[sLen + sLenOther] = '\0';
+			sLen += sLenOther;
+		} else {
+			// Grow the buffer bigger than really needed, to have room for other appends
+			char *sNew = new char[lenNew + sizeGrowth + 1];
+			if (sNew) {
+				if (s) {
+					memcpy(sNew, s, sLen);
+					delete []s;
+				}
+				s = sNew;
+				sSize = lenNew + sizeGrowth;
+				if (lenSep) {
+					s[sLen] = sep;
+					sLen++;
+				}
+				strncpy(&s[sLen], sOther, sLenOther);
+				sNew[sLen + sLenOther] = '\0';
+				sLen += sLenOther;
+			}
+		}
+		return *this;
+	}
+	SString &operator +=(const char *sOther) {
+		return append(sOther, -1);
+	}
+	SString &operator +=(const SString &sOther) {
+		return append(sOther.s, sOther.sSize);
+	}
+	SString &operator +=(char ch) {
+		return append(&ch, 1);
+	}
+	SString &appendwithseparator(const char* sOther, char sep) {
+		return append(sOther, strlen(sOther), sep);
+	}
+	int value() const {
+		if (s)
+			return atoi(s);
+		else
+			return 0;
+	}
+	void substitute(char find, char replace) {
+		char *t = s;
+		while (t) {
+			t = strchr(t, find);
+			if (t) {
+				*t = replace;
+				t++;
+			}
+		}
+	}
+};
+
+#endif
diff --git a/contrib/src/stc/scintilla/include/SciLexer.h b/contrib/src/stc/scintilla/include/SciLexer.h
index 69402ab9ab..591bd06aa1 100644
--- a/contrib/src/stc/scintilla/include/SciLexer.h
+++ b/contrib/src/stc/scintilla/include/SciLexer.h
@@ -1,6 +1,8 @@
 // Scintilla source code edit control
-// SciLexer - interface to the added lexer functions in the SciLexer version of the edit control
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file SciLexer.h
+ ** Interface to the added lexer functions in the SciLexer version of the edit control.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 // Most of this file is automatically generated from the Scintilla.iface interface definition
@@ -29,6 +31,16 @@
 #define SCLEX_LATEX 14
 #define SCLEX_LUA 15
 #define SCLEX_DIFF 16
+#define SCLEX_CONF 17
+#define SCLEX_PASCAL 18
+#define SCLEX_AVE 19
+#define SCLEX_ADA 20
+#define SCLEX_LISP 21
+#define SCLEX_RUBY 22
+#define SCLEX_EIFFEL 23
+#define SCLEX_EIFFELKW 24
+#define SCLEX_TCL 25
+#define SCLEX_AUTOMATIC 1000
 #define SCE_P_DEFAULT 0
 #define SCE_P_COMMENTLINE 1
 #define SCE_P_NUMBER 2
@@ -57,6 +69,9 @@
 #define SCE_C_IDENTIFIER 11
 #define SCE_C_STRINGEOL 12
 #define SCE_C_VERBATIM 13
+#define SCE_C_REGEX 14
+#define SCE_C_COMMENTLINEDOC 15
+#define SCE_C_WORD2 16
 #define SCE_H_DEFAULT 0
 #define SCE_H_TAG 1
 #define SCE_H_TAGUNKNOWN 2
@@ -77,6 +92,8 @@
 #define SCE_H_CDATA 17
 #define SCE_H_QUESTION 18
 #define SCE_H_VALUE 19
+#define SCE_H_XCCOMMENT 20
+#define SCE_H_SGML 21
 #define SCE_HJ_START 40
 #define SCE_HJ_DEFAULT 41
 #define SCE_HJ_COMMENT 42
@@ -89,6 +106,7 @@
 #define SCE_HJ_SINGLESTRING 49
 #define SCE_HJ_SYMBOLS 50
 #define SCE_HJ_STRINGEOL 51
+#define SCE_HJ_REGEX 52
 #define SCE_HJA_START 55
 #define SCE_HJA_DEFAULT 56
 #define SCE_HJA_COMMENT 57
@@ -101,6 +119,7 @@
 #define SCE_HJA_SINGLESTRING 64
 #define SCE_HJA_SYMBOLS 65
 #define SCE_HJA_STRINGEOL 66
+#define SCE_HJA_REGEX 67
 #define SCE_HB_START 70
 #define SCE_HB_DEFAULT 71
 #define SCE_HB_COMMENTLINE 72
@@ -151,9 +170,10 @@
 #define SCE_HPHP_VARIABLE 123
 #define SCE_HPHP_COMMENT 124
 #define SCE_HPHP_COMMENTLINE 125
-#define SCE_HPHP_STRINGEOL 126
+#define SCE_HPHP_HSTRING_VARIABLE 126
+#define SCE_HPHP_OPERATOR 127
 #define SCE_PL_DEFAULT 0
-#define SCE_PL_HERE 1
+#define SCE_PL_ERROR 1
 #define SCE_PL_COMMENTLINE 2
 #define SCE_PL_POD 3
 #define SCE_PL_NUMBER 4
@@ -168,12 +188,20 @@
 #define SCE_PL_ARRAY 13
 #define SCE_PL_HASH 14
 #define SCE_PL_SYMBOLTABLE 15
-#define SCE_PL_REF 16
 #define SCE_PL_REGEX 17
 #define SCE_PL_REGSUBST 18
 #define SCE_PL_LONGQUOTE 19
 #define SCE_PL_BACKTICKS 20
 #define SCE_PL_DATASECTION 21
+#define SCE_PL_HERE_DELIM 22
+#define SCE_PL_HERE_Q 23
+#define SCE_PL_HERE_QQ 24
+#define SCE_PL_HERE_QX 25
+#define SCE_PL_STRING_Q 26
+#define SCE_PL_STRING_QQ 27
+#define SCE_PL_STRING_QX 28
+#define SCE_PL_STRING_QR 29
+#define SCE_PL_STRING_QW 30
 #define SCE_L_DEFAULT 0
 #define SCE_L_COMMAND 1
 #define SCE_L_TAG 2
@@ -199,6 +227,74 @@
 #define SCE_ERR_CMD 4
 #define SCE_ERR_BORLAND 5
 #define SCE_ERR_PERL 6
+#define SCE_ERR_NET 7
+#define SCE_ERR_LUA 8
+#define SCE_ERR_DIFF_CHANGED 10
+#define SCE_ERR_DIFF_ADDITION 11
+#define SCE_ERR_DIFF_DELETION 12
+#define SCE_ERR_DIFF_MESSAGE 13
+#define SCE_BAT_DEFAULT 0
+#define SCE_BAT_COMMENT 1
+#define SCE_BAT_WORD 2
+#define SCE_BAT_LABEL 3
+#define SCE_BAT_HIDE 4
+#define SCE_BAT_COMMAND 5
+#define SCE_BAT_IDENTIFIER 6
+#define SCE_BAT_OPERATOR 7
+#define SCE_MAKE_DEFAULT 0
+#define SCE_MAKE_COMMENT 1
+#define SCE_MAKE_PREPROCESSOR 2
+#define SCE_MAKE_IDENTIFIER 3
+#define SCE_MAKE_OPERATOR 4
+#define SCE_MAKE_TARGET 5
+#define SCE_MAKE_IDEOL 9
+#define SCE_CONF_DEFAULT 0
+#define SCE_CONF_COMMENT 1
+#define SCE_CONF_NUMBER 2
+#define SCE_CONF_IDENTIFIER 3
+#define SCE_CONF_EXTENSION 4
+#define SCE_CONF_PARAMETER 5
+#define SCE_CONF_STRING 6
+#define SCE_CONF_OPERATOR 7
+#define SCE_CONF_IP 8
+#define SCE_CONF_DIRECTIVE 9
+#define SCE_AVE_DEFAULT 0
+#define SCE_AVE_COMMENT 1
+#define SCE_AVE_NUMBER 2
+#define SCE_AVE_WORD 3
+#define SCE_AVE_KEYWORD 4
+#define SCE_AVE_STATEMENT 5
+#define SCE_AVE_STRING 6
+#define SCE_AVE_ENUM 7
+#define SCE_AVE_STRINGEOL 8
+#define SCE_AVE_IDENTIFIER 9
+#define SCE_AVE_OPERATOR 10
+#define SCE_ADA_DEFAULT 0
+#define SCE_ADA_COMMENT 1
+#define SCE_ADA_NUMBER 2
+#define SCE_ADA_WORD 3
+#define SCE_ADA_STRING 4
+#define SCE_ADA_CHARACTER 5
+#define SCE_ADA_OPERATOR 6
+#define SCE_ADA_IDENTIFIER 7
+#define SCE_ADA_STRINGEOL 8
+#define SCE_LISP_DEFAULT 0
+#define SCE_LISP_COMMENT 1
+#define SCE_LISP_NUMBER 2
+#define SCE_LISP_KEYWORD 3
+#define SCE_LISP_STRING 6
+#define SCE_LISP_STRINGEOL 8
+#define SCE_LISP_IDENTIFIER 9
+#define SCE_LISP_OPERATOR 10
+#define SCE_EIFFEL_DEFAULT 0
+#define SCE_EIFFEL_COMMENTLINE 1
+#define SCE_EIFFEL_NUMBER 2
+#define SCE_EIFFEL_WORD 3
+#define SCE_EIFFEL_STRING 4
+#define SCE_EIFFEL_CHARACTER 5
+#define SCE_EIFFEL_OPERATOR 6
+#define SCE_EIFFEL_IDENTIFIER 7
+#define SCE_EIFFEL_STRINGEOL 8
 //--Autogenerated -- end of section automatically generated from Scintilla.iface
 
 #endif
diff --git a/contrib/src/stc/scintilla/include/Scintilla.h b/contrib/src/stc/scintilla/include/Scintilla.h
index ca81d135bd..0185d3e5be 100644
--- a/contrib/src/stc/scintilla/include/Scintilla.h
+++ b/contrib/src/stc/scintilla/include/Scintilla.h
@@ -1,6 +1,8 @@
 // Scintilla source code edit control
-// Scintilla.h - interface to the edit control
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file Scintilla.h
+ ** Interface to the edit control.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 // Most of this file is automatically generated from the Scintilla.iface interface definition
@@ -18,7 +20,13 @@ void Scintilla_RegisterClasses(HINSTANCE hInstance);
 #endif
 #endif
 
-typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wParam, long lParam);
+// Here should be placed typedefs for uptr_t, an unsigned integer type large enough to
+// hold a pointer and sptr_t, a signed integer large enough to hold a pointer.
+// May need to be changed for 64 bit platforms.
+typedef unsigned long uptr_t;
+typedef long sptr_t;
+
+typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, sptr_t lParam);
 
 //++Autogenerated -- start of section automatically generated from Scintilla.iface
 #define INVALID_POSITION -1
@@ -50,15 +58,16 @@ typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wPara
 #define SCI_GETVIEWWS 2020
 #define SCI_SETVIEWWS 2021
 #define SCI_POSITIONFROMPOINT 2022
+#define SCI_POSITIONFROMPOINTCLOSE 2023
 #define SCI_GOTOLINE 2024
 #define SCI_GOTOPOS 2025
 #define SCI_SETANCHOR 2026
 #define SCI_GETCURLINE 2027
 #define SCI_GETENDSTYLED 2028
-#define SCI_CONVERTEOLS 2029
 #define SC_EOL_CRLF 0
 #define SC_EOL_CR 1
 #define SC_EOL_LF 2
+#define SCI_CONVERTEOLS 2029
 #define SCI_GETEOLMODE 2030
 #define SCI_SETEOLMODE 2031
 #define SCI_STARTSTYLING 2032
@@ -80,6 +89,24 @@ typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wPara
 #define SC_MARK_ARROWDOWN 6
 #define SC_MARK_MINUS 7
 #define SC_MARK_PLUS 8
+#define SC_MARK_VLINE 9
+#define SC_MARK_LCORNER 10
+#define SC_MARK_TCORNER 11
+#define SC_MARK_BOXPLUS 12
+#define SC_MARK_BOXPLUSCONNECTED 13
+#define SC_MARK_BOXMINUS 14
+#define SC_MARK_BOXMINUSCONNECTED 15
+#define SC_MARK_LCORNERCURVE 16
+#define SC_MARK_TCORNERCURVE 17
+#define SC_MARK_CIRCLEPLUS 18
+#define SC_MARK_CIRCLEPLUSCONNECTED 19
+#define SC_MARK_CIRCLEMINUS 20
+#define SC_MARK_CIRCLEMINUSCONNECTED 21
+#define SC_MARKNUM_FOLDEREND 25
+#define SC_MARKNUM_FOLDEROPENMID 26
+#define SC_MARKNUM_FOLDERMIDTAIL 27
+#define SC_MARKNUM_FOLDERTAIL 28
+#define SC_MARKNUM_FOLDERSUB 29
 #define SC_MARKNUM_FOLDER 30
 #define SC_MARKNUM_FOLDEROPEN 31
 #define SCI_MARKERDEFINE 2040
@@ -137,6 +164,10 @@ typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wPara
 #define SCI_STYLESETEOLFILLED 2057
 #define SCI_STYLERESETDEFAULT 2058
 #define SCI_STYLESETUNDERLINE 2059
+#define SC_CASE_MIXED 0
+#define SC_CASE_UPPER 1
+#define SC_CASE_LOWER 2
+#define SCI_STYLESETCASE 2060
 #define SCI_STYLESETCHARACTERSET 2066
 #define SCI_SETSELFORE 2067
 #define SCI_SETSELBACK 2068
@@ -170,6 +201,10 @@ typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wPara
 #define SCI_SETLINESTATE 2092
 #define SCI_GETLINESTATE 2093
 #define SCI_GETMAXLINESTATE 2094
+#define SCI_GETCARETLINEVISIBLE 2095
+#define SCI_SETCARETLINEVISIBLE 2096
+#define SCI_GETCARETLINEBACK 2097
+#define SCI_SETCARETLINEBACK 2098
 #define SCI_AUTOCSHOW 2100
 #define SCI_AUTOCCANCEL 2101
 #define SCI_AUTOCACTIVE 2102
@@ -186,6 +221,9 @@ typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wPara
 #define SCI_AUTOCGETCHOOSESINGLE 2114
 #define SCI_AUTOCSETIGNORECASE 2115
 #define SCI_AUTOCGETIGNORECASE 2116
+#define SCI_USERLISTSHOW 2117
+#define SCI_AUTOCSETAUTOHIDE 2118
+#define SCI_AUTOCGETAUTOHIDE 2119
 #define SCI_SETINDENT 2122
 #define SCI_GETINDENT 2123
 #define SCI_SETUSETABS 2124
@@ -215,9 +253,10 @@ typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wPara
 #define SC_PRINT_NORMAL 0
 #define SC_PRINT_INVERTLIGHT 1
 #define SC_PRINT_BLACKONWHITE 2
+#define SC_PRINT_COLOURONWHITE 3
+#define SC_PRINT_COLOURONWHITEDEFAULTBG 4
 #define SCI_SETPRINTCOLOURMODE 2148
 #define SCI_GETPRINTCOLOURMODE 2149
-#define SCFIND_DOWN 1
 #define SCFIND_WHOLEWORD 2
 #define SCFIND_MATCHCASE 4
 #define SCFIND_WORDSTART 0x00100000
@@ -260,6 +299,17 @@ typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wPara
 #define SCI_GETDIRECTPOINTER 2185
 #define SCI_SETOVERTYPE 2186
 #define SCI_GETOVERTYPE 2187
+#define SCI_SETCARETWIDTH 2188
+#define SCI_GETCARETWIDTH 2189
+#define SCI_SETTARGETSTART 2190
+#define SCI_GETTARGETSTART 2191
+#define SCI_SETTARGETEND 2192
+#define SCI_GETTARGETEND 2193
+#define SCI_REPLACETARGET 2194
+#define SCI_REPLACETARGETRE 2195
+#define SCI_SEARCHINTARGET 2197
+#define SCI_SETSEARCHFLAGS 2198
+#define SCI_GETSEARCHFLAGS 2199
 #define SCI_CALLTIPSHOW 2200
 #define SCI_CALLTIPCANCEL 2201
 #define SCI_CALLTIPACTIVE 2202
@@ -284,6 +334,14 @@ typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wPara
 #define SCI_TOGGLEFOLD 2231
 #define SCI_ENSUREVISIBLE 2232
 #define SCI_SETFOLDFLAGS 2233
+#define SCI_ENSUREVISIBLEENFORCEPOLICY 2234
+#define SCI_SETTABINDENTS 2260
+#define SCI_GETTABINDENTS 2261
+#define SCI_SETBACKSPACEUNINDENTS 2262
+#define SCI_GETBACKSPACEUNINDENTS 2263
+#define SC_TIME_FOREVER 10000000
+#define SCI_SETMOUSEDWELLTIME 2264
+#define SCI_GETMOUSEDWELLTIME 2265
 #define SCI_LINEDOWN 2300
 #define SCI_LINEDOWNEXTEND 2301
 #define SCI_LINEUP 2302
@@ -328,6 +386,7 @@ typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wPara
 #define SCI_UPPERCASE 2341
 #define SCI_LINESCROLLDOWN 2342
 #define SCI_LINESCROLLUP 2343
+#define SCI_MOVECARETINSIDEVIEW 2401
 #define SCI_LINELENGTH 2350
 #define SCI_BRACEHIGHLIGHT 2351
 #define SCI_BRACEBADLIGHT 2352
@@ -352,6 +411,8 @@ typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wPara
 #define CARET_SLOP 0x01
 #define CARET_CENTER 0x02
 #define CARET_STRICT 0x04
+#define CARET_XEVEN 0x08
+#define CARET_XJUMPS 0x10
 #define SCI_SETCARETPOLICY 2369
 #define SCI_LINESONSCREEN 2370
 #define SCI_USEPOPUP 2371
@@ -362,6 +423,25 @@ typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wPara
 #define SCI_ADDREFDOCUMENT 2376
 #define SCI_RELEASEDOCUMENT 2377
 #define SCI_GETMODEVENTMASK 2378
+#define SCI_SETFOCUS 2380
+#define SCI_GETFOCUS 2381
+#define SCI_SETSTATUS 2382
+#define SCI_GETSTATUS 2383
+#define SCI_SETMOUSEDOWNCAPTURES 2384
+#define SCI_GETMOUSEDOWNCAPTURES 2385
+#define SC_CURSORNORMAL -1
+#define SC_CURSORWAIT 3
+#define SCI_SETCURSOR 2386
+#define SCI_GETCURSOR 2387
+#define SCI_WORDPARTLEFT 2390
+#define SCI_WORDPARTLEFTEXTEND 2391
+#define SCI_WORDPARTRIGHT 2392
+#define SCI_WORDPARTRIGHTEXTEND 2393
+#define VISIBLE_SLOP 0x01
+#define VISIBLE_STRICT 0x04
+#define SCI_SETVISIBLEPOLICY 2394
+#define SCI_DELLINELEFT 2395
+#define SCI_DELLINERIGHT 2396
 #define SCI_GRABFOCUS 2400
 #define SCI_STARTRECORD 3001
 #define SCI_STOPRECORD 3002
@@ -370,6 +450,7 @@ typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wPara
 #define SCI_COLOURISE 4003
 #define SCI_SETPROPERTY 4004
 #define SCI_SETKEYWORDS 4005
+#define SCI_SETLEXERLANGUAGE 4006
 #define SC_MOD_INSERTTEXT 0x1
 #define SC_MOD_DELETETEXT 0x2
 #define SC_MOD_CHANGESTYLE 0x4
@@ -419,6 +500,11 @@ typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wPara
 #define SCN_MARGINCLICK 2010
 #define SCN_NEEDSHOWN 2011
 #define SCN_POSCHANGED 2012
+#define SCN_PAINTED 2013
+#define SCN_USERLISTSELECTION 2014
+#define SCN_URIDROPPED 2015
+#define SCN_DWELLSTART 2016
+#define SCN_DWELLEND 2017
 //--Autogenerated -- end of section automatically generated from Scintilla.iface
 
 // Optional module for macro recording
@@ -437,14 +523,14 @@ struct CharacterRange {
 };
 
 struct TextRange {
-	CharacterRange chrg;
+	struct CharacterRange chrg;
 	char *lpstrText;
 };
 
 struct TextToFind {
-	CharacterRange chrg;
+	struct CharacterRange chrg;
 	char *lpstrText;
-	CharacterRange chrgText;
+	struct CharacterRange chrgText;
 };
 
 #ifdef PLATFORM_H
@@ -463,8 +549,8 @@ struct RangeToFormat {
 #endif
 
 struct NotifyHeader {
-    // hwndFrom is really an environment specifc window handle or pointer
-    // but most clients of Scintilla.h do not have this type visible.
+	// hwndFrom is really an environment specifc window handle or pointer
+	// but most clients of Scintilla.h do not have this type visible.
 	//WindowID hwndFrom;
 	void *hwndFrom; 
 	unsigned int idFrom;
@@ -472,26 +558,35 @@ struct NotifyHeader {
 };
 
 struct SCNotification {
-	NotifyHeader nmhdr;
-	int position;			// SCN_STYLENEEDED, SCN_MODIFIED
-	int ch;					// SCN_CHARADDED, SCN_KEY
-	int modifiers;			// SCN_KEY
-  	int modificationType;	// SCN_MODIFIED
- 	const char *text;		// SCN_MODIFIED
- 	int length;				// SCN_MODIFIED
- 	int linesAdded;	// SCN_MODIFIED
+	struct NotifyHeader nmhdr;
+	int position;	// SCN_STYLENEEDED, SCN_MODIFIED, SCN_DWELLSTART, SCN_DWELLEND
+	int ch;		// SCN_CHARADDED, SCN_KEY
+	int modifiers;	// SCN_KEY
+	int modificationType;	// SCN_MODIFIED
+	const char *text;	// SCN_MODIFIED
+	int length;		// SCN_MODIFIED
+	int linesAdded;	// SCN_MODIFIED
 #ifdef MACRO_SUPPORT
 	int message;	// SCN_MACRORECORD
-	int wParam;	// SCN_MACRORECORD
-	int lParam;	// SCN_MACRORECORD
+	uptr_t wParam;	// SCN_MACRORECORD
+	sptr_t lParam;		// SCN_MACRORECORD
 #endif
-	int line;			// SCN_MODIFIED
+	int line;		// SCN_MODIFIED
 	int foldLevelNow;	// SCN_MODIFIED
 	int foldLevelPrev;	// SCN_MODIFIED
-	int margin;	// SCN_MARGINCLICK
+	int margin;		// SCN_MARGINCLICK
+	int listType;	// SCN_USERLISTSELECTION
+	int x;			// SCN_DWELLSTART, SCN_DWELLEND
+	int y;		// SCN_DWELLSTART, SCN_DWELLEND
 };
 
-#define SC_MASK_FOLDERS ((1<<SC_MARKNUM_FOLDER) | (1<<SC_MARKNUM_FOLDEROPEN))
+#define SC_MASK_FOLDERS ((1<<SC_MARKNUM_FOLDER) | \
+	(1<<SC_MARKNUM_FOLDEROPEN) | \
+	(1<<SC_MARKNUM_FOLDERSUB) | \
+	(1<<SC_MARKNUM_FOLDERTAIL) | \
+	(1<<SC_MARKNUM_FOLDERMIDTAIL) | \
+	(1<<SC_MARKNUM_FOLDEROPENMID) | \
+	(1<<SC_MARKNUM_FOLDEREND))
 
 // Deprecation section listing all API features that are deprecated and will
 // will be removed completely in a future version.
@@ -499,10 +594,6 @@ struct SCNotification {
 
 #ifdef INCLUDE_DEPRECATED_FEATURES
 
-// Deprecated in 1.27
-#define SC_UNDOCOLLECT_NONE 0
-#define SC_UNDOCOLLECT_AUTOSTART 1
-
 #endif
 
 #endif
diff --git a/contrib/src/stc/scintilla/include/Scintilla.iface b/contrib/src/stc/scintilla/include/Scintilla.iface
index 416063efa5..90360076fa 100644
--- a/contrib/src/stc/scintilla/include/Scintilla.iface
+++ b/contrib/src/stc/scintilla/include/Scintilla.iface
@@ -134,6 +134,10 @@ set void SetViewWS=2021(int viewWS,)
 # Find the position from a point within the window.
 fun int PositionFromPoint=2022(int x, int y)
 
+# 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)
+
 # Set caret to start of a line and ensure it is visible.
 fun void GotoLine=2024(int line,)
 
@@ -151,13 +155,13 @@ fun int GetCurLine=2027(int length, stringresult text)
 # Retrieve the position of the last correctly styled character.
 get position GetEndStyled=2028(,)
 
-# Convert all line endings in the document to use the current mode.
-fun void ConvertEOLs=2029(,)
-
 val SC_EOL_CRLF=0
 val SC_EOL_CR=1
 val SC_EOL_LF=2
 
+# Convert all line endings in the document to one mode.
+fun void ConvertEOLs=2029(int eolMode,)
+
 # Retrieve the current end of line mode - one of CRLF, CR, or LF.
 get int GetEOLMode=2030(,)
 
@@ -210,6 +214,27 @@ val SC_MARK_ARROWDOWN=6
 val SC_MARK_MINUS=7
 val SC_MARK_PLUS=8
 
+# Shapes used for outlining column
+val SC_MARK_VLINE=9
+val SC_MARK_LCORNER=10
+val SC_MARK_TCORNER=11
+val SC_MARK_BOXPLUS=12
+val SC_MARK_BOXPLUSCONNECTED=13
+val SC_MARK_BOXMINUS=14
+val SC_MARK_BOXMINUSCONNECTED=15
+val SC_MARK_LCORNERCURVE=16
+val SC_MARK_TCORNERCURVE=17
+val SC_MARK_CIRCLEPLUS=18
+val SC_MARK_CIRCLEPLUSCONNECTED=19
+val SC_MARK_CIRCLEMINUS=20
+val SC_MARK_CIRCLEMINUSCONNECTED=21
+
+# Markers used for outlining column
+val SC_MARKNUM_FOLDEREND=25
+val SC_MARKNUM_FOLDEROPENMID=26
+val SC_MARKNUM_FOLDERMIDTAIL=27
+val SC_MARKNUM_FOLDERTAIL=28
+val SC_MARKNUM_FOLDERSUB=29
 val SC_MARKNUM_FOLDER=30
 val SC_MARKNUM_FOLDEROPEN=31
 
@@ -327,6 +352,12 @@ fun void StyleResetDefault=2058(,)
 # Set a style to be underlined or not.
 set void StyleSetUnderline=2059(int style, bool underline)
 
+val SC_CASE_MIXED=0
+val SC_CASE_UPPER=1
+val SC_CASE_LOWER=2
+# Set a style to be mixed case, or to force upper or lower case.
+set void StyleSetCase=2060(int style, int caseForce)
+
 # Set the character set of the font in a style.
 set void StyleSetCharacterSet=2066(int style, int characterSet)
 
@@ -412,6 +443,18 @@ get int GetLineState=2093(int line,)
 # Retrieve the last line number that has line state.
 get int GetMaxLineState=2094(,)
 
+# Is the background of the line containing the caret in a different colour?
+get bool GetCaretLineVisible=2095(,)
+
+# Display the background of the line containing the caret in a different colour.
+set void SetCaretLineVisible=2096(bool show,)
+
+# Get the colour of the background of the line containing the caret.
+get colour GetCaretLineBack=2097(,)
+
+# Set the colour of the background of the line containing the caret.
+set void SetCaretLineBack=2098(colour back,)
+
 # Display a auto-completion list.
 # The lenEntered parameter indicates how many characters before
 # the caret should be used to provide context.
@@ -465,6 +508,15 @@ set void AutoCSetIgnoreCase=2115(bool ignoreCase,)
 # Retrieve state of ignore case flag.
 get bool AutoCGetIgnoreCase=2116(,)
 
+# Display a list of strings and send notification when user chooses one.
+fun void UserListShow=2117(int listType, string itemList)
+
+# Set whether or not autocompletion is hidden automatically when nothing matches
+set void AutoCSetAutoHide=2118(bool autoHide,)
+
+# Retrieve whether or not autocompletion is hidden automatically when nothing matches
+get bool AutoCGetAutoHide=2119(,)
+
 # Set the number of spaces used for one level of indentation.
 set void SetIndent=2122(int indentSize,)
 
@@ -551,6 +603,10 @@ val SC_PRINT_NORMAL=0
 val SC_PRINT_INVERTLIGHT=1
 # PrintColourMode - force black text on white background for printing.
 val SC_PRINT_BLACKONWHITE=2
+# PrintColourMode - text stays coloured, but all background is forced to be white for printing.
+val SC_PRINT_COLOURONWHITE=3
+# PrintColourMode - only the default-background is forced to be white for printing.
+val SC_PRINT_COLOURONWHITEDEFAULTBG=4
 
 # Modify colours when printing for clearer printed text.
 set void SetPrintColourMode=2148(int mode,)
@@ -558,11 +614,9 @@ set void SetPrintColourMode=2148(int mode,)
 # Returns the print colour mode.
 get int GetPrintColourMode=2149(,)
 
-val SCFIND_DOWN=1
 val SCFIND_WHOLEWORD=2
 val SCFIND_MATCHCASE=4
 val SCFIND_WORDSTART=0x00100000
-# SCFIND_REGEXP is not yet implemented.
 val SCFIND_REGEXP=0x00200000
 
 # Find some text in the document.
@@ -582,13 +636,13 @@ fun int GetLine=2153(int line, stringresult text)
 get int GetLineCount=2154(,)
 
 # Sets the size in pixels of the left margin.
-set void SetMarginLeft=2155(, int width)
+set void SetMarginLeft=2155(, int pixelWidth)
 
 # Returns the size in pixels of the left margin.
 get int GetMarginLeft=2156(,)
 
 # Sets the size in pixels of the right margin.
-set void SetMarginRight=2157(, int width)
+set void SetMarginRight=2157(, int pixelWidth)
 
 # Returns the size in pixels of the right margin.
 get int GetMarginRight=2158(,)
@@ -684,6 +738,48 @@ set void SetOvertype=2186(bool overtype,)
 # Returns true if overtype mode is active otherwise false is returned.
 get bool GetOvertype=2187(,)
 
+# Set the width of the insert mode caret
+set void SetCaretWidth=2188(int pixelWidth,)
+
+# Returns the width of the insert mode caret
+get int GetCaretWidth=2189(,)
+
+# Sets the position that starts the target which is used for updating the
+# document without affecting the scroll position.
+set void SetTargetStart=2190(position pos,)
+
+# Get the position that starts the target.
+get position GetTargetStart=2191(,)
+
+# Sets the position that ends the target which is used for updating the
+# document without affecting the scroll position.
+set void SetTargetEnd=2192(position pos,)
+
+# Get the position that ends the target.
+get position GetTargetEnd=2193(,)
+
+# Replace the target text with the argument text.
+# 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.
+# 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
+# caused by processing the \d patterns.
+fun int ReplaceTargetRE=2195(int length, string text)
+
+# Search for a counted string in the target and set the target to the found
+# range.
+# Returns length of range or -1 for failure in which case target is not moved.
+fun int SearchInTarget=2197(int length, string text)
+
+# Set the search flags used by SearchInTarget
+set void SetSearchFlags=2198(int flags,)
+
+# Get the search flags used by SearchInTarget
+get int GetSearchFlags=2199(,)
+
 # Show a call tip containing a definition near position pos.
 fun void CallTipShow=2200(position pos, string definition)
 
@@ -751,6 +847,30 @@ fun void EnsureVisible=2232(int line,)
 # Set some debugging options for folding
 fun void SetFoldFlags=2233(int flags,)
 
+# Ensure a particular line is visible by expanding any header line hiding it.
+# Use the currently set visibility policy to determine which range to display.
+fun void EnsureVisibleEnforcePolicy=2234(int line,)
+
+# Sets whether a tab pressed when caret is within indentation indents
+set void SetTabIndents=2260(bool tabIndents,)
+
+# Does a tab pressed when caret is within indentation indent?
+get bool GetTabIndents=2261(,)
+
+# Sets whether a backspace pressed when caret is within indentation unindents
+set void SetBackSpaceUnIndents=2262(bool bsUnIndents,)
+
+# Does a backspace pressed when caret is within indentation unindent?
+get bool GetBackSpaceUnIndents=2263(,)
+
+val SC_TIME_FOREVER=10000000
+
+# Sets the time the mouse must sit still to generate a mouse dwell event
+set void SetMouseDwellTime=2264(int periodMilliseconds,)
+
+# Retrieve the time the mouse must sit still to generate a mouse dwell event
+get int GetMouseDwellTime=2265(,)
+
 ## Start of key messages
 # Move caret down one line.
 fun void LineDown=2300(,)
@@ -887,6 +1007,9 @@ fun void LineScrollDown=2342(,)
 # Scroll the document up, keeping the caret visible.
 fun void LineScrollUp=2343(,)
 
+# Move the caret inside current view if it's not there already
+fun void MoveCaretInsideView=2401(,)
+
 # How many characters are on a line, not including end of line characters.
 fun int LineLength=2350(int line,)
 
@@ -909,7 +1032,7 @@ set void SetViewEOL=2356(bool visible,)
 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,)
@@ -942,18 +1065,28 @@ set void SetEdgeColour=2365(colour edgeColour,)
 fun void SearchAnchor=2366(,)
 
 # Find some text starting at the search anchor.
+# Does not ensure the selection is visible.
 fun int SearchNext=2367(int flags, string text)
 
 # Find some text starting at the search anchor and moving backwards.
+# Does not ensure the selection is visible.
 fun int SearchPrev=2368(int flags, string text)
 
 # Show caret within N lines of edge when it's scrolled to view
+# If CARET_SLOP not set then centre caret on screen when it's
+# scrolled to view
 val CARET_SLOP=0x01
-# Center caret on screen when it's scrolled to view
+# Value not used
 val CARET_CENTER=0x02
-# OR this with CARET_CENTER to reposition even when visible, or
-# OR this with CARET_SLOP to reposition whenever outside slop border
+# If CARET_SLOP also set then reposition whenever outside slop border
+# If CARET_SLOP not set then recentre even when visible
 val CARET_STRICT=0x04
+# If CARET_XEVEN set then both left and right margins are given equal weight
+# rather than favouring left following behaviour.
+val CARET_XEVEN=0x08
+# If CARET_XJUMPS set then when caret reaches the margin the display jumps
+# enough to leave the caret solidly within the display.
+val CARET_XJUMPS=0x10
 # Set the way the line the caret is on is kept visible.
 fun void SetCaretPolicy=2369(int caretPolicy, int caretSlop)
 
@@ -984,6 +1117,49 @@ fun void ReleaseDocument=2377(, int doc)
 # Get which document modification events are sent to the container.
 get int GetModEventMask=2378(,)
 
+# Change internal focus flag
+set void SetFocus=2380(bool focus,)
+# Get internal focus flag
+get bool GetFocus=2381(,)
+
+# Change error status - 0 = OK
+set void SetStatus=2382(int statusCode,)
+# Get error status
+get int GetStatus=2383(,)
+
+# Set whether the mouse is captured when its button is pressed
+set void SetMouseDownCaptures=2384(bool captures,)
+# Get whether mouse gets captured
+get bool GetMouseDownCaptures=2385(,)
+
+val SC_CURSORNORMAL=-1
+val SC_CURSORWAIT=3
+# Sets the cursor to one of the SC_CURSOR* values
+set void SetCursor=2386(int cursorType,)
+# Get cursor type
+get int GetCursor=2387(,)
+
+# Move to the previous change in capitalistion
+fun void WordPartLeft=2390(,)
+# Move to the previous change in capitalistion extending selection to new caret position.
+fun void WordPartLeftExtend=2391(,)
+# Move to the change next in capitalistion
+fun void WordPartRight=2392(,)
+# Move to the next change in capitalistion extending selection to new caret position.
+fun void WordPartRightExtend=2393(,)
+
+# Constants for use with SetVisiblePolicy, similar to SetCaretPolicy
+val VISIBLE_SLOP=0x01
+val VISIBLE_STRICT=0x04
+# Set the way the display area is determined when a particular line is to be moved to.
+fun void SetVisiblePolicy=2394(int visiblePolicy, int visibleSlop)
+
+# Delete back from the current position to the start of the line
+fun void DelLineLeft=2395(,)
+
+# Delete forwards from the current position to the end of the line
+fun void DelLineRight=2396(,)
+
 # Set the focus to this Scintilla widget.
 # GTK+ Specific
 fun void GrabFocus=2400(,)
@@ -1009,6 +1185,9 @@ set void SetProperty=4004(string key, string value)
 # Set up the key words used by the lexer.
 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)
+
 # Notifications
 # Type of modification and the action which caused the modification
 # These are defined as a bit mask to make it easy to specify which notifications are wanted.
@@ -1077,6 +1256,18 @@ val SCLEX_XCODE=13
 val SCLEX_LATEX=14
 val SCLEX_LUA=15
 val SCLEX_DIFF=16
+val SCLEX_CONF=17
+val SCLEX_PASCAL=18
+val SCLEX_AVE=19
+val SCLEX_ADA=20
+val SCLEX_LISP=21
+val SCLEX_RUBY=22
+val SCLEX_EIFFEL=23
+val SCLEX_EIFFELKW=24
+val SCLEX_TCL=25
+# When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
+# value assigned in sequence from SCLEX_AUTOMATIC+1.
+val SCLEX_AUTOMATIC=1000
 # Lexical states for SCLEX_PYTHON
 val SCE_P_DEFAULT=0
 val SCE_P_COMMENTLINE=1
@@ -1107,6 +1298,9 @@ val SCE_C_OPERATOR=10
 val SCE_C_IDENTIFIER=11
 val SCE_C_STRINGEOL=12
 val SCE_C_VERBATIM=13
+val SCE_C_REGEX=14
+val SCE_C_COMMENTLINEDOC=15
+val SCE_C_WORD2=16
 # Lexical states for SCLEX_HTML, SCLEX_XML
 val SCE_H_DEFAULT=0
 val SCE_H_TAG=1
@@ -1130,6 +1324,10 @@ val SCE_H_CDATA=17
 val SCE_H_QUESTION=18
 # More HTML
 val SCE_H_VALUE=19
+# X-Code
+val SCE_H_XCCOMMENT=20
+# SGML
+val SCE_H_SGML=21
 # Embedded Javascript
 val SCE_HJ_START=40
 val SCE_HJ_DEFAULT=41
@@ -1143,6 +1341,7 @@ val SCE_HJ_DOUBLESTRING=48
 val SCE_HJ_SINGLESTRING=49
 val SCE_HJ_SYMBOLS=50
 val SCE_HJ_STRINGEOL=51
+val SCE_HJ_REGEX=52
 # ASP Javascript
 val SCE_HJA_START=55
 val SCE_HJA_DEFAULT=56
@@ -1156,6 +1355,7 @@ val SCE_HJA_DOUBLESTRING=63
 val SCE_HJA_SINGLESTRING=64
 val SCE_HJA_SYMBOLS=65
 val SCE_HJA_STRINGEOL=66
+val SCE_HJA_REGEX=67
 # Embedded VBScript
 val SCE_HB_START=70
 val SCE_HB_DEFAULT=71
@@ -1211,10 +1411,11 @@ val SCE_HPHP_NUMBER=122
 val SCE_HPHP_VARIABLE=123
 val SCE_HPHP_COMMENT=124
 val SCE_HPHP_COMMENTLINE=125
-val SCE_HPHP_STRINGEOL=126
+val SCE_HPHP_HSTRING_VARIABLE=126
+val SCE_HPHP_OPERATOR=127
 # Lexical states for SCLEX_PERL
 val SCE_PL_DEFAULT=0
-val SCE_PL_HERE=1
+val SCE_PL_ERROR=1
 val SCE_PL_COMMENTLINE=2
 val SCE_PL_POD=3
 val SCE_PL_NUMBER=4
@@ -1229,12 +1430,20 @@ val SCE_PL_SCALAR=12
 val SCE_PL_ARRAY=13
 val SCE_PL_HASH=14
 val SCE_PL_SYMBOLTABLE=15
-val SCE_PL_REF=16
 val SCE_PL_REGEX=17
 val SCE_PL_REGSUBST=18
 val SCE_PL_LONGQUOTE=19
 val SCE_PL_BACKTICKS=20
 val SCE_PL_DATASECTION=21
+val SCE_PL_HERE_DELIM=22
+val SCE_PL_HERE_Q=23
+val SCE_PL_HERE_QQ=24
+val SCE_PL_HERE_QX=25
+val SCE_PL_STRING_Q=26
+val SCE_PL_STRING_QQ=27
+val SCE_PL_STRING_QX=28
+val SCE_PL_STRING_QR=29
+val SCE_PL_STRING_QW=30
 # Lexical states for SCLEX_LATEX
 val SCE_L_DEFAULT=0
 val SCE_L_COMMAND=1
@@ -1255,6 +1464,7 @@ val SCE_LUA_PREPROCESSOR=9
 val SCE_LUA_OPERATOR=10
 val SCE_LUA_IDENTIFIER=11
 val SCE_LUA_STRINGEOL=12
+# Lexical states for SCLEX_ERRORLIST
 val SCE_ERR_DEFAULT=0
 val SCE_ERR_PYTHON=1
 val SCE_ERR_GCC=2
@@ -1262,6 +1472,81 @@ val SCE_ERR_MS=3
 val SCE_ERR_CMD=4
 val SCE_ERR_BORLAND=5
 val SCE_ERR_PERL=6
+val SCE_ERR_NET=7
+val SCE_ERR_LUA=8
+val SCE_ERR_DIFF_CHANGED=10
+val SCE_ERR_DIFF_ADDITION=11
+val SCE_ERR_DIFF_DELETION=12
+val SCE_ERR_DIFF_MESSAGE=13
+# Lexical states for SCLEX_BATCH
+val SCE_BAT_DEFAULT=0
+val SCE_BAT_COMMENT=1
+val SCE_BAT_WORD=2
+val SCE_BAT_LABEL=3
+val SCE_BAT_HIDE=4
+val SCE_BAT_COMMAND=5
+val SCE_BAT_IDENTIFIER=6
+val SCE_BAT_OPERATOR=7
+# Lexical states for SCLEX_MAKEFILE
+val SCE_MAKE_DEFAULT=0
+val SCE_MAKE_COMMENT=1
+val SCE_MAKE_PREPROCESSOR=2
+val SCE_MAKE_IDENTIFIER=3
+val SCE_MAKE_OPERATOR=4
+val SCE_MAKE_TARGET=5
+val SCE_MAKE_IDEOL=9
+# Lexical states for the SCLEX_CONF (Apache Configuration Files Lexer)
+val SCE_CONF_DEFAULT=0
+val SCE_CONF_COMMENT=1
+val SCE_CONF_NUMBER=2
+val SCE_CONF_IDENTIFIER=3
+val SCE_CONF_EXTENSION=4
+val SCE_CONF_PARAMETER=5
+val SCE_CONF_STRING=6
+val SCE_CONF_OPERATOR=7
+val SCE_CONF_IP=8
+val SCE_CONF_DIRECTIVE=9
+# Avenue
+val SCE_AVE_DEFAULT=0
+val SCE_AVE_COMMENT=1
+val SCE_AVE_NUMBER=2
+val SCE_AVE_WORD=3
+val SCE_AVE_KEYWORD=4
+val SCE_AVE_STATEMENT=5
+val SCE_AVE_STRING=6
+val SCE_AVE_ENUM=7
+val SCE_AVE_STRINGEOL=8
+val SCE_AVE_IDENTIFIER=9
+val SCE_AVE_OPERATOR=10
+# Lexical states for SCLEX_ADA
+val SCE_ADA_DEFAULT=0
+val SCE_ADA_COMMENT=1
+val SCE_ADA_NUMBER=2
+val SCE_ADA_WORD=3
+val SCE_ADA_STRING=4
+val SCE_ADA_CHARACTER=5
+val SCE_ADA_OPERATOR=6
+val SCE_ADA_IDENTIFIER=7
+val SCE_ADA_STRINGEOL=8
+# Lexical states for SCLEX_LISP
+val SCE_LISP_DEFAULT=0
+val SCE_LISP_COMMENT=1
+val SCE_LISP_NUMBER=2
+val SCE_LISP_KEYWORD=3
+val SCE_LISP_STRING=6
+val SCE_LISP_STRINGEOL=8
+val SCE_LISP_IDENTIFIER=9
+val SCE_LISP_OPERATOR=10
+# Lexical states for SCLEX_EIFFEL and SCLEX_EIFFELKW
+val SCE_EIFFEL_DEFAULT=0
+val SCE_EIFFEL_COMMENTLINE=1
+val SCE_EIFFEL_NUMBER=2
+val SCE_EIFFEL_WORD=3
+val SCE_EIFFEL_STRING=4
+val SCE_EIFFEL_CHARACTER=5
+val SCE_EIFFEL_OPERATOR=6
+val SCE_EIFFEL_IDENTIFIER=7
+val SCE_EIFFEL_STRINGEOL=8
 
 # Events
 
@@ -1282,9 +1567,16 @@ evt void MacroRecord=2009(int message, int wParam, int lParam)
 evt void MarginClick=2010(int modifiers, int position, int margin)
 evt void NeedShown=2011(int position, int length)
 evt void PosChanged=2012(int position)
+evt void Painted=2013(void)
+evt void UserListSelection=2014(int listType, string text)
+evt void URIDropped=2015(string text)
+evt void DwellStart=2016(int position)
+evt void DwellEnd=2017(int position)
 
 cat Deprecated
 
+val SCFIND_DOWN=1
+
 ################################################
 # From WinDefs.h
 
diff --git a/contrib/src/stc/scintilla/include/ScintillaWidget.h b/contrib/src/stc/scintilla/include/ScintillaWidget.h
index 980557a2e7..f6c2fc3542 100644
--- a/contrib/src/stc/scintilla/include/ScintillaWidget.h
+++ b/contrib/src/stc/scintilla/include/ScintillaWidget.h
@@ -1,7 +1,9 @@
 // Scintilla source code edit control
-// ScintillaWidget.h - definition of Scintilla widget for GTK+
-// Only needed by GTK+ code but is harmless on other platforms.
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file ScintillaWidget.h
+ ** Definition of Scintilla widget for GTK+.
+ ** Only needed by GTK+ code but is harmless on other platforms.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef SCINTILLAWIDGET_H
@@ -9,6 +11,17 @@
 
 #if PLAT_GTK
 
+#ifndef SCINTILLA_H
+#ifdef _MSC_VER
+#pragma message(__FILE__ "(1) : warning : Scintilla.h should be included before ScintillaWidget.h")
+#pragma message("This will be required in the next version of Scintilla")
+#else
+#warning Scintilla.h should be included before ScintillaWidget.h
+#warning This will be required in the next version of Scintilla
+#endif
+#include "Scintilla.h"
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -21,7 +34,7 @@ typedef struct _ScintillaObject ScintillaObject;
 typedef struct _ScintillaClass  ScintillaClass;
 
 struct _ScintillaObject {
-	GtkFixed vbox;
+	GtkContainer cont;
 	void *pscin;
 };
 
@@ -35,7 +48,7 @@ struct _ScintillaClass {
 guint		scintilla_get_type	(void);
 GtkWidget*	scintilla_new		(void);
 void		scintilla_set_id	(ScintillaObject *sci,int id);
-long 		scintilla_send_message	(ScintillaObject *sci,int iMessage,int wParam,int lParam);
+sptr_t	scintilla_send_message	(ScintillaObject *sci,unsigned int iMessage, uptr_t wParam, sptr_t lParam);
 
 #ifdef __cplusplus
 }
diff --git a/contrib/src/stc/scintilla/include/WinDefs.h b/contrib/src/stc/scintilla/include/WinDefs.h
index c56f02d810..b3421c0bcc 100644
--- a/contrib/src/stc/scintilla/include/WinDefs.h
+++ b/contrib/src/stc/scintilla/include/WinDefs.h
@@ -1,11 +1,23 @@
 // Scintilla source code edit control
-// WinDefs.h - the subset of definitions from Windows needed by Scintilla for GTK+
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file WinDefs.h
+ ** The subset of definitions from Windows needed by Scintilla for GTK+.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef WINDEFS_H
 #define WINDEFS_H
 
+/* Running GTK version on win32 */
+#if PLAT_GTK_WIN32
+#include "Windows.h"
+#include "Richedit.h"
+
+/* Name conflicts */
+#undef DrawText
+#undef FindText
+#else
+
 #define WORD short
 #define WPARAM unsigned long
 #define LPARAM long
@@ -180,4 +192,6 @@ struct FORMATRANGE {
 //#define LOWORD(x) (x & 0xffff)
 //#define HIWORD(x) (x >> 16)
 
+#endif /* !_MSC_VER */
+
 #endif
diff --git a/contrib/src/stc/scintilla/include/WindowAccessor.h b/contrib/src/stc/scintilla/include/WindowAccessor.h
index 4f41dfc7ff..7fd8e30fd7 100644
--- a/contrib/src/stc/scintilla/include/WindowAccessor.h
+++ b/contrib/src/stc/scintilla/include/WindowAccessor.h
@@ -1,7 +1,13 @@
-// WindowAccessor.h - implementation of BufferAccess and StylingAccess on a Scintilla rapid easy access to contents of a Scintilla
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file WindowAccessor.h
+ ** Implementation of BufferAccess and StylingAccess on a Scintilla
+ ** rapid easy access to contents of a Scintilla.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
+/**
+ */
 class WindowAccessor : public Accessor {
 	// Private so WindowAccessor objects can not be copied
 	WindowAccessor(const WindowAccessor &source) : Accessor(), props(source.props) {}
@@ -36,6 +42,9 @@ public:
 	int GetPropertyInt(const char *key, int defaultValue=0) { 
 		return props.GetInt(key, defaultValue); 
 	}
+	char *GetProperties() {
+		return props.ToString();
+	}
 
 	void StartAt(unsigned int start, char chMask=31);
 	void SetFlags(char chFlags_, char chWhile_) {chFlags = chFlags_; chWhile = chWhile_; };
diff --git a/contrib/src/stc/scintilla/src/AutoComplete.cxx b/contrib/src/stc/scintilla/src/AutoComplete.cxx
index 5bc50d1efa..7f7412e43f 100644
--- a/contrib/src/stc/scintilla/src/AutoComplete.cxx
+++ b/contrib/src/stc/scintilla/src/AutoComplete.cxx
@@ -1,13 +1,17 @@
 // Scintilla source code edit control
-// AutoComplete.cxx - defines the auto completion list box
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file AutoComplete.cxx
+ ** Defines the auto completion list box.
+ **/
+// 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 <stdio.h>
 
 #include "Platform.h"
 
+#include "PropSet.h"
 #include "AutoComplete.h"
 
 AutoComplete::AutoComplete() : 
@@ -17,7 +21,8 @@ AutoComplete::AutoComplete() :
 	chooseSingle(false),
 	posStart(0),
 	startLen(0),
-	cancelAtStartPos(true) {
+	cancelAtStartPos(true),
+	autoHide(true) {
 	stopChars[0] = '\0';
 	fillUpChars[0] = '\0';
 }
@@ -85,7 +90,6 @@ void AutoComplete::SetList(const char *list) {
 		}
 		delete []words;
 	}
-	lb.Sort();
 }
 
 void AutoComplete::Show() {
@@ -113,9 +117,42 @@ void AutoComplete::Move(int delta) {
 }
 
 void AutoComplete::Select(const char *word) {
-	int pos = lb.Find(word);
-	//Platform::DebugPrintf("Autocompleting at <%s> %d\n", wordCurrent, pos);
-	if (pos != -1)
-		lb.Select(pos);
+	int lenWord = strlen(word);
+	int location = -1;
+	const int maxItemLen=1000;
+	char item[maxItemLen];
+	int start = 0; // lower bound of the api array block to search
+	int end = lb.Length() - 1; // upper bound of the api array block to search
+	while ((start <= end) && (location == -1)) { // Binary searching loop
+		int pivot = (start + end) / 2;
+		lb.GetValue(pivot, item, maxItemLen);
+		int cond;
+		if (ignoreCase)
+			cond = CompareNCaseInsensitive(word, item, lenWord);
+		else
+			cond = strncmp(word, item, lenWord);
+		if (!cond) {
+			// Find first match
+			while (pivot > start) {
+				lb.GetValue(pivot-1, item, maxItemLen);
+				if (ignoreCase)
+					cond = CompareNCaseInsensitive(word, item, lenWord);
+				else
+					cond = strncmp(word, item, lenWord);
+				if (0 != cond)
+					break;
+				--pivot;
+			}
+			location = pivot;
+		} else if (cond < 0) {
+			end = pivot - 1;
+		} else if (cond > 0) {
+			start = pivot + 1;
+		}
+	}
+	if (location == -1 && autoHide)
+		Cancel();
+	else
+		lb.Select(location);
 }
 
diff --git a/contrib/src/stc/scintilla/src/AutoComplete.h b/contrib/src/stc/scintilla/src/AutoComplete.h
index c1789ad7b6..79d4675291 100644
--- a/contrib/src/stc/scintilla/src/AutoComplete.h
+++ b/contrib/src/stc/scintilla/src/AutoComplete.h
@@ -1,56 +1,62 @@
 // Scintilla source code edit control
-// AutoComplete.h - defines the auto completion list box
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file AutoComplete.h
+ ** Defines the auto completion list box.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef AUTOCOMPLETE_H
 #define AUTOCOMPLETE_H
 
+/**
+ */
 class AutoComplete {
 	bool active;
 	char stopChars[256];
 	char fillUpChars[256];
 	char separator;
+
 public:
 	bool ignoreCase;
 	bool chooseSingle;
 	ListBox lb;
 	int posStart;
 	int startLen;
-	// Should autocompletion be canceled if editor's currentPos <= startPos?
+	/// Should autocompletion be canceled if editor's currentPos <= startPos?
 	bool cancelAtStartPos;
-	
+	bool autoHide;
+
 	AutoComplete();
 	~AutoComplete();
 
-	// Is the auto completion list displayed?	
+	/// Is the auto completion list displayed?
 	bool Active();
-	
-	// Display the auto completion list positioned to be near a character position
+
+	/// Display the auto completion list positioned to be near a character position
 	void Start(Window &parent, int ctrlID, int position, int startLen_);
-	
-	// The stop chars are characters which, when typed, cause the auto completion list to disappear
+
+	/// The stop chars are characters which, when typed, cause the auto completion list to disappear
 	void SetStopChars(const char *stopChars_);
 	bool IsStopChar(char ch);
-	
-	// The fillup chars are characters which, when typed, fill up the selected word
+
+	/// The fillup chars are characters which, when typed, fill up the selected word
 	void SetFillUpChars(const char *fillUpChars_);
 	bool IsFillUpChar(char ch);
 
-	// The separator character is used when interpreting the list in SetList
+	/// The separator character is used when interpreting the list in SetList
 	void SetSeparator(char separator_);
 	char GetSeparator();
-	
-	// The list string contains a sequence of words separated by the separator character
+
+	/// The list string contains a sequence of words separated by the separator character
 	void SetList(const char *list);
-	
+
 	void Show();
 	void Cancel();
-	
-	// Move the current list element by delta, scrolling appropriately
+
+	/// Move the current list element by delta, scrolling appropriately
 	void Move(int delta);
-	
-	// Select a list element that starts with word as the current element
+
+	/// Select a list element that starts with word as the current element
 	void Select(const char *word);
 };
 
diff --git a/contrib/src/stc/scintilla/src/CallTip.cxx b/contrib/src/stc/scintilla/src/CallTip.cxx
index d22a963645..3422de6969 100644
--- a/contrib/src/stc/scintilla/src/CallTip.cxx
+++ b/contrib/src/stc/scintilla/src/CallTip.cxx
@@ -1,10 +1,12 @@
 // Scintilla source code edit control
-// CallTip.cxx - code for displaying call tips
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file CallTip.cxx
+ ** Code for displaying call tips.
+ **/
+// 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 <stdlib.h>
+#include <string.h>
 
 #include "Platform.h"
 
@@ -27,6 +29,7 @@ CallTip::CallTip() {
 }
 
 CallTip::~CallTip() {
+	font.Release();
 	wCallTip.Destroy();
 	delete []val;
 	val = 0;
@@ -42,7 +45,7 @@ void CallTip::RefreshColourPalette(Palette &pal, bool want) {
 
 void CallTip::PaintCT(Surface *surfaceWindow) {
 	if (!val)
-		return;
+		return ;
 	PRectangle rcClientPos = wCallTip.GetClientPosition();
 	PRectangle rcClientSize(0, 0, rcClientPos.right - rcClientPos.left,
 	                        rcClientPos.bottom - rcClientPos.top);
@@ -117,7 +120,7 @@ PRectangle CallTip::CallTipStart(int pos, Point pt, const char *defn,
                                  const char *faceName, int size) {
 	Surface surfaceMeasure;
 	surfaceMeasure.Init();
-	int deviceHeight = (size * surfaceMeasure.LogPixelsY()) / 72;
+	int deviceHeight = surfaceMeasure.DeviceHeightFont(size);
 	font.Create(faceName, SC_CHARSET_DEFAULT, deviceHeight, false, false);
 	if (val)
 		delete []val;
@@ -146,10 +149,9 @@ PRectangle CallTip::CallTipStart(int pos, Point pt, const char *defn,
 	int lineHeight = surfaceMeasure.Height(font);
 	// Extra line for border and an empty line at top and bottom
 	int height = lineHeight * numLines - surfaceMeasure.InternalLeading(font) + 2 + 2;
-	return PRectangle(pt.x -5, pt.y + lineHeight + 1, pt.x + width - 5, pt.y + lineHeight + 1 + height);
+	return PRectangle(pt.x -5, pt.y + 1, pt.x + width - 5, pt.y + 1 + height);
 }
 
-
 void CallTip::CallTipCancel() {
 	inCallTipMode = false;
 	if (wCallTip.Created()) {
diff --git a/contrib/src/stc/scintilla/src/CallTip.h b/contrib/src/stc/scintilla/src/CallTip.h
index cb5bc29032..b38a4840ab 100644
--- a/contrib/src/stc/scintilla/src/CallTip.h
+++ b/contrib/src/stc/scintilla/src/CallTip.h
@@ -1,11 +1,15 @@
 // Scintilla source code edit control
-// CallTip.h - interface to the call tip control
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file CallTip.h
+ ** Interface to the call tip control.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef CALLTIP_H
 #define CALLTIP_H
 
+/**
+ */
 class CallTip {
 	int startHighlight;
 	int endHighlight;
@@ -14,6 +18,7 @@ class CallTip {
 	// Private so CallTip objects can not be copied
 	CallTip(const CallTip &) {}
 	CallTip &operator=(const CallTip &) { return *this; }
+
 public:
 	Window wCallTip;
 	Window wDraw;
@@ -28,19 +33,19 @@ public:
 	CallTip();
 	~CallTip();
 	
-	// Claim or accept palette entries for the colours required to paint a calltip
+	/// Claim or accept palette entries for the colours required to paint a calltip.
 	void RefreshColourPalette(Palette &pal, bool want);
 	
 	void PaintCT(Surface *surfaceWindow);
 	
-	// Setup the calltip and return a rectangle of the area required
+	/// Setup the calltip and return a rectangle of the area required.
 	PRectangle CallTipStart(int pos, Point pt, const char *defn, 
 		const char *faceName, int size);
 		
 	void CallTipCancel();
 	
-	// Set a range of characters to be displayed in a highlight style.
-	// Commonly used to highlight the current parameter.
+	/// Set a range of characters to be displayed in a highlight style.
+	/// Commonly used to highlight the current parameter.
 	void SetHighlight(int start, int end);
 };
 
diff --git a/contrib/src/stc/scintilla/src/CellBuffer.cxx b/contrib/src/stc/scintilla/src/CellBuffer.cxx
index befec75fc3..ecb5bc1801 100644
--- a/contrib/src/stc/scintilla/src/CellBuffer.cxx
+++ b/contrib/src/stc/scintilla/src/CellBuffer.cxx
@@ -1,6 +1,8 @@
 // Scintilla source code edit control
-// CellBuffer.cxx - manages a buffer of cells
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file CellBuffer.cxx
+ ** Manages a buffer of cells.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include <stdio.h>
@@ -416,22 +418,19 @@ UndoHistory::~UndoHistory() {
 }
 
 void UndoHistory::EnsureUndoRoom() {
-	//Platform::DebugPrintf("%% %d action %d %d %d\n", at, position, length, currentAction);
-	if (currentAction >= 2) {
-		// Have to test that there is room for 2 more actions in the array
-		// as two actions may be created by this function
-		if (currentAction >= (lenActions - 2)) {
-			// Run out of undo nodes so extend the array
-			int lenActionsNew = lenActions * 2;
-			Action *actionsNew = new Action[lenActionsNew];
-			if (!actionsNew)
-				return ;
-			for (int act = 0; act <= currentAction; act++)
-				actionsNew[act].Grab(&actions[act]);
-			delete []actions;
-			lenActions = lenActionsNew;
-			actions = actionsNew;
-		}
+	// Have to test that there is room for 2 more actions in the array
+	// as two actions may be created by the calling function
+	if (currentAction >= (lenActions - 2)) {
+		// Run out of undo nodes so extend the array
+		int lenActionsNew = lenActions * 2;
+		Action *actionsNew = new Action[lenActionsNew];
+		if (!actionsNew)
+			return ;
+		for (int act = 0; act <= currentAction; act++)
+			actionsNew[act].Grab(&actions[act]);
+		delete []actions;
+		lenActions = lenActionsNew;
+		actions = actionsNew;
 	}
 }
 
@@ -450,14 +449,27 @@ void UndoHistory::AppendAction(actionType at, int position, char *data, int leng
 				currentAction++;
 			} else if (currentAction == savePoint) {
 				currentAction++;
-			} else if ((at == removeAction) &&
-			           ((position + lengthData * 2) != actPrevious.position)) {
-				// Removals must be at same position to coalesce
-				currentAction++;
 			} else if ((at == insertAction) &&
 			           (position != (actPrevious.position + actPrevious.lenData*2))) {
 				// Insertions must be immediately after to coalesce
 				currentAction++;
+			} else if (!actions[currentAction].mayCoalesce) {
+				// Not allowed to coalesce if this set
+				currentAction++;
+			} else if (at == removeAction) {
+				if ((lengthData == 1) || (lengthData == 2)){
+					if ((position + lengthData * 2) == actPrevious.position) {
+						; // Backspace -> OK
+					} else if (position == actPrevious.position) {
+						; // Delete -> OK
+					} else {
+						// Removals must be at same position to coalesce
+						currentAction++;
+					}
+				} else {
+					// Removals must be of one character to coalesce
+					currentAction++;
+				}
 			} else {
 				//Platform::DebugPrintf("action coalesced\n");
 			}
@@ -582,6 +594,7 @@ CellBuffer::CellBuffer(int initialLength) {
 	part2body = body + gaplen;
 	readOnly = false;
 	collectingUndo = true;
+	growSize = 4000;
 }
 
 CellBuffer::~CellBuffer() {
@@ -612,7 +625,9 @@ void CellBuffer::RoomFor(int insertionLength) {
 	if (gaplen <= insertionLength) {
 		//Platform::DebugPrintf("need room %d %d\n", gaplen, insertionLength);
 		GapTo(length);
-		int newSize = size + insertionLength + 4000;
+		if (growSize * 6 < size)
+			growSize *= 2;
+		int newSize = size + insertionLength + growSize;
 		//Platform::DebugPrintf("moved gap %d\n", newSize);
 		char *newBody = new char[newSize];
 		memcpy(newBody, body, size);
@@ -733,6 +748,8 @@ bool CellBuffer::SetStyleAt(int position, char style, char mask) {
 bool CellBuffer::SetStyleFor(int position, int lengthStyle, char style, char mask) {
 	int bytePos = position * 2 + 1;
 	bool changed = false;
+	PLATFORM_ASSERT(lengthStyle == 0 ||
+		(lengthStyle > 0 && lengthStyle + position < length));
 	while (lengthStyle--) {
 		char curVal = ByteAt(bytePos);
 		if ((curVal & mask) != style) {
@@ -779,7 +796,7 @@ int CellBuffer::LineStart(int line) {
 	if (line < 0)
 		return 0;
 	else if (line > lv.lines)
-		return length;
+		return Length();
 	else
 		return lv.linesData[line].startPosition;
 }
@@ -930,7 +947,6 @@ void CellBuffer::BasicDeleteChars(int position, int deleteLength) {
 			ignoreNL = true; 	// First \n is not real deletion
 		}
 
-
 		char ch = chNext;
 		for (int i = 0; i < deleteLength; i += 2) {
 			chNext = ' ';
@@ -948,7 +964,6 @@ void CellBuffer::BasicDeleteChars(int position, int deleteLength) {
 				ignoreNL = false; 	// Further \n are not real deletions
 			}
 
-
 			ch = chNext;
 		}
 		// May have to fix up end if last deletion causes cr to be next to lf
diff --git a/contrib/src/stc/scintilla/src/CellBuffer.h b/contrib/src/stc/scintilla/src/CellBuffer.h
index 4a1ecb3989..b5c90f57a5 100644
--- a/contrib/src/stc/scintilla/src/CellBuffer.h
+++ b/contrib/src/stc/scintilla/src/CellBuffer.h
@@ -1,28 +1,35 @@
 // Scintilla source code edit control
-// CellBuffer.h - manages the text of the document
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file CellBuffer.h
+ ** Manages the text of the document.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef CELLBUFFER_H
 #define CELLBUFFER_H
 
-// This holds the marker identifier and the marker type to display.
-// MarkerHandleNumbers are members of lists.
+/**
+ * This holds the marker identifier and the marker type to display.
+ * MarkerHandleNumbers are members of lists.
+ */
 struct MarkerHandleNumber {
 	int handle;
 	int number;
 	MarkerHandleNumber *next;
 };
 
-// A marker handle set contains any number of MarkerHandleNumbers
+/**
+ * A marker handle set contains any number of MarkerHandleNumbers.
+ */
 class MarkerHandleSet {
 	MarkerHandleNumber *root;
+
 public:
 	MarkerHandleSet();
 	~MarkerHandleSet();
 	int Length();
 	int NumberFromHandle(int handle);
-	int MarkValue();	// Bit set of marker numbers
+	int MarkValue();	///< Bit set of marker numbers.
 	bool Contains(int handle);
 	bool InsertHandle(int handle, int markerNum);
 	void RemoveHandle(int handle);
@@ -30,8 +37,10 @@ public:
 	void CombineWith(MarkerHandleSet *other);
 };
 
-// Each line stores the starting position of the first character of the line in the cell buffer
-// and potentially a marker handle set. Often a line will not have any attached markers.
+/**
+ * Each line stores the starting position of the first character of the line in the cell buffer
+ * and potentially a marker handle set. Often a line will not have any attached markers.
+ */
 struct LineData {
 	int startPosition;
 	MarkerHandleSet *handleSet;
@@ -39,7 +48,9 @@ struct LineData {
 	}
 };
 
-// The line vector contains information about each of the lines in a cell buffer.
+/**
+ * The line vector contains information about each of the lines in a cell buffer.
+ */
 class LineVector {
 public:
 	enum { growSize = 4000 };
@@ -48,22 +59,22 @@ public:
 	int size;
 	int *levels;
 	int sizeLevels;
-	
-	// Handles are allocated sequentially and should never have to be reused as 32 bit ints are very big.
+
+	/// Handles are allocated sequentially and should never have to be reused as 32 bit ints are very big.
 	int handleCurrent;
-	
+
 	LineVector();
 	~LineVector();
 	void Init();
 
 	void Expand(int sizeNew);
 	void ExpandLevels(int sizeNew=-1);
-    void ClearLevels();
+	void ClearLevels();
 	void InsertValue(int pos, int value);
 	void SetValue(int pos, int value);
 	void Remove(int pos);
 	int LineFromPosition(int pos);
-	
+
 	int AddMark(int line, int marker);
 	void MergeMarkers(int pos);
 	void DeleteMark(int line, int markerNum);
@@ -71,9 +82,11 @@ public:
 	int LineFromHandle(int markerHandle);
 };
 
-// Actions are used to store all the information required to perform one undo/redo step.
 enum actionType { insertAction, removeAction, startAction };
 
+/**
+ * Actions are used to store all the information required to perform one undo/redo step.
+ */
 class Action {
 public:
 	actionType at;
@@ -89,6 +102,9 @@ public:
 	void Grab(Action *source);
 };
 
+/**
+ *
+ */
 class UndoHistory {
 	Action *actions;
 	int lenActions;
@@ -98,25 +114,25 @@ class UndoHistory {
 	int savePoint;
 
 	void EnsureUndoRoom();
-	
+
 public:
 	UndoHistory();
 	~UndoHistory();
-	
+
 	void AppendAction(actionType at, int position, char *data, int length);
 
 	void BeginUndoAction();
 	void EndUndoAction();
 	void DropUndoSequence();
 	void DeleteUndoHistory();
-	
-	// The save point is a marker in the undo stack where the container has stated that 
-	// the buffer was saved. Undo and redo can move over the save point.
+
+	/// The save point is a marker in the undo stack where the container has stated that
+	/// the buffer was saved. Undo and redo can move over the save point.
 	void SetSavePoint();
 	bool IsSavePoint() const;
 
-	// To perform an undo, StartUndo is called to retrieve the number of steps, then UndoStep is 
-	// called that many times. Similarly for redo.
+	/// To perform an undo, StartUndo is called to retrieve the number of steps, then UndoStep is
+	/// called that many times. Similarly for redo.
 	bool CanUndo() const;
 	int StartUndo();
 	const Action &GetUndoStep() const;
@@ -127,9 +143,11 @@ public:
 	void CompletedRedoStep();
 };
 
-// Holder for an expandable array of characters that supports undo and line markers
-// Based on article "Data Structures in a Bit-Mapped Text Editor"
-// by Wilfred J. Hansen, Byte January 1987, page 183
+/**
+ * Holder for an expandable array of characters that supports undo and line markers.
+ * Based on article "Data Structures in a Bit-Mapped Text Editor"
+ * by Wilfred J. Hansen, Byte January 1987, page 183.
+ */
 class CellBuffer {
 private:
 	char *body;
@@ -139,6 +157,7 @@ private:
 	int gaplen;
 	char *part2body;
 	bool readOnly;
+	int growSize;
 
 	bool collectingUndo;
 	UndoHistory uh;
@@ -157,12 +176,12 @@ public:
 
 	CellBuffer(int initialLength = 4000);
 	~CellBuffer();
-	
-	// Retrieving positions outside the range of the buffer works and returns 0
+
+	/// Retrieving positions outside the range of the buffer works and returns 0
 	char CharAt(int position);
 	void GetCharRange(char *buffer, int position, int lengthRetrieve);
 	char StyleAt(int position);
-	
+
 	int ByteLength();
 	int Length();
 	int Lines();
@@ -170,23 +189,23 @@ public:
 	int LineFromPosition(int pos) { return lv.LineFromPosition(pos); }
 	const char *InsertString(int position, char *s, int insertLength);
 	void InsertCharStyle(int position, char ch, char style);
-	
-	// Setting styles for positions outside the range of the buffer is safe and has no effect.
-	// True is returned if the style of a character changed.
+
+	/// Setting styles for positions outside the range of the buffer is safe and has no effect.
+	/// @return true if the style of a character is changed.
 	bool SetStyleAt(int position, char style, char mask='\377');
 	bool SetStyleFor(int position, int length, char style, char mask);
-	
+
 	const char *DeleteChars(int position, int deleteLength);
 
 	bool IsReadOnly();
 	void SetReadOnly(bool set);
 
-	// The save point is a marker in the undo stack where the container has stated that 
-	// the buffer was saved. Undo and redo can move over the save point.
+	/// The save point is a marker in the undo stack where the container has stated that
+	/// the buffer was saved. Undo and redo can move over the save point.
 	void SetSavePoint();
 	bool IsSavePoint();
 
-	// Line marker functions
+	/// Line marker functions
 	int AddMark(int line, int markerNum);
 	void DeleteMark(int line, int markerNum);
 	void DeleteMarkFromHandle(int markerHandle);
@@ -194,7 +213,7 @@ public:
 	void DeleteAllMarks(int markerNum);
 	int LineFromHandle(int markerHandle);
  
-	// Without undo
+	/// Actions without undo
 	void BasicInsertString(int position, char *s, int insertLength);
 	void BasicDeleteChars(int position, int deleteLength);
 
@@ -203,9 +222,9 @@ public:
 	void BeginUndoAction();
 	void EndUndoAction();
 	void DeleteUndoHistory();
-	
-	// To perform an undo, StartUndo is called to retrieve the number of steps, then UndoStep is 
-	// called that many times. Similarly for redo.
+
+	/// To perform an undo, StartUndo is called to retrieve the number of steps, then UndoStep is
+	/// called that many times. Similarly for redo.
 	bool CanUndo();
 	int StartUndo();
 	const Action &GetUndoStep() const;
@@ -214,14 +233,14 @@ public:
 	int StartRedo();
 	const Action &GetRedoStep() const;
 	void PerformRedoStep();
-	
+
 	int SetLineState(int line, int state);
 	int GetLineState(int line);
 	int GetMaxLineState();
-		
+
 	int SetLevel(int line, int level);
 	int GetLevel(int line);
-    void ClearLevels();
+	void ClearLevels();
 };
 
 #define CELL_SIZE	2
diff --git a/contrib/src/stc/scintilla/src/ContractionState.cxx b/contrib/src/stc/scintilla/src/ContractionState.cxx
index 0558b4c365..1f14696650 100644
--- a/contrib/src/stc/scintilla/src/ContractionState.cxx
+++ b/contrib/src/stc/scintilla/src/ContractionState.cxx
@@ -1,6 +1,8 @@
 // Scintilla source code edit control
-// ContractionState.cxx - manages visibility of lines for folding
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file ContractionState.cxx
+ ** Manages visibility of lines for folding.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include "Platform.h"
diff --git a/contrib/src/stc/scintilla/src/ContractionState.h b/contrib/src/stc/scintilla/src/ContractionState.h
index 2c344efeea..0d7881c7b2 100644
--- a/contrib/src/stc/scintilla/src/ContractionState.h
+++ b/contrib/src/stc/scintilla/src/ContractionState.h
@@ -1,15 +1,19 @@
 // Scintilla source code edit control
-// ContractionState.h - manages visibility of lines for folding
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file ContractionState.h
+ ** Manages visibility of lines for folding.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef CONTRACTIONSTATE_H
 #define CONTRACTIONSTATE_H
 
+/**
+ */
 class OneLine {
 public:
-	int displayLine;	// position within set of visible lines
-	int docLine;		// inverse of displayLine
+	int displayLine;	///< Position within set of visible lines
+	int docLine;		///< Inverse of @a displayLine
 	bool visible;
 	bool expanded;
 	
@@ -17,6 +21,8 @@ public:
 	virtual ~OneLine() {}
 };
 
+/**
+ */
 class ContractionState {
 	void Grow(int sizeNew);
 	enum { growSize = 4000 };
@@ -26,6 +32,7 @@ class ContractionState {
 	int size;
 	mutable bool valid;
 	void MakeValid() const;
+
 public:
 	ContractionState();
 	virtual ~ContractionState();
diff --git a/contrib/src/stc/scintilla/src/Document.cxx b/contrib/src/stc/scintilla/src/Document.cxx
index c883dd253f..10403242b9 100644
--- a/contrib/src/stc/scintilla/src/Document.cxx
+++ b/contrib/src/stc/scintilla/src/Document.cxx
@@ -1,6 +1,8 @@
 // Scintilla source code edit control
-// Document.cxx - text document that handles notifications, DBCS, styling, words and end of line
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file Document.cxx
+ ** Text document that handles notifications, DBCS, styling, words and end of line.
+ **/
+// 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>
@@ -14,6 +16,12 @@
 #include "SVector.h"
 #include "CellBuffer.h"
 #include "Document.h"
+#include "RESearch.h"
+
+// This is ASCII specific but is safe with chars >= 0x80
+inline bool isspacechar(unsigned char ch) {
+	return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d));
+}
 
 Document::Document() {
 	refCount = 0;
@@ -25,7 +33,6 @@ Document::Document() {
 	dbcsCodePage = 0;
 	stylingBits = 5;
 	stylingBitsMask = 0x1F;
-	stylingPos = 0;
 	stylingMask = 0;
 	for (int ch = 0; ch < 256; ch++) {
 		wordchars[ch] = isalnum(ch) || ch == '_';
@@ -36,8 +43,14 @@ Document::Document() {
 	tabInChars = 8;
 	indentInChars = 0;
 	useTabs = true;
+	tabIndents = true;
+	backspaceUnindents = false;
 	watchers = 0;
 	lenWatchers = 0;
+
+	matchesValid = false;
+	pre = 0;
+	substituted = 0;
 }
 
 Document::~Document() {
@@ -47,6 +60,10 @@ Document::~Document() {
 	delete []watchers;
 	watchers = 0;
 	lenWatchers = 0;
+	delete pre;
+	pre = 0;
+	delete []substituted;
+	substituted = 0;
 }
 
 // Increase reference count and return its previous value.
@@ -68,27 +85,27 @@ void Document::SetSavePoint() {
 	NotifySavePoint(true);
 }
 
-int Document::AddMark(int line, int markerNum) { 
-	int prev = cb.AddMark(line, markerNum); 
+int Document::AddMark(int line, int markerNum) {
+	int prev = cb.AddMark(line, markerNum);
 	DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0);
 	NotifyModified(mh);
 	return prev;
 }
 
-void Document::DeleteMark(int line, int markerNum) { 
-	cb.DeleteMark(line, markerNum); 
+void Document::DeleteMark(int line, int markerNum) {
+	cb.DeleteMark(line, markerNum);
 	DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0);
 	NotifyModified(mh);
 }
 
-void Document::DeleteMarkFromHandle(int markerHandle) { 
-	cb.DeleteMarkFromHandle(markerHandle); 
+void Document::DeleteMarkFromHandle(int markerHandle) {
+	cb.DeleteMarkFromHandle(markerHandle);
 	DocModification mh(SC_MOD_CHANGEMARKER, 0, 0, 0, 0);
 	NotifyModified(mh);
 }
 
-void Document::DeleteAllMarks(int markerNum) { 
-	cb.DeleteAllMarks(markerNum); 
+void Document::DeleteAllMarks(int markerNum) {
+	cb.DeleteAllMarks(markerNum);
 	DocModification mh(SC_MOD_CHANGEMARKER, 0, 0, 0, 0);
 	NotifyModified(mh);
 }
@@ -131,10 +148,11 @@ int Document::VCHomePosition(int position) {
 		return startText;
 }
 
-int Document::SetLevel(int line, int level) { 
-	int prev = cb.SetLevel(line, level); 
+int Document::SetLevel(int line, int level) {
+	int prev = cb.SetLevel(line, level);
 	if (prev != level) {
-		DocModification mh(SC_MOD_CHANGEFOLD, LineStart(line), 0, 0, 0);
+		DocModification mh(SC_MOD_CHANGEFOLD | SC_MOD_CHANGEMARKER,
+		                   LineStart(line), 0, 0, 0);
 		mh.line = line;
 		mh.foldLevelNow = level;
 		mh.foldLevelPrev = prev;
@@ -146,7 +164,7 @@ int Document::SetLevel(int line, int level) {
 static bool IsSubordinate(int levelStart, int levelTry) {
 	if (levelTry & SC_FOLDLEVELWHITEFLAG)
 		return true;
-	else 
+	else
 		return (levelStart & SC_FOLDLEVELNUMBERMASK) < (levelTry & SC_FOLDLEVELNUMBERMASK);
 }
 
@@ -155,16 +173,16 @@ int Document::GetLastChild(int lineParent, int level) {
 		level = GetLevel(lineParent) & SC_FOLDLEVELNUMBERMASK;
 	int maxLine = LinesTotal();
 	int lineMaxSubord = lineParent;
-	while (lineMaxSubord < maxLine-1) {
-		EnsureStyledTo(LineStart(lineMaxSubord+2));
-		if (!IsSubordinate(level, GetLevel(lineMaxSubord+1)))
+	while (lineMaxSubord < maxLine - 1) {
+		EnsureStyledTo(LineStart(lineMaxSubord + 2));
+		if (!IsSubordinate(level, GetLevel(lineMaxSubord + 1)))
 			break;
 		lineMaxSubord++;
 	}
 	if (lineMaxSubord > lineParent) {
-		if (level > (GetLevel(lineMaxSubord+1) & SC_FOLDLEVELNUMBERMASK)) {
-			// Have chewed up some whitespace that belongs to a parent so seek back 
-			if ((lineMaxSubord > lineParent) && (GetLevel(lineMaxSubord) & SC_FOLDLEVELWHITEFLAG)) {
+		if (level > (GetLevel(lineMaxSubord + 1) & SC_FOLDLEVELNUMBERMASK)) {
+			// Have chewed up some whitespace that belongs to a parent so seek back
+			if (GetLevel(lineMaxSubord) & SC_FOLDLEVELWHITEFLAG) {
 				lineMaxSubord--;
 			}
 		}
@@ -174,15 +192,15 @@ int Document::GetLastChild(int lineParent, int level) {
 
 int Document::GetFoldParent(int line) {
 	int level = GetLevel(line);
-	int lineLook = line-1;
+	int lineLook = line - 1;
 	while ((lineLook > 0) && (
-		(!(GetLevel(lineLook) & SC_FOLDLEVELHEADERFLAG)) || 
-		((GetLevel(lineLook) & SC_FOLDLEVELNUMBERMASK) >= level))
-	) {
+	            (!(GetLevel(lineLook) & SC_FOLDLEVELHEADERFLAG)) ||
+	            ((GetLevel(lineLook) & SC_FOLDLEVELNUMBERMASK) >= level))
+	      ) {
 		lineLook--;
 	}
 	if ((GetLevel(lineLook) & SC_FOLDLEVELHEADERFLAG) &&
-		((GetLevel(lineLook) & SC_FOLDLEVELNUMBERMASK) < level)) {
+	        ((GetLevel(lineLook) & SC_FOLDLEVELNUMBERMASK) < level)) {
 		return lineLook;
 	} else {
 		return -1;
@@ -241,12 +259,12 @@ int Document::LenChar(int pos) {
 		if (ch < 0x80)
 			return 1;
 		int len = 2;
-		if (ch >= (0x80+0x40+0x20))
+		if (ch >= (0x80 + 0x40 + 0x20))
 			len = 3;
 		int lengthDoc = Length();
 		if ((pos + len) > lengthDoc)
-			return lengthDoc-pos;
-		else 
+			return lengthDoc -pos;
+		else
 			return len;
 	} else if (IsDBCS(pos)) {
 		return 2;
@@ -292,7 +310,7 @@ int Document::MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd) {
 				// ch is a trail byte
 				if (moveDir > 0)
 					pos++;
-				else 
+				else
 					pos--;
 				ch = static_cast<unsigned char>(cb.CharAt(pos));
 			}
@@ -314,6 +332,7 @@ int Document::MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd) {
 				//Platform::DebugPrintf("DBCS %s\n", atlead ? "D" : "-");
 			}
 
+
 			if (atLeadByte) {
 				// Position is between a lead byte and a trail byte
 				if (moveDir > 0)
@@ -338,9 +357,9 @@ void Document::ModifiedAt(int pos) {
 
 // Unlike Undo, Redo, and InsertStyledString, the pos argument is a cell number not a char number
 void Document::DeleteChars(int pos, int len) {
-    if ((pos + len) > Length())
-        return;
-	if (cb.IsReadOnly() && enteredReadOnlyCount==0) {
+	if ((pos + len) > Length())
+		return ;
+	if (cb.IsReadOnly() && enteredReadOnlyCount == 0) {
 		enteredReadOnlyCount++;
 		NotifyModifyAttempt();
 		enteredReadOnlyCount--;
@@ -349,28 +368,31 @@ void Document::DeleteChars(int pos, int len) {
 		enteredCount++;
 		if (!cb.IsReadOnly()) {
 			NotifyModified(
-                DocModification(
-                    SC_MOD_BEFOREDELETE | SC_PERFORMED_USER, 
-                    pos, len, 
-                    0, 0));
+			    DocModification(
+			        SC_MOD_BEFOREDELETE | SC_PERFORMED_USER,
+			        pos, len,
+			        0, 0));
 			int prevLinesTotal = LinesTotal();
 			bool startSavePoint = cb.IsSavePoint();
-			const char *text = cb.DeleteChars(pos*2, len * 2);
+			const char *text = cb.DeleteChars(pos * 2, len * 2);
 			if (startSavePoint && cb.IsCollectingUndo())
 				NotifySavePoint(!startSavePoint);
-			ModifiedAt(pos);
+			if ((pos < Length()) || (pos == 0))
+				ModifiedAt(pos);
+			else
+				ModifiedAt(pos-1);
 			NotifyModified(
-                DocModification(
-                    SC_MOD_DELETETEXT | SC_PERFORMED_USER, 
-                    pos, len, 
-                    LinesTotal() - prevLinesTotal, text));
+			    DocModification(
+			        SC_MOD_DELETETEXT | SC_PERFORMED_USER,
+			        pos, len,
+			        LinesTotal() - prevLinesTotal, text));
 		}
 		enteredCount--;
 	}
 }
 
 void Document::InsertStyledString(int position, char *s, int insertLength) {
-	if (cb.IsReadOnly() && enteredReadOnlyCount==0) {
+	if (cb.IsReadOnly() && enteredReadOnlyCount == 0) {
 		enteredReadOnlyCount++;
 		NotifyModifyAttempt();
 		enteredReadOnlyCount--;
@@ -379,10 +401,10 @@ void Document::InsertStyledString(int position, char *s, int insertLength) {
 		enteredCount++;
 		if (!cb.IsReadOnly()) {
 			NotifyModified(
-                DocModification(
-                    SC_MOD_BEFOREINSERT | SC_PERFORMED_USER, 
-                    position / 2, insertLength / 2, 
-                    0, 0));
+			    DocModification(
+			        SC_MOD_BEFOREINSERT | SC_PERFORMED_USER,
+			        position / 2, insertLength / 2,
+			        0, 0));
 			int prevLinesTotal = LinesTotal();
 			bool startSavePoint = cb.IsSavePoint();
 			const char *text = cb.InsertString(position, s, insertLength);
@@ -390,10 +412,10 @@ void Document::InsertStyledString(int position, char *s, int insertLength) {
 				NotifySavePoint(!startSavePoint);
 			ModifiedAt(position / 2);
 			NotifyModified(
-                DocModification(
-                    SC_MOD_INSERTTEXT | SC_PERFORMED_USER, 
-                    position / 2, insertLength / 2, 
-                    LinesTotal() - prevLinesTotal, text));
+			    DocModification(
+			        SC_MOD_INSERTTEXT | SC_PERFORMED_USER,
+			        position / 2, insertLength / 2,
+			        LinesTotal() - prevLinesTotal, text));
 		}
 		enteredCount--;
 	}
@@ -406,21 +428,21 @@ int Document::Undo() {
 		bool startSavePoint = cb.IsSavePoint();
 		int steps = cb.StartUndo();
 		//Platform::DebugPrintf("Steps=%d\n", steps);
-		for (int step=0; step<steps; step++) {
+		for (int step = 0; step < steps; step++) {
 			int prevLinesTotal = LinesTotal();
 			const Action &action = cb.GetUndoStep();
 			if (action.at == removeAction) {
-			    NotifyModified(DocModification(
-                    SC_MOD_BEFOREINSERT | SC_PERFORMED_UNDO, action));
-            } else {
-			    NotifyModified(DocModification(
-                    SC_MOD_BEFOREDELETE | SC_PERFORMED_UNDO, action));
-            }
+				NotifyModified(DocModification(
+				                   SC_MOD_BEFOREINSERT | SC_PERFORMED_UNDO, action));
+			} else {
+				NotifyModified(DocModification(
+				                   SC_MOD_BEFOREDELETE | SC_PERFORMED_UNDO, action));
+			}
 			cb.PerformUndoStep();
 			int cellPosition = action.position / 2;
 			ModifiedAt(cellPosition);
 			newPos = cellPosition;
-			
+
 			int modFlags = SC_PERFORMED_UNDO;
 			// With undo, an insertion action becomes a deletion notification
 			if (action.at == removeAction) {
@@ -429,12 +451,12 @@ int Document::Undo() {
 			} else {
 				modFlags |= SC_MOD_DELETETEXT;
 			}
-			if (step == steps-1)
+			if (step == steps - 1)
 				modFlags |= SC_LASTSTEPINUNDOREDO;
-			NotifyModified(DocModification(modFlags, cellPosition, action.lenData, 
-				LinesTotal() - prevLinesTotal, action.data));
+			NotifyModified(DocModification(modFlags, cellPosition, action.lenData,
+			                               LinesTotal() - prevLinesTotal, action.data));
 		}
-	
+
 		bool endSavePoint = cb.IsSavePoint();
 		if (startSavePoint != endSavePoint)
 			NotifySavePoint(endSavePoint);
@@ -449,20 +471,20 @@ int Document::Redo() {
 		enteredCount++;
 		bool startSavePoint = cb.IsSavePoint();
 		int steps = cb.StartRedo();
-		for (int step=0; step<steps; step++) {
+		for (int step = 0; step < steps; step++) {
 			int prevLinesTotal = LinesTotal();
 			const Action &action = cb.GetRedoStep();
 			if (action.at == insertAction) {
-			    NotifyModified(DocModification(
-                    SC_MOD_BEFOREINSERT | SC_PERFORMED_REDO, action));
-            } else {
-			    NotifyModified(DocModification(
-                    SC_MOD_BEFOREDELETE | SC_PERFORMED_REDO, action));
-            }
+				NotifyModified(DocModification(
+				                   SC_MOD_BEFOREINSERT | SC_PERFORMED_REDO, action));
+			} else {
+				NotifyModified(DocModification(
+				                   SC_MOD_BEFOREDELETE | SC_PERFORMED_REDO, action));
+			}
 			cb.PerformRedoStep();
 			ModifiedAt(action.position / 2);
 			newPos = action.position / 2;
-			
+
 			int modFlags = SC_PERFORMED_REDO;
 			if (action.at == insertAction) {
 				newPos += action.lenData;
@@ -470,13 +492,13 @@ int Document::Redo() {
 			} else {
 				modFlags |= SC_MOD_DELETETEXT;
 			}
-			if (step == steps-1)
+			if (step == steps - 1)
 				modFlags |= SC_LASTSTEPINUNDOREDO;
 			NotifyModified(
-                DocModification(modFlags, action.position / 2, action.lenData, 
-				LinesTotal() - prevLinesTotal, action.data));
+			    DocModification(modFlags, action.position / 2, action.lenData,
+			                    LinesTotal() - prevLinesTotal, action.data));
 		}
-	
+
 		bool endSavePoint = cb.IsSavePoint();
 		if (startSavePoint != endSavePoint)
 			NotifySavePoint(endSavePoint);
@@ -526,7 +548,7 @@ int Document::DelCharBack(int pos) {
 		DeleteChars(pos - 2, 2);
 		return pos - 2;
 	} else if (SC_CP_UTF8 == dbcsCodePage) {
-		int startChar = MovePositionOutsideChar(pos-1, -1, false);
+		int startChar = MovePositionOutsideChar(pos - 1, -1, false);
 		DeleteChars(startChar, pos - startChar);
 		return startChar;
 	} else if (IsDBCS(pos - 1)) {
@@ -568,13 +590,13 @@ int Document::GetLineIndentation(int line) {
 	if ((line >= 0) && (line < LinesTotal())) {
 		int lineStart = LineStart(line);
 		int length = Length();
-		for (int i=lineStart;i<length;i++) {
+		for (int i = lineStart;i < length;i++) {
 			char ch = cb.CharAt(i);
 			if (ch == ' ')
 				indent++;
 			else if (ch == '\t')
 				indent = NextTab(indent, tabInChars);
-			else 
+			else
 				return indent;
 		}
 	}
@@ -596,8 +618,8 @@ void Document::SetLineIndentation(int line, int indent) {
 }
 
 int Document::GetLineIndentPosition(int line) {
-    if (line < 0)
-        return 0;
+	if (line < 0)
+		return 0;
 	int pos = LineStart(line);
 	int length = Length();
 	while ((pos < length) && isindentchar(cb.CharAt(pos))) {
@@ -610,7 +632,7 @@ int Document::GetColumn(int pos) {
 	int column = 0;
 	int line = LineFromPosition(pos);
 	if ((line >= 0) && (line < LinesTotal())) {
-		for (int i=LineStart(line);i<pos;i++) {
+		for (int i = LineStart(line);i < pos;i++) {
 			char ch = cb.CharAt(i);
 			if (ch == '\t')
 				column = NextTab(column, tabInChars);
@@ -640,7 +662,7 @@ void Document::ConvertLineEnds(int eolModeSet) {
 	BeginUndoAction();
 	for (int pos = 0; pos < Length(); pos++) {
 		if (cb.CharAt(pos) == '\r') {
-			if (cb.CharAt(pos+1) == '\n') {
+			if (cb.CharAt(pos + 1) == '\n') {
 				if (eolModeSet != SC_EOL_CRLF) {
 					DeleteChars(pos, 2);
 					if (eolModeSet == SC_EOL_CR)
@@ -677,7 +699,7 @@ void Document::ConvertLineEnds(int eolModeSet) {
 }
 
 bool Document::IsWordChar(unsigned char ch) {
-	if ((SC_CP_UTF8 == dbcsCodePage) && (ch >0x80))
+	if ((SC_CP_UTF8 == dbcsCodePage) && (ch > 0x80))
 		return true;
 	return wordchars[ch];
 }
@@ -697,19 +719,19 @@ int Document::NextWordStart(int pos, int delta) {
 	if (delta < 0) {
 		while (pos > 0 && (cb.CharAt(pos - 1) == ' ' || cb.CharAt(pos - 1) == '\t'))
 			pos--;
-		if (isspace(cb.CharAt(pos - 1))) {	// Back up to previous line
-			while (pos > 0 && isspace(cb.CharAt(pos - 1)))
+		if (isspacechar(cb.CharAt(pos - 1))) {	// Back up to previous line
+			while (pos > 0 && isspacechar(cb.CharAt(pos - 1)))
 				pos--;
 		} else {
 			bool startAtWordChar = IsWordChar(cb.CharAt(pos - 1));
-			while (pos > 0 && !isspace(cb.CharAt(pos - 1)) && (startAtWordChar == IsWordChar(cb.CharAt(pos - 1))))
+			while (pos > 0 && !isspacechar(cb.CharAt(pos - 1)) && (startAtWordChar == IsWordChar(cb.CharAt(pos - 1))))
 				pos--;
 		}
 	} else {
 		bool startAtWordChar = IsWordChar(cb.CharAt(pos));
-		while (pos < (Length()) && isspace(cb.CharAt(pos)))
+		while (pos < (Length()) && isspacechar(cb.CharAt(pos)))
 			pos++;
-		while (pos < (Length()) && !isspace(cb.CharAt(pos)) && (startAtWordChar == IsWordChar(cb.CharAt(pos))))
+		while (pos < (Length()) && !isspacechar(cb.CharAt(pos)) && (startAtWordChar == IsWordChar(cb.CharAt(pos))))
 			pos++;
 		while (pos < (Length()) && (cb.CharAt(pos) == ' ' || cb.CharAt(pos) == '\t'))
 			pos++;
@@ -717,6 +739,10 @@ int Document::NextWordStart(int pos, int delta) {
 	return pos;
 }
 
+/**
+ * Check that the character before the given position
+ * is not a word character.
+ */
 bool Document::IsWordStartAt(int pos) {
 	if (pos > 0) {
 		return !IsWordChar(CharAt(pos - 1));
@@ -724,6 +750,10 @@ bool Document::IsWordStartAt(int pos) {
 	return true;
 }
 
+/**
+ * Check that the character after the given position
+ * is not a word character.
+ */
 bool Document::IsWordEndAt(int pos) {
 	if (pos < Length() - 1) {
 		return !IsWordChar(CharAt(pos));
@@ -731,74 +761,233 @@ bool Document::IsWordEndAt(int pos) {
 	return true;
 }
 
+/**
+ * Check that the given range is delimited by
+ * non word characters.
+ */
 bool Document::IsWordAt(int start, int end) {
 	return IsWordStartAt(start) && IsWordEndAt(end);
 }
 
-// Find text in document, supporting both forward and backward
-// searches (just pass minPos > maxPos to do a backward search)
-// Has not been tested with backwards DBCS searches yet.
-long Document::FindText(int minPos, int maxPos, const char *s, 
-	bool caseSensitive, bool word, bool wordStart) {
- 	bool forward = minPos <= maxPos;
-	int increment = forward ? 1 : -1;
-
-	// Range endpoints should not be inside DBCS characters, but just in case, move them.
-	int startPos = MovePositionOutsideChar(minPos, increment, false);
-	int endPos = MovePositionOutsideChar(maxPos, increment, false);
- 	
-	// Compute actual search ranges needed
-	int lengthFind = strlen(s);
- 	int endSearch = endPos;
- 	if (startPos <= endPos) {
- 		endSearch = endPos - lengthFind + 1;
- 	}
-	//Platform::DebugPrintf("Find %d %d %s %d\n", startPos, endPos, ft->lpstrText, lengthFind);
-	char firstChar = s[0];
-	if (!caseSensitive)
-		firstChar = static_cast<char>(toupper(firstChar));
-	int pos = startPos;
-	while (forward ? (pos < endSearch) : (pos >= endSearch)) {
-		char ch = CharAt(pos);
-		if (caseSensitive) {
-			if (ch == firstChar) {
-				bool found = true;
-				for (int posMatch = 1; posMatch < lengthFind && found; posMatch++) {
-					ch = CharAt(pos + posMatch);
-					if (ch != s[posMatch])
-						found = false;
-				}
-				if (found) {
-					if ((!word && !wordStart) ||
-						word && IsWordAt(pos, pos + lengthFind) ||
-						wordStart && IsWordStartAt(pos))
- 						return pos;
-				}
-			}
+// The comparison and case changing functions here assume ASCII
+// or extended ASCII such as the normal Windows code page.
+
+static inline char MakeUpperCase(char ch) {
+	if (ch < 'a' || ch > 'z')
+		return ch;
+	else
+		return static_cast<char>(ch - 'a' + 'A');
+}
+
+static inline char MakeLowerCase(char ch) {
+	if (ch < 'A' || ch > 'Z')
+		return ch;
+	else
+		return static_cast<char>(ch - 'A' + 'a');
+}
+
+// Define a way for the Regular Expression code to access the document
+class DocumentIndexer : public CharacterIndexer {
+	Document *pdoc;
+	int end;
+public:
+DocumentIndexer(Document *pdoc_, int end_) :
+	pdoc(pdoc_), end(end_) {}
+
+	virtual char CharAt(int index) {
+		if (index < 0 || index >= end)
+			return 0;
+		else
+			return pdoc->CharAt(index);
+	}
+};
+
+/**
+ * Find text in document, supporting both forward and backward
+ * searches (just pass minPos > maxPos to do a backward search)
+ * Has not been tested with backwards DBCS searches yet.
+ */
+long Document::FindText(int minPos, int maxPos, const char *s,
+                        bool caseSensitive, bool word, bool wordStart, bool regExp,
+                        int *length) {
+	if (regExp) {
+		if (!pre)
+			pre = new RESearch();
+		if (!pre)
+			return -1;
+
+		int startPos;
+		int endPos;
+
+		if (minPos <= maxPos) {
+			startPos = minPos;
+			endPos = maxPos;
 		} else {
-			if (toupper(ch) == firstChar) {
-				bool found = true;
-				for (int posMatch = 1; posMatch < lengthFind && found; posMatch++) {
-					ch = CharAt(pos + posMatch);
-					if (toupper(ch) != toupper(s[posMatch]))
-						found = false;
+			startPos = maxPos;
+			endPos = minPos;
+		}
+
+		// Range endpoints should not be inside DBCS characters, but just in case, move them.
+		startPos = MovePositionOutsideChar(startPos, 1, false);
+		endPos = MovePositionOutsideChar(endPos, 1, false);
+
+		const char *errmsg = pre->Compile(s, *length, caseSensitive);
+		if (errmsg) {
+			return -1;
+		}
+		// Find a variable in a property file: \$(\([A-Za-z0-9_.]+\))
+		// Replace first '.' with '-' in each property file variable reference:
+		//     Search: \$(\([A-Za-z0-9_-]+\)\.\([A-Za-z0-9_.]+\))
+		//     Replace: $(\1-\2)
+		int lineRangeStart = LineFromPosition(startPos);
+		int lineRangeEnd = LineFromPosition(endPos);
+		if ((startPos >= LineEnd(lineRangeStart)) && (lineRangeStart < lineRangeEnd)) {
+			// the start position is at end of line or between line end characters.
+			lineRangeStart++;
+			startPos = LineStart(lineRangeStart);
+		}
+		int pos = -1;
+		int lenRet = 0;
+		char searchEnd = s[*length - 1];
+		if (*length == 1) {
+			// These produce empty selections so nudge them on if needed
+			if (s[0] == '^') {
+				if (startPos == LineStart(lineRangeStart))
+					startPos++;
+			} else if (s[0] == '$') {
+				if ((startPos == LineEnd(lineRangeStart)) && (lineRangeStart < lineRangeEnd))
+					startPos = LineStart(lineRangeStart + 1);
+			}
+			lineRangeStart = LineFromPosition(startPos);
+			lineRangeEnd = LineFromPosition(endPos);
+		}
+		for (int line = lineRangeStart; line <= lineRangeEnd; line++) {
+			int startOfLine = LineStart(line);
+			int endOfLine = LineEnd(line);
+			if (line == lineRangeStart) {
+				if ((startPos != startOfLine) && (s[0] == '^'))
+					continue;	// Can't match start of line if start position after start of line
+				startOfLine = startPos;
+			}
+			if (line == lineRangeEnd) {
+				if ((endPos != endOfLine) && (searchEnd == '$'))
+					continue;	// Can't match end of line if end position before end of line
+				endOfLine = endPos;
+			}
+			DocumentIndexer di(this, endOfLine);
+			int success = pre->Execute(di, startOfLine, endOfLine);
+			if (success) {
+				pos = pre->bopat[0];
+				lenRet = pre->eopat[0] - pre->bopat[0];
+				break;
+			}
+		}
+		*length = lenRet;
+		return pos;
+
+	} else {
+
+		bool forward = minPos <= maxPos;
+		int increment = forward ? 1 : -1;
+
+		// Range endpoints should not be inside DBCS characters, but just in case, move them.
+		int startPos = MovePositionOutsideChar(minPos, increment, false);
+		int endPos = MovePositionOutsideChar(maxPos, increment, false);
+
+		// Compute actual search ranges needed
+		int lengthFind = *length;
+		if (lengthFind == -1)
+			lengthFind = strlen(s);
+		int endSearch = endPos;
+		if (startPos <= endPos) {
+			endSearch = endPos - lengthFind + 1;
+		}
+		//Platform::DebugPrintf("Find %d %d %s %d\n", startPos, endPos, ft->lpstrText, lengthFind);
+		char firstChar = s[0];
+		if (!caseSensitive)
+			firstChar = static_cast<char>(MakeUpperCase(firstChar));
+		int pos = startPos;
+		while (forward ? (pos < endSearch) : (pos >= endSearch)) {
+			char ch = CharAt(pos);
+			if (caseSensitive) {
+				if (ch == firstChar) {
+					bool found = true;
+					for (int posMatch = 1; posMatch < lengthFind && found; posMatch++) {
+						ch = CharAt(pos + posMatch);
+						if (ch != s[posMatch])
+							found = false;
+					}
+					if (found) {
+						if ((!word && !wordStart) ||
+						        word && IsWordAt(pos, pos + lengthFind) ||
+						        wordStart && IsWordStartAt(pos))
+							return pos;
+					}
 				}
-				if (found) {
-					if (!(word && wordStart) ||
-						word && IsWordAt(pos, pos + lengthFind) ||
-						wordStart && IsWordStartAt(pos))
- 						return pos;
+			} else {
+				if (MakeUpperCase(ch) == firstChar) {
+					bool found = true;
+					for (int posMatch = 1; posMatch < lengthFind && found; posMatch++) {
+						ch = CharAt(pos + posMatch);
+						if (MakeUpperCase(ch) != MakeUpperCase(s[posMatch]))
+							found = false;
+					}
+					if (found) {
+						if ((!word && !wordStart) ||
+						        word && IsWordAt(pos, pos + lengthFind) ||
+						        wordStart && IsWordStartAt(pos))
+							return pos;
+					}
 				}
 			}
-		}
-		pos += increment;
-		if (dbcsCodePage) {
-			// Ensure trying to match from start of character
-			pos = MovePositionOutsideChar(pos, increment, false);
+			pos += increment;
+			if (dbcsCodePage) {
+				// Ensure trying to match from start of character
+				pos = MovePositionOutsideChar(pos, increment, false);
+			}
 		}
 	}
 	//Platform::DebugPrintf("Not found\n");
-	return - 1;
+	return -1;
+}
+
+const char *Document::SubstituteByPosition(const char *text, int *length) {
+	if (!pre)
+		return 0;
+	delete []substituted;
+	substituted = 0;
+	DocumentIndexer di(this, Length());
+	if (!pre->GrabMatches(di))
+		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++;
+		} else {
+			lenResult++;
+		}
+	}
+	substituted = new char[lenResult + 1];
+	if (!substituted)
+		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++;
+		} else {
+			*o++ = text[j];
+		}
+	}
+	*o = '\0';
+	*length = lenResult;
+	return substituted;
 }
 
 int Document::LinesTotal() {
@@ -806,18 +995,18 @@ int Document::LinesTotal() {
 }
 
 void Document::ChangeCase(Range r, bool makeUpperCase) {
-	for (int pos=r.start; pos<r.end; pos++) {
+	for (int pos = r.start; pos < r.end; pos++) {
 		char ch = CharAt(pos);
 		if (dbcsCodePage && IsDBCS(pos)) {
 			pos += LenChar(pos);
 		} else {
 			if (makeUpperCase) {
 				if (islower(ch)) {
-					ChangeChar(pos, static_cast<char>(toupper(ch)));
+					ChangeChar(pos, static_cast<char>(MakeUpperCase(ch)));
 				}
 			} else {
 				if (isupper(ch)) {
-					ChangeChar(pos, static_cast<char>(tolower(ch)));
+					ChangeChar(pos, static_cast<char>(MakeLowerCase(ch)));
 				}
 			}
 		}
@@ -844,28 +1033,27 @@ void Document::SetWordChars(unsigned char *chars) {
 void Document::SetStylingBits(int bits) {
 	stylingBits = bits;
 	stylingBitsMask = 0;
-	for (int bit=0; bit<stylingBits; bit++) {
+	for (int bit = 0; bit < stylingBits; bit++) {
 		stylingBitsMask <<= 1;
 		stylingBitsMask |= 1;
 	}
 }
 
 void Document::StartStyling(int position, char mask) {
-	stylingPos = position;
 	stylingMask = mask;
+	endStyled = position;
 }
 
 void Document::SetStyleFor(int length, char style) {
 	if (enteredCount == 0) {
 		enteredCount++;
 		int prevEndStyled = endStyled;
-		if (cb.SetStyleFor(stylingPos, length, style, stylingMask)) {
-			DocModification mh(SC_MOD_CHANGESTYLE | SC_PERFORMED_USER, 
-				prevEndStyled, length);
+		if (cb.SetStyleFor(endStyled, length, style, stylingMask)) {
+			DocModification mh(SC_MOD_CHANGESTYLE | SC_PERFORMED_USER,
+			                   prevEndStyled, length);
 			NotifyModified(mh);
 		}
-		stylingPos += length;
-		endStyled = stylingPos;
+		endStyled += length;
 		enteredCount--;
 	}
 }
@@ -875,15 +1063,14 @@ void Document::SetStyles(int length, char *styles) {
 		enteredCount++;
 		int prevEndStyled = endStyled;
 		bool didChange = false;
-		for (int iPos = 0; iPos < length; iPos++, stylingPos++) {
-			if (cb.SetStyleAt(stylingPos, styles[iPos], stylingMask)) {
+		for (int iPos = 0; iPos < length; iPos++, endStyled++) {
+			if (cb.SetStyleAt(endStyled, styles[iPos], stylingMask)) {
 				didChange = true;
 			}
 		}
-		endStyled = stylingPos;
 		if (didChange) {
-			DocModification mh(SC_MOD_CHANGESTYLE | SC_PERFORMED_USER, 
-				prevEndStyled, endStyled - prevEndStyled);
+			DocModification mh(SC_MOD_CHANGESTYLE | SC_PERFORMED_USER,
+			                   prevEndStyled, endStyled - prevEndStyled);
 			NotifyModified(mh);
 		}
 		enteredCount--;
@@ -958,3 +1145,85 @@ void Document::NotifyModified(DocModification mh) {
 		watchers[i].watcher->NotifyModified(this, mh, watchers[i].userData);
 	}
 }
+
+bool Document::IsWordPartSeparator(char ch) {
+	return ispunct(ch) && IsWordChar(ch);
+}
+
+int Document::WordPartLeft(int pos) {
+	if (pos > 0) {
+		--pos;
+		char startChar = cb.CharAt(pos);
+		if (IsWordPartSeparator(startChar)) {
+			while (pos > 0 && IsWordPartSeparator(cb.CharAt(pos))) {
+				--pos;
+			}
+		}
+		if (pos > 0) {
+			startChar = cb.CharAt(pos);
+			--pos;
+			if (islower(startChar)) {
+				while (pos > 0 && islower(cb.CharAt(pos)))
+					--pos;
+				if (!isupper(cb.CharAt(pos)) && !islower(cb.CharAt(pos)))
+					++pos;
+			} else if (isupper(startChar)) {
+				while (pos > 0 && isupper(cb.CharAt(pos)))
+					--pos;
+				if (!isupper(cb.CharAt(pos)))
+					++pos;
+			} else if (isdigit(startChar)) {
+				while (pos > 0 && isdigit(cb.CharAt(pos)))
+					--pos;
+				if (!isdigit(cb.CharAt(pos)))
+					++pos;
+			} else if (ispunct(startChar)) {
+				while (pos > 0 && ispunct(cb.CharAt(pos)))
+					--pos;
+				if (!ispunct(cb.CharAt(pos)))
+					++pos;
+			} else if (isspacechar(startChar)) {
+				while (pos > 0 && isspacechar(cb.CharAt(pos)))
+					--pos;
+				if (!isspacechar(cb.CharAt(pos)))
+					++pos;
+			}
+		}
+	}
+	return pos;
+}
+
+int Document::WordPartRight(int pos) {
+	char startChar = cb.CharAt(pos);
+	int length = Length();
+	if (IsWordPartSeparator(startChar)) {
+		while (pos < length && IsWordPartSeparator(cb.CharAt(pos)))
+			++pos;
+		startChar = cb.CharAt(pos);
+	}
+	if (islower(startChar)) {
+		while (pos < length && islower(cb.CharAt(pos)))
+			++pos;
+	} else if (isupper(startChar)) {
+		if (islower(cb.CharAt(pos + 1))) {
+			++pos;
+			while (pos < length && islower(cb.CharAt(pos)))
+				++pos;
+		} else {
+			while (pos < length && isupper(cb.CharAt(pos)))
+				++pos;
+		}
+		if (islower(cb.CharAt(pos)) && isupper(cb.CharAt(pos - 1)))
+			--pos;
+	} else if (isdigit(startChar)) {
+		while (pos < length && isdigit(cb.CharAt(pos)))
+			++pos;
+	} else if (ispunct(startChar)) {
+		while (pos < length && ispunct(cb.CharAt(pos)))
+			++pos;
+	} else if (isspacechar(startChar)) {
+		while (pos < length && isspacechar(cb.CharAt(pos)))
+			++pos;
+	}
+	return pos;
+}
diff --git a/contrib/src/stc/scintilla/src/Document.h b/contrib/src/stc/scintilla/src/Document.h
index af477dd79b..394c8f94b0 100644
--- a/contrib/src/stc/scintilla/src/Document.h
+++ b/contrib/src/stc/scintilla/src/Document.h
@@ -1,36 +1,42 @@
 // Scintilla source code edit control
-// Document.h - text document that handles notifications, DBCS, styling, words and end of line
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file Document.h
+ ** Text document that handles notifications, DBCS, styling, words and end of line.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef DOCUMENT_H
 #define DOCUMENT_H
 
-// A Position is a position within a document between two characters or at the beginning or end.
-// Sometimes used as a character index where it identifies the character after the position.
+/**
+ * A Position is a position within a document between two characters or at the beginning or end.
+ * Sometimes used as a character index where it identifies the character after the position.
+ */
 typedef int Position;
 const Position invalidPosition = -1;
 
-// The range class represents a range of text in a document.
-// The two values are not sorted as one end may be more significant than the other
-// as is the case for the selection where the end position is the position of the caret.
-// If either position is invalidPosition then the range is invalid and most operations will fail.
+/**
+ * The range class represents a range of text in a document.
+ * The two values are not sorted as one end may be more significant than the other
+ * as is the case for the selection where the end position is the position of the caret.
+ * If either position is invalidPosition then the range is invalid and most operations will fail.
+ */
 class Range {
 public:
 	Position start;
 	Position end;
-	
+
 	Range(Position pos=0) : 
 		start(pos), end(pos) {
 	};
 	Range(Position start_, Position end_) : 
 		start(start_), end(end_) {
 	};
-	
+
 	bool Valid() const {
 		return (start != invalidPosition) && (end != invalidPosition);
 	}
-	
+
 	bool Contains(Position pos) const {
 		if (start < end) {
 			return (pos >= start && pos <= end);
@@ -38,11 +44,11 @@ public:
 			return (pos <= start && pos >= end);
 		}
 	}
-	
+
 	bool Contains(Range other) const {
 		return Contains(other.start) && Contains(other.end);
 	}
-	
+
 	bool Overlaps(Range other) const {
 		return 
 		Contains(other.start) ||
@@ -54,11 +60,14 @@ public:
 
 class DocWatcher;
 class DocModification;
+class RESearch;
 
+/**
+ */
 class Document {
 
 public:
-	// Used to pair watcher pointer with user data
+	/** Used to pair watcher pointer with user data. */
 	class WatcherWithUserData {
 	public:
 		DocWatcher *watcher;
@@ -68,37 +77,42 @@ public:
 			userData = 0;
 		}
 	};
-	
+
 private:	
 	int refCount;
 	CellBuffer cb;
 	bool wordchars[256];
-	int stylingPos;
 	char stylingMask;
 	int endStyled;
 	int enteredCount;
 	int enteredReadOnlyCount;
-	
+
 	WatcherWithUserData *watchers;
 	int lenWatchers;
-	
+
+	bool matchesValid;
+	RESearch *pre;
+	char *substituted;
+
 public:
 	int stylingBits;
 	int stylingBitsMask;
-	
+
 	int eolMode;
-	// dbcsCodePage can also be SC_CP_UTF8 to enable UTF-8 mode
+	/// Can also be SC_CP_UTF8 to enable UTF-8 mode
 	int dbcsCodePage;
 	int tabInChars;
 	int indentInChars;
 	bool useTabs;
-	
+	bool tabIndents;
+	bool backspaceUnindents;
+
 	Document();
 	virtual ~Document();
-	
+
 	int AddRef();
 	int Release();
- 	
+
 	int LineFromPosition(int pos);
 	int ClampPositionIntoDocument(int pos);
 	bool IsCrLf(int pos);
@@ -165,12 +179,13 @@ public:
 	int NextWordStart(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 caseSensitive, bool word, bool wordStart, bool regExp, int *length);
 	long FindText(int iMessage, unsigned long wParam, long lParam);
+	const char *SubstituteByPosition(const char *text, int *length);
 	int LinesTotal();
-	
+
 	void ChangeCase(Range r, bool makeUpperCase);
-	
+
 	void SetWordChars(unsigned char *chars);
 	void SetStylingBits(int bits);
 	void StartStyling(int position, char mask);
@@ -182,12 +197,16 @@ public:
 	int SetLineState(int line, int state) { return cb.SetLineState(line, state); }
 	int GetLineState(int line) { return cb.GetLineState(line); }
 	int GetMaxLineState() { return cb.GetMaxLineState(); }
-		
+
 	bool AddWatcher(DocWatcher *watcher, void *userData);
 	bool RemoveWatcher(DocWatcher *watcher, void *userData);
 	const WatcherWithUserData *GetWatchers() const { return watchers; }
 	int GetLenWatchers() const { return lenWatchers; }
-	
+
+	bool IsWordPartSeparator(char ch);
+	int WordPartLeft(int pos);
+	int WordPartRight(int pos);
+
 private:
 	bool IsDBCS(int pos);
 	bool IsWordChar(unsigned char ch);
@@ -195,24 +214,26 @@ private:
 	bool IsWordEndAt(int pos);
 	bool IsWordAt(int start, int end);
 	void ModifiedAt(int pos);
-	
+
 	void NotifyModifyAttempt();
 	void NotifySavePoint(bool atSavePoint);
 	void NotifyModified(DocModification mh);
-	
+
 	int IndentSize() { return indentInChars ? indentInChars : tabInChars; }
 };
 
-// To optimise processing of document modifications by DocWatchers, a hint is passed indicating the 
-// scope of the change.
-// If the DocWatcher is a document view then this can be used to optimise screen updating.
+/**
+ * To optimise processing of document modifications by DocWatchers, a hint is passed indicating the
+ * scope of the change.
+ * If the DocWatcher is a document view then this can be used to optimise screen updating.
+ */
 class DocModification {
 public:
   	int modificationType;
 	int position;
  	int length;
- 	int linesAdded;	// Negative if lines deleted
- 	const char *text;	// Only valid for changes to text, not for changes to style
+ 	int linesAdded;	/**< Negative if lines deleted. */
+ 	const char *text;	/**< Only valid for changes to text, not for changes to style. */
  	int line;
 	int foldLevelNow;
 	int foldLevelPrev;
@@ -239,12 +260,14 @@ public:
 		foldLevelPrev(0) {}
 };
 
-// A class that wants to receive notifications from a Document must be derived from DocWatcher 
-// and implement the notification methods. It can then be added to the watcher list with AddWatcher.
+/**
+ * A class that wants to receive notifications from a Document must be derived from DocWatcher
+ * and implement the notification methods. It can then be added to the watcher list with AddWatcher.
+ */
 class DocWatcher {
 public:
 	virtual ~DocWatcher() {}
-	
+
 	virtual void NotifyModifyAttempt(Document *doc, void *userData) = 0;
 	virtual void NotifySavePoint(Document *doc, void *userData, bool atSavePoint) = 0;
 	virtual void NotifyModified(Document *doc, DocModification mh, void *userData) = 0;
diff --git a/contrib/src/stc/scintilla/src/DocumentAccessor.cxx b/contrib/src/stc/scintilla/src/DocumentAccessor.cxx
index 6828e37c3f..c187f2a442 100644
--- a/contrib/src/stc/scintilla/src/DocumentAccessor.cxx
+++ b/contrib/src/stc/scintilla/src/DocumentAccessor.cxx
@@ -1,11 +1,13 @@
-// SciTE - Scintilla based Text Editor
-// Accessor.cxx - rapid easy access to contents of a Scintilla
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file DocumentAccessor.cxx
+ ** Rapid easy access to contents of a Scintilla.
+ **/
+// 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 <ctype.h>
 #include <stdio.h>
 
 #include "Platform.h"
@@ -21,12 +23,12 @@
 DocumentAccessor::~DocumentAccessor() {
 }
 
-#if PLAT_WIN 
+#if PLAT_WIN
 bool DocumentAccessor::InternalIsLeadByte(char ch) {
 	if (SC_CP_UTF8 == codePage)
 		// For lexing, all characters >= 0x80 are treated the
 		// same so none is considered a lead byte.
-		return false;	
+		return false;
 	else
 		return IsDBCSLeadByteEx(codePage, ch);
 }
@@ -36,7 +38,7 @@ bool DocumentAccessor::InternalIsLeadByte(char ch) {
 bool DocumentAccessor::InternalIsLeadByte(char) {
 	return false;
 }
-#endif 
+#endif
 
 void DocumentAccessor::Fill(int position) {
 	if (lenDoc == -1)
@@ -70,10 +72,10 @@ int DocumentAccessor::LevelAt(int line) {
 	return pdoc->GetLevel(line);
 }
 
-int DocumentAccessor::Length() { 
-	if (lenDoc == -1) 
+int DocumentAccessor::Length() {
+	if (lenDoc == -1)
 		lenDoc = pdoc->Length();
-	return lenDoc; 
+	return lenDoc;
 }
 
 int DocumentAccessor::GetLineState(int line) {
@@ -132,12 +134,12 @@ void DocumentAccessor::Flush() {
 int DocumentAccessor::IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader) {
 	int end = Length();
 	int spaceFlags = 0;
-	
-	// Determines the indentation level of the current line and also checks for consistent 
+
+	// Determines the indentation level of the current line and also checks for consistent
 	// indentation compared to the previous line.
-	// Indentation is judged consistent when the indentation whitespace of each line lines 
+	// Indentation is judged consistent when the indentation whitespace of each line lines
 	// the same or the indentation of one line is a prefix of the other.
-	
+
 	int pos = LineStart(line);
 	char ch = (*this)[pos];
 	int indent = 0;
@@ -164,11 +166,12 @@ int DocumentAccessor::IndentAmount(int line, int *flags, PFNIsCommentLeader pfnI
 		}
 		ch = (*this)[++pos];
 	}
-	
+
 	*flags = spaceFlags;
 	indent += SC_FOLDLEVELBASE;
 	// if completely empty line or the start of a comment...
-	if (isspace(ch) || (pfnIsCommentLeader && (*pfnIsCommentLeader)(*this, pos, end-pos)) )
+	if ((ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r') || 
+		(pfnIsCommentLeader && (*pfnIsCommentLeader)(*this, pos, end-pos)) )
 		return indent | SC_FOLDLEVELWHITEFLAG;
 	else
 		return indent;
diff --git a/contrib/src/stc/scintilla/src/DocumentAccessor.h b/contrib/src/stc/scintilla/src/DocumentAccessor.h
index ccc05fee9f..48742a9b40 100644
--- a/contrib/src/stc/scintilla/src/DocumentAccessor.h
+++ b/contrib/src/stc/scintilla/src/DocumentAccessor.h
@@ -1,16 +1,24 @@
-// DocumentAccessor.h - implementation of BufferAccess and StylingAccess on a Scintilla rapid easy access to contents of a Scintilla
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file DocumentAccessor.h
+ ** Implementation of BufferAccess and StylingAccess on a Scintilla
+ ** rapid easy access to contents of a Scintilla.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 class Document;
 
+/**
+ */
 class DocumentAccessor : public Accessor {
 	// Private so DocumentAccessor objects can not be copied
 	DocumentAccessor(const DocumentAccessor &source) : Accessor(), props(source.props) {}
 	DocumentAccessor &operator=(const DocumentAccessor &) { return *this; }
+
 protected:
 	Document *pdoc;
 	PropSet &props;
+	WindowID id;
 	int lenDoc;
 
 	char styleBuf[bufferSize];
@@ -21,9 +29,10 @@ protected:
 
 	bool InternalIsLeadByte(char ch);
 	void Fill(int position);
+
 public:
-	DocumentAccessor(Document *pdoc_, PropSet &props_) : 
-		Accessor(), pdoc(pdoc_), props(props_), 
+	DocumentAccessor(Document *pdoc_, PropSet &props_, WindowID id_=0) : 
+		Accessor(), pdoc(pdoc_), props(props_), id(id_),
 		lenDoc(-1), validLen(0), chFlags(0), chWhile(0) {
 	}
 	~DocumentAccessor();
@@ -38,6 +47,10 @@ public:
 	int GetPropertyInt(const char *key, int defaultValue=0) { 
 		return props.GetInt(key, defaultValue); 
 	}
+	char *GetProperties() {
+		return props.ToString();
+	}
+	WindowID GetWindow() { return id; }
 
 	void StartAt(unsigned int start, char chMask=31);
 	void SetFlags(char chFlags_, char chWhile_) {chFlags = chFlags_; chWhile = chWhile_; };
diff --git a/contrib/src/stc/scintilla/src/Editor.cxx b/contrib/src/stc/scintilla/src/Editor.cxx
index 87b579bbc1..5b72ac579d 100644
--- a/contrib/src/stc/scintilla/src/Editor.cxx
+++ b/contrib/src/stc/scintilla/src/Editor.cxx
@@ -1,6 +1,8 @@
 // Scintilla source code edit control
-// Editor.cxx - main code for the edit control
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file Editor.cxx
+ ** Main code for the edit control.
+ **/
+// 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>
@@ -14,7 +16,7 @@
 
 #if PLAT_WX || PLAT_GTK
 #include "WinDefs.h"
-#endif
+#endif 
 
 #include "ContractionState.h"
 #include "SVector.h"
@@ -28,7 +30,7 @@
 #include "Editor.h"
 
 Caret::Caret() :
-active(true), on(true), period(500) {}
+active(false), on(false), period(500) {}
 
 Timer::Timer() :
 ticking(false), ticksToWait(0), tickerID(0) {}
@@ -40,13 +42,20 @@ Editor::Editor() {
 
 	printMagnification = 0;
 	printColourMode = SC_PRINT_NORMAL;
+	cursorMode = SC_CURSORNORMAL;
 
+	hasFocus = false;
 	hideSelection = false;
 	inOverstrike = false;
+	errorStatus = 0;
+	mouseDownCaptures = true;
 
 	bufferedDraw = true;
 
 	lastClickTime = 0;
+	dwellDelay = SC_TIME_FOREVER;
+	ticksToDwell = SC_TIME_FOREVER;
+	dwelling = false;
 	ptMouseLast.x = 0;
 	ptMouseLast.y = 0;
 	firstExpose = true;
@@ -71,6 +80,9 @@ Editor::Editor() {
 	caretPolicy = CARET_SLOP;
 	caretSlop = 0;
 
+	visiblePolicy = VISIBLE_SLOP;
+	visibleSlop = 0;
+
 	searchAnchor = 0;
 
 	ucWheelScrollLines = 0;
@@ -83,6 +95,10 @@ Editor::Editor() {
 	currentPos = 0;
 	anchor = 0;
 
+	targetStart = 0;
+	targetEnd = 0;
+	searchFlags = 0;
+
 	topLine = 0;
 	posTopLine = 0;
 
@@ -106,7 +122,7 @@ Editor::Editor() {
 
 #ifdef MACRO_SUPPORT
 	recordingMacro = 0;
-#endif
+#endif 
 	foldFlags = 0;
 }
 
@@ -161,7 +177,7 @@ void Editor::RefreshStyleData() {
 }
 
 PRectangle Editor::GetClientRectangle() {
-	return wDraw.GetClientPosition();
+	return wMain.GetClientPosition();
 }
 
 PRectangle Editor::GetTextRectangle() {
@@ -215,15 +231,17 @@ const char *ControlCharacterString(unsigned char ch) {
 	}
 }
 
-Point Editor::LocationFromPosition(unsigned int pos) {
+Point Editor::LocationFromPosition(int pos) {
+	Point pt;
 	RefreshStyleData();
+	if (pos == INVALID_POSITION)
+		return pt;
 	int line = pdoc->LineFromPosition(pos);
 	int lineVisible = cs.DisplayFromDoc(line);
 	//Platform::DebugPrintf("line=%d\n", line);
 	Surface surface;
 	surface.Init();
 	surface.SetUnicodeMode(SC_CP_UTF8 == pdoc->dbcsCodePage);
-	Point pt;
 	pt.y = (lineVisible - topLine) * vs.lineHeight;  	// + half a lineheight?
 	unsigned int posLineStart = pdoc->LineStart(line);
 	LineLayout ll;
@@ -237,7 +255,7 @@ Point Editor::LocationFromPosition(unsigned int pos) {
 	return pt;
 }
 
-int Editor::XFromPosition(unsigned int pos) {
+int Editor::XFromPosition(int pos) {
 	Point pt = LocationFromPosition(pos);
 	return pt.x - vs.fixedColumnWidth + xOffset;
 }
@@ -262,7 +280,6 @@ int Editor::PositionFromLocation(Point pt) {
 		return 0;
 	if (line >= pdoc->LinesTotal())
 		return pdoc->Length();
-	//Platform::DebugPrintf("Position of (%d,%d) line = %d top=%d\n", pt.x, pt.y, line, topLine);
 	Surface surface;
 	surface.Init();
 	surface.SetUnicodeMode(SC_CP_UTF8 == pdoc->dbcsCodePage);
@@ -280,6 +297,42 @@ int Editor::PositionFromLocation(Point pt) {
 	return ll.numCharsInLine + posLineStart;
 }
 
+// Like PositionFromLocation but INVALID_POSITION returned when not near any text.
+int Editor::PositionFromLocationClose(Point pt) {
+	RefreshStyleData();
+	PRectangle rcClient = GetTextRectangle();
+	if (!rcClient.Contains(pt))
+		return INVALID_POSITION;
+	if (pt.x < vs.fixedColumnWidth)
+		return INVALID_POSITION;
+	if (pt.y < 0)
+		return INVALID_POSITION;
+	pt.x = pt.x - vs.fixedColumnWidth + xOffset;
+	int line = cs.DocFromDisplay(pt.y / vs.lineHeight + topLine);
+	if (pt.y < 0) {	// Division rounds towards 0
+		line = cs.DocFromDisplay((pt.y - (vs.lineHeight - 1)) / vs.lineHeight + topLine);
+	}
+	if (line < 0)
+		return INVALID_POSITION;
+	if (line >= pdoc->LinesTotal())
+		return INVALID_POSITION;
+	Surface surface;
+	surface.Init();
+	surface.SetUnicodeMode(SC_CP_UTF8 == pdoc->dbcsCodePage);
+	unsigned int posLineStart = pdoc->LineStart(line);
+
+	LineLayout ll;
+	LayoutLine(line, &surface, vs, ll);
+	for (int i = 0; i < ll.numCharsInLine; i++) {
+		if (pt.x < ((ll.positions[i] + ll.positions[i + 1]) / 2) ||
+		        ll.chars[i] == '\r' || ll.chars[i] == '\n') {
+			return i + posLineStart;
+		}
+	}
+
+	return INVALID_POSITION;
+}
+
 int Editor::PositionFromLineX(int line, int x) {
 	RefreshStyleData();
 	if (line >= pdoc->LinesTotal())
@@ -303,27 +356,27 @@ int Editor::PositionFromLineX(int line, int x) {
 }
 
 void Editor::RedrawRect(PRectangle rc) {
-    //Platform::DebugPrintf("Redraw %d %d - %d %d\n", rc.left, rc.top, rc.right, rc.bottom);
-
-    // Clip the redraw rectangle into the client area
-    PRectangle rcClient = GetClientRectangle();
-    if (rc.top < rcClient.top)
-        rc.top = rcClient.top;
-    if (rc.bottom > rcClient.bottom)
-        rc.bottom = rcClient.bottom;
-    if (rc.left < rcClient.left)
-        rc.left = rcClient.left;
-    if (rc.right > rcClient.right)
-        rc.right = rcClient.right;
+	//Platform::DebugPrintf("Redraw %0d,%0d - %0d,%0d\n", rc.left, rc.top, rc.right, rc.bottom);
 
-    if ((rc.bottom > rc.top) && (rc.right > rc.left)) {
-        wDraw.InvalidateRectangle(rc);
-    }
+	// Clip the redraw rectangle into the client area
+	PRectangle rcClient = GetClientRectangle();
+	if (rc.top < rcClient.top)
+		rc.top = rcClient.top;
+	if (rc.bottom > rcClient.bottom)
+		rc.bottom = rcClient.bottom;
+	if (rc.left < rcClient.left)
+		rc.left = rcClient.left;
+	if (rc.right > rcClient.right)
+		rc.right = rcClient.right;
+
+	if ((rc.bottom > rc.top) && (rc.right > rc.left)) {
+		wMain.InvalidateRectangle(rc);
+	}
 }
 
 void Editor::Redraw() {
 	//Platform::DebugPrintf("Redraw all\n");
-	wDraw.InvalidateAll();
+	wMain.InvalidateAll();
 }
 
 void Editor::RedrawSelMargin() {
@@ -332,7 +385,7 @@ void Editor::RedrawSelMargin() {
 	} else {
 		PRectangle rcSelMargin = GetClientRectangle();
 		rcSelMargin.right = vs.fixedColumnWidth;
-		wDraw.InvalidateRectangle(rcSelMargin);
+		wMain.InvalidateRectangle(rcSelMargin);
 	}
 }
 
@@ -384,7 +437,6 @@ int Editor::SelectionStart(int line) {
 			return -1;
 		} else {
 			int minX = Platform::Minimum(xStartSelect, xEndSelect);
-			//return PositionFromLineX(line, minX + vs.fixedColumnWidth - xOffset);
 			return PositionFromLineX(line, minX);
 		}
 	}
@@ -455,6 +507,7 @@ void Editor::SetSelection(int currentPos_) {
 }
 
 void Editor::SetEmptySelection(int currentPos_) {
+	selType = selStream;
 	SetSelection(currentPos_, currentPos_);
 }
 
@@ -485,6 +538,7 @@ int Editor::MovePositionTo(int newPos, bool extend) {
 	}
 	EnsureCaretVisible();
 	ShowCaretAtCurrentPosition();
+	NotifyMove(newPos);
 	return 0;
 }
 
@@ -541,7 +595,7 @@ void Editor::HorizontalScrollTo(int xPos) {
 	if (xOffset < 0)
 		xOffset = 0;
 	SetHorizontalScrollPos();
-	Redraw();
+	RedrawRect(GetClientRectangle());
 }
 
 void Editor::MoveCaretInsideView() {
@@ -557,9 +611,10 @@ void Editor::MoveCaretInsideView() {
 	}
 }
 
-void Editor::EnsureCaretVisible(bool useMargin) {
-	//Platform::DebugPrintf("EnsureCaretVisible %d\n", xOffset);
+void Editor::EnsureCaretVisible(bool useMargin, bool vert, bool horiz) {
+	//Platform::DebugPrintf("EnsureCaretVisible %d %s\n", xOffset, useMargin ? " margin" : " ");
 	PRectangle rcClient = GetTextRectangle();
+	//int rcClientFullWidth = rcClient.Width();
 	int posCaret = currentPos;
 	if (posDrag >= 0)
 		posCaret = posDrag;
@@ -569,17 +624,26 @@ void Editor::EnsureCaretVisible(bool useMargin) {
 	int lineCaret = cs.DisplayFromDoc(pdoc->LineFromPosition(posCaret));
 	ptBottomCaret.y += vs.lineHeight - 1;
 
-	// Ensure the caret is reasonably visible in context.
+	// Ensure the caret is reasonably visible in context:
+	// xMargin must equal to xCaretMargin, with a minimum of 2 and a maximum of
+	// slightly less than half the width of the text area.
 	int xMargin = Platform::Clamp(xCaretMargin, 2, Platform::Maximum(rcClient.Width() - 10, 4) / 2);
 	if (!useMargin)
 		xMargin = 2;
 
-	// Ensure certain amount of text visible on both sides of caretSo move if caret just on edge
-	rcClient.left = rcClient.left + xMargin;
-	rcClient.right = rcClient.right - xMargin;
+	// If we scroll the display, we use a minimum amount of xMargin.
+	int offsetLeft = rcClient.left + xMargin;
+	int offsetRight = rcClient.right - xMargin;
+	// If we are in XJUMPS mode, then when the margin is reached, the 
+	// offset jumps so that it won't need to move agin for a while.
+	if (!(caretPolicy & CARET_XJUMPS)) {
+		rcClient.left = offsetLeft;
+		rcClient.right = offsetRight;
+	}
 
-	if (!rcClient.Contains(pt) || !rcClient.Contains(ptBottomCaret) || (caretPolicy & CARET_STRICT)) {
-		//Platform::DebugPrintf("EnsureCaretVisible move, (%d,%d) (%d,%d)\n", pt.x, pt.y, rcClient.left, rcClient.right);
+	// Vertical positioning
+	if (vert && (!rcClient.Contains(pt) || !rcClient.Contains(ptBottomCaret) || (caretPolicy & CARET_STRICT))) {
+		//Platform::DebugPrintf("EnsureCaretVisible move, (%d,%d)(%d,%d)\n", pt.x, pt.y, rcClient.left, rcClient.right);
 		// It should be possible to scroll the window to show the caret,
 		// but this fails to remove the caret on GTK+
 		if (caretPolicy & CARET_SLOP) {
@@ -600,12 +664,16 @@ void Editor::EnsureCaretVisible(bool useMargin) {
 				Redraw();
 			}
 		}
+	}
+
+	// Horizontal positioning
+	if (horiz) {
 		int xOffsetNew = xOffset;
 		if (pt.x < rcClient.left) {
-			xOffsetNew = xOffset - (rcClient.left - pt.x);
-		} else if (pt.x >= rcClient.right) {
-			xOffsetNew = xOffset + (pt.x - rcClient.right);
-			int xOffsetEOL = xOffset + (ptEOL.x - rcClient.right) - xMargin + 2;
+			xOffsetNew = xOffset - (offsetLeft - pt.x);
+		} else if ((!(caretPolicy & CARET_XEVEN) && ((xOffset > 0) && useMargin)) || pt.x >= rcClient.right) {
+			xOffsetNew = xOffset + (pt.x - offsetRight);
+			int xOffsetEOL = xOffset + (ptEOL.x - offsetRight) - xMargin + 2;
 			//Platform::DebugPrintf("Margin %d %d\n", xOffsetNew, xOffsetEOL);
 			// Ensure don't scroll out into empty space
 			if (xOffsetNew > xOffsetEOL)
@@ -622,10 +690,10 @@ void Editor::EnsureCaretVisible(bool useMargin) {
 }
 
 void Editor::ShowCaretAtCurrentPosition() {
-	if (!wMain.HasFocus()) {
+	if (!hasFocus) {
 		caret.active = false;
 		caret.on = false;
-		return ;
+		return;
 	}
 	caret.active = true;
 	caret.on = true;
@@ -644,15 +712,21 @@ void Editor::InvalidateCaret() {
 		InvalidateRange(currentPos, currentPos + 1);
 }
 
+int Editor::SubstituteMarkerIfEmpty(int markerCheck, int markerDefault) {
+	if (vs.markers[markerCheck].markType == SC_MARK_EMPTY)
+		return markerDefault;
+	return markerCheck;
+}
+
 void Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) {
 	if (vs.fixedColumnWidth == 0)
-		return ;
+		return;
 
 	PRectangle rcMargin = GetClientRectangle();
 	rcMargin.right = vs.fixedColumnWidth;
 
 	if (!rc.Intersects(rcMargin))
-		return ;
+		return;
 
 	Surface *surface;
 	if (bufferedDraw) {
@@ -691,15 +765,89 @@ void Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) {
 			int line = cs.DocFromDisplay(visibleLine);
 			int yposScreen = 0;
 
+			// Work out whether the top line is whitespace located after a 
+			// lessening of fold level which implies a 'fold tail' but which should not
+			// be displayed until the last of a sequence of whitespace.
+			bool needWhiteClosure = false;	
+			int level = pdoc->GetLevel(line);
+			if (level & SC_FOLDLEVELWHITEFLAG) {
+				int lineBack = line;
+				int levelPrev = level;
+				while ((lineBack > 0) && (levelPrev & SC_FOLDLEVELWHITEFLAG)) {
+					lineBack--;
+					levelPrev = pdoc->GetLevel(lineBack);
+				}
+				if (!(levelPrev & SC_FOLDLEVELHEADERFLAG)) {
+					if ((level & SC_FOLDLEVELNUMBERMASK) < (levelPrev & SC_FOLDLEVELNUMBERMASK))
+						needWhiteClosure = true;
+				}
+			}
+			
+			// Old code does not know about new markers needed to distinguish all cases
+			int folderOpenMid = SubstituteMarkerIfEmpty(SC_MARKNUM_FOLDEROPENMID, 
+				SC_MARKNUM_FOLDEROPEN);
+			int folderEnd = SubstituteMarkerIfEmpty(SC_MARKNUM_FOLDEREND, 
+				SC_MARKNUM_FOLDER);
+			
 			while ((visibleLine < cs.LinesDisplayed()) && yposScreen < rcMargin.bottom) {
+
+				// Decide which fold indicator should be displayed
+				level = pdoc->GetLevel(line);
+				int levelNext = pdoc->GetLevel(line+1);
 				int marks = pdoc->GetMark(line);
-				if (pdoc->GetLevel(line) & SC_FOLDLEVELHEADERFLAG) {
+				int levelNum = level & SC_FOLDLEVELNUMBERMASK;
+				int levelNextNum = levelNext & SC_FOLDLEVELNUMBERMASK;
+				if (level & SC_FOLDLEVELHEADERFLAG) {
 					if (cs.GetExpanded(line)) {
-						marks |= 1 << SC_MARKNUM_FOLDEROPEN;
+						if (levelNum == SC_FOLDLEVELBASE)
+							marks |= 1 << SC_MARKNUM_FOLDEROPEN;
+						else 
+							marks |= 1 << folderOpenMid;
 					} else {
-						marks |= 1 << SC_MARKNUM_FOLDER;
+						if (levelNum == SC_FOLDLEVELBASE)
+							marks |= 1 << SC_MARKNUM_FOLDER;
+						else
+							marks |= 1 << folderEnd;
+					}
+					needWhiteClosure = false;
+				} else if (level & SC_FOLDLEVELWHITEFLAG) {
+					if (needWhiteClosure) {
+						if (levelNext & SC_FOLDLEVELWHITEFLAG) {
+							marks |= 1 << SC_MARKNUM_FOLDERSUB;
+						} else if (levelNum > SC_FOLDLEVELBASE) {
+							marks |= 1 << SC_MARKNUM_FOLDERMIDTAIL;
+							needWhiteClosure = false;
+						} else {
+							marks |= 1 << SC_MARKNUM_FOLDERTAIL;
+							needWhiteClosure = false;
+						}
+					} else if (levelNum > SC_FOLDLEVELBASE) {
+						if (levelNextNum < levelNum) {
+							if (levelNextNum > SC_FOLDLEVELBASE) {
+								marks |= 1 << SC_MARKNUM_FOLDERMIDTAIL;
+							} else {
+								marks |= 1 << SC_MARKNUM_FOLDERTAIL;
+							}
+						} else {
+							marks |= 1 << SC_MARKNUM_FOLDERSUB;
+						}
+					}
+				} else if (levelNum > SC_FOLDLEVELBASE) {
+					if (levelNextNum < levelNum) {
+						needWhiteClosure = false;
+						if (levelNext & SC_FOLDLEVELWHITEFLAG) {
+							marks |= 1 << SC_MARKNUM_FOLDERSUB;
+							needWhiteClosure = true;
+						} else if (levelNextNum > SC_FOLDLEVELBASE) {
+							marks |= 1 << SC_MARKNUM_FOLDERMIDTAIL;
+						} else {
+							marks |= 1 << SC_MARKNUM_FOLDERTAIL;
+						}
+					} else {
+						marks |= 1 << SC_MARKNUM_FOLDERSUB;
 					}
 				}
+
 				marks &= vs.ms[margin].mask;
 				PRectangle rcMarker = rcSelMargin;
 				rcMarker.top = yposScreen;
@@ -726,8 +874,6 @@ void Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) {
 				if (marks) {
 					for (int markBit = 0; (markBit < 32) && marks; markBit++) {
 						if (marks & 1) {
-							rcMarker.top++;
-							rcMarker.bottom--;
 							vs.markers[markBit].Draw(surface, rcMarker);
 						}
 						marks >>= 1;
@@ -763,6 +909,11 @@ void DrawTabArrow(Surface *surface, PRectangle rcTab, int ymid) {
 	surface->LineTo(xhead, ymid + ydiff);
 }
 
+/**
+ * Fill in the LineLayout data for the given line.
+ * Copy the given @a line and its styles from the document into local arrays.
+ * Also determine the x position at which each character starts.
+ */
 void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayout &ll) {
 	int numCharsInLine = 0;
 	int posLineStart = pdoc->LineStart(line);
@@ -771,9 +922,11 @@ void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayou
 	char styleByte = 0;
 	int styleMask = pdoc->stylingBitsMask;
 	ll.xHighlightGuide = 0;
+	// If the line is very long, limit the treatment to a length that should fit in the viewport
 	if (posLineEnd > (posLineStart + LineLayout::maxLineLength)) {
 		posLineEnd = posLineStart + LineLayout::maxLineLength;
 	}
+	// Fill base line layout
 	for (int charInDoc = posLineStart; charInDoc < posLineEnd; charInDoc++) {
 		char chDoc = pdoc->CharAt(charInDoc);
 		styleByte = pdoc->StyleAt(charInDoc);
@@ -781,6 +934,10 @@ void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayou
 			ll.chars[numCharsInLine] = chDoc;
 			ll.styles[numCharsInLine] = static_cast<char>(styleByte & styleMask);
 			ll.indicators[numCharsInLine] = static_cast<char>(styleByte & ~styleMask);
+			if (vstyle.styles[ll.styles[numCharsInLine]].caseForce == Style::caseUpper)
+				ll.chars[numCharsInLine] = static_cast<char>(toupper(chDoc));
+			else if (vstyle.styles[ll.styles[numCharsInLine]].caseForce == Style::caseLower)
+				ll.chars[numCharsInLine] = static_cast<char>(tolower(chDoc));
 			numCharsInLine++;
 		}
 	}
@@ -791,10 +948,11 @@ void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayou
 
 	// Layout the line, determining the position of each character,
 	// with an extra element at the end for the end of the line.
-	int startseg = 0;
-	int startsegx = 0;
+	int startseg = 0;	// Start of the current segment, in char. number
+	int startsegx = 0;	// Start of the current segment, in pixels
 	ll.positions[0] = 0;
 	unsigned int tabWidth = vstyle.spaceWidth * pdoc->tabInChars;
+	bool lastSegItalics = false;
 
 	for (int charInLine = 0; charInLine < numCharsInLine; charInLine++) {
 		if ((ll.styles[charInLine] != ll.styles[charInLine + 1]) ||
@@ -810,14 +968,16 @@ void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayou
 						// +3 For a blank on front and rounded edge each side:
 						ll.positions[charInLine + 1] = surface->WidthText(ctrlCharsFont, ctrlChar, strlen(ctrlChar)) + 3;
 					}
-				} else {
+					lastSegItalics = false;
+				} else {	// Regular character
+					lastSegItalics = vstyle.styles[ll.styles[charInLine]].italic;
 					int lenSeg = charInLine - startseg + 1;
 					if ((lenSeg == 1) && (' ' == ll.chars[startseg])) {
 						// Over half the segments are single characters and of these about half are space characters.
 						ll.positions[charInLine + 1] = vstyle.styles[ll.styles[charInLine]].spaceWidth;
 					} else {
 						surface->MeasureWidths(vstyle.styles[ll.styles[charInLine]].font, ll.chars + startseg,
-						                       charInLine - startseg + 1, ll.positions + startseg + 1);
+						                       lenSeg, ll.positions + startseg + 1);
 					}
 				}
 			} else {    // invisible
@@ -832,6 +992,10 @@ void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayou
 			startseg = charInLine + 1;
 		}
 	}
+	// Small hack to make lines that end with italics not cut off the edge of the last character
+	if ((startseg > 0) && lastSegItalics) {
+		ll.positions[startseg] += 2;
+	}
 	ll.numCharsInLine = numCharsInLine;
 }
 
@@ -845,19 +1009,23 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis
 	// is taken by an individual character - internal leading gives varying results.
 	Font &ctrlCharsFont = vsDraw.styles[STYLE_CONTROLCHAR].font;
 
-	int marks = 0;
-	Colour markBack = Colour(0, 0, 0);
+	bool overrideBackground = false;
+	Colour background = Colour(0, 0, 0);
+	if (caret.active && vsDraw.showCaretLineBackground && ll.containsCaret) {
+		overrideBackground = true;
+		background = vsDraw.caretLineBackground.allocated;
+	}
 	if (vsDraw.maskInLine) {
-		marks = pdoc->GetMark(line) & vsDraw.maskInLine;
+		int marks = pdoc->GetMark(line) & vsDraw.maskInLine;
 		if (marks) {
+			overrideBackground = true;
 			for (int markBit = 0; (markBit < 32) && marks; markBit++) {
 				if (marks & 1) {
-					markBack = vsDraw.markers[markBit].back.allocated;
+					background = vsDraw.markers[markBit].back.allocated;
 				}
 				marks >>= 1;
 			}
 		}
-		marks = pdoc->GetMark(line) & vsDraw.maskInLine;
 	}
 
 	bool inIndentation = true;
@@ -893,8 +1061,8 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis
 				if (vsDraw.selforeset)
 					textFore = vsDraw.selforeground.allocated;
 			} else {
-				if (marks)
-					textBack = markBack;
+				if (overrideBackground)
+					textBack = background;
 				if ((vsDraw.edgeState == EDGE_BACKGROUND) && (i >= ll.edgeColumn) && (ll.chars[i] != '\n') && (ll.chars[i] != '\r'))
 					textBack = vsDraw.edgecolour.allocated;
 			}
@@ -948,7 +1116,8 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis
 				                         rcSegment.top + vsDraw.maxAscent, ctrlChar, strlen(ctrlChar),
 				                         textBack, textFore);
 				// Manage normal display
-			} else {
+			}
+			else {
 				rcSegment.left = ll.positions[startseg] + xStart;
 				rcSegment.right = ll.positions[i + 1] + xStart;
 				// Only try to draw if really visible - enhances performance by not calling environment to
@@ -1032,16 +1201,16 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis
 			surface->FillRectangle(rcSegment, vsDraw.selbackground.allocated);
 		else
 			surface->FillRectangle(rcSegment, vsDraw.selbackground2.allocated);
-	} else if (marks) {
-		surface->FillRectangle(rcSegment, markBack);
+	} else if (overrideBackground) {
+		surface->FillRectangle(rcSegment, background);
 	} else {
 		surface->FillRectangle(rcSegment, vsDraw.styles[ll.styles[ll.numCharsInLine] & styleMask].back.allocated);
 	}
 
 	rcSegment.left = xEol + vsDraw.aveCharWidth + xStart;
 	rcSegment.right = rcLine.right;
-	if (marks) {
-		surface->FillRectangle(rcSegment, markBack);
+	if (overrideBackground) {
+		surface->FillRectangle(rcSegment, background);
 	} else if (vsDraw.styles[ll.styles[ll.numCharsInLine] & styleMask].eolFilled) {
 		surface->FillRectangle(rcSegment, vsDraw.styles[ll.styles[ll.numCharsInLine] & styleMask].back.allocated);
 	} else {
@@ -1110,14 +1279,14 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
 	}
 
 	surfaceWindow->SetPalette(&palette, true);
-	pixmapLine.SetPalette(&palette, !wMain.HasFocus());
+	pixmapLine.SetPalette(&palette, !hasFocus);
 
 	//Platform::DebugPrintf("Paint: (%3d,%3d) ... (%3d,%3d)\n",
 	//	rcArea.left, rcArea.top, rcArea.right, rcArea.bottom);
 
 	int screenLinePaintFirst = rcArea.top / vs.lineHeight;
 	// The area to be painted plus one extra line is styled.
-	// The extra line is to determine when a style change, such as statrting a comment flows on to other lines.
+	// The extra line is to determine when a style change, such as starting a comment flows on to other lines.
 	int lineStyleLast = topLine + (rcArea.bottom - 1) / vs.lineHeight + 1;
 	//Platform::DebugPrintf("Paint lines = %d .. %d\n", topLine + screenLinePaintFirst, lineStyleLast);
 	int endPosPaint = pdoc->Length();
@@ -1150,10 +1319,11 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
 		// Either styling or NotifyUpdateUI noticed that painting is needed
 		// outside the current painting rectangle
 		//Platform::DebugPrintf("Abandoning paint\n");
-		return ;
+		return;
 	}
 	//Platform::DebugPrintf("start display %d, offset = %d\n", pdoc->Length(), xOffset);
 
+	// Do the painting
 	if (rcArea.right > vs.fixedColumnWidth) {
 
 		Surface *surface = surfaceWindow;
@@ -1176,11 +1346,29 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
 		rcTextArea.left = vs.fixedColumnWidth;
 		rcTextArea.right -= vs.rightMarginWidth;
 		surfaceWindow->SetClip(rcTextArea);
+
+		// Loop on visible lines
 		//GTimer *tim=g_timer_new();
 		while (visibleLine < cs.LinesDisplayed() && yposScreen < rcArea.bottom) {
 			//g_timer_start(tim);
 			//Platform::DebugPrintf("Painting line %d\n", line);
 
+			// Copy this line and its styles from the document into local arrays
+			// and determine the x position at which each character starts.
+			LineLayout ll;
+			LayoutLine(line, surface, vs, ll);
+
+			ll.selStart = SelectionStart(line);
+			ll.selEnd = SelectionEnd(line);
+			ll.containsCaret = line == lineCaret;
+			if (hideSelection) {
+				ll.selStart = -1;
+				ll.selEnd = -1;
+				ll.containsCaret = false;
+			}
+			// Need to fix this up so takes account of Unicode and DBCS
+			ll.edgeColumn = theEdge;
+
 			int posLineStart = pdoc->LineStart(line);
 			int posLineEnd = pdoc->LineStart(line + 1);
 			//Platform::DebugPrintf("line %d %d - %d\n", line, posLineStart, posLineEnd);
@@ -1189,11 +1377,6 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
 			rcLine.top = ypos;
 			rcLine.bottom = ypos + vs.lineHeight;
 
-			// Copy this line and its styles from the document into local arrays
-			// and determine the x position at which each character starts.
-			LineLayout ll;
-			LayoutLine(line, surface, vs, ll);
-
 			// Highlight the current braces if any
 			if ((braces[0] >= posLineStart) && (braces[0] < posLineEnd)) {
 				int braceOffset = braces[0] - posLineStart;
@@ -1210,15 +1393,6 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
 				ll.xHighlightGuide = highlightGuideColumn * vs.spaceWidth;
 			}
 
-			ll.selStart = SelectionStart(line);
-			ll.selEnd = SelectionEnd(line);
-			if (hideSelection) {
-				ll.selStart = -1;
-				ll.selEnd = -1;
-			}
-			// Need to fix this up so takes account of Unicode and DBCS
-			ll.edgeColumn = theEdge;
-
 			// Draw the line
 			if (cs.GetVisible(line))
 				DrawLine(surface, vs, line, visibleLine, xStart, rcLine, ll);
@@ -1255,17 +1429,20 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
 					widthOverstrikeCaret = 3;
 				if (((caret.active && caret.on) || (posDrag >= 0)) && xposCaret >= 0) {
 					PRectangle rcCaret = rcLine;
+					int caretWidthOffset = 0;
+					if ((offset > 0) && (vs.caretWidth > 1))
+						caretWidthOffset = 1;	// Move back so overlaps both character cells.
 					if (posDrag >= 0) {
-						rcCaret.left = xposCaret;
-						rcCaret.right = xposCaret + 1;
+						rcCaret.left = xposCaret - caretWidthOffset;
+						rcCaret.right = rcCaret.left + vs.caretWidth;
 					} else {
 						if (inOverstrike) {
 							rcCaret.top = rcCaret.bottom - 2;
 							rcCaret.left = xposCaret + 1;
 							rcCaret.right = rcCaret.left + widthOverstrikeCaret - 1;
 						} else {
-							rcCaret.left = xposCaret;
-							rcCaret.right = xposCaret + 1;
+							rcCaret.left = xposCaret - caretWidthOffset;
+							rcCaret.right = rcCaret.left + vs.caretWidth;
 						}
 					}
 					surface->FillRectangle(rcCaret, vs.caretcolour.allocated);
@@ -1294,6 +1471,10 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
 		}
 		//g_timer_destroy(tim);
 
+		// Right column limit indicator
+
+
+
 		PRectangle rcBeyondEOF = rcClient;
 		rcBeyondEOF.left = vs.fixedColumnWidth;
 		rcBeyondEOF.right = rcBeyondEOF.right;
@@ -1307,6 +1488,7 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
 				surfaceWindow->FillRectangle(rcBeyondEOF, vs.edgecolour.allocated);
 			}
 		}
+		NotifyPainted();
 	}
 }
 
@@ -1360,8 +1542,9 @@ long Editor::FormatRange(bool draw, RangeToFormat *pfr) {
 	// Don't show the selection when printing
 	vsPrint.selbackset = false;
 	vsPrint.selforeset = false;
-	// White background for the line numbers
-	vsPrint.styles[STYLE_LINENUMBER].back.desired = Colour(0xff, 0xff, 0xff);
+	vsPrint.showCaretLineBackground = false;
+
+	// Set colours for printing according to users settings
 	for (int sty = 0;sty <= STYLE_MAX;sty++) {
 		if (printColourMode == SC_PRINT_INVERTLIGHT) {
 			vsPrint.styles[sty].fore.desired = InvertedLight(vsPrint.styles[sty].fore.desired);
@@ -1369,8 +1552,15 @@ long Editor::FormatRange(bool draw, RangeToFormat *pfr) {
 		} else if (printColourMode == SC_PRINT_BLACKONWHITE) {
 			vsPrint.styles[sty].fore.desired = Colour(0, 0, 0);
 			vsPrint.styles[sty].back.desired = Colour(0xff, 0xff, 0xff);
+		} else if (printColourMode == SC_PRINT_COLOURONWHITE) {
+			vsPrint.styles[sty].back.desired = Colour(0xff, 0xff, 0xff);
+		} else if (printColourMode == SC_PRINT_COLOURONWHITEDEFAULTBG) {
+			if (sty <= STYLE_DEFAULT) {
+				vsPrint.styles[sty].back.desired = Colour(0xff, 0xff, 0xff);
+			}
 		}
 	}
+	// White background for the line numbers
 	vsPrint.styles[STYLE_LINENUMBER].back.desired = Colour(0xff, 0xff, 0xff);
 
 	vsPrint.Refresh(*surfaceMeasure);
@@ -1381,7 +1571,7 @@ long Editor::FormatRange(bool draw, RangeToFormat *pfr) {
 	int lineNumberWidth = 0;
 	if (lineNumberIndex >= 0) {
 		lineNumberWidth = surface->WidthText(vsPrint.styles[STYLE_LINENUMBER].font,
-		                                     "9999" lineNumberPrintSpace, 4 + strlen(lineNumberPrintSpace));
+		                                     "99999" lineNumberPrintSpace, 5 + strlen(lineNumberPrintSpace));
 		vsPrint.ms[lineNumberIndex].width = lineNumberWidth;
 	}
 
@@ -1410,6 +1600,22 @@ long Editor::FormatRange(bool draw, RangeToFormat *pfr) {
 
 		while (line <= linePrintLast && ypos < pfr->rc.bottom) {
 
+			// When printing, the hdc and hdcTarget may be the same, so
+			// changing the state of surfaceMeasure may change the underlying
+			// state of surface. Therefore, any cached state is discarded before
+			// using each surface.
+			surfaceMeasure->FlushCachedState();
+
+			// Copy this line and its styles from the document into local arrays
+			// and determine the x position at which each character starts.
+			LineLayout ll;
+			LayoutLine(line, surfaceMeasure, vsPrint, ll);
+			ll.selStart = -1;
+			ll.selEnd = -1;
+			ll.containsCaret = false;
+			// Need to fix this up so takes account of Unicode and DBCS
+			ll.edgeColumn = theEdge;
+
 			PRectangle rcLine;
 			rcLine.left = pfr->rc.left + lineNumberWidth;
 			rcLine.top = ypos;
@@ -1430,21 +1636,6 @@ long Editor::FormatRange(bool draw, RangeToFormat *pfr) {
 				                  vsPrint.styles[STYLE_LINENUMBER].back.allocated);
 			}
 
-			// When printing, the hdc and hdcTarget may be the same, so
-			// changing the state of surfaceMeasure may change the underlying
-			// state of surface. Therefore, any cached state is discarded before
-			// using each surface.
-
-			// Copy this line and its styles from the document into local arrays
-			// and determine the x position at which each character starts.
-			surfaceMeasure->FlushCachedState();
-			LineLayout ll;
-			LayoutLine(line, surfaceMeasure, vsPrint, ll);
-			ll.selStart = -1;
-			ll.selEnd = -1;
-			// Need to fix this up so takes account of Unicode and DBCS
-			ll.edgeColumn = theEdge;
-
 			// Draw the line
 			surface->FlushCachedState();
 			DrawLine(surface, vsPrint, line, line, xStart, rcLine, ll);
@@ -1463,7 +1654,6 @@ long Editor::FormatRange(bool draw, RangeToFormat *pfr) {
 // Empty method is overridden on GTK+ to show / hide scrollbars
 void Editor::ReconfigureScrollBars() {}
 
-
 void Editor::SetScrollBarsTo(PRectangle) {
 	RefreshStyleData();
 
@@ -1483,7 +1673,6 @@ void Editor::SetScrollBarsTo(PRectangle) {
 	//Platform::DebugPrintf("end max = %d page = %d\n", nMax, nPage);
 }
 
-
 void Editor::SetScrollBars() {
 	PRectangle rsClient = GetClientRectangle();
 	SetScrollBarsTo(rsClient);
@@ -1512,7 +1701,38 @@ void Editor::AddCharUTF(char *s, unsigned int len) {
 	// Avoid blinking during rapid typing:
 	ShowCaretAtCurrentPosition();
 	SetLastXChosen();
-	NotifyChar(s[0]);
+
+	int byte = static_cast<unsigned char>(s[0]);
+	if ((byte < 0xC0) || (1 == len)) {
+		// Handles UTF-8 characters between 0x01 and 0x7F and single byte 
+		// characters when not in UTF-8 mode. 
+		// Also treats \0 and naked trail bytes 0x80 to 0xBF as valid
+		// characters representing themselves.
+	} else {
+		// Unroll 1 to 3 byte UTF-8 sequences.  See reference data at:
+		// http://www.cl.cam.ac.uk/~mgk25/unicode.html
+		// http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
+		if (byte < 0xE0) {
+			int byte2 = static_cast<unsigned char>(s[1]);
+			if ((byte2 & 0xC0) == 0x80) {
+				// Two-byte-character lead-byte followed by a trail-byte.
+				byte = (((byte & 0x1F) << 6) | (byte2 & 0x3F));
+			}
+			// A two-byte-character lead-byte not followed by trail-byte
+			// represents itself.
+		} else if (byte < 0xF0) {
+			int byte2 = static_cast<unsigned char>(s[1]);
+			int byte3 = static_cast<unsigned char>(s[2]);
+			if (((byte2 & 0xC0) == 0x80) && ((byte3 & 0xC0) == 0x80)) {
+				// Three-byte-character lead byte followed by two trail bytes.
+				byte = (((byte & 0x0F) << 12) | ((byte2 & 0x3F) << 6) |
+					(byte3 & 0x3F));
+			}
+			// A three-byte-character lead-byte not followed by two trail-bytes
+			// represents itself.
+		}
+	}
+	NotifyChar(byte);
 }
 
 void Editor::ClearSelection() {
@@ -1529,23 +1749,27 @@ void Editor::ClearSelection() {
 			}
 		}
 		SetEmptySelection(startPos);
-		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();
 		}
 	}
 }
 
 void Editor::ClearAll() {
+	pdoc->BeginUndoAction();
 	if (0 != pdoc->Length()) {
 		pdoc->DeleteChars(0, pdoc->Length());
 	}
 	cs.Clear();
+	pdoc->EndUndoAction();
 	anchor = 0;
 	currentPos = 0;
 	SetTopLine(0);
@@ -1560,16 +1784,22 @@ void Editor::ClearDocumentStyle() {
 }
 
 void Editor::Cut() {
-	Copy();
-	ClearSelection();
+	if (!pdoc->IsReadOnly()) {
+		Copy();
+		ClearSelection();
+	}
 }
 
 void Editor::PasteRectangular(int pos, const char *ptr, int len) {
+	if (pdoc->IsReadOnly()) {
+		return;
+	}
 	currentPos = pos;
 	int insertPos = currentPos;
 	int xInsert = XFromPosition(currentPos);
 	int line = pdoc->LineFromPosition(currentPos);
 	bool prevCr = false;
+	pdoc->BeginUndoAction();
 	for (int i = 0; i < len; i++) {
 		if ((ptr[i] == '\r') || (ptr[i] == '\n')) {
 			if ((ptr[i] == '\r') || (!prevCr))
@@ -1580,7 +1810,15 @@ void Editor::PasteRectangular(int pos, const char *ptr, int len) {
 				if (pdoc->eolMode != SC_EOL_CR)
 					pdoc->InsertChar(pdoc->Length(), '\n');
 			}
+			// Pad the end of lines with spaces if required
 			currentPos = PositionFromLineX(line, xInsert);
+			if ((XFromPosition(currentPos) < xInsert) && (i + 1 < len)) {
+				for (int i = 0; i < xInsert - XFromPosition(currentPos); i++) {
+					pdoc->InsertChar(currentPos, ' ');
+					currentPos++;
+				}
+				insertPos = currentPos;
+			}
 			prevCr = ptr[i] == '\r';
 		} else {
 			pdoc->InsertString(currentPos, ptr + i, 1);
@@ -1589,9 +1827,14 @@ void Editor::PasteRectangular(int pos, const char *ptr, int len) {
 			prevCr = false;
 		}
 	}
+	pdoc->EndUndoAction();
 	SetEmptySelection(insertPos);
 }
 
+bool Editor::CanPaste() {
+	return !pdoc->IsReadOnly();
+}
+
 void Editor::Clear() {
 	if (currentPos == anchor) {
 		DelChar();
@@ -1608,7 +1851,7 @@ void Editor::SelectAll() {
 
 void Editor::Undo() {
 	if (pdoc->CanUndo()) {
-        InvalidateCaret();
+		InvalidateCaret();
 		int newPos = pdoc->Undo();
 		SetEmptySelection(newPos);
 		EnsureCaretVisible();
@@ -1631,8 +1874,23 @@ void Editor::DelChar() {
 
 void Editor::DelCharBack() {
 	if (currentPos == anchor) {
-		int newPos = pdoc->DelCharBack(currentPos);
-		SetEmptySelection(newPos);
+		int lineCurrentPos = pdoc->LineFromPosition(currentPos);
+		if (pdoc->GetColumn(currentPos) <= pdoc->GetLineIndentation(lineCurrentPos) &&
+			pdoc->GetColumn(currentPos) > 0 && pdoc->backspaceUnindents) {
+			pdoc->BeginUndoAction();
+			int indentation = pdoc->GetLineIndentation(lineCurrentPos);
+			int indentationStep = (pdoc->indentInChars ? pdoc->indentInChars : pdoc->tabInChars);
+			if (indentation % indentationStep == 0) {
+				pdoc->SetLineIndentation(lineCurrentPos, indentation - indentationStep);
+			} else {
+				pdoc->SetLineIndentation(lineCurrentPos, indentation - (indentation % indentationStep));
+			}
+			SetEmptySelection(pdoc->GetLineIndentPosition(lineCurrentPos));
+			pdoc->EndUndoAction();
+		} else {
+			int newPos = pdoc->DelCharBack(currentPos);
+			SetEmptySelection(newPos);
+		}
 	} else {
 		ClearSelection();
 		SetEmptySelection(currentPos);
@@ -1643,7 +1901,6 @@ void Editor::DelCharBack() {
 
 void Editor::NotifyFocus(bool) {}
 
-
 void Editor::NotifyStyleToNeeded(int endStyleNeeded) {
 	SCNotification scn;
 	scn.nmhdr.code = SCN_STYLENEEDED;
@@ -1655,7 +1912,7 @@ void Editor::NotifyStyleNeeded(Document*, void *, int endStyleNeeded) {
 	NotifyStyleToNeeded(endStyleNeeded);
 }
 
-void Editor::NotifyChar(char ch) {
+void Editor::NotifyChar(int ch) {
 	SCNotification scn;
 	scn.nmhdr.code = SCN_CHARADDED;
 	scn.ch = ch;
@@ -1663,11 +1920,11 @@ void Editor::NotifyChar(char ch) {
 #ifdef MACRO_SUPPORT
 	if (recordingMacro) {
 		char txt[2];
-		txt[0] = ch;
+		txt[0] = static_cast<char>(ch);
 		txt[1] = '\0';
 		NotifyMacroRecord(SCI_REPLACESEL, 0, reinterpret_cast<long>(txt));
 	}
-#endif
+#endif 
 }
 
 void Editor::NotifySavePoint(bool isSavePoint) {
@@ -1698,6 +1955,12 @@ void Editor::NotifyUpdateUI() {
 	NotifyParent(scn);
 }
 
+void Editor::NotifyPainted() {
+	SCNotification scn;
+	scn.nmhdr.code = SCN_PAINTED;
+	NotifyParent(scn);
+}
+
 bool Editor::NotifyMarginClick(Point pt, bool shift, bool ctrl, bool alt) {
 	int marginClicked = -1;
 	int x = 0;
@@ -1728,6 +1991,15 @@ void Editor::NotifyNeedShown(int pos, int len) {
 	NotifyParent(scn);
 }
 
+void Editor::NotifyDwelling(Point pt, bool state) {
+	SCNotification scn;
+	scn.nmhdr.code = state ? SCN_DWELLSTART : SCN_DWELLEND;
+	scn.position = PositionFromLocationClose(pt);
+	scn.x = pt.x;
+	scn.y = pt.y;
+	NotifyParent(scn);
+}
+
 // Notifications from document
 void Editor::NotifyModifyAttempt(Document*, void *) {
 	//Platform::DebugPrintf("** Modify Attempt\n");
@@ -1808,13 +2080,12 @@ void Editor::NotifyModified(Document*, DocModification mh, void *) {
 				// Some lines are hidden so may need shown.
 				// TODO: check if the modified area is hidden.
 				if (mh.modificationType & SC_MOD_BEFOREINSERT) {
-					NotifyNeedShown(mh.position, 0);
+					NotifyNeedShown(mh.position, mh.length);
 				} else if (mh.modificationType & SC_MOD_BEFOREDELETE) {
 					NotifyNeedShown(mh.position, mh.length);
 				}
 			}
 			if (mh.linesAdded != 0) {
-
 				// Update contraction state for inserted and removed lines
 				// lineOfPos should be calculated in context of state before modification, shouldn't it
 				int lineOfPos = pdoc->LineFromPosition(mh.position);
@@ -1859,6 +2130,8 @@ void Editor::NotifyModified(Document*, DocModification mh, void *) {
 			NotifyChange();	// Send EN_CHANGE
 		}
 
+
+
 		SCNotification scn;
 		scn.nmhdr.code = SCN_MODIFIED;
 		scn.position = mh.position;
@@ -1886,6 +2159,10 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long
 	case SCI_COPY:
 	case SCI_PASTE:
 	case SCI_CLEAR:
+	case WM_CUT:
+	case WM_COPY:
+	case WM_PASTE:
+	case WM_CLEAR:
 	case SCI_REPLACESEL:
 	case SCI_ADDTEXT:
 	case SCI_INSERTTEXT:
@@ -1908,6 +2185,10 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long
 	case SCI_WORDLEFTEXTEND:
 	case SCI_WORDRIGHT:
 	case SCI_WORDRIGHTEXTEND:
+	case SCI_WORDPARTLEFT:
+	case SCI_WORDPARTLEFTEXTEND:
+	case SCI_WORDPARTRIGHT:
+	case SCI_WORDPARTRIGHTEXTEND:
 	case SCI_HOME:
 	case SCI_HOMEEXTEND:
 	case SCI_LINEEND:
@@ -1925,12 +2206,13 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long
 	case SCI_DELETEBACK:
 	case SCI_TAB:
 	case SCI_BACKTAB:
-	case SCI_NEWLINE:
 	case SCI_FORMFEED:
 	case SCI_VCHOME:
 	case SCI_VCHOMEEXTEND:
 	case SCI_DELWORDLEFT:
 	case SCI_DELWORDRIGHT:
+	case SCI_DELLINELEFT:
+	case SCI_DELLINERIGHT:
 	case SCI_LINECUT:
 	case SCI_LINEDELETE:
 	case SCI_LINETRANSPOSE:
@@ -1938,11 +2220,12 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long
 	case SCI_UPPERCASE:
 		break;
 
-		// Filter out all others (display changes, etc)
+		// 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);
-
-		return ;
+		return;
 	}
 
 	// Send notification
@@ -1953,7 +2236,7 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long
 	scn.lParam = lParam;
 	NotifyParent(scn);
 }
-#endif
+#endif 
 
 // Force scroll and keep position relative to top of window
 void Editor::PageMove(int direction, bool extend) {
@@ -1995,7 +2278,6 @@ void Editor::ChangeCaseOfSelection(bool makeUpperCase) {
 	pdoc->EndUndoAction();
 }
 
-
 void Editor::LineTranspose() {
 	int line = pdoc->LineFromPosition(currentPos);
 	if (line > 0) {
@@ -2028,7 +2310,6 @@ void Editor::LineTranspose() {
 
 void Editor::CancelModes() {}
 
-
 int Editor::KeyCommand(unsigned int iMessage) {
 	Point pt = LocationFromPosition(currentPos);
 
@@ -2147,7 +2428,7 @@ int Editor::KeyCommand(unsigned int iMessage) {
 		ShowCaretAtCurrentPosition();
 		NotifyUpdateUI();
 		break;
-	case SCI_CANCEL:   	// Cancel any modes - handled in subclass
+	case SCI_CANCEL:          	// Cancel any modes - handled in subclass
 		// Also unselect text
 		CancelModes();
 		break;
@@ -2219,6 +2500,21 @@ int Editor::KeyCommand(unsigned int iMessage) {
 			MovePositionTo(currentPos);
 		}
 		break;
+	case SCI_DELLINELEFT: {
+			int line = pdoc->LineFromPosition(currentPos);
+			int start = pdoc->LineStart(line);
+			pdoc->DeleteChars(start, currentPos - start);
+			MovePositionTo(start);
+			SetLastXChosen();
+		}
+		break;
+	case SCI_DELLINERIGHT: {
+			int line = pdoc->LineFromPosition(currentPos);
+			int end = pdoc->LineEnd(line);
+			pdoc->DeleteChars(currentPos, end - currentPos);
+			MovePositionTo(currentPos);
+		}
+		break;
 	case SCI_LINECUT: {
 			int lineStart = pdoc->LineFromPosition(currentPos);
 			int lineEnd = pdoc->LineFromPosition(anchor);
@@ -2250,6 +2546,22 @@ int Editor::KeyCommand(unsigned int iMessage) {
 	case SCI_UPPERCASE:
 		ChangeCaseOfSelection(true);
 		break;
+	case SCI_WORDPARTLEFT:
+		MovePositionTo(MovePositionSoVisible(pdoc->WordPartLeft(currentPos), -1));
+		SetLastXChosen();
+		break;
+	case SCI_WORDPARTLEFTEXTEND:
+		MovePositionTo(MovePositionSoVisible(pdoc->WordPartLeft(currentPos), -1), true);
+		SetLastXChosen();
+		break;
+	case SCI_WORDPARTRIGHT:
+		MovePositionTo(MovePositionSoVisible(pdoc->WordPartRight(currentPos), 1));
+		SetLastXChosen();
+		break;
+	case SCI_WORDPARTRIGHTEXTEND:
+		MovePositionTo(MovePositionSoVisible(pdoc->WordPartRight(currentPos), 1), true);
+		SetLastXChosen();
+		break;
 	}
 	return 0;
 }
@@ -2258,14 +2570,20 @@ int Editor::KeyDefault(int, int) {
 	return 0;
 }
 
-int Editor::KeyDown(int key, bool shift, bool ctrl, bool alt) {
+int Editor::KeyDown(int key, bool shift, bool ctrl, bool alt, bool *consumed) {
+	DwellEnd(false);
 	int modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) |
 	                (alt ? SCI_ALT : 0);
 	int msg = kmap.Find(key, modifiers);
-	if (msg)
+	if (msg) {
+		if (consumed)
+			*consumed = true;
 		return WndProc(msg, 0, 0);
-	else
+	} else {
+		if (consumed)
+			*consumed = false;
 		return KeyDefault(key, modifiers);
+	}
 }
 
 void Editor::SetWhitespaceVisible(int view) {
@@ -2281,15 +2599,50 @@ void Editor::Indent(bool forwards) {
 	int lineOfAnchor = pdoc->LineFromPosition(anchor);
 	int lineCurrentPos = pdoc->LineFromPosition(currentPos);
 	if (lineOfAnchor == lineCurrentPos) {
-		ClearSelection();
-		if (pdoc->useTabs) {
-			pdoc->InsertChar(currentPos, '\t');
-			SetEmptySelection(currentPos + 1);
+		if (forwards) {
+			ClearSelection();
+			if (pdoc->GetColumn(currentPos) <= pdoc->GetColumn(pdoc->GetLineIndentPosition(lineCurrentPos)) &&
+			        pdoc->tabIndents) {
+				pdoc->BeginUndoAction();
+				int indentation = pdoc->GetLineIndentation(lineCurrentPos);
+				int indentationStep = (pdoc->indentInChars ? pdoc->indentInChars : pdoc->tabInChars);
+				pdoc->SetLineIndentation(lineCurrentPos, indentation + indentationStep);
+				SetEmptySelection(pdoc->GetLineIndentPosition(lineCurrentPos));
+				pdoc->EndUndoAction();
+			} else {
+				if (pdoc->useTabs) {
+					pdoc->InsertChar(currentPos, '\t');
+					SetEmptySelection(currentPos + 1);
+				} else {
+					int numSpaces = (pdoc->tabInChars) -
+					                (pdoc->GetColumn(currentPos) % (pdoc->tabInChars));
+					if (numSpaces < 1)
+						numSpaces = pdoc->tabInChars;
+					for (int i = 0; i < numSpaces; i++) {
+						pdoc->InsertChar(currentPos, ' ');
+					}
+					SetEmptySelection(currentPos + numSpaces);
+				}
+			}
 		} else {
-			for (int i = 0; i < pdoc->tabInChars; i++) {
-				pdoc->InsertChar(currentPos, ' ');
+			if (pdoc->GetColumn(currentPos) <= pdoc->GetLineIndentation(lineCurrentPos) &&
+			        pdoc->tabIndents) {
+				pdoc->BeginUndoAction();
+				int indentation = pdoc->GetLineIndentation(lineCurrentPos);
+				int indentationStep = (pdoc->indentInChars ? pdoc->indentInChars : pdoc->tabInChars);
+				pdoc->SetLineIndentation(lineCurrentPos, indentation - indentationStep);
+				SetEmptySelection(pdoc->GetLineIndentPosition(lineCurrentPos));
+				pdoc->EndUndoAction();
+			} else {
+				int newColumn = ((pdoc->GetColumn(currentPos) - 1) / pdoc->tabInChars) *
+				                pdoc->tabInChars;
+				if (newColumn < 0)
+					newColumn = 0;
+				int newPos = currentPos;
+				while (pdoc->GetColumn(newPos) > newColumn)
+					newPos--;
+				SetEmptySelection(newPos);
 			}
-			SetEmptySelection(currentPos + pdoc->tabInChars);
 		}
 	} else {
 		int anchorPosOnLine = anchor - pdoc->LineStart(lineOfAnchor);
@@ -2316,59 +2669,104 @@ void Editor::Indent(bool forwards) {
 	}
 }
 
-long Editor::FindText(unsigned int iMessage, unsigned long wParam, long lParam) {
+/**
+ * Search of a text in the document, in the given range.
+ * @return The position of the found text, -1 if not found.
+ */
+long Editor::FindText(
+    unsigned int iMessage,    	///< Can be @c EM_FINDTEXT or @c EM_FINDTEXTEX or @c SCI_FINDTEXT.
+    unsigned long wParam,    	///< Search modes : @c SCFIND_MATCHCASE, @c SCFIND_WHOLEWORD,
+    ///< @c SCFIND_WORDSTART or @c SCFIND_REGEXP.
+    long lParam) {			///< @c TextToFind structure: The text to search for in the given range.
+
 	TextToFind *ft = reinterpret_cast<TextToFind *>(lParam);
+	int lengthFound = strlen(ft->lpstrText);
 	int pos = pdoc->FindText(ft->chrg.cpMin, ft->chrg.cpMax, ft->lpstrText,
-	                        wParam & SCFIND_MATCHCASE, wParam & SCFIND_WHOLEWORD,
-				wParam & SCFIND_WORDSTART);
+	                         wParam & SCFIND_MATCHCASE,
+	                         wParam & SCFIND_WHOLEWORD,
+	                         wParam & SCFIND_WORDSTART,
+	                         wParam & SCFIND_REGEXP,
+	                         &lengthFound);
 	if (pos != -1) {
 		if (iMessage != EM_FINDTEXT) {
 			ft->chrgText.cpMin = pos;
-			ft->chrgText.cpMax = pos + strlen(ft->lpstrText);
+			ft->chrgText.cpMax = pos + lengthFound;
 		}
 	}
 	return pos;
 }
 
-// Relocatable search support : Searches relative to current selection
-// point and sets the selection to the found text range with
-// each search.
-
-// Anchor following searches at current selection start:  This allows
-// multiple incremental interactive searches to be macro recorded
-// while still setting the selection to found text so the find/select
-// operation is self-contained.
+/**
+ * Relocatable search support : Searches relative to current selection
+ * point and sets the selection to the found text range with
+ * each search.
+ */
+/**
+ * Anchor following searches at current selection start: This allows
+ * multiple incremental interactive searches to be macro recorded
+ * while still setting the selection to found text so the find/select
+ * operation is self-contained.
+ */
 void Editor::SearchAnchor() {
 	searchAnchor = SelectionStart();
 }
 
-// Find text from current search anchor:  Must call SearchAnchor first.
-// Accepts both SCI_SEARCHNEXT and SCI_SEARCHPREV.
-// wParam contains search modes : ORed FR_MATCHCASE and FR_WHOLEWORD.
-// lParam contains the text to search for.
-long Editor::SearchText(unsigned int iMessage, unsigned long wParam, long lParam) {
+/**
+ * Find text from current search anchor: Must call @c SearchAnchor first.
+ * Used for next text and previous text requests.
+ * @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.
+    unsigned long wParam,    	///< Search modes : @c SCFIND_MATCHCASE, @c SCFIND_WHOLEWORD,
+    ///< @c SCFIND_WORDSTART or @c SCFIND_REGEXP.
+    long lParam) {			///< The text to search for.
+
 	const char *txt = reinterpret_cast<char *>(lParam);
 	int pos;
-
+	int lengthFound = strlen(txt);
 	if (iMessage == SCI_SEARCHNEXT) {
 		pos = pdoc->FindText(searchAnchor, pdoc->Length(), txt,
-			wParam & SCFIND_MATCHCASE,
-			wParam & SCFIND_WHOLEWORD,
-			wParam & SCFIND_WORDSTART);
+		                     wParam & SCFIND_MATCHCASE,
+		                     wParam & SCFIND_WHOLEWORD,
+		                     wParam & SCFIND_WORDSTART,
+		                     wParam & SCFIND_REGEXP,
+		                     &lengthFound);
 	} else {
 		pos = pdoc->FindText(searchAnchor, 0, txt,
-			wParam & SCFIND_MATCHCASE,
-			wParam & SCFIND_WHOLEWORD,
-			wParam & SCFIND_WORDSTART);
+		                     wParam & SCFIND_MATCHCASE,
+		                     wParam & SCFIND_WHOLEWORD,
+		                     wParam & SCFIND_WORDSTART,
+		                     wParam & SCFIND_REGEXP,
+		                     &lengthFound);
 	}
 
 	if (pos != -1) {
-		SetSelection(pos, pos + strlen(txt));
+		SetSelection(pos, pos + lengthFound);
 	}
 
 	return pos;
 }
 
+/**
+ * Search for text in the target range of the document.
+ * @return The position of the found text, -1 if not found.
+ */
+long Editor::SearchInTarget(const char *text, int length) {
+	int lengthFound = length;
+	int pos = pdoc->FindText(targetStart, targetEnd, text,
+	                         searchFlags & SCFIND_MATCHCASE,
+	                         searchFlags & SCFIND_WHOLEWORD,
+	                         searchFlags & SCFIND_WORDSTART,
+	                         searchFlags & SCFIND_REGEXP,
+	                         &lengthFound);
+	if (pos != -1) {
+		targetStart = pos;
+		targetEnd = pos + lengthFound;
+	}
+	return pos;
+}
+
 void Editor::GoToLine(int lineNo) {
 	if (lineNo > pdoc->LinesTotal())
 		lineNo = pdoc->LinesTotal();
@@ -2471,13 +2869,21 @@ void Editor::SetDragPosition(int newPos) {
 	}
 }
 
+void Editor::DisplayCursor(Window::Cursor c) {
+	if (cursorMode == SC_CURSORNORMAL)
+		wMain.SetCursor(c);
+	else
+		wMain.SetCursor(static_cast<Window::Cursor>(cursorMode));
+}
+
 void Editor::StartDrag() {
 	// Always handled by subclasses
 	//SetMouseCapture(true);
-	//wDraw.SetCursor(Window::cursorArrow);
+	//DisplayCursor(Window::cursorArrow);
 }
 
 
+
 void Editor::DropAt(int position, const char *value, bool moving, bool rectangular) {
 	//Platform::DebugPrintf("DropAt %d\n", inDragDrop);
 	if (inDragDrop)
@@ -2598,6 +3004,30 @@ bool Editor::PointInSelMargin(Point pt) {
 	}
 }
 
+void Editor::LineSelection(int lineCurrent_, int lineAnchor_) {
+	if (lineAnchor_ < lineCurrent_) {
+		SetSelection(pdoc->LineStart(lineCurrent_ + 1),
+		             pdoc->LineStart(lineAnchor_));
+	} else if (lineAnchor_ > lineCurrent_) {
+		SetSelection(pdoc->LineStart(lineCurrent_),
+		             pdoc->LineStart(lineAnchor_ + 1));
+	} else { // Same line, select it
+		SetSelection(pdoc->LineStart(lineAnchor_ + 1),
+		             pdoc->LineStart(lineAnchor_));
+	}
+}
+
+void Editor::DwellEnd(bool mouseMoved) {
+	if (mouseMoved)
+		ticksToDwell = dwellDelay;
+	else
+		ticksToDwell = SC_TIME_FOREVER;
+	if (dwelling && (dwellDelay < SC_TIME_FOREVER)) {
+		dwelling = false;
+		NotifyDwelling(ptMouseLast, dwelling);
+	}
+}
+
 void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt) {
 	//Platform::DebugPrintf("Scintilla:ButtonDown %d %d = %d alt=%d\n", curTime, lastClickTime, curTime - lastClickTime, alt);
 	ptMouseLast = pt;
@@ -2607,9 +3037,10 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b
 
 	bool processed = NotifyMarginClick(pt, shift, ctrl, alt);
 	if (processed)
-		return ;
+		return;
 
-	if (shift) {
+	bool inSelMargin = PointInSelMargin(pt);
+	if (shift & !inSelMargin) {
 		SetSelection(newPos);
 	}
 	if (((curTime - lastClickTime) < Platform::DoubleClickTime()) && Close(pt, lastClick)) {
@@ -2650,21 +3081,30 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b
 		if (doubleClick)
 			NotifyDoubleClick(pt, shift);
 	} else {	// Single click
-		if (PointInSelMargin(pt)) {
+		if (inSelMargin) {
+			selType = selStream;
 			if (ctrl) {
 				SelectAll();
 				lastClickTime = curTime;
-				return ;
+				return;
 			}
-			lineAnchor = LineFromLocation(pt);
-			// While experimenting with folding turn off line selection
 			if (!shift) {
+				lineAnchor = LineFromLocation(pt);
 				// Single click in margin: select whole line
-				SetSelection(pdoc->LineStart(lineAnchor + 1), pdoc->LineStart(lineAnchor));
+				LineSelection(lineAnchor, lineAnchor);
+				SetSelection(pdoc->LineStart(lineAnchor + 1),
+				             pdoc->LineStart(lineAnchor));
 			} else {
-				// Single shift+click in margin: select from anchor to beginning of clicked line
-				SetSelection(pdoc->LineStart(lineAnchor), anchor);
+				// Single shift+click in margin: select from line anchor to clicked line
+				if (anchor > currentPos)
+					lineAnchor = pdoc->LineFromPosition(anchor - 1);
+				else
+					lineAnchor = pdoc->LineFromPosition(anchor);
+				int lineStart = LineFromLocation(pt);
+				LineSelection(lineStart, lineAnchor);
+				//lineAnchor = lineStart; // Keep the same anchor for ButtonMove
 			}
+
 			SetDragPosition(invalidPosition);
 			SetMouseCapture(true);
 			selectionType = selLine;
@@ -2678,13 +3118,13 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b
 				CopySelectionIntoDrag();
 				StartDrag();
 			} else {
-				selType = alt ? selRectangle : selStream;
 				xStartSelect = pt.x - vs.fixedColumnWidth + xOffset;
 				xEndSelect = pt.x - vs.fixedColumnWidth + xOffset;
 				SetDragPosition(invalidPosition);
 				SetMouseCapture(true);
 				if (!shift)
 					SetEmptySelection(newPos);
+				selType = alt ? selRectangle : selStream;
 				selectionType = selChar;
 				originalAnchorPos = currentPos;
 			}
@@ -2696,10 +3136,21 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b
 }
 
 void Editor::ButtonMove(Point pt) {
+	if ((ptMouseLast.x != pt.x) || (ptMouseLast.y != pt.y)) {
+		DwellEnd(true);
+	}
+	ptMouseLast = pt;
 	//Platform::DebugPrintf("Move %d %d\n", pt.x, pt.y);
 	if (HaveMouseCapture()) {
+
+		// Slow down autoscrolling/selection
+		autoScrollTimer.ticksToWait -= timer.tickSize;
+		if (autoScrollTimer.ticksToWait > 0)
+			return;
+		autoScrollTimer.ticksToWait = autoScrollDelay;
+
+		// Adjust selection
 		xEndSelect = pt.x - vs.fixedColumnWidth + xOffset;
-		ptMouseLast = pt;
 		int movePos = PositionFromLocation(pt);
 		movePos = MovePositionOutsideChar(movePos, currentPos - movePos);
 		if (posDrag >= 0) {
@@ -2719,29 +3170,35 @@ void Editor::ButtonMove(Point pt) {
 			} else {
 				// Continue selecting by line
 				int lineMove = LineFromLocation(pt);
-				if (lineAnchor < lineMove) {
-					SetSelection(pdoc->LineStart(lineMove + 1),
-					             pdoc->LineStart(lineAnchor));
-				} else {
-					SetSelection(pdoc->LineStart(lineMove),
-					             pdoc->LineStart(lineAnchor + 1));
-				}
+				LineSelection(lineMove, lineAnchor);
 			}
 		}
-		EnsureCaretVisible(false);
+
+		// Autoscroll
+		PRectangle rcClient = GetClientRectangle();
+		if (pt.y > rcClient.bottom) {
+			int lineMove = cs.DisplayFromDoc(LineFromLocation(pt));
+			ScrollTo(lineMove - LinesOnScreen() + 5);
+			Redraw();
+		} else if (pt.y < rcClient.top) {
+			int lineMove = cs.DisplayFromDoc(LineFromLocation(pt));
+			ScrollTo(lineMove - 5);
+			Redraw();
+		}
+		EnsureCaretVisible(false, false, true);
+
 	} else {
 		if (vs.fixedColumnWidth > 0) {	// There is a margin
 			if (PointInSelMargin(pt)) {
-				wDraw.SetCursor(Window::cursorReverseArrow);
-				return ; 	// No need to test for selection
+				DisplayCursor(Window::cursorReverseArrow);
+				return; 	// No need to test for selection
 			}
-
 		}
 		// Display regular (drag) cursor over selection
 		if (PointInSelection(pt))
-			wDraw.SetCursor(Window::cursorArrow);
+			DisplayCursor(Window::cursorArrow);
 		else
-			wDraw.SetCursor(Window::cursorText);
+			DisplayCursor(Window::cursorText);
 	}
 
 }
@@ -2750,9 +3207,9 @@ void Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) {
 	//Platform::DebugPrintf("ButtonUp %d\n", HaveMouseCapture());
 	if (HaveMouseCapture()) {
 		if (PointInSelMargin(pt)) {
-			wDraw.SetCursor(Window::cursorReverseArrow);
+			DisplayCursor(Window::cursorReverseArrow);
 		} else {
-			wDraw.SetCursor(Window::cursorText);
+			DisplayCursor(Window::cursorText);
 		}
 		xEndSelect = pt.x - vs.fixedColumnWidth + xOffset;
 		ptMouseLast = pt;
@@ -2813,6 +3270,26 @@ void Editor::Tick() {
 			InvalidateCaret();
 		}
 	}
+	if ((dwellDelay < SC_TIME_FOREVER) && 
+		(ticksToDwell > 0) &&
+		(!HaveMouseCapture())) {
+		ticksToDwell -= timer.tickSize;
+		if (ticksToDwell <= 0) {
+			dwelling = true;
+			NotifyDwelling(ptMouseLast, dwelling);
+		}
+	}
+}
+
+void Editor::SetFocusState(bool focusState) {
+	hasFocus = focusState;
+	NotifyFocus(hasFocus);
+	if (hasFocus) {
+		ShowCaretAtCurrentPosition();
+		InvalidateCaret();
+	} else {
+		DropCaret();
+	}
 }
 
 static bool IsIn(int a, int minimum, int maximum) {
@@ -2831,7 +3308,7 @@ void Editor::CheckForChangeOutsidePaint(Range r) {
 	if (paintState == painting && !paintingAllText) {
 		//Platform::DebugPrintf("Checking range in paint %d-%d\n", r.start, r.end);
 		if (!r.Valid())
-			return ;
+			return;
 
 		PRectangle rcText = GetTextRectangle();
 		// Determine number of lines displayed including a possible partially displayed last line
@@ -2843,7 +3320,7 @@ void Editor::CheckForChangeOutsidePaint(Range r) {
 		if (!IsOverlap(topLine, bottomLine, lineRangeStart, lineRangeEnd)) {
 			//Platform::DebugPrintf("No overlap (%d-%d) with window(%d-%d)\n",
 			//		lineRangeStart, lineRangeEnd, topLine, bottomLine);
-			return ;
+			return;
 		}
 
 		// Assert rcPaint contained within or equal to rcText
@@ -2855,7 +3332,7 @@ void Editor::CheckForChangeOutsidePaint(Range r) {
 				//Platform::DebugPrintf("Change (%d-%d) in top npv(%d-%d)\n",
 				//	lineRangeStart, lineRangeEnd, topLine, paintTopLine);
 				paintState = paintAbandoned;
-				return ;
+				return;
 			}
 		}
 		if (rcPaint.bottom < rcText.bottom) {
@@ -2866,7 +3343,7 @@ void Editor::CheckForChangeOutsidePaint(Range r) {
 				//Platform::DebugPrintf("Change (%d-%d) in bottom npv(%d-%d)\n",
 				//	lineRangeStart, lineRangeEnd, paintBottomLine, bottomLine);
 				paintState = paintAbandoned;
-				return ;
+				return;
 			}
 		}
 	}
@@ -3005,12 +3482,12 @@ 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.
-void Editor::EnsureLineVisible(int line) {
-	if (!cs.GetVisible(line)) {
-		int lineParent = pdoc->GetFoldParent(line);
+void Editor::EnsureLineVisible(int lineDoc, bool enforcePolicy) {
+	if (!cs.GetVisible(lineDoc)) {
+		int lineParent = pdoc->GetFoldParent(lineDoc);
 		if (lineParent >= 0) {
-			if (line != lineParent)
-				EnsureLineVisible(lineParent);
+			if (lineDoc != lineParent)
+				EnsureLineVisible(lineParent, enforcePolicy);
 			if (!cs.GetExpanded(lineParent)) {
 				cs.SetExpanded(lineParent, 1);
 				Expand(lineParent, true);
@@ -3019,21 +3496,59 @@ void Editor::EnsureLineVisible(int line) {
 		SetScrollBars();
 		Redraw();
 	}
+	if (enforcePolicy) {
+		int lineDisplay = cs.DisplayFromDoc(lineDoc);
+		if (visiblePolicy & VISIBLE_SLOP) {
+			if ((topLine > lineDisplay) || ((visiblePolicy & VISIBLE_STRICT) && (topLine + visibleSlop > lineDisplay))) {
+				SetTopLine(Platform::Clamp(lineDisplay - visibleSlop, 0, MaxScrollPos()));
+				SetVerticalScrollPos();
+				Redraw();
+			} else if ((lineDisplay > topLine + LinesOnScreen() - 1) ||
+					   ((visiblePolicy & VISIBLE_STRICT) && (lineDisplay > topLine + LinesOnScreen() - 1 - visibleSlop))) {
+				SetTopLine(Platform::Clamp(lineDisplay - LinesOnScreen() + 1 + visibleSlop, 0, MaxScrollPos()));
+				SetVerticalScrollPos();
+				Redraw();
+			}
+		} else {
+			if ((topLine > lineDisplay) || (lineDisplay > topLine + LinesOnScreen() - 1) || (visiblePolicy & VISIBLE_STRICT)) {
+				SetTopLine(Platform::Clamp(lineDisplay - LinesOnScreen() / 2 + 1, 0, MaxScrollPos()));
+				SetVerticalScrollPos();
+				Redraw();
+			}
+		}
+	}
+}
+
+int Editor::ReplaceTarget(bool replacePatterns, const char *text, int length) {
+	pdoc->BeginUndoAction();
+	if (length == -1)
+		length = strlen(text);
+	if (replacePatterns) {
+		text = pdoc->SubstituteByPosition(text, &length);
+		if (!text)
+			return 0;
+	}
+	if (targetStart != targetEnd)
+		pdoc->DeleteChars(targetStart, targetEnd - targetStart);
+	targetEnd = targetStart;
+	pdoc->InsertString(targetStart, text, length);
+	targetEnd = targetStart + length;
+	pdoc->EndUndoAction();
+	return length;
 }
 
 static bool ValidMargin(unsigned long wParam) {
 	return wParam < ViewStyle::margins;
 }
 
-
-long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
+sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
 	//Platform::DebugPrintf("S start wnd proc %d %d %d\n",iMessage, wParam, lParam);
 
 	// Optional macro recording hook
 #ifdef MACRO_SUPPORT
 	if (recordingMacro)
 		NotifyMacroRecord(iMessage, wParam, lParam);
-#endif
+#endif 
 
 	switch (iMessage) {
 
@@ -3095,7 +3610,7 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 		SetLastXChosen();
 		break;
 
-		// Edit control mesages
+		// Edit control messages
 
 		// Not supported (no-ops):
 		//		EM_GETWORDBREAKPROC
@@ -3164,31 +3679,37 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 		return topLine;
 
 	case EM_GETLINE: {
-			if (lParam == 0)
+			if (lParam == 0) {
 				return 0;
-			int lineStart = pdoc->LineStart(wParam);
-			int lineEnd = pdoc->LineStart(wParam + 1);
+			}
 			char *ptr = reinterpret_cast<char *>(lParam);
 			short *pBufSize = reinterpret_cast<short *>(lParam);
-			if (*pBufSize < lineEnd - lineStart) {
-				ptr[0] = '\0'; 	// If no characters copied have to put a NUL into buffer
+			short bufSize = *pBufSize;
+			ptr[0] = '\0'; 	// If no characters copied, have to put a NUL into buffer
+			if (static_cast<int>(wParam) > pdoc->LinesTotal()) {
 				return 0;
 			}
+			int lineStart = pdoc->LineStart(wParam);
+			int lineEnd = pdoc->LineStart(wParam + 1);
+			// The first word of the buffer is the size, in TCHARs, of the buffer
 			int iPlace = 0;
-			for (int iChar = lineStart; iChar < lineEnd; iChar++)
+			for (int iChar = lineStart; iChar < lineEnd && iPlace < bufSize; iChar++) {
 				ptr[iPlace++] = pdoc->CharAt(iChar);
+			}
 			return iPlace;
 		}
 
-	case SCI_GETLINE: {
-			if (lParam == 0)
+	case SCI_GETLINE: {	// Simpler than EM_GETLINE, but with risk of overwriting the end of the buffer
+			if (lParam == 0) {
 				return 0;
+			}
 			int lineStart = pdoc->LineStart(wParam);
 			int lineEnd = pdoc->LineStart(wParam + 1);
 			char *ptr = reinterpret_cast<char *>(lParam);
 			int iPlace = 0;
-			for (int iChar = lineStart; iChar < lineEnd; iChar++)
+			for (int iChar = lineStart; iChar < lineEnd; iChar++) {
 				ptr[iPlace++] = pdoc->CharAt(iChar);
+			}
 			return iPlace;
 		}
 
@@ -3268,6 +3789,8 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 					ptr[iChar] = text[iChar];
 				ptr[iChar] = '\0';
 				delete []text;
+			} else {
+				ptr[0] = '\0';
 			}
 			return iChar;
 		}
@@ -3294,7 +3817,7 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 		if (wParam == 0)
 			return 0; 	// Even if there is no text, there is a first line that starts at 0
 		if (static_cast<int>(wParam) > pdoc->LinesTotal())
-			return - 1;
+			return -1;
 		//if (wParam > pdoc->LineFromPosition(pdoc->Length()))	// Useful test, anyway...
 		//	return -1;
 		return pdoc->LineStart(wParam);
@@ -3334,6 +3857,39 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 		}
 		break;
 
+	case SCI_SETTARGETSTART:
+		targetStart = wParam;
+		break;
+
+	case SCI_GETTARGETSTART:
+		return targetStart;
+
+	case SCI_SETTARGETEND:
+		targetEnd = wParam;
+		break;
+
+	case SCI_GETTARGETEND:
+		return targetEnd;
+
+	case SCI_REPLACETARGET:
+		PLATFORM_ASSERT(lParam);
+		return ReplaceTarget(false, reinterpret_cast<char *>(lParam), wParam);
+
+	case SCI_REPLACETARGETRE:
+		PLATFORM_ASSERT(lParam);
+		return ReplaceTarget(true, reinterpret_cast<char *>(lParam), wParam);
+
+	case SCI_SEARCHINTARGET:
+		PLATFORM_ASSERT(lParam);
+		return SearchInTarget(reinterpret_cast<char *>(lParam), wParam);
+
+	case SCI_SETSEARCHFLAGS:
+		searchFlags = wParam;
+		break;
+
+	case SCI_GETSEARCHFLAGS:
+		return searchFlags;
+
 	case EM_LINESCROLL:
 	case SCI_LINESCROLL:
 		ScrollTo(topLine + lParam);
@@ -3355,7 +3911,7 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 
 	case EM_CANPASTE:
 	case SCI_CANPASTE:
-		return 1;
+		return CanPaste();
 
 	case EM_CHARFROMPOS: {
 			if (lParam == 0)
@@ -3419,15 +3975,16 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 		}
 
 
+
 	case EM_SELECTIONTYPE:
 #ifdef SEL_EMPTY
 		if (currentPos == anchor)
 			return SEL_EMPTY;
 		else
 			return SEL_TEXT;
-#else
+#else 
 		return 0;
-#endif
+#endif 
 
 	case EM_HIDESELECTION:
 		hideSelection = wParam;
@@ -3461,7 +4018,7 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 			vs.rightMarginWidth = vs.aveCharWidth / 2;
 		}
 		InvalidateStyleRedraw();
-#endif
+#endif 
 		break;
 
 	case SCI_SETMARGINLEFT:
@@ -3611,7 +4168,6 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 
 	case SCI_SETSAVEPOINT:
 		pdoc->SetSavePoint();
-		NotifySavePoint(true);
 		break;
 
 	case SCI_GETSTYLEDTEXT: {
@@ -3649,6 +4205,9 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 	case SCI_POSITIONFROMPOINT:
 		return PositionFromLocation(Point(wParam, lParam));
 
+	case SCI_POSITIONFROMPOINTCLOSE:
+		return PositionFromLocationClose(Point(wParam, lParam));
+
 	case SCI_GOTOLINE:
 		GoToLine(wParam);
 		break;
@@ -3660,15 +4219,17 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 		break;
 
 	case SCI_GETCURLINE: {
-			if (lParam == 0)
+			if (lParam == 0) {
 				return 0;
+			}
 			int lineCurrentPos = pdoc->LineFromPosition(currentPos);
 			int lineStart = pdoc->LineStart(lineCurrentPos);
 			unsigned int lineEnd = pdoc->LineStart(lineCurrentPos + 1);
 			char *ptr = reinterpret_cast<char *>(lParam);
 			unsigned int iPlace = 0;
-			for (unsigned int iChar = lineStart; iChar < lineEnd && iPlace < wParam; iChar++)
+			for (unsigned int iChar = lineStart; iChar < lineEnd && iPlace < wParam - 1; iChar++) {
 				ptr[iPlace++] = pdoc->CharAt(iChar);
+			}
 			ptr[iPlace] = '\0';
 			return currentPos - lineStart;
 		}
@@ -3691,7 +4252,7 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 		pdoc->SetStyleFor(wParam, static_cast<char>(lParam));
 		break;
 
-	case SCI_SETSTYLINGEX:    // Specify a complete styling buffer
+	case SCI_SETSTYLINGEX:           // Specify a complete styling buffer
 		if (lParam == 0)
 			return 0;
 		pdoc->SetStyles(wParam, reinterpret_cast<char *>(lParam));
@@ -3739,6 +4300,28 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 	case SCI_GETLINEINDENTPOSITION:
 		return pdoc->GetLineIndentPosition(wParam);
 
+	case SCI_SETTABINDENTS:
+		pdoc->tabIndents = wParam;
+		break;
+
+	case SCI_GETTABINDENTS:
+		return pdoc->tabIndents;
+
+	case SCI_SETBACKSPACEUNINDENTS:
+		pdoc->backspaceUnindents = wParam;
+		break;
+
+	case SCI_GETBACKSPACEUNINDENTS:
+		return pdoc->backspaceUnindents;
+
+	case SCI_SETMOUSEDWELLTIME:
+		dwellDelay = wParam;
+		ticksToDwell = dwellDelay;
+		break;
+	
+	case SCI_GETMOUSEDWELLTIME:
+		return dwellDelay;
+	
 	case SCI_GETCOLUMN:
 		return pdoc->GetColumn(wParam);
 
@@ -3946,6 +4529,12 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 			InvalidateStyleRedraw();
 		}
 		break;
+	case SCI_STYLESETCASE:
+		if (wParam <= STYLE_MAX) {
+			vs.styles[wParam].caseForce = static_cast<Style::ecaseForced>(lParam);
+			InvalidateStyleRedraw();
+		}
+		break;
 	case SCI_STYLESETCHARACTERSET:
 		if (wParam <= STYLE_MAX) {
 			vs.styles[wParam].characterSet = lParam;
@@ -3979,6 +4568,19 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 	case SCI_GETMAXLINESTATE:
 		return pdoc->GetMaxLineState();
 
+	case SCI_GETCARETLINEVISIBLE:
+		return vs.showCaretLineBackground;
+	case SCI_SETCARETLINEVISIBLE:
+		vs.showCaretLineBackground = wParam;
+		InvalidateStyleRedraw();
+		break;
+	case SCI_GETCARETLINEBACK:
+		return vs.caretLineBackground.desired.AsLong();
+	case SCI_SETCARETLINEBACK:
+		vs.caretLineBackground.desired = wParam;
+		InvalidateStyleRedraw();
+		break;
+
 		// Folding messages
 
 	case SCI_VISIBLEFROMDOCLINE:
@@ -4037,7 +4639,11 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 		break;
 
 	case SCI_ENSUREVISIBLE:
-		EnsureLineVisible(wParam);
+		EnsureLineVisible(wParam, false);
+		break;
+
+	case SCI_ENSUREVISIBLEENFORCEPOLICY:
+		EnsureLineVisible(wParam, true);
 		break;
 
 	case SCI_SEARCHANCHOR:
@@ -4053,6 +4659,11 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 		caretSlop = lParam;
 		break;
 
+	case SCI_SETVISIBLEPOLICY:
+		visiblePolicy = wParam;
+		visibleSlop = lParam;
+		break;
+
 	case SCI_LINESONSCREEN:
 		return LinesOnScreen();
 
@@ -4080,6 +4691,19 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 	case SCI_GETCARETFORE:
 		return vs.caretcolour.desired.AsLong();
 
+	case SCI_SETCARETWIDTH:
+		if (wParam <= 1)
+			vs.caretWidth = 1;
+		else if (wParam >= 3)
+			vs.caretWidth = 3;
+		else
+			vs.caretWidth = wParam;
+		InvalidateStyleRedraw();
+		break;
+
+	case SCI_GETCARETWIDTH:
+		return vs.caretWidth;
+
 	case SCI_ASSIGNCMDKEY:
 		kmap.AssignCmdKey(Platform::LowShortFromLong(wParam),
 		                  Platform::HighShortFromLong(wParam), lParam);
@@ -4151,6 +4775,8 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 	case SCI_ZOOMOUT:
 	case SCI_DELWORDLEFT:
 	case SCI_DELWORDRIGHT:
+	case SCI_DELLINELEFT:
+	case SCI_DELLINERIGHT:
 	case SCI_LINECUT:
 	case SCI_LINEDELETE:
 	case SCI_LINETRANSPOSE:
@@ -4158,6 +4784,10 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 	case SCI_UPPERCASE:
 	case SCI_LINESCROLLDOWN:
 	case SCI_LINESCROLLUP:
+	case SCI_WORDPARTLEFT:
+	case SCI_WORDPARTLEFTEXTEND:
+	case SCI_WORDPARTRIGHT:
+	case SCI_WORDPARTRIGHTEXTEND:
 		return KeyCommand(iMessage);
 
 	case SCI_BRACEHIGHLIGHT:
@@ -4256,6 +4886,35 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 	case SCI_GETOVERTYPE:
 		return inOverstrike ? TRUE : FALSE;
 
+	case SCI_SETFOCUS:
+		SetFocusState(wParam);
+		break;
+
+	case SCI_GETFOCUS:
+		return hasFocus;
+
+	case SCI_SETSTATUS:
+		errorStatus = wParam;
+		break;
+
+	case SCI_GETSTATUS:
+		return errorStatus;
+
+	case SCI_SETMOUSEDOWNCAPTURES:
+		mouseDownCaptures = wParam;
+		break;
+
+	case SCI_GETMOUSEDOWNCAPTURES:
+		return mouseDownCaptures;
+
+	case SCI_SETCURSOR:
+		cursorMode = wParam;
+		DisplayCursor(Window::cursorText);
+		break;
+
+	case SCI_GETCURSOR:
+		return cursorMode;
+
 #ifdef MACRO_SUPPORT
 	case SCI_STARTRECORD:
 		recordingMacro = 1;
@@ -4264,7 +4923,11 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 	case SCI_STOPRECORD:
 		recordingMacro = 0;
 		return 0;
-#endif
+#endif 
+
+	case SCI_MOVECARETINSIDEVIEW:
+		MoveCaretInsideView();
+		break;
 
 	default:
 		return DefWndProc(iMessage, wParam, lParam);
diff --git a/contrib/src/stc/scintilla/src/Editor.h b/contrib/src/stc/scintilla/src/Editor.h
index 83967cfd6a..d42f5ad14a 100644
--- a/contrib/src/stc/scintilla/src/Editor.h
+++ b/contrib/src/stc/scintilla/src/Editor.h
@@ -1,11 +1,15 @@
 // Scintilla source code edit control
-// Editor.h - defines the main editor class
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file Editor.h
+ ** Defines the main editor class.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef EDITOR_H
 #define EDITOR_H
 
+/**
+ */
 class Caret {
 public:
 	bool active;
@@ -15,8 +19,9 @@ public:
 	Caret();
 };
 
+/**
+ */
 class Timer {
-
 public:
 	bool ticking;
 	int ticksToWait;
@@ -26,15 +31,18 @@ public:
 	Timer();
 };
 
+/**
+ */
 class LineLayout {
 public:
-	// Drawing is only performed for maxLineLength characters on each line.
+	/// Drawing is only performed for @a maxLineLength characters on each line.
 	enum {maxLineLength = 4000};
 	int numCharsInLine;
 	int xHighlightGuide;
 	bool highlightColumn;
 	int selStart;
 	int selEnd;
+	bool containsCaret;
 	int edgeColumn;
 	char chars[maxLineLength+1];
 	char styles[maxLineLength+1];
@@ -42,35 +50,40 @@ public:
 	int positions[maxLineLength+1];
 };
 
+/**
+ */
 class Editor : public DocWatcher {
 	// Private so Editor objects can not be copied
 	Editor(const Editor &) : DocWatcher() {}
 	Editor &operator=(const Editor &) { return *this; }
+
 protected:	// ScintillaBase subclass needs access to much of Editor
 
-	// On GTK+, Scintilla is a container widget holding two scroll bars and a drawing area
-	// whereas on Windows there is just one window with both scroll bars turned on.
-	// Therefore, on GTK+ the following are separate windows but only one window on Windows.
-	Window wMain;	// The Scintilla parent window
-	Window wDraw;	// The text drawing area
+	/** On GTK+, Scintilla is a container widget holding two scroll bars
+	 * whereas on Windows there is just one window with both scroll bars turned on. */
+	Window wMain;	///< The Scintilla parent window
 
-	// Style resources may be expensive to allocate so are cached between uses.
-	// When a style attribute is changed, this cache is flushed.
+	/** Style resources may be expensive to allocate so are cached between uses.
+	 * When a style attribute is changed, this cache is flushed. */
 	bool stylesValid;	
 	ViewStyle vs;
 	Palette palette;
 	int printMagnification;
 	int printColourMode;
-	
+	int cursorMode;
+
+	bool hasFocus;
 	bool hideSelection;
 	bool inOverstrike;
-
-	// In bufferedDraw mode, graphics operations are drawn to a pixmap and then copied to 
-	// the screen. This avoids flashing but is about 30% slower.
+	int errorStatus;
+	bool mouseDownCaptures;
+	
+	/** In bufferedDraw mode, graphics operations are drawn to a pixmap and then copied to
+	 * the screen. This avoids flashing but is about 30% slower. */
 	bool bufferedDraw;
 
-	int xOffset;				// Horizontal scrolled amount in pixels
-	int xCaretMargin;	// Ensure this many pixels visible on both sides of caret
+	int xOffset;		///< Horizontal scrolled amount in pixels
+	int xCaretMargin;	///< Ensure this many pixels visible on both sides of caret
 	bool horizontalScrollBarVisible;
 	
 	Surface pixmapLine;
@@ -80,15 +93,20 @@ protected:	// ScintillaBase subclass needs access to much of Editor
 	Surface pixmapIndentGuideHighlight;
 	// Intellimouse support - currently only implemented for Windows
 	unsigned int ucWheelScrollLines;
-	int cWheelDelta; //wheel delta from roll
+	int cWheelDelta; ///< Wheel delta from roll
 
 	KeyMap kmap;
 
 	Caret caret;
 	Timer timer;
+	Timer autoScrollTimer;
+	enum { autoScrollDelay = 200 };
 
 	Point lastClick;
 	unsigned int lastClickTime;
+	int dwellDelay;
+	int ticksToDwell;
+	bool dwelling;
 	enum { selChar, selWord, selLine } selectionType;
 	Point ptMouseLast;
 	bool firstExpose;
@@ -101,6 +119,9 @@ protected:	// ScintillaBase subclass needs access to much of Editor
 	int originalAnchorPos;
 	int currentPos;
 	int anchor;
+	int targetStart;
+	int targetEnd;
+	int searchFlags;
 	int topLine;
 	int posTopLine;
 	
@@ -128,6 +149,9 @@ protected:	// ScintillaBase subclass needs access to much of Editor
 	int caretPolicy;
 	int caretSlop;
 
+	int visiblePolicy;
+	int visibleSlop;
+	
 	int searchAnchor;
 
 	int displayPopupMenu;
@@ -152,15 +176,16 @@ protected:	// ScintillaBase subclass needs access to much of Editor
 	void RefreshStyleData();
 	void DropGraphics();
 
-	PRectangle GetClientRectangle();
+	virtual PRectangle GetClientRectangle();
 	PRectangle GetTextRectangle();
 	
 	int LinesOnScreen();
 	int LinesToScroll();
 	int MaxScrollPos();
-	Point LocationFromPosition(unsigned int pos);
-	int XFromPosition(unsigned int pos);
+	Point LocationFromPosition(int pos);
+	int XFromPosition(int pos);
 	int PositionFromLocation(Point pt);
+	int PositionFromLocationClose(Point pt);
 	int PositionFromLineX(int line, int x);
 	int LineFromLocation(Point pt);
 	void SetTopLine(int topLineNew);
@@ -187,11 +212,12 @@ protected:	// ScintillaBase subclass needs access to much of Editor
 	virtual void ScrollText(int linesToMove);
 	void HorizontalScrollTo(int xPos);
 	void MoveCaretInsideView();
-	void EnsureCaretVisible(bool useMargin=true);
+	void EnsureCaretVisible(bool useMargin=true, bool vert=true, bool horiz=true);
 	void ShowCaretAtCurrentPosition();
 	void DropCaret();
 	void InvalidateCaret();
 
+	int SubstituteMarkerIfEmpty(int markerCheck, int markerDefault);
 	void PaintSelMargin(Surface *surface, PRectangle &rc);
         void LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayout &ll);
 	void DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVisible, int xStart, 
@@ -214,6 +240,7 @@ protected:	// ScintillaBase subclass needs access to much of Editor
 	void Cut();
 	void PasteRectangular(int pos, const char *ptr, int len);
 	virtual void Copy() = 0;
+	virtual bool CanPaste();
 	virtual void Paste() = 0;
 	void Clear();
 	void SelectAll();
@@ -227,14 +254,16 @@ protected:	// ScintillaBase subclass needs access to much of Editor
 	virtual void NotifyFocus(bool focus);
 	virtual void NotifyParent(SCNotification scn) = 0;
 	virtual void NotifyStyleToNeeded(int endStyleNeeded);
-	void NotifyChar(char ch);
+	void NotifyChar(int ch);
 	void NotifyMove(int position);
 	void NotifySavePoint(bool isSavePoint);
 	void NotifyModifyAttempt();
 	virtual void NotifyDoubleClick(Point pt, bool shift);
 	void NotifyUpdateUI();
+	void NotifyPainted();
 	bool NotifyMarginClick(Point pt, bool shift, bool ctrl, bool alt);
 	void NotifyNeedShown(int pos, int len);
+	void NotifyDwelling(Point pt, bool state);
 	
 	void NotifyModifyAttempt(Document *document, void *userData);
 	void NotifySavePoint(Document *document, void *userData, bool atSavePoint);
@@ -253,7 +282,7 @@ protected:	// ScintillaBase subclass needs access to much of Editor
     	virtual void CancelModes();
 	virtual int KeyCommand(unsigned int iMessage);
 	virtual int KeyDefault(int /* key */, int /*modifiers*/);
-	int KeyDown(int key, bool shift, bool ctrl, bool alt);
+	int KeyDown(int key, bool shift, bool ctrl, bool alt, bool *consumed=0);
 
 	int GetWhitespaceVisible();
 	void SetWhitespaceVisible(int view);
@@ -263,6 +292,7 @@ protected:	// ScintillaBase subclass needs access to much of Editor
 	long FindText(unsigned int iMessage, unsigned long wParam, long lParam);
 	void SearchAnchor();
 	long SearchText(unsigned int iMessage, unsigned long wParam, long lParam);
+	long SearchInTarget(const char *text, int length);
 	void GoToLine(int lineNo);
 
 	char *CopyRange(int start, int end);
@@ -270,13 +300,16 @@ protected:	// ScintillaBase subclass needs access to much of Editor
 	char *CopySelectionRange();
 	void CopySelectionIntoDrag();
 	void SetDragPosition(int newPos);
+	void DisplayCursor(Window::Cursor c);
 	virtual void StartDrag();
 	void DropAt(int position, const char *value, bool moving, bool rectangular);
-	// PositionInSelection returns 0 if position in selection, -1 if position before selection, and 1 if after.
-	// Before means either before any line of selection or before selection on its line, with a similar meaning to after
+	/** PositionInSelection returns 0 if position in selection, -1 if position before selection, and 1 if after.
+	 * Before means either before any line of selection or before selection on its line, with a similar meaning to after. */
 	int PositionInSelection(int pos);
 	bool PointInSelection(Point pt);
 	bool PointInSelMargin(Point pt);
+	void LineSelection(int lineCurrent_, int lineAnchor_);
+	void DwellEnd(bool mouseMoved);
 	virtual void ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt);
 	void ButtonMove(Point pt);
 	void ButtonUp(Point pt, unsigned int curTime, bool ctrl);
@@ -285,6 +318,7 @@ protected:	// ScintillaBase subclass needs access to much of Editor
 	virtual void SetTicking(bool on) = 0;
 	virtual void SetMouseCapture(bool on) = 0;
 	virtual bool HaveMouseCapture() = 0;
+	void SetFocusState(bool focusState);
 
 	void CheckForChangeOutsidePaint(Range r);
 	int BraceMatch(int position, int maxReStyle);
@@ -294,13 +328,14 @@ protected:	// ScintillaBase subclass needs access to much of Editor
 	
 	void Expand(int &line, bool doExpand);
 	void ToggleContraction(int line);
-	void EnsureLineVisible(int line);
+	void EnsureLineVisible(int lineDoc, bool enforcePolicy);
+	int ReplaceTarget(bool replacePatterns, const char *text, int length=-1);
 
-	virtual long DefWndProc(unsigned int iMessage, unsigned long wParam, long lParam) = 0;
+	virtual sptr_t DefWndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) = 0;
 	
 public:
 	// Public so scintilla_send_message can use it
-	virtual long WndProc(unsigned int iMessage, unsigned long wParam, long lParam);
+	virtual sptr_t WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam);
 	// Public so scintilla_set_id can use it
 	int ctrlID;	
 };
diff --git a/contrib/src/stc/scintilla/src/Indicator.cxx b/contrib/src/stc/scintilla/src/Indicator.cxx
index 05bdf66b53..580e9f86da 100644
--- a/contrib/src/stc/scintilla/src/Indicator.cxx
+++ b/contrib/src/stc/scintilla/src/Indicator.cxx
@@ -1,6 +1,8 @@
 // Scintilla source code edit control
-// Indicator.cxx - defines the style of indicators which are text decorations such as underlining
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file Indicator.cxx
+ ** Defines the style of indicators which are text decorations such as underlining.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include "Platform.h"
diff --git a/contrib/src/stc/scintilla/src/Indicator.h b/contrib/src/stc/scintilla/src/Indicator.h
index 2472cedc14..a19b46b5e2 100644
--- a/contrib/src/stc/scintilla/src/Indicator.h
+++ b/contrib/src/stc/scintilla/src/Indicator.h
@@ -1,11 +1,15 @@
 // Scintilla source code edit control
-// Indicator.h - defines the style of indicators which are text decorations such as underlining
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file Indicator.h
+ ** Defines the style of indicators which are text decorations such as underlining.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef INDICATOR_H
 #define INDICATOR_H
 
+/**
+ */
 class Indicator {
 public:
 	int style;
diff --git a/contrib/src/stc/scintilla/src/KeyMap.cxx b/contrib/src/stc/scintilla/src/KeyMap.cxx
index d2a6660f3c..e1fe8e0322 100644
--- a/contrib/src/stc/scintilla/src/KeyMap.cxx
+++ b/contrib/src/stc/scintilla/src/KeyMap.cxx
@@ -1,6 +1,8 @@
 // Scintilla source code edit control
-// KeyMap.cxx  - defines a mapping between keystrokes and commands
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file KeyMap.cxx 
+ ** Defines a mapping between keystrokes and commands.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include "Platform.h"
@@ -71,10 +73,14 @@ KeyToCommand KeyMap::MapDefault[] = {
     {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_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_HOME, 		SCI_SHIFT, 	SCI_VCHOMEEXTEND},
     {SCK_HOME, 		SCI_CTRL, 	SCI_DOCUMENTSTART},
@@ -90,6 +96,7 @@ KeyToCommand KeyMap::MapDefault[] = {
     {SCK_DELETE, 	SCI_NORM,	SCI_CLEAR},
     {SCK_DELETE, 	SCI_SHIFT,	SCI_CUT},
     {SCK_DELETE, 	SCI_CTRL,	SCI_DELWORDRIGHT},
+    {SCK_DELETE,	SCI_CSHIFT,	SCI_DELLINERIGHT},
     {SCK_INSERT, 		SCI_NORM,	SCI_EDITTOGGLEOVERTYPE},
     {SCK_INSERT, 		SCI_SHIFT,	SCI_PASTE},
     {SCK_INSERT, 		SCI_CTRL,	SCI_COPY},
@@ -98,6 +105,7 @@ KeyToCommand KeyMap::MapDefault[] = {
     {SCK_BACK,		SCI_SHIFT, 	SCI_DELETEBACK},
     {SCK_BACK,		SCI_CTRL, 	SCI_DELWORDLEFT},
     {SCK_BACK, 		SCI_ALT,	SCI_UNDO},
+    {SCK_BACK,		SCI_CSHIFT,	SCI_DELLINELEFT},    
     {'Z', 			SCI_CTRL,	SCI_UNDO},
     {'Y', 			SCI_CTRL,	SCI_REDO},
     {'X', 			SCI_CTRL,	SCI_CUT},
diff --git a/contrib/src/stc/scintilla/src/KeyMap.h b/contrib/src/stc/scintilla/src/KeyMap.h
index c843104174..8232b7160b 100644
--- a/contrib/src/stc/scintilla/src/KeyMap.h
+++ b/contrib/src/stc/scintilla/src/KeyMap.h
@@ -1,6 +1,8 @@
 // Scintilla source code edit control
-// KeyMap.h - defines a mapping between keystrokes and commands
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file KeyMap.h
+ ** Defines a mapping between keystrokes and commands.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef KEYTOCOMMAND_H
@@ -13,6 +15,8 @@
 #define SCI_CSHIFT (SCI_CTRL | SCI_SHIFT)
 #define SCI_ASHIFT (SCI_ALT | SCI_SHIFT)
 
+/**
+ */
 class KeyToCommand {
 public:
 	int key;
@@ -20,11 +24,14 @@ public:
 	unsigned int msg;
 };
 
+/**
+ */
 class KeyMap {
 	KeyToCommand *kmap;
 	int len;
 	int alloc;
 	static KeyToCommand MapDefault[];
+
 public:
 	KeyMap();
 	~KeyMap();
diff --git a/contrib/src/stc/scintilla/src/KeyWords.cxx b/contrib/src/stc/scintilla/src/KeyWords.cxx
index 113ba222df..0728580fdf 100644
--- a/contrib/src/stc/scintilla/src/KeyWords.cxx
+++ b/contrib/src/stc/scintilla/src/KeyWords.cxx
@@ -1,13 +1,15 @@
-// SciTE - Scintilla based Text Editor
-// KeyWords.cxx - colourise for particular languages
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file KeyWords.cxx
+ ** Colourise for particular languages.
+ **/
+// 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"
 
@@ -18,28 +20,137 @@
 #include "SciLexer.h"
 
 LexerModule *LexerModule::base = 0;
+int LexerModule::nextLanguage = SCLEX_AUTOMATIC+1;
 
-LexerModule::LexerModule(int language_, LexerFunction fn_) :
-	language(language_), fn(fn_) {
+LexerModule::LexerModule(int language_, LexerFunction fnLexer_,
+	const char *languageName_, LexerFunction fnFolder_) :
+	language(language_), 
+	languageName(languageName_), 
+	fnLexer(fnLexer_), 
+	fnFolder(fnFolder_) {
 	next = base;
 	base = this;
+	if (language == SCLEX_AUTOMATIC) {
+		language = nextLanguage;
+		nextLanguage++;
+	}
 }
 
-void LexerModule::Colourise(unsigned int startPos, int lengthDoc, int initStyle,
-		int language, WordList *keywordlists[], Accessor &styler) {
+LexerModule *LexerModule::Find(int language) {
 	LexerModule *lm = base;
 	while (lm) {
 		if (lm->language == language) {
-			lm->fn(startPos, lengthDoc, initStyle, keywordlists, styler);
-			return;
+			return lm;
 		}
 		lm = lm->next;
 	}
-	// Unknown language
+	return 0;
+}
+
+LexerModule *LexerModule::Find(const char *languageName) {
+	if (languageName) {
+		LexerModule *lm = base;
+		while (lm) {
+			if (lm->languageName && 0 == strcmp(lm->languageName, languageName)) {
+				return lm;
+			}
+			lm = lm->next;
+		}
+	}
+	return 0;
+}
+
+void LexerModule::Lex(unsigned int startPos, int lengthDoc, int initStyle,
+	  WordList *keywordlists[], Accessor &styler) {
+	if (fnLexer)
+		fnLexer(startPos, lengthDoc, initStyle, keywordlists, styler);
+}
+
+void LexerModule::Fold(unsigned int startPos, int lengthDoc, int initStyle,
+	  WordList *keywordlists[], Accessor &styler) {
+	if (fnFolder) {
+		int lineCurrent = styler.GetLine(startPos);
+		// Move back one line in case deletion wrecked current line fold state
+		if (lineCurrent > 0) {
+			lineCurrent--;
+			int newStartPos = styler.LineStart(lineCurrent);
+			lengthDoc += startPos - newStartPos;
+			startPos = newStartPos;
+			initStyle = 0;
+			if (startPos > 0) {
+				initStyle = styler.StyleAt(startPos - 1);
+			}
+		}
+		fnFolder(startPos, lengthDoc, initStyle, keywordlists, styler);
+	}
+}
+
+static void ColouriseNullDoc(unsigned int startPos, int length, int, WordList *[],
+                            Accessor &styler) {
 	// Null language means all style bytes are 0 so just mark the end - no need to fill in.
-	if (lengthDoc > 0) {
-		styler.StartAt(startPos + lengthDoc - 1);
-		styler.StartSegment(startPos + lengthDoc - 1);
-		styler.ColourTo(startPos + lengthDoc - 1, 0);
+	if (length > 0) {
+		styler.StartAt(startPos + length - 1);
+		styler.StartSegment(startPos + length - 1);
+		styler.ColourTo(startPos + length - 1, 0);
 	}
 }
+
+LexerModule lmNull(SCLEX_NULL, ColouriseNullDoc, "null");
+
+#ifdef __vms
+
+// The following code forces a reference to all of the Scintilla lexers.
+// If we don't do something like this, then the linker tends to "optimize"
+// them away. (eric@sourcegear.com)
+
+// Taken from wxWindow's stc.cpp. Walter.
+
+int wxForceScintillaLexers(void) {
+  extern LexerModule lmAda;
+  extern LexerModule lmAVE;
+  extern LexerModule lmConf;
+  extern LexerModule lmDiff;
+  extern LexerModule lmLatex;
+  extern LexerModule lmPascal;
+  extern LexerModule lmCPP;
+  extern LexerModule lmHTML;
+  extern LexerModule lmXML;
+  extern LexerModule lmProps;
+  extern LexerModule lmErrorList;
+  extern LexerModule lmMake;
+  extern LexerModule lmBatch;
+  extern LexerModule lmPerl;
+  extern LexerModule lmPython;
+  extern LexerModule lmSQL;
+  extern LexerModule lmVB;
+  extern LexerModule lmRuby;
+
+  if (
+      &lmAda
+      && &lmAVE
+      && &lmConf
+      && &lmDiff
+      && &lmLatex
+      && &lmPascal
+      && &lmCPP
+      && &lmHTML
+      && &lmXML
+      && &lmProps
+      && &lmErrorList
+      && &lmMake
+      && &lmBatch
+      && &lmPerl
+      && &lmPython
+      && &lmSQL
+      && &lmVB
+      && &lmRuby      
+      )
+    {
+      return 1;
+    }
+  else
+    {
+      return 0;
+    }
+}
+#endif
diff --git a/contrib/src/stc/scintilla/src/LexAVE.cxx b/contrib/src/stc/scintilla/src/LexAVE.cxx
new file mode 100644
index 0000000000..a7422743fa
--- /dev/null
+++ b/contrib/src/stc/scintilla/src/LexAVE.cxx
@@ -0,0 +1,188 @@
+// SciTE - Scintilla based Text Editor
+/** @file LexAVE.cxx
+ ** Lexer for Avenue.
+ **/
+// 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"
+
+static void ColouriseAveDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
+	Accessor &styler) {
+
+	WordList &keywords = *keywordlists[0];
+
+	styler.StartAt(startPos);
+
+	bool fold = styler.GetPropertyInt("fold");
+	int lineCurrent = styler.GetLine(startPos);
+	int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
+	int levelCurrent = levelPrev;
+
+	int state = initStyle;
+	if (state == SCE_AVE_STRINGEOL)	// Does not leak onto next line
+		state = SCE_AVE_DEFAULT;
+	char chNext = styler[startPos];
+	unsigned int lengthDoc = startPos + length;
+	int visibleChars = 0;
+	styler.StartSegment(startPos);
+
+	for (unsigned int i = startPos; i < lengthDoc; i++) {
+		char ch = chNext;
+		chNext = styler.SafeGetCharAt(i + 1);
+		if ((ch == '\r' && chNext != '\n') || (ch == '\n')) {
+			// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)
+			// Avoid triggering two times on Dos/Win
+			// End of line
+			if (state == SCE_AVE_STRINGEOL) {
+				styler.ColourTo(i, state);
+				state = SCE_AVE_DEFAULT;
+			}
+			if (fold) {
+				int lev = levelPrev;
+				if (visibleChars == 0)
+					lev |= SC_FOLDLEVELWHITEFLAG;
+				if ((levelCurrent > levelPrev) && (visibleChars > 0))
+					lev |= SC_FOLDLEVELHEADERFLAG;
+				styler.SetLevel(lineCurrent, lev);
+				lineCurrent++;
+				levelPrev = levelCurrent;
+			}
+			visibleChars = 0;
+		}
+		if (!isspace(ch))
+			visibleChars++;
+		if (styler.IsLeadByte(ch)) {
+			chNext = styler.SafeGetCharAt(i + 2);
+			i += 1;
+			continue;
+		}
+
+		if (state == SCE_AVE_DEFAULT) {
+			if (iswordstart(ch) || (ch == '.') )  {
+				styler.ColourTo(i-1, state);
+				state = SCE_AVE_IDENTIFIER;
+			} else if (ch == '\'') {
+				styler.ColourTo(i-1, state);
+				state = SCE_AVE_COMMENT;
+			} else if (ch == '\"') {
+				styler.ColourTo(i-1, state);
+				state = SCE_AVE_STRING;
+			} else if (ch == '#') {
+				styler.ColourTo(i-1, state);
+				state = SCE_AVE_ENUM;
+			} else if (isoperator(ch) ) {
+				styler.ColourTo(i-1, state);
+				styler.ColourTo(i, SCE_AVE_OPERATOR);
+			}
+		}
+	  	else if (state == SCE_AVE_COMMENT) {
+			if (ch == '\r' || ch == '\n') {
+				styler.ColourTo(i-1, state);
+				state = SCE_AVE_DEFAULT;
+			}
+		}
+	  	else if (state == SCE_AVE_ENUM) {
+			if (isoperator(ch)  || ch == ' ' || ch == '\'' || ch == '\r' || ch == '\n') {
+				styler.ColourTo(i-1, state);
+				state = SCE_AVE_DEFAULT;
+			}
+		}
+		else if (state == SCE_AVE_STRING) {
+			if (ch == '\"') {
+				if (chNext == '\"') {
+					i++;
+					ch = chNext;
+					chNext = styler.SafeGetCharAt(i + 1);
+				} else
+				{
+					styler.ColourTo(i, state);
+					state = SCE_AVE_DEFAULT;
+				}
+			} else if (chNext == '\r' || chNext == '\n') {
+				styler.ColourTo(i-1, SCE_AVE_STRINGEOL);
+				state = SCE_AVE_STRINGEOL;
+			}
+		}
+		if ((state == SCE_AVE_IDENTIFIER)) {
+			if (!iswordchar(ch) || ch == '.' ) {
+				char s[100];
+				unsigned int start = styler.GetStartSegment();
+				unsigned int end = i - 1;
+				for (unsigned int ii = 0; ii < end - start + 1 && ii < 30; ii++) 	{
+					s[ii] = static_cast<char>(tolower(styler[start + ii]));
+					s[ii + 1] = '\0';
+				}
+
+				char chAttr = SCE_AVE_IDENTIFIER;
+
+				if (isdigit(s[0]))
+					chAttr = SCE_AVE_NUMBER;
+				else {
+					if ((strcmp(s, "for") == 0) || (strcmp(s, "if") == 0) || (strcmp(s, "while") == 0))
+					{
+						levelCurrent +=1;
+						chAttr = SCE_AVE_STATEMENT;
+					}
+
+					if (strcmp(s, "end") == 0)
+					{
+						levelCurrent -=1;
+						chAttr = SCE_AVE_STATEMENT;
+					}
+
+					if ( (strcmp(s, "then") == 0) ||  (strcmp(s, "else") == 0)       || (strcmp(s, "break") == 0) ||
+						(strcmp(s, "each") == 0) ||
+						(strcmp(s, "exit") == 0) ||  (strcmp(s, "continue") == 0) || (strcmp(s, "return") == 0) ||
+						(strcmp(s, "by") == 0)   ||  (strcmp(s, "in") == 0)          || (strcmp(s, "elseif") == 0))
+					{
+						chAttr = SCE_AVE_STATEMENT;
+					}
+
+					if ((strcmp(s, "av") == 0) || (strcmp(s, "self") == 0))
+					{
+						chAttr = SCE_AVE_KEYWORD;
+					}
+
+					if (keywords.InList(s))
+					{
+						chAttr = SCE_AVE_WORD;
+					}
+				}
+				styler.ColourTo(end, chAttr);
+				state = SCE_AVE_DEFAULT;
+
+				if (ch == '\'') {
+					state = SCE_AVE_COMMENT;
+				} else if (ch == '\"') {
+					state = SCE_AVE_STRING;
+				} else if (isoperator(ch)) {
+					styler.ColourTo(i, SCE_AVE_OPERATOR);
+				}
+			}
+		}
+
+	}
+	styler.ColourTo(lengthDoc - 1, state);
+
+	// Fill in the real level of the next line, keeping the current flags as they will be filled in later
+	if (fold) {
+		int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
+		styler.SetLevel(lineCurrent, levelPrev | flagsNext);
+
+	}
+}
+
+LexerModule lmAVE(SCLEX_AVE, ColouriseAveDoc, "ave");
diff --git a/contrib/src/stc/scintilla/src/LexAda.cxx b/contrib/src/stc/scintilla/src/LexAda.cxx
new file mode 100644
index 0000000000..91bf00ede8
--- /dev/null
+++ b/contrib/src/stc/scintilla/src/LexAda.cxx
@@ -0,0 +1,198 @@
+// SciTE - Scintilla based Text Editor
+// LexAda.cxx - lexer for Ada95
+// by Tahir Karaca <tahir@bigfoot.de>
+// 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"
+
+inline void classifyWordAda(unsigned int start, unsigned int end,
+	WordList &keywords, Accessor &styler) {
+
+	static const unsigned KEWORD_LEN_MAX = 30;
+
+	char wordLower[KEWORD_LEN_MAX + 1];
+	unsigned i;
+	for(i = 0; ( i < KEWORD_LEN_MAX ) && ( i < end - start + 1 ); i++) {
+		wordLower[i] = static_cast<char>(tolower(styler[start + i]));		
+	}
+	wordLower[i] = '\0';
+		
+//	int levelChange = 0;
+	char chAttr = SCE_ADA_IDENTIFIER;
+	if (keywords.InList(wordLower)) {
+		chAttr = SCE_ADA_WORD;
+
+// Folding doesn't work this way since the semantics of some keywords depends
+// on the current context.
+// E.g. - "cond1 and THEN cond2" <-> "if ... THEN ..."		
+//      - "procedure X IS ... end X;" <-> "procedure X IS new Y;"
+//		if (strcmp(wordLower, "is") == 0 || strcmp(wordLower, "then") == 0)
+//			levelChange=1;
+//		else if (strcmp(wordLower, "end") == 0)
+//			levelChange=-1;
+	}
+	styler.ColourTo(end, chAttr);
+	
+//	return levelChange;
+}
+
+
+inline bool isAdaOperator(char ch) {
+	
+	if (ch == '&' || ch == '\'' || ch == '(' || ch == ')' ||
+	        ch == '*' || ch == '+' || ch == ',' || ch == '-' ||
+	        ch == '.' || ch == '/' || ch == ':' || ch == ';' ||
+	        ch == '<' || ch == '=' || ch == '>')
+		return true;
+	return false;
+}
+
+
+inline void styleTokenBegin(char beginChar, unsigned int pos, int &state,
+	Accessor &styler) {
+		
+	if (isalpha(beginChar)) {
+		styler.ColourTo(pos-1, state);
+		state = SCE_ADA_IDENTIFIER;
+	} else if (isdigit(beginChar)) {
+		styler.ColourTo(pos-1, state);
+		state = SCE_ADA_NUMBER;
+	} else if (beginChar == '-' && styler.SafeGetCharAt(pos + 1) == '-') {
+		styler.ColourTo(pos-1, state);
+		state = SCE_ADA_COMMENT;
+	} else if (beginChar == '\"') {
+		styler.ColourTo(pos-1, state);
+		state = SCE_ADA_STRING;
+	} else if (beginChar == '\'' && styler.SafeGetCharAt(pos + 2) == '\'') {
+		styler.ColourTo(pos-1, state);
+		state = SCE_ADA_CHARACTER;
+	} else if (isAdaOperator(beginChar)) {
+		styler.ColourTo(pos-1, state);
+		styler.ColourTo(pos, SCE_ADA_OPERATOR);
+	}
+}
+
+
+static void ColouriseAdaDoc(unsigned int startPos, int length, int initStyle,
+	WordList *keywordlists[], Accessor &styler) {
+	
+	WordList &keywords = *keywordlists[0];
+	
+	styler.StartAt(startPos);
+	
+//	bool fold = styler.GetPropertyInt("fold");
+//	int lineCurrent = styler.GetLine(startPos);
+//	int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
+//	int levelCurrent = levelPrev;
+
+	int state = initStyle;
+	if (state == SCE_ADA_STRINGEOL)	// Does not leak onto next line
+		state = SCE_ADA_DEFAULT;
+	char chNext = styler[startPos];
+	const unsigned int lengthDoc = startPos + length;
+	//int visibleChars = 0;
+	styler.StartSegment(startPos);
+	for (unsigned int i = startPos; i < lengthDoc; i++) {
+		char ch = chNext;
+		chNext = styler.SafeGetCharAt(i + 1);
+
+		if ((ch == '\r' && chNext != '\n') || (ch == '\n')) {
+			// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)
+			// Avoid triggering two times on Dos/Win
+			if (state == SCE_ADA_STRINGEOL) {
+				styler.ColourTo(i, state);
+				state = SCE_ADA_DEFAULT;
+			}
+//			if (fold) {
+//				int lev = levelPrev;
+//				if (visibleChars == 0)
+//					lev |= SC_FOLDLEVELWHITEFLAG;
+//				if ((levelCurrent > levelPrev) && (visibleChars > 0))
+//					lev |= SC_FOLDLEVELHEADERFLAG;
+//				styler.SetLevel(lineCurrent, lev);
+//				lineCurrent++;
+//				levelPrev = levelCurrent;
+//			}
+			//visibleChars = 0;
+		}
+		//if (!isspacechar(ch))
+		//	visibleChars++;
+
+		if (styler.IsLeadByte(ch)) {
+			chNext = styler.SafeGetCharAt(i + 2);
+			i += 1;
+			continue;
+		}
+
+		if (state == SCE_ADA_DEFAULT) {
+			styleTokenBegin(ch, i, state, styler);
+		} else if (state == SCE_ADA_IDENTIFIER) {
+			if (!iswordchar(ch)) {
+				classifyWordAda(styler.GetStartSegment(),
+								i - 1,
+								keywords,
+								styler);
+				state = SCE_ADA_DEFAULT;
+				styleTokenBegin(ch, i, state, styler);
+			}
+		} else if (state == SCE_ADA_COMMENT) {
+			if (ch == '\r' || ch == '\n') {
+				styler.ColourTo(i-1, state);
+				state = SCE_ADA_DEFAULT;
+			}
+		} else if (state == SCE_ADA_STRING) {
+			if (ch == '"' ) {
+				if( chNext == '"' ) {
+					i++;
+					chNext = styler.SafeGetCharAt(i + 1);
+				} else {					
+					styler.ColourTo(i, state);
+					state = SCE_ADA_DEFAULT;
+				}
+			} else if (chNext == '\r' || chNext == '\n') {
+				styler.ColourTo(i-1, SCE_ADA_STRINGEOL);
+				state = SCE_ADA_STRINGEOL;
+			}
+		} else if (state == SCE_ADA_CHARACTER) {
+			if (ch == '\r' || ch == '\n') {
+				styler.ColourTo(i-1, SCE_ADA_STRINGEOL);
+				state = SCE_ADA_STRINGEOL;
+			} else if (ch == '\'' && styler.SafeGetCharAt(i - 2) == '\'') {
+				styler.ColourTo(i, state);
+				state = SCE_ADA_DEFAULT;
+			}
+		} else if (state == SCE_ADA_NUMBER) {
+			if ( !( isdigit(ch) || ch == '.' || ch == '_' || ch == '#'
+				    || ch == 'A' || ch == 'B' || ch == 'C' || ch == 'D'
+					|| ch == 'E' || ch == 'F'
+					|| ch == 'a' || ch == 'b' || ch == 'c' || ch == 'd'
+					|| ch == 'e' || ch == 'f' ) ) {
+				styler.ColourTo(i-1, SCE_ADA_NUMBER);
+				state = SCE_ADA_DEFAULT;
+				styleTokenBegin(ch, i, state, styler);
+			}
+		}
+
+	}
+	styler.ColourTo(lengthDoc - 1, state);
+
+//	// Fill in the real level of the next line, keeping the current flags as they will be filled in later
+//	if (fold) {
+//		int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
+//		styler.SetLevel(lineCurrent, levelPrev | flagsNext);
+//	}
+}
+
+LexerModule lmAda(SCLEX_ADA, ColouriseAdaDoc, "ada");
diff --git a/contrib/src/stc/scintilla/src/LexCPP.cxx b/contrib/src/stc/scintilla/src/LexCPP.cxx
index b6358ab332..19aa329baf 100644
--- a/contrib/src/stc/scintilla/src/LexCPP.cxx
+++ b/contrib/src/stc/scintilla/src/LexCPP.cxx
@@ -1,13 +1,15 @@
-// SciTE - Scintilla based Text Editor
-// LexCPP.cxx - lexer for C++, C, Java, and Javascript
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file LexCPP.cxx
+ ** Lexer for C++, C, Java, and Javascript.
+ **/
+// 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"
 
@@ -17,246 +19,370 @@
 #include "Scintilla.h"
 #include "SciLexer.h"
 
-static bool classifyWordCpp(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {
-	char s[100];
-	for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
+static bool IsOKBeforeRE(int ch) {
+	return (ch == '(') || (ch == '=') || (ch == ',');
+}
+
+static void getRange(unsigned int start,
+		unsigned int end,
+		Accessor &styler,
+		char *s,
+		unsigned int len) {
+	unsigned int i = 0;
+	while ((i < end - start + 1) && (i < len-1)) {
 		s[i] = styler[start + i];
-		s[i + 1] = '\0';
+		i++;
+	}
+	s[i] = '\0';
+}
+
+inline bool IsASpace(int ch) {
+    return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d));
+}
+
+inline bool IsAWordChar(int  ch) {
+	return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
+}
+
+inline bool IsAWordStart(int ch) {
+	return (ch < 0x80) && (isalnum(ch) || ch == '_');
+}
+
+inline bool IsADigit(int ch) {
+	return (ch >= '0') && (ch <= '9');
+}
+
+// All languages handled so far can treat all characters >= 0x80 as one class
+// which just continues the current token or starts an identifier if in default.
+// DBCS treated specially as the second character can be < 0x80 and hence 
+// syntactically significant. UTF-8 avoids this as all trail bytes are >= 0x80
+class ColouriseContext {
+	Accessor &styler;
+	int lengthDoc;
+	int currentPos;
+	ColouriseContext& operator=(const ColouriseContext&) {
+		return *this;
 	}
-	bool wordIsUUID = false;
-	char chAttr = SCE_C_IDENTIFIER;
-	if (isdigit(s[0]) || (s[0] == '.'))
-		chAttr = SCE_C_NUMBER;
-	else {
-		if (keywords.InList(s)) {
-			chAttr = SCE_C_WORD;
-			wordIsUUID = strcmp(s, "uuid") == 0; 
+public:
+	bool atEOL;
+	int state;
+	int chPrev;
+	int ch;
+	int chNext;
+
+	ColouriseContext(unsigned int startPos, int length,
+                        int initStyle, Accessor &styler_) : 
+		styler(styler_),
+		lengthDoc(startPos + length),
+		currentPos(startPos), 
+		atEOL(false),
+		state(initStyle), 
+		chPrev(0),
+		ch(0), 
+		chNext(0) {
+		styler.StartAt(startPos);
+		styler.StartSegment(startPos);
+		int pos = currentPos;
+		ch = static_cast<unsigned char>(styler.SafeGetCharAt(pos));
+		if (styler.IsLeadByte(static_cast<char>(ch))) {
+			pos++;
+			ch = ch << 8;
+			ch |= static_cast<unsigned char>(styler.SafeGetCharAt(pos));
+		}
+		chNext = static_cast<unsigned char>(styler.SafeGetCharAt(pos+1));
+		if (styler.IsLeadByte(static_cast<char>(chNext))) {
+			chNext = chNext << 8;
+			chNext |= static_cast<unsigned char>(styler.SafeGetCharAt(pos+2));
 		}
+		atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
 	}
-	styler.ColourTo(end, chAttr);
-	return wordIsUUID;
-}
+	void Complete() {
+		styler.ColourTo(currentPos - 1, state);
+	}
+	bool More() {
+		return currentPos <= lengthDoc;
+	}
+	void Forward() {
+		// A lot of this is repeated from the constructor - TODO: merge code
+		chPrev = ch;
+		currentPos++;
+		if (ch >= 0x100)
+			currentPos++;
+		ch = chNext;
+		chNext = static_cast<unsigned char>(styler.SafeGetCharAt(currentPos+1));
+		if (styler.IsLeadByte(static_cast<char>(chNext))) {
+			chNext = chNext << 8;
+			chNext |= static_cast<unsigned char>(styler.SafeGetCharAt(currentPos + 2));
+		}
+		// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)
+		// Avoid triggering two times on Dos/Win
+		// End of line
+		atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
+	}
+	void ChangeState(int state_) {
+		state = state_;
+	}
+	void SetState(int state_) {
+		styler.ColourTo(currentPos - 1, state);
+		state = state_;
+	}
+	void ForwardSetState(int state_) {
+		Forward();
+		styler.ColourTo(currentPos - 1, state);
+		state = state_;
+	}
+	void GetCurrent(char *s, int len) {
+		getRange(styler.GetStartSegment(), currentPos - 1, styler, s, len);
+	}
+	int LengthCurrent() {
+		return currentPos - styler.GetStartSegment();
+	}
+	bool Match(char ch0) {
+		return ch == ch0;
+	}
+	bool Match(char ch0, char ch1) {
+		return (ch == ch0) && (chNext == ch1);
+	}
+	bool Match(const char *s) {
+		if (ch != *s)
+			return false;
+		s++;
+		if (chNext != *s)
+			return false;
+		s++;
+		for (int n=2; *s; n++) {
+			if (*s != styler.SafeGetCharAt(currentPos+n))
+				return false;
+			s++;
+		}
+		return true;
+	}
+};
+
+static void ColouriseCppDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
+                            Accessor &styler) {
 
-static void ColouriseCppDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], 
-	Accessor &styler) {
-	
 	WordList &keywords = *keywordlists[0];
-	
-	styler.StartAt(startPos);
-	
-	bool fold = styler.GetPropertyInt("fold");
+	WordList &keywords2 = *keywordlists[1];
+
 	bool stylingWithinPreprocessor = styler.GetPropertyInt("styling.within.preprocessor");
-	int lineCurrent = styler.GetLine(startPos);
-	int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
-	int levelCurrent = levelPrev;
 
-	int state = initStyle;
-	if (state == SCE_C_STRINGEOL)	// Does not leak onto next line
-		state = SCE_C_DEFAULT;
-	char chPrev = ' ';
-	char chNext = styler[startPos];
-	unsigned int lengthDoc = startPos + length;
+	if (initStyle == SCE_C_STRINGEOL)	// Does not leak onto next line
+		initStyle = SCE_C_DEFAULT;
+
+	int chPrevNonWhite = ' ';
 	int visibleChars = 0;
-	styler.StartSegment(startPos);
 	bool lastWordWasUUID = false;
-	for (unsigned int i = startPos; i < lengthDoc; i++) {
-		char ch = chNext;
-		chNext = styler.SafeGetCharAt(i + 1);
 
-		if ((ch == '\r' && chNext != '\n') || (ch == '\n')) {
-			// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)
-			// Avoid triggering two times on Dos/Win
-			// End of line
-			if (state == SCE_C_STRINGEOL) {
-				styler.ColourTo(i, state);
-				state = SCE_C_DEFAULT;
-			}
-			if (fold) {
-				int lev = levelPrev;
-				if (visibleChars == 0)
-					lev |= SC_FOLDLEVELWHITEFLAG;
-				if ((levelCurrent > levelPrev) && (visibleChars > 0))
-					lev |= SC_FOLDLEVELHEADERFLAG;
-				styler.SetLevel(lineCurrent, lev);
-				lineCurrent++;
-				levelPrev = levelCurrent;
-			}
-			visibleChars = 0;
-		}
-		if (!isspace(ch))
-			visibleChars++;
+	ColouriseContext cc(startPos, length, initStyle, styler);
 
-		if (styler.IsLeadByte(ch)) {
-			chNext = styler.SafeGetCharAt(i + 2);
-			chPrev = ' ';
-			i += 1;
-			continue;
-		}
+	for (; cc.More(); cc.Forward()) {
 
-		if (state == SCE_C_DEFAULT) {
-			if (ch == '@' && chNext == '\"') {
-				styler.ColourTo(i-1, state);
-				state = SCE_C_VERBATIM;
-				i++;
-				ch = chNext;
-				chNext = styler.SafeGetCharAt(i + 1);
-			} else if (iswordstart(ch) || (ch == '@')) {
-				styler.ColourTo(i-1, state);
-				if (lastWordWasUUID) {
-					state = SCE_C_UUID;
-					lastWordWasUUID = false;
-				} else {
-					state = SCE_C_IDENTIFIER;
-				}
-			} else if (ch == '/' && chNext == '*') {
-				styler.ColourTo(i-1, state);
-				if (styler.SafeGetCharAt(i + 2) == '*')
-					state = SCE_C_COMMENTDOC;
-				else
-					state = SCE_C_COMMENT;
-			} else if (ch == '/' && chNext == '/') {
-				styler.ColourTo(i-1, state);
-				state = SCE_C_COMMENTLINE;
-			} else if (ch == '\"') {
-				styler.ColourTo(i-1, state);
-				state = SCE_C_STRING;
-			} else if (ch == '\'') {
-				styler.ColourTo(i-1, state);
-				state = SCE_C_CHARACTER;
-			} else if (ch == '#' && visibleChars == 1) {
-				// Preprocessor commands are alone on their line
-				styler.ColourTo(i-1, state);
-				state = SCE_C_PREPROCESSOR;
-				// Skip whitespace between # and preprocessor word
-				do {
-					i++;
-					ch = chNext;
-					chNext = styler.SafeGetCharAt(i + 1);
-				} while (isspace(ch) && (i < lengthDoc));
-			} else if (isoperator(ch)) {
-				styler.ColourTo(i-1, state);
-				styler.ColourTo(i, SCE_C_OPERATOR);
-				if ((ch == '{') || (ch == '}')) {
-					levelCurrent += (ch == '{') ? 1 : -1;
-				}
+		if (cc.state == SCE_C_STRINGEOL) {
+			if (cc.atEOL) {
+				cc.SetState(SCE_C_DEFAULT);
+			}
+		} else if (cc.state == SCE_C_OPERATOR) {
+			cc.SetState(SCE_C_DEFAULT);
+		} else if (cc.state == SCE_C_NUMBER) {
+			if (!IsAWordChar(cc.ch)) {
+				cc.SetState(SCE_C_DEFAULT);
 			}
-		} else if (state == SCE_C_IDENTIFIER) {
-			if (!iswordchar(ch)) {
-				lastWordWasUUID = classifyWordCpp(styler.GetStartSegment(), i - 1, keywords, styler);
-				state = SCE_C_DEFAULT;
-				if (ch == '/' && chNext == '*') {
-					if (styler.SafeGetCharAt(i + 2) == '*')
-						state = SCE_C_COMMENTDOC;
-					else
-						state = SCE_C_COMMENT;
-				} else if (ch == '/' && chNext == '/') {
-					state = SCE_C_COMMENTLINE;
-				} else if (ch == '\"') {
-					state = SCE_C_STRING;
-				} else if (ch == '\'') {
-					state = SCE_C_CHARACTER;
-				} else if (isoperator(ch)) {
-					styler.ColourTo(i, SCE_C_OPERATOR);
-					if ((ch == '{') || (ch == '}')) {
-						levelCurrent += (ch == '{') ? 1 : -1;
-					}
+		} else if (cc.state == SCE_C_IDENTIFIER) {
+			if (!IsAWordChar(cc.ch) || (cc.ch == '.')) {
+				char s[100];
+				cc.GetCurrent(s, sizeof(s));
+				if (keywords.InList(s)) {
+					lastWordWasUUID = strcmp(s, "uuid") == 0;
+					cc.ChangeState(SCE_C_WORD);
+				} else if (keywords2.InList(s)) {
+					cc.ChangeState(SCE_C_WORD2);
 				}
+				cc.SetState(SCE_C_DEFAULT);
 			}
-		} else {
-			if (state == SCE_C_PREPROCESSOR) {
-				if (stylingWithinPreprocessor) {
-					if (isspace(ch)) {
-						styler.ColourTo(i-1, state);
-						state = SCE_C_DEFAULT;
-					}
-				} else {
-					if ((ch == '\r' || ch == '\n') && !(chPrev == '\\' || chPrev == '\r')) {
-						styler.ColourTo(i-1, state);
-						state = SCE_C_DEFAULT;
-					}
+		} if (cc.state == SCE_C_PREPROCESSOR) {
+			if (stylingWithinPreprocessor) {
+				if (IsASpace(cc.ch)) {
+					cc.SetState(SCE_C_DEFAULT);
 				}
-			} else if (state == SCE_C_COMMENT) {
-				if (ch == '/' && chPrev == '*') {
-					if (((i > styler.GetStartSegment() + 2) || (
-						(initStyle == SCE_C_COMMENT) && 
-						(styler.GetStartSegment() == static_cast<unsigned int>(startPos))))) {
-						styler.ColourTo(i, state);
-						state = SCE_C_DEFAULT;
-					}
+			} else {
+				if (cc.atEOL && (cc.chPrev != '\\')) {
+					cc.SetState(SCE_C_DEFAULT);
 				}
-			} else if (state == SCE_C_COMMENTDOC) {
-				if (ch == '/' && chPrev == '*') {
-					if (((i > styler.GetStartSegment() + 2) || (
-						(initStyle == SCE_C_COMMENTDOC) && 
-						(styler.GetStartSegment() == static_cast<unsigned int>(startPos))))) {
-						styler.ColourTo(i, state);
-						state = SCE_C_DEFAULT;
-					}
+			}
+		} else if (cc.state == SCE_C_COMMENT) {
+			if (cc.Match('*', '/')) {
+				cc.Forward();
+				cc.ForwardSetState(SCE_C_DEFAULT);
+			}
+		} else if (cc.state == SCE_C_COMMENTDOC) {
+			if (cc.Match('*', '/')) {
+				cc.Forward();
+				cc.ForwardSetState(SCE_C_DEFAULT);
+			}
+		} else if (cc.state == SCE_C_COMMENTLINE || cc.state == SCE_C_COMMENTLINEDOC) {
+			if (cc.ch == '\r' || cc.ch == '\n') {
+				cc.SetState(SCE_C_DEFAULT);
+			}
+		} else if (cc.state == SCE_C_STRING) {
+			if (cc.ch == '\\') {
+				if (cc.chNext == '\"' || cc.chNext == '\'' || cc.chNext == '\\') {
+					cc.Forward();
 				}
-			} else if (state == SCE_C_COMMENTLINE) {
-				if (ch == '\r' || ch == '\n') {
-					styler.ColourTo(i-1, state);
-					state = SCE_C_DEFAULT;
+			} else if (cc.ch == '\"') {
+				cc.ForwardSetState(SCE_C_DEFAULT);
+			} else if ((cc.atEOL) && (cc.chPrev != '\\')) {
+				cc.ChangeState(SCE_C_STRINGEOL);
+			}
+		} else if (cc.state == SCE_C_CHARACTER) {
+			if ((cc.ch == '\r' || cc.ch == '\n') && (cc.chPrev != '\\')) {
+				cc.ChangeState(SCE_C_STRINGEOL);
+			} else if (cc.ch == '\\') {
+				if (cc.chNext == '\"' || cc.chNext == '\'' || cc.chNext == '\\') {
+					cc.Forward();
 				}
-			} else if (state == SCE_C_STRING) {
-				if (ch == '\\') {
-					if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
-						i++;
-						ch = chNext;
-						chNext = styler.SafeGetCharAt(i + 1);
-					}
-				} else if (ch == '\"') {
-					styler.ColourTo(i, state);
-					state = SCE_C_DEFAULT;
-				} else if (chNext == '\r' || chNext == '\n') {
-					styler.ColourTo(i-1, SCE_C_STRINGEOL);
-					state = SCE_C_STRINGEOL;
+			} else if (cc.ch == '\'') {
+				cc.ForwardSetState(SCE_C_DEFAULT);
+			}
+		} else if (cc.state == SCE_C_REGEX) {
+			if (cc.ch == '\r' || cc.ch == '\n' || cc.ch == '/') {
+				cc.ForwardSetState(SCE_C_DEFAULT);
+			} else if (cc.ch == '\\') {
+				// Gobble up the quoted character
+				if (cc.chNext == '\\' || cc.chNext == '/') {
+					cc.Forward();
 				}
-			} else if (state == SCE_C_CHARACTER) {
-				if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) {
-					styler.ColourTo(i-1, SCE_C_STRINGEOL);
-					state = SCE_C_STRINGEOL;
-				} else if (ch == '\\') {
-					if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
-						i++;
-						ch = chNext;
-						chNext = styler.SafeGetCharAt(i + 1);
-					}
-				} else if (ch == '\'') {
-					styler.ColourTo(i, state);
-					state = SCE_C_DEFAULT;
+			}
+		} else if (cc.state == SCE_C_VERBATIM) {
+			if (cc.ch == '\"') {
+				if (cc.chNext == '\"') {
+					cc.Forward();
+				} else {
+					cc.ForwardSetState(SCE_C_DEFAULT);
 				}
-			} else if (state == SCE_C_VERBATIM) {
-				if (ch == '\"') {
-					if (chNext == '\"') {
-						i++;
-						ch = chNext;
-						chNext = styler.SafeGetCharAt(i + 1);
-					} else {
-						styler.ColourTo(i, state);
-						state = SCE_C_DEFAULT;
-					}
+			}
+		} else if (cc.state == SCE_C_UUID) {
+			if (cc.ch == '\r' || cc.ch == '\n' || cc.ch == ')') {
+				cc.SetState(SCE_C_DEFAULT);
+			}
+		}
+
+		if (cc.state == SCE_C_DEFAULT) {
+			if (cc.Match('@', '\"')) {
+				cc.SetState(SCE_C_VERBATIM);
+				cc.Forward();
+			} else if (IsADigit(cc.ch) || (cc.ch == '.' && IsADigit(cc.chNext))) {
+				if (lastWordWasUUID) {
+					cc.SetState(SCE_C_UUID);
+					lastWordWasUUID = false;
+				} else {
+					cc.SetState(SCE_C_NUMBER);
 				}
-			} else if (state == SCE_C_UUID) {
-				if (ch == '\r' || ch == '\n' || ch == ')') {
-					styler.ColourTo(i-1, state);
-					if (ch == ')')
-						styler.ColourTo(i, SCE_C_OPERATOR);
-					state = SCE_C_DEFAULT;
+			} else if (IsAWordStart(cc.ch) || (cc.ch == '@')) {
+				if (lastWordWasUUID) {
+					cc.SetState(SCE_C_UUID);
+					lastWordWasUUID = false;
+				} else {
+					cc.SetState(SCE_C_IDENTIFIER);
 				}
+			} else if (cc.Match('/', '*')) {
+				if (cc.Match("/**") || cc.Match("/*!"))	// Support of Qt/Doxygen doc. style
+					cc.SetState(SCE_C_COMMENTDOC);
+				else
+					cc.SetState(SCE_C_COMMENT);
+				cc.Forward();	// Eat the * so it isn't used for the end of the comment
+			} else if (cc.Match('/', '/')) {
+				if (cc.Match("///") || cc.Match("//!"))	// Support of Qt/Doxygen doc. style
+					cc.SetState(SCE_C_COMMENTLINEDOC);
+				else
+					cc.SetState(SCE_C_COMMENTLINE);
+			} else if (cc.ch == '/' && IsOKBeforeRE(chPrevNonWhite)) {
+				cc.SetState(SCE_C_REGEX);
+			} else if (cc.ch == '\"') {
+				cc.SetState(SCE_C_STRING);
+			} else if (cc.ch == '\'') {
+				cc.SetState(SCE_C_CHARACTER);
+			} else if (cc.ch == '#' && visibleChars == 0) {
+				// Preprocessor commands are alone on their line
+				cc.SetState(SCE_C_PREPROCESSOR);
+				// Skip whitespace between # and preprocessor word
+				do {
+					cc.Forward();
+				} while (IsASpace(cc.ch) && cc.More());
+			} else if (isoperator(static_cast<char>(cc.ch))) {
+				cc.SetState(SCE_C_OPERATOR);
 			}
 		}
-		chPrev = ch;
+		if (cc.atEOL) {
+			// Reset states to begining of colourise so no surprises 
+			// if different sets of lines lexed.
+			chPrevNonWhite = ' ';
+			visibleChars = 0;
+			lastWordWasUUID = false;
+		}
+		if (!IsASpace(cc.ch)) {
+			chPrevNonWhite = cc.ch;
+			visibleChars++;
+		}
 	}
-	styler.ColourTo(lengthDoc - 1, state);
+	cc.Complete();
+}
 
-	// Fill in the real level of the next line, keeping the current flags as they will be filled in later
-	if (fold) {
-		int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
-		//styler.SetLevel(lineCurrent, levelCurrent | flagsNext);
-		styler.SetLevel(lineCurrent, levelPrev | flagsNext);
-		
+static void FoldCppDoc(unsigned int startPos, int length, int initStyle, WordList *[],
+                            Accessor &styler) {
+	bool foldComment = styler.GetPropertyInt("fold.comment");
+	bool foldCompact = styler.GetPropertyInt("fold.compact", 1);
+	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[startPos];
+	int styleNext = styler.StyleAt(startPos);
+	int style = initStyle;
+	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 (foldComment &&
+			(style == SCE_C_COMMENT || style == SCE_C_COMMENTDOC)) {
+			if (style != stylePrev) {
+				levelCurrent++;
+			} else if ((style != styleNext) && !atEOL) {
+				// Comments don't end at end of line and the next character may be unstyled.
+				levelCurrent--;
+			}
+		}
+		if (style == SCE_C_OPERATOR) {
+			if (ch == '{') {
+				levelCurrent++;
+			} else if (ch == '}') {
+				levelCurrent--;
+			}
+		}
+		if (atEOL) {
+			int lev = levelPrev;
+			if (visibleChars == 0 && foldCompact)
+				lev |= SC_FOLDLEVELWHITEFLAG;
+			if ((levelCurrent > levelPrev) && (visibleChars > 0))
+				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);
 }
 
-LexerModule lmCPP(SCLEX_CPP, ColouriseCppDoc);
+LexerModule lmCPP(SCLEX_CPP, ColouriseCppDoc, "cpp", FoldCppDoc);
+LexerModule lmTCL(SCLEX_TCL, ColouriseCppDoc, "tcl", FoldCppDoc);
diff --git a/contrib/src/stc/scintilla/src/LexConf.cxx b/contrib/src/stc/scintilla/src/LexConf.cxx
new file mode 100644
index 0000000000..2dbb65c371
--- /dev/null
+++ b/contrib/src/stc/scintilla/src/LexConf.cxx
@@ -0,0 +1,177 @@
+// Scintilla source code edit control
+/** @file LexConf.cxx
+ ** Lexer for Apache Configuration Files.
+ **
+ ** First working version contributed by Ahmad Zawawi <zeus_go64@hotmail.com> on October 28, 2000.
+ ** i created this lexer because i needed something pretty when dealing
+ ** when Apache Configuration files...
+ **/
+// 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"
+
+static void ColouriseConfDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler)
+{
+	int state = SCE_CONF_DEFAULT;
+	char chNext = styler[startPos];
+	int lengthDoc = startPos + length;
+	// create a buffer large enough to take the largest chunk...
+	char *buffer = new char[length];
+	int bufferCount = 0;
+
+	// this assumes that we have 2 keyword list in conf.properties
+	WordList &directives = *keywordLists[0];
+	WordList &params = *keywordLists[1];
+
+	// go through all provided text segment
+	// using the hand-written state machine shown below
+	styler.StartAt(startPos);
+	styler.StartSegment(startPos);
+	for (int i = startPos; i < lengthDoc; i++) {
+		char ch = chNext;
+		chNext = styler.SafeGetCharAt(i + 1);
+
+		if (styler.IsLeadByte(ch)) {
+			chNext = styler.SafeGetCharAt(i + 2);
+			i++;
+			continue;
+		}
+		switch(state) {
+			case SCE_CONF_DEFAULT:
+				if( ch == '\n' || ch == '\r' || ch == '\t' || ch == ' ') {
+					// whitespace is simply ignored here...
+					styler.ColourTo(i,SCE_CONF_DEFAULT);
+					break;
+				} else if( ch == '#' ) {
+					// signals the start of a comment...
+					state = SCE_CONF_COMMENT;
+					styler.ColourTo(i,SCE_CONF_COMMENT);
+				} else if( ch == '.' /*|| ch == '/'*/) {
+					// signals the start of a file...
+					state = SCE_CONF_EXTENSION;
+					styler.ColourTo(i,SCE_CONF_EXTENSION);
+				} else if( ch == '"') {
+					state = SCE_CONF_STRING;
+					styler.ColourTo(i,SCE_CONF_STRING);
+				} else if( ispunct(ch) ) {
+					// signals an operator...
+					// no state jump necessary for this
+					// simple case...
+					styler.ColourTo(i,SCE_CONF_OPERATOR);
+				} else if( isalpha(ch) ) {
+					// signals the start of an identifier
+					bufferCount = 0;
+					buffer[bufferCount++] = static_cast<char>(tolower(ch));
+					state = SCE_CONF_IDENTIFIER;
+				} else if( isdigit(ch) ) {
+					// signals the start of a number
+					bufferCount = 0;
+					buffer[bufferCount++] = ch;
+					//styler.ColourTo(i,SCE_CONF_NUMBER);
+					state = SCE_CONF_NUMBER;
+				} else {
+					// style it the default style..
+					styler.ColourTo(i,SCE_CONF_DEFAULT);
+				}
+				break;
+
+			case SCE_CONF_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_CONF_DEFAULT;
+				} else {
+					styler.ColourTo(i,SCE_CONF_COMMENT);
+				}
+				break;
+
+			case SCE_CONF_EXTENSION:
+				// if we find a non-alphanumeric char,
+				// we simply go to default state
+				// else we're still dealing with an extension...
+				if( isalnum(ch) || (ch == '_') ||
+					(ch == '-') || (ch == '$') ||
+					(ch == '/') || (ch == '.') || (ch == '*') )
+				{
+					styler.ColourTo(i,SCE_CONF_EXTENSION);
+				} else {
+					state = SCE_CONF_DEFAULT;
+					chNext = styler[i--];
+				}
+				break;
+
+			case SCE_CONF_STRING:
+				// if we find the end of a string char, we simply go to default state
+				// else we're still dealing with an string...
+				if( (ch == '"' && styler.SafeGetCharAt(i-1)!='\\') || (ch == '\n') || (ch == '\r') ) {
+					state = SCE_CONF_DEFAULT;
+				}
+				styler.ColourTo(i,SCE_CONF_STRING);
+				break;
+
+			case SCE_CONF_IDENTIFIER:
+				// stay  in CONF_IDENTIFIER state until we find a non-alphanumeric
+				if( isalnum(ch) || (ch == '_') || (ch == '-') || (ch == '/') || (ch == '$') || (ch == '.') || (ch == '*')) {
+					buffer[bufferCount++] = static_cast<char>(tolower(ch));
+				} else {
+					state = SCE_CONF_DEFAULT;
+					buffer[bufferCount] = '\0';
+
+					// check if the buffer contains a keyword, and highlight it if it is a keyword...
+					if(directives.InList(buffer)) {
+						styler.ColourTo(i-1,SCE_CONF_DIRECTIVE );
+					} else if(params.InList(buffer)) {
+						styler.ColourTo(i-1,SCE_CONF_PARAMETER );
+					} else if(strchr(buffer,'/') || strchr(buffer,'.')) {
+						styler.ColourTo(i-1,SCE_CONF_EXTENSION);
+					} else {
+						styler.ColourTo(i-1,SCE_CONF_DEFAULT);
+					}
+
+					// push back the faulty character
+					chNext = styler[i--];
+
+				}
+				break;
+
+			case SCE_CONF_NUMBER:
+				// stay  in CONF_NUMBER state until we find a non-numeric
+				if( isdigit(ch) || ch == '.') {
+					buffer[bufferCount++] = ch;
+				} else {
+					state = SCE_CONF_DEFAULT;
+					buffer[bufferCount] = '\0';
+
+					// Colourize here...
+					if( strchr(buffer,'.') ) {
+						// it is an IP address...
+						styler.ColourTo(i-1,SCE_CONF_IP);
+					} else {
+						// normal number
+						styler.ColourTo(i-1,SCE_CONF_NUMBER);
+					}
+
+					// push back a character
+					chNext = styler[i--];
+				}
+				break;
+
+		}
+	}
+}
+
+LexerModule lmConf(SCLEX_CONF, ColouriseConfDoc, "conf");
diff --git a/contrib/src/stc/scintilla/src/LexEiffel.cxx b/contrib/src/stc/scintilla/src/LexEiffel.cxx
new file mode 100644
index 0000000000..1296fb2450
--- /dev/null
+++ b/contrib/src/stc/scintilla/src/LexEiffel.cxx
@@ -0,0 +1,321 @@
+// Scintilla source code edit control
+/** @file LexEiffel.cxx
+ ** Lexer for Eiffel.
+ **/
+// 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 <stdarg.h>
+#include <stdio.h>
+#include <fcntl.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+inline bool isEiffelOperator(unsigned int ch) {
+	// '.' left out as it is used to make up numbers
+	return ch == '*' || ch == '/' || ch == '\\' || ch == '-' || ch == '+' ||
+	        ch == '(' || ch == ')' || ch == '=' ||
+	        ch == '{' || ch == '}' || ch == '~' ||
+	        ch == '[' || ch == ']' || ch == ';' ||
+	        ch == '<' || ch == '>' || ch == ',' ||
+	        ch == '.' || ch == '^' || ch == '%' || ch == ':' || 
+		ch == '!' || ch == '@' || ch == '?';
+}
+
+static void getRangeLowered(unsigned int start,
+		unsigned int end,
+		Accessor &styler,
+		char *s,
+		unsigned int len) {
+	unsigned int i = 0;
+	while ((i < end - start + 1) && (i < len-1)) {
+		s[i] = static_cast<char>(tolower(styler[start + i]));
+		i++;
+	}
+	s[i] = '\0';
+}
+
+inline bool IsASpace(unsigned int ch) {
+    return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d));
+}
+
+inline bool IsAWordChar(unsigned int  ch) {
+	return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
+}
+
+inline bool IsAWordStart(unsigned int ch) {
+	return (ch < 0x80) && (isalnum(ch) || ch == '_');
+}
+
+inline bool IsADigit(unsigned int ch) {
+	return (ch >= '0') && (ch <= '9');
+}
+
+// All languages handled so far can treat all characters >= 0x80 as one class
+// which just continues the current token or starts an identifier if in default.
+// DBCS treated specially as the second character can be < 0x80 and hence 
+// syntactically significant. UTF-8 avoids this as all trail bytes are >= 0x80
+class xColouriseContext {
+	Accessor &styler;
+	int lengthDoc;
+	int currentPos;
+	xColouriseContext& operator=(const xColouriseContext&) {
+		return *this;
+	}
+public:
+	int state;
+	unsigned int chPrev;
+	unsigned int ch;
+	unsigned int chNext;
+
+	xColouriseContext(unsigned int startPos, int length,
+                        int initStyle, Accessor &styler_) : 
+		styler(styler_),
+		lengthDoc(startPos + length),
+		currentPos(startPos), 
+		state(initStyle), 
+		chPrev(0),
+		ch(0), 
+		chNext(0) {
+		styler.StartAt(startPos);
+		styler.StartSegment(startPos);
+		int pos = currentPos;
+		ch = static_cast<unsigned char>(styler.SafeGetCharAt(pos));
+		if (styler.IsLeadByte(static_cast<char>(ch))) {
+			pos++;
+			ch = ch << 8;
+			ch |= static_cast<unsigned char>(styler.SafeGetCharAt(pos));
+		}
+		chNext = static_cast<unsigned char>(styler.SafeGetCharAt(pos+1));
+		if (styler.IsLeadByte(static_cast<char>(chNext))) {
+			chNext = chNext << 8;
+			chNext |= static_cast<unsigned char>(styler.SafeGetCharAt(pos+2));
+		}
+	}
+	void Complete() {
+		styler.ColourTo(currentPos - 1, state);
+	}
+	bool More() {
+		return currentPos <= lengthDoc;
+	}
+	void Forward() {
+		chPrev = ch;
+		currentPos++;
+		if (ch >= 0x100)
+			currentPos++;
+		ch = chNext;
+		chNext = static_cast<unsigned char>(styler.SafeGetCharAt(currentPos+1));
+		if (styler.IsLeadByte(static_cast<char>(chNext))) {
+			chNext = chNext << 8;
+			chNext |= static_cast<unsigned char>(styler.SafeGetCharAt(currentPos + 2));
+		}
+	}
+	void ChangeState(int state_) {
+		state = state_;
+	}
+	void SetState(int state_) {
+		styler.ColourTo(currentPos - 1, state);
+		state = state_;
+	}
+	void GetCurrentLowered(char *s, int len) {
+		getRangeLowered(styler.GetStartSegment(), currentPos - 1, styler, s, len);
+	}
+};
+
+static void ColouriseEiffelDoc(unsigned int startPos,
+                            int length,
+                            int initStyle,
+                            WordList *keywordlists[],
+                            Accessor &styler) {
+
+	WordList &keywords = *keywordlists[0];
+
+	xColouriseContext lc(startPos, length, initStyle, styler);
+
+	for (; lc.More(); lc.Forward()) {
+
+		if (lc.state == SCE_EIFFEL_STRINGEOL) {
+			if (lc.ch != '\r' && lc.ch != '\n') {
+				lc.SetState(SCE_EIFFEL_DEFAULT);
+			}
+		} else if (lc.state == SCE_EIFFEL_OPERATOR) {
+			lc.SetState(SCE_EIFFEL_DEFAULT);
+		} else if (lc.state == SCE_EIFFEL_WORD) {
+			if (!IsAWordChar(lc.ch)) {
+				char s[100];
+				lc.GetCurrentLowered(s, sizeof(s));
+				if (!keywords.InList(s)) {
+					lc.ChangeState(SCE_EIFFEL_IDENTIFIER);
+				}
+				lc.SetState(SCE_EIFFEL_DEFAULT);
+			}
+		} else if (lc.state == SCE_EIFFEL_NUMBER) {
+			if (!IsAWordChar(lc.ch)) {
+				lc.SetState(SCE_EIFFEL_DEFAULT);
+			}
+		} else if (lc.state == SCE_EIFFEL_COMMENTLINE) {
+			if (lc.ch == '\r' || lc.ch == '\n') {
+				lc.SetState(SCE_EIFFEL_DEFAULT);
+			}
+		} else if (lc.state == SCE_EIFFEL_STRING) {
+			if (lc.ch == '%') {
+				lc.Forward();
+			} else if (lc.ch == '\"') {
+				lc.Forward();
+				lc.SetState(SCE_EIFFEL_DEFAULT);
+			}
+		} else if (lc.state == SCE_EIFFEL_CHARACTER) {
+			if (lc.ch == '\r' || lc.ch == '\n') {
+				lc.SetState(SCE_EIFFEL_STRINGEOL);
+			} else if (lc.ch == '%') {
+				lc.Forward();
+			} else if (lc.ch == '\'') {
+				lc.Forward();
+				lc.SetState(SCE_EIFFEL_DEFAULT);
+			}
+		}
+
+		if (lc.state == SCE_EIFFEL_DEFAULT) {
+			if (lc.ch == '-' && lc.chNext == '-') {
+				lc.SetState(SCE_EIFFEL_COMMENTLINE);
+			} else if (lc.ch == '\"') {
+				lc.SetState(SCE_EIFFEL_STRING);
+			} else if (lc.ch == '\'') {
+				lc.SetState(SCE_EIFFEL_CHARACTER);
+			} else if (IsADigit(lc.ch) || (lc.ch == '.')) {
+				lc.SetState(SCE_EIFFEL_NUMBER);
+			} else if (IsAWordStart(lc.ch)) {
+				lc.SetState(SCE_EIFFEL_WORD);
+			} else if (isEiffelOperator(lc.ch)) {
+				lc.SetState(SCE_EIFFEL_OPERATOR);
+			}
+		}
+	}
+	lc.Complete();
+}
+
+static bool IsEiffelComment(Accessor &styler, int pos, int len) {
+	return len>1 && styler[pos]=='-' && styler[pos+1]=='-';
+}
+
+static void FoldEiffelDocIndent(unsigned int startPos, int length, int,
+						   WordList *[], Accessor &styler) {
+	int lengthDoc = startPos + length;
+
+	// Backtrack to previous line in case need to fix its fold status
+	int lineCurrent = styler.GetLine(startPos);
+	if (startPos > 0) {
+		if (lineCurrent > 0) {
+			lineCurrent--;
+			startPos = styler.LineStart(lineCurrent);
+		}
+	}
+	int spaceFlags = 0;
+	int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsEiffelComment);
+	char chNext = styler[startPos];
+	for (int i = startPos; i < lengthDoc; i++) {
+		char ch = chNext;
+		chNext = styler.SafeGetCharAt(i + 1);
+
+		if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc)) {
+			int lev = indentCurrent;
+			int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsEiffelComment);
+			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, IsEiffelComment);
+					if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) {
+						lev |= SC_FOLDLEVELHEADERFLAG;
+					}
+				}
+			}
+			indentCurrent = indentNext;
+			styler.SetLevel(lineCurrent, lev);
+			lineCurrent++;
+		}
+	}
+}
+
+static void FoldEiffelDocKeyWords(unsigned int startPos, int length, int /* initStyle */, WordList *[],
+                       Accessor &styler) {
+	unsigned int lengthDoc = startPos + length;
+	int visibleChars = 0;
+	int lineCurrent = styler.GetLine(startPos);
+	int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
+	int levelCurrent = levelPrev;
+	char chNext = styler[startPos];
+	int stylePrev = 0;
+	int styleNext = styler.StyleAt(startPos);
+	// lastDeferred should be determined by looking back to last keyword in case
+	// the "deferred" is on a line before "class"
+	bool lastDeferred = false;
+	for (unsigned int i = startPos; i < lengthDoc; i++) {
+		char ch = chNext;
+		chNext = styler.SafeGetCharAt(i + 1);
+		int style = styleNext;
+		styleNext = styler.StyleAt(i + 1);
+		bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
+		if ((stylePrev != SCE_EIFFEL_WORD) && (style == SCE_EIFFEL_WORD)) {
+			char s[20];
+			unsigned int j = 0;
+			while ((j < (sizeof(s) - 1)) && (iswordchar(styler[i + j]))) {
+				s[j] = styler[i + j];
+				j++;
+			}
+			s[j] = '\0';
+
+			if (
+				(strcmp(s, "check") == 0) || 
+				(strcmp(s, "debug") == 0) || 
+				(strcmp(s, "deferred") == 0) || 
+				(strcmp(s, "do") == 0) || 
+				(strcmp(s, "from") == 0) ||
+				(strcmp(s, "if") == 0) ||
+				(strcmp(s, "inspect") == 0) || 
+				(strcmp(s, "once") == 0)
+			)
+				levelCurrent++;
+			if (!lastDeferred && (strcmp(s, "class") == 0))
+				levelCurrent++;
+			if (strcmp(s, "end") == 0) 
+				levelCurrent--;
+			lastDeferred = strcmp(s, "deferred") == 0;
+		}
+
+		if (atEOL) {
+			int lev = levelPrev;
+			if (visibleChars == 0)
+				lev |= SC_FOLDLEVELWHITEFLAG;
+			if ((levelCurrent > levelPrev) && (visibleChars > 0))
+				lev |= SC_FOLDLEVELHEADERFLAG;
+			if (lev != styler.LevelAt(lineCurrent)) {
+				styler.SetLevel(lineCurrent, lev);
+			}
+			lineCurrent++;
+			levelPrev = levelCurrent;
+			visibleChars = 0;
+		}
+		if (!isspacechar(ch))
+			visibleChars++;
+		stylePrev = style;
+	}
+	// 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);
+}
+
+LexerModule lmEiffel(SCLEX_EIFFEL, ColouriseEiffelDoc, "eiffel", FoldEiffelDocIndent);
+LexerModule lmEiffelkw(SCLEX_EIFFELKW, ColouriseEiffelDoc, "eiffelkw", FoldEiffelDocKeyWords);
diff --git a/contrib/src/stc/scintilla/src/LexHTML.cxx b/contrib/src/stc/scintilla/src/LexHTML.cxx
index 7868b47fc8..c28a432795 100644
--- a/contrib/src/stc/scintilla/src/LexHTML.cxx
+++ b/contrib/src/stc/scintilla/src/LexHTML.cxx
@@ -1,13 +1,15 @@
-// SciTE - Scintilla based Text Editor
-// LexHTML.cxx - lexer for HTML
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file LexHTML.cxx
+ ** Lexer for HTML.
+ **/
+// 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"
 
@@ -32,6 +34,8 @@ static int segIsScriptingIndicator(Accessor &styler, unsigned int start, unsigne
 		s[i + 1] = '\0';
 	}
 	//Platform::DebugPrintf("Scripting indicator [%s]\n", s);
+	if (strstr(s, "src"))	// External script
+		return eScriptNone;
 	if (strstr(s, "vbs"))
 		return eScriptVBS;
 	if (strstr(s, "pyth"))
@@ -63,7 +67,6 @@ static int PrintScriptingIndicatorOffset(Accessor &styler, unsigned int start, u
 	return iResult;
 }
 
-//static int ScriptOfState(int state,int defaultScript)
 static int ScriptOfState(int state) {
 	int scriptLanguage;
 
@@ -71,7 +74,7 @@ static int ScriptOfState(int state) {
 		scriptLanguage = eScriptPython;
 	} else if ((state >= SCE_HB_START) && (state <= SCE_HB_STRINGEOL)) {
 		scriptLanguage = eScriptVBS;
-	} else if ((state >= SCE_HJ_START) && (state <= SCE_HJ_STRINGEOL)) {
+	} else if ((state >= SCE_HJ_START) && (state <= SCE_HJ_REGEX)) {
 		scriptLanguage = eScriptJS;
 	} else if ((state >= SCE_HPHP_DEFAULT) && (state <= SCE_HPHP_COMMENTLINE)) {
 		scriptLanguage = eScriptPHP;
@@ -90,7 +93,7 @@ static int statePrintForState(int state, int inScriptType) {
 		StateToPrint = state + ((inScriptType == eNonHtmlScript) ? 0 : SCE_HA_PYTHON);
 	} else if ((state >= SCE_HB_START) && (state <= SCE_HB_STRINGEOL)) {
 		StateToPrint = state + ((inScriptType == eNonHtmlScript) ? 0 : SCE_HA_VBS);
-	} else if ((state >= SCE_HJ_START) && (state <= SCE_HJ_STRINGEOL)) {
+	} else if ((state >= SCE_HJ_START) && (state <= SCE_HJ_REGEX)) {
 		StateToPrint = state + ((inScriptType == eNonHtmlScript) ? 0 : SCE_HA_JS);
 	} else {
 		StateToPrint = state;
@@ -106,7 +109,7 @@ static int stateForPrintState(int StateToPrint) {
 		state = StateToPrint - SCE_HA_PYTHON;
 	} else if ((StateToPrint >= SCE_HBA_START) && (StateToPrint <= SCE_HBA_STRINGEOL)) {
 		state = StateToPrint - SCE_HA_VBS;
-	} else if ((StateToPrint >= SCE_HJA_START) && (StateToPrint <= SCE_HJA_STRINGEOL)) {
+	} else if ((StateToPrint >= SCE_HJA_START) && (StateToPrint <= SCE_HJA_REGEX)) {
 		state = StateToPrint - SCE_HA_JS;
 	} else {
 		state = StateToPrint;
@@ -117,7 +120,51 @@ static int stateForPrintState(int StateToPrint) {
 
 static inline bool IsNumber(unsigned int start, Accessor &styler) {
 	return isdigit(styler[start]) || (styler[start] == '.') ||
-	                    (styler[start] == '-') || (styler[start] == '#');
+	       (styler[start] == '-') || (styler[start] == '#');
+}
+
+static inline bool isStringState(int state) {
+	bool bResult;
+
+	switch (state) {
+	case SCE_HJ_DOUBLESTRING:
+	case SCE_HJ_SINGLESTRING:
+	case SCE_HJA_DOUBLESTRING:
+	case SCE_HJA_SINGLESTRING:
+	case SCE_HB_STRING:
+	case SCE_HBA_STRING:
+	case SCE_HP_STRING:
+	case SCE_HPA_STRING:
+	case SCE_HPHP_HSTRING:
+	case SCE_HPHP_SIMPLESTRING:
+		bResult = true;
+		break;
+	default :
+		bResult = false;
+		break;
+	}
+	return bResult;
+}
+
+// not really well done, since it's only comments that should lex the %> and <%
+static inline bool isCommentASPState(int state) {
+	bool bResult;
+
+	switch (state) {
+	case SCE_HJ_COMMENT:
+	case SCE_HJ_COMMENTLINE:
+	case SCE_HJ_COMMENTDOC:
+	case SCE_HB_COMMENTLINE:
+	case SCE_HP_COMMENTLINE:
+	case SCE_HPHP_COMMENT:
+	case SCE_HPHP_COMMENTLINE:
+		bResult = true;
+		break;
+	default :
+		bResult = false;
+		break;
+	}
+	return bResult;
 }
 
 static void classifyAttribHTML(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {
@@ -152,27 +199,28 @@ static int classifyTagHTML(unsigned int start, unsigned int end,
 			s[i++] = static_cast<char>(tolower(ch));
 	}
 	s[i] = '\0';
+	bool isScript = false;
 	char chAttr = SCE_H_TAGUNKNOWN;
 	if (s[0] == '!' && s[1] == '-' && s[2] == '-') {	//Comment
 		chAttr = SCE_H_COMMENT;
 	} else if (strcmp(s, "![cdata[") == 0) {	// In lower case because already converted
 		chAttr = SCE_H_CDATA;
+	} else if (s[0] == '!') {
+		chAttr = SCE_H_SGML;
 	} else if (s[0] == '/') {	// Closing tag
 		if (keywords.InList(s + 1))
 			chAttr = SCE_H_TAG;
 	} else {
 		if (keywords.InList(s)) {
 			chAttr = SCE_H_TAG;
-		}
-		if (0 == strcmp(s, "script")) {
-			chAttr = SCE_H_SCRIPT;
+			isScript = 0 == strcmp(s, "script");
 		}
 	}
 	if ((chAttr == SCE_H_TAGUNKNOWN) && !keywords)
 		// No keywords -> all are known
 		chAttr = SCE_H_TAG;
 	styler.ColourTo(end, chAttr);
-	return chAttr;
+	return isScript ? SCE_H_SCRIPT : chAttr;
 }
 
 static void classifyWordHTJS(unsigned int start, unsigned int end,
@@ -295,6 +343,17 @@ static bool isLineEnd(char ch) {
 	return ch == '\r' || ch == '\n';
 }
 
+static bool isOKBeforeRE(char ch) {
+	return (ch == '(') || (ch == '=') || (ch == ',');
+}
+
+static bool isPHPStringState(int state) {
+	return 
+		(state == SCE_HPHP_HSTRING) ||
+		(state == SCE_HPHP_SIMPLESTRING) ||
+		(state == SCE_HPHP_HSTRING_VARIABLE);
+}
+
 static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
                                   Accessor &styler) {
 
@@ -313,8 +372,9 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 
 	// If inside a tag, it may be a script tag, so reread from the start to ensure any language tags are seen
 	if (InTagState(state)) {
-		while ((startPos > 1) && (InTagState(styler.StyleAt(startPos - 1)))) {
+		while ((startPos > 0) && (InTagState(styler.StyleAt(startPos - 1)))) {
 			startPos--;
+            length++;
 		}
 		state = SCE_H_DEFAULT;
 	}
@@ -324,25 +384,36 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 	int lineCurrent = styler.GetLine(startPos);
 	if (lineCurrent > 0)
 		lineState = styler.GetLineState(lineCurrent);
-	int inScriptType = (lineState >> 0) & 0x03; // 2 bits
-	int defaultScript = (lineState >> 4) & 0x0F; // 4 bits
-	int beforePreProc = (lineState >> 8) & 0xFF; // 8 bits
+	int inScriptType  = (lineState >> 0) & 0x03; // 2 bits of scripting type
+	bool tagOpened    = (lineState >> 2) & 0x01; // 1 bit to know if we are in an opened tag
+	bool tagClosing   = (lineState >> 3) & 0x01; // 1 bit to know if we are in a closing tag
+	int defaultScript = (lineState >> 4) & 0x0F; // 4 bits of script name
+	int beforePreProc = (lineState >> 8) & 0xFF; // 8 bits of state
 
-	//	int scriptLanguage = ScriptOfState(state,defaultScript);
 	int scriptLanguage = ScriptOfState(state);
 
 	bool fold = styler.GetPropertyInt("fold");
+	bool foldHTML = styler.GetPropertyInt("fold.html",0);
+	bool foldCompact = styler.GetPropertyInt("fold.compact",1);
+
+	fold = foldHTML && fold;
+
 	int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
 	int levelCurrent = levelPrev;
-	int visibleChars = 0;
+	int visibleChars;
+
+	visibleChars = 0;
 
 	char chPrev = ' ';
 	char ch = ' ';
+	char chPrevNonWhite = ' ';
 	styler.StartSegment(startPos);
 	int lengthDoc = startPos + length;
 	for (int i = startPos; i < lengthDoc; i++) {
 		char chPrev2 = chPrev;
 		chPrev = ch;
+		if (ch != ' ' && ch != '\t')
+			chPrevNonWhite = ch;
 		ch = styler[i];
 		char chNext = styler.SafeGetCharAt(i + 1);
 		char chNext2 = styler.SafeGetCharAt(i + 2);
@@ -354,40 +425,44 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 			continue;
 		}
 
-		if (fold && !isspace(ch))
+		if ((!isspacechar(ch) || !foldCompact) && fold)
 			visibleChars++;
 
+		// decide what is the current state to print (depending of the script tag)
+		StateToPrint = statePrintForState(state, inScriptType);
+
 		// handle script folding
 		if (fold) {
 			switch (scriptLanguage) {
 			case eScriptJS:
 			case eScriptPHP:
 				//not currently supported				case eScriptVBS:
+
 				if ((state != SCE_HPHP_COMMENT) && (state != SCE_HPHP_COMMENTLINE) && (state != SCE_HJ_COMMENT) && (state != SCE_HJ_COMMENTLINE) && (state != SCE_HJ_COMMENTDOC)) {
-				if ((ch == '{') || (ch == '}')) {
-					levelCurrent += (ch == '{') ? 1 : -1;
+					if ((ch == '{') || (ch == '}')) {
+						levelCurrent += (ch == '{') ? 1 : -1;
 					}
 				}
 				break;
 			case eScriptPython:
 				if (state != SCE_HP_COMMENTLINE) {
-				if ((ch == ':') && ((chNext == '\n') || (chNext == '\r' && chNext2 == '\n'))) {
-					levelCurrent++;
-				} else if ((ch == '\n') && !((chNext == '\r') && (chNext2 == '\n')) && (chNext != '\n')) {
-					// check if the number of tabs is lower than the level
-					int Findlevel = (levelCurrent & ~SC_FOLDLEVELBASE) * 8;
-					for (int j = 0;Findlevel > 0;j++) {
-						char chTmp = styler.SafeGetCharAt(i + j + 1);
-						if (chTmp == '\t') {
-							Findlevel -= 8;
-						}	else if (chTmp == ' ') {
-							Findlevel--;
-						}	else break;
-					}
+					if ((ch == ':') && ((chNext == '\n') || (chNext == '\r' && chNext2 == '\n'))) {
+						levelCurrent++;
+					} else if ((ch == '\n') && !((chNext == '\r') && (chNext2 == '\n')) && (chNext != '\n')) {
+						// check if the number of tabs is lower than the level
+						int Findlevel = (levelCurrent & ~SC_FOLDLEVELBASE) * 8;
+						for (int j = 0;Findlevel > 0;j++) {
+							char chTmp = styler.SafeGetCharAt(i + j + 1);
+							if (chTmp == '\t') {
+								Findlevel -= 8;
+							}	else if (chTmp == ' ') {
+								Findlevel--;
+							}	else break;
+						}
 
-					if (Findlevel > 0) {
-						levelCurrent -= Findlevel / 8;
-						if (Findlevel % 8) levelCurrent--;
+						if (Findlevel > 0) {
+							levelCurrent -= Findlevel / 8;
+							if (Findlevel % 8) levelCurrent--;
 						}
 					}
 				}
@@ -395,9 +470,6 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 			}
 		}
 
-		// decide what is the current state to print (depending of the script tag)
-		StateToPrint = statePrintForState(state, inScriptType);
-
 		if ((ch == '\r' && chNext != '\n') || (ch == '\n')) {
 			// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)
 			// Avoid triggering two times on Dos/Win
@@ -408,13 +480,16 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 					lev |= SC_FOLDLEVELWHITEFLAG;
 				if ((levelCurrent > levelPrev) && (visibleChars > 0))
 					lev |= SC_FOLDLEVELHEADERFLAG;
+
 				styler.SetLevel(lineCurrent, lev);
 				visibleChars = 0;
 				levelPrev = levelCurrent;
 			}
 			lineCurrent++;
 			styler.SetLineState(lineCurrent,
-			                    ((inScriptType & 0x03) << 0) |
+			                    ((inScriptType  & 0x03) << 0) |
+								((tagOpened     & 0x01) << 2) |
+								((tagClosing    & 0x01) << 3) |
 			                    ((defaultScript & 0x0F) << 4) |
 			                    ((beforePreProc & 0xFF) << 8));
 		}
@@ -428,7 +503,9 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 			case SCE_H_SINGLESTRING:
 			case SCE_HJ_COMMENT:
 			case SCE_HJ_COMMENTDOC:
-			case SCE_HJ_COMMENTLINE:
+			// SCE_HJ_COMMENTLINE removed as this is a common thing done to hide
+			// the end of script marker from some JS interpreters.
+			//case SCE_HJ_COMMENTLINE:
 			case SCE_HJ_DOUBLESTRING:
 			case SCE_HJ_SINGLESTRING:
 			case SCE_HB_STRING:
@@ -438,19 +515,24 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 				break;
 			default :
 				// maybe we should check here if it's a tag and if it's SCRIPT
-
 				styler.ColourTo(i - 1, StateToPrint);
 				state = SCE_H_TAGUNKNOWN;
 				inScriptType = eHtml;
 				scriptLanguage = eScriptNone;
 				i += 2;
+				// unfold closing script
+				levelCurrent--;
 				continue;
 			}
 		}
 
 		/////////////////////////////////////
 		// handle the start of PHP pre-processor = Non-HTML
-		else if ((ch == '<') && (chNext == '?')) {
+		else if ((state != SCE_H_ASPAT) && 
+				!isPHPStringState(state) && 
+				(state != SCE_HPHP_COMMENT) && 
+				(ch == '<') && 
+				(chNext == '?')) {
 			styler.ColourTo(i - 1, StateToPrint);
 			beforePreProc = state;
 			scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment() + 2, i + 10, eScriptPHP);
@@ -465,11 +547,17 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 				inScriptType = eNonHtmlScriptPreProc;
 			else
 				inScriptType = eNonHtmlPreProc;
+			// fold whole script
+			levelCurrent++;
+			if (scriptLanguage == eScriptXML)
+				levelCurrent--; // no folding of the XML first tag (all XML-like tags in this case)
+			// should be better
+			ch = styler.SafeGetCharAt(i);
 			continue;
 		}
 
 		// handle the start of ASP pre-processor = Non-HTML
-		else if ((ch == '<') && (chNext == '%')) {
+		else if (!isCommentASPState(state) && (ch == '<') && (chNext == '%')) {
 			styler.ColourTo(i - 1, StateToPrint);
 			beforePreProc = state;
 			if (inScriptType == eNonHtmlScript)
@@ -480,25 +568,40 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 			if (chNext2 == '@') {
 				i += 2; // place as if it was the second next char treated
 				state = SCE_H_ASPAT;
+			} else if ((chNext2 == '-') && (styler.SafeGetCharAt(i + 3) == '-')) {
+				styler.ColourTo(i + 3, SCE_H_ASP);
+				state = SCE_H_XCCOMMENT;
+				scriptLanguage = eScriptVBS;
+				continue;
 			} else {
 				if (chNext2 == '=') {
 					i += 2; // place as if it was the second next char treated
-				}
-				else {
+				} else {
 					i++; // place as if it was the next char treated
 				}
 
-
 				state = StateForScript(defaultScript);
 			}
+			scriptLanguage = eScriptVBS;
 			styler.ColourTo(i, SCE_H_ASP);
+			// fold whole script
+			levelCurrent++;
+			// should be better
+			ch = styler.SafeGetCharAt(i);
 			continue;
 		}
 
 		// handle the end of a pre-processor = Non-HTML
-		else if (((inScriptType == eNonHtmlPreProc) || (inScriptType == eNonHtmlScriptPreProc)) && ((ch == '?') || (ch == '%')) && (chNext == '>')) {
+		else if (
+			((inScriptType == eNonHtmlPreProc)
+				|| (inScriptType == eNonHtmlScriptPreProc)) && (
+				((scriptLanguage == eScriptPHP) && (ch == '?') && !isPHPStringState(state) && (state != SCE_HPHP_COMMENT)) || 
+				((scriptLanguage != eScriptNone) && !isStringState(state) &&
+				 (ch == '%'))
+			) && (chNext == '>')) {
 			if (state == SCE_H_ASPAT) {
-				defaultScript = segIsScriptingIndicator(styler, styler.GetStartSegment(), i - 1, defaultScript);
+				defaultScript = segIsScriptingIndicator(styler,
+					styler.GetStartSegment(), i - 1, defaultScript);
 			}
 			// Bounce out of any ASP mode
 			switch (state) {
@@ -514,6 +617,9 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 			case SCE_HPHP_WORD:
 				classifyWordHTPHP(styler.GetStartSegment(), i - 1, keywords5, styler);
 				break;
+			case SCE_H_XCCOMMENT:
+				styler.ColourTo(i - 1, state);
+				break;
 			default :
 				styler.ColourTo(i - 1, StateToPrint);
 				break;
@@ -531,6 +637,8 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 			else
 				inScriptType = eHtml;
 			scriptLanguage = eScriptNone;
+			// unfold all scripting languages
+			levelCurrent--;
 			continue;
 		}
 		/////////////////////////////////////
@@ -538,10 +646,21 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 		switch (state) {
 		case SCE_H_DEFAULT:
 			if (ch == '<') {
+				// in HTML, fold on tag open and unfold on tag close
+				tagOpened = true;
+				if (chNext == '/') {
+					tagClosing = true;
+				} else {
+					tagClosing = false;
+				}
+
 				styler.ColourTo(i - 1, StateToPrint);
-				if (chNext == '!' && chNext2 == '-' && styler.SafeGetCharAt(i + 3) == '-')
+				if (chNext == '!' && chNext2 == '-' && styler.SafeGetCharAt(i + 3) == '-') {
+					// should be better
+					i += 3;
+					levelCurrent++;
 					state = SCE_H_COMMENT;
-				else
+				} else
 					state = SCE_H_TAGUNKNOWN;
 			} else if (ch == '&') {
 				styler.ColourTo(i - 1, SCE_H_DEFAULT);
@@ -550,14 +669,26 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 			break;
 		case SCE_H_COMMENT:
 			if ((ch == '>') && (chPrev == '-') && (chPrev2 == '-')) {
+				// unfold HTML comment
+				levelCurrent--;
 				styler.ColourTo(i, StateToPrint);
 				state = SCE_H_DEFAULT;
+				tagOpened = false;
 			}
 			break;
 		case SCE_H_CDATA:
 			if ((ch == '>') && (chPrev == ']') && (chPrev2 == ']')) {
 				styler.ColourTo(i, StateToPrint);
 				state = SCE_H_DEFAULT;
+				tagOpened = false;
+			}
+			break;
+		case SCE_H_SGML:
+			if (ch == '>') {
+				levelCurrent--;
+				styler.ColourTo(i, StateToPrint);
+				state = SCE_H_DEFAULT;
+				tagOpened = false;
 			}
 			break;
 		case SCE_H_ENTITY:
@@ -571,7 +702,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 			}
 			break;
 		case SCE_H_TAGUNKNOWN:
-			if (!ishtmlwordchar(ch) && ch != '/' && ch != '-' && ch != '[') {
+			if (!ishtmlwordchar(ch) && !((ch == '/') && (chPrev == '<')) && ch != '[') {
 				int eClass = classifyTagHTML(styler.GetStartSegment(), i - 1, keywords, styler);
 				if (eClass == SCE_H_SCRIPT) {
 					inScriptType = eNonHtmlScript;
@@ -579,17 +710,38 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 					eClass = SCE_H_TAG;
 				}
 				if (ch == '>') {
-					styler.ColourTo(i, SCE_H_TAG);
+					styler.ColourTo(i, eClass);
 					if (inScriptType == eNonHtmlScript) {
 						state = StateForScript(scriptLanguage);
 					} else {
 						state = SCE_H_DEFAULT;
 					}
-				} else {
-					if (eClass == SCE_H_CDATA) {
-						state = SCE_H_CDATA;
+					tagOpened = false;
+					if (tagClosing)
+						levelCurrent--;
+					else
+						levelCurrent++;
+					tagClosing = false;
+			    } else if (ch == '/' && chNext == '>') {
+					if (eClass == SCE_H_TAGUNKNOWN) {
+					    styler.ColourTo(i + 1, SCE_H_TAGUNKNOWN);
 					} else {
-						state = SCE_H_OTHER;
+					    styler.ColourTo(i - 1, StateToPrint);
+					    styler.ColourTo(i + 1, SCE_H_TAGEND);
+					}
+				    i++;
+				    ch = chNext;
+				    state = SCE_H_DEFAULT;
+					tagOpened = false;
+				} else {
+					if (eClass != SCE_H_TAGUNKNOWN) {
+						if (eClass == SCE_H_CDATA) {
+							state = SCE_H_CDATA;
+						} else if (eClass == SCE_H_SGML) {
+							state = SCE_H_SGML;
+						} else {
+							state = SCE_H_OTHER;
+						}
 					}
 				}
 			}
@@ -597,7 +749,10 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 		case SCE_H_ATTRIBUTE:
 			if (!ishtmlwordchar(ch) && ch != '/' && ch != '-') {
 				if (inScriptType == eNonHtmlScript) {
+					int scriptLanguagePrev = scriptLanguage;
 					scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment(), i - 1, scriptLanguage);
+					if ((scriptLanguagePrev != scriptLanguage) && (scriptLanguage == eScriptNone))
+						inScriptType = eHtml;
 				}
 				classifyAttribHTML(styler.GetStartSegment(), i - 1, keywords, styler);
 				if (ch == '>') {
@@ -607,6 +762,12 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 					} else {
 						state = SCE_H_DEFAULT;
 					}
+					tagOpened = false;
+					if (tagClosing)
+						levelCurrent--;
+					else
+						levelCurrent++;
+					tagClosing = false;
 				} else if (ch == '=') {
 					styler.ColourTo(i, SCE_H_OTHER);
 					state = SCE_H_VALUE;
@@ -624,6 +785,12 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 				} else {
 					state = SCE_H_DEFAULT;
 				}
+				tagOpened = false;
+				if (tagClosing)
+					levelCurrent--;
+				else
+					levelCurrent++;
+				tagClosing = false;
 			} else if (ch == '\"') {
 				styler.ColourTo(i - 1, StateToPrint);
 				state = SCE_H_DOUBLESTRING;
@@ -639,6 +806,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 				i++;
 				ch = chNext;
 				state = SCE_H_DEFAULT;
+				tagOpened = false;
 			} else if (ch == '?' && chNext == '>') {
 				styler.ColourTo(i - 1, StateToPrint);
 				styler.ColourTo(i + 1, SCE_H_XMLEND);
@@ -688,6 +856,12 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 						} else {
 							state = SCE_H_DEFAULT;
 						}
+						tagOpened = false;
+						if (tagClosing)
+							levelCurrent--;
+						else
+							levelCurrent++;
+						tagClosing = false;
 					} else {
 						state = SCE_H_OTHER;
 					}
@@ -709,6 +883,9 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 			} else if (ch == '/' && chNext == '/') {
 				styler.ColourTo(i - 1, StateToPrint);
 				state = SCE_HJ_COMMENTLINE;
+			} else if (ch == '/' && isOKBeforeRE(chPrevNonWhite)) {
+				styler.ColourTo(i - 1, StateToPrint);
+				state = SCE_HJ_REGEX;
 			} else if (ch == '\"') {
 				styler.ColourTo(i - 1, StateToPrint);
 				state = SCE_HJ_DOUBLESTRING;
@@ -781,8 +958,6 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 			} else if (ch == '\"') {
 				styler.ColourTo(i, statePrintForState(SCE_HJ_DOUBLESTRING, inScriptType));
 				state = SCE_HJ_DEFAULT;
-				i++;
-				ch = chNext;
 			} else if ((inScriptType == eNonHtmlScript) && (ch == '-') && (chNext == '-') && (chNext2 == '>')) {
 				styler.ColourTo(i - 1, StateToPrint);
 				state = SCE_HJ_COMMENTLINE;
@@ -800,8 +975,6 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 			} else if (ch == '\'') {
 				styler.ColourTo(i, statePrintForState(SCE_HJ_SINGLESTRING, inScriptType));
 				state = SCE_HJ_DEFAULT;
-				i++;
-				ch = chNext;
 			} else if ((inScriptType == eNonHtmlScript) && (ch == '-') && (chNext == '-') && (chNext2 == '>')) {
 				styler.ColourTo(i - 1, StateToPrint);
 				state = SCE_HJ_COMMENTLINE;
@@ -820,6 +993,19 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 				state = SCE_HJ_DEFAULT;
 			}
 			break;
+		case SCE_HJ_REGEX:
+			if (ch == '\r' || ch == '\n' || ch == '/') {
+				styler.ColourTo(i, StateToPrint);
+				state = SCE_HJ_DEFAULT;
+			} else if (ch == '\\') {
+				// Gobble up the quoted character
+				if (chNext == '\\' || chNext == '/') {
+					i++;
+					ch = chNext;
+					chNext = styler.SafeGetCharAt(i + 1);
+				}
+			}
+			break;
 		case SCE_HB_DEFAULT:
 		case SCE_HB_START:
 			if (iswordstart(ch)) {
@@ -837,7 +1023,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 				state = SCE_HB_COMMENTLINE;
 			} else if (isoperator(ch)) {
 				styler.ColourTo(i - 1, StateToPrint);
-				styler.ColourTo(i, SCE_HB_DEFAULT);
+				styler.ColourTo(i, statePrintForState(SCE_HB_DEFAULT, inScriptType));
 				state = SCE_HB_DEFAULT;
 			} else if ((ch == ' ') || (ch == '\t')) {
 				if (state == SCE_HB_START) {
@@ -865,8 +1051,6 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 			if (ch == '\"') {
 				styler.ColourTo(i, StateToPrint);
 				state = SCE_HB_DEFAULT;
-				i++;
-				ch = chNext;
 			} else if (ch == '\r' || ch == '\n') {
 				styler.ColourTo(i - 1, StateToPrint);
 				state = SCE_HB_STRINGEOL;
@@ -1023,6 +1207,8 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 					state = SCE_HPHP_SIMPLESTRING;
 				} else if (ch == '$') {
 					state = SCE_HPHP_VARIABLE;
+				} else if (isoperator(ch)) {
+					state = SCE_HPHP_OPERATOR;
 				} else {
 					state = SCE_HPHP_DEFAULT;
 				}
@@ -1031,13 +1217,19 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 		case SCE_HPHP_NUMBER:
 			if (!isdigit(ch)) {
 				styler.ColourTo(i - 1, SCE_HPHP_NUMBER);
-				state = SCE_HPHP_DEFAULT;
+				if (isoperator(ch)) 
+					state =SCE_HPHP_OPERATOR;
+				else 
+					state = SCE_HPHP_DEFAULT;
 			}
 			break;
 		case SCE_HPHP_VARIABLE:
 			if (!iswordstart(ch)) {
 				styler.ColourTo(i - 1, SCE_HPHP_VARIABLE);
-				state = SCE_HPHP_DEFAULT;
+				if (isoperator(ch)) 
+					state =SCE_HPHP_OPERATOR;
+				else 
+					state = SCE_HPHP_DEFAULT;
 			}
 			break;
 		case SCE_HPHP_COMMENT:
@@ -1054,20 +1246,34 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 			break;
 		case SCE_HPHP_HSTRING:
 			if (ch == '\\') {
-        // skip the next char
-					i++;
+				// skip the next char
+				i++;
+			} else if (ch == '$') {
+				styler.ColourTo(i-1, StateToPrint);
+				state = SCE_HPHP_HSTRING_VARIABLE;
 			} else if (ch == '\"') {
 				styler.ColourTo(i, StateToPrint);
 				state = SCE_HPHP_DEFAULT;
 			}
 			break;
 		case SCE_HPHP_SIMPLESTRING:
-			 if (ch == '\'') {
+			if (ch == '\\') {
+				// skip the next char
+				i++;
+			} else if (ch == '\'') {
 				styler.ColourTo(i, StateToPrint);
 				state = SCE_HPHP_DEFAULT;
 			}
 			break;
-		case SCE_HPHP_DEFAULT:
+		case SCE_HPHP_HSTRING_VARIABLE:
+			if (!iswordstart(ch)) {
+				styler.ColourTo(i-1, StateToPrint);
+				i--; // strange but it works
+				state = SCE_HPHP_HSTRING;
+			}
+			break;
+		case SCE_HPHP_OPERATOR:
+  		case SCE_HPHP_DEFAULT:
 			styler.ColourTo(i - 1, StateToPrint);
 			if (isdigit(ch)) {
 				state = SCE_HPHP_NUMBER;
@@ -1087,15 +1293,20 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 				state = SCE_HPHP_SIMPLESTRING;
 			} else if (ch == '$') {
 				state = SCE_HPHP_VARIABLE;
+			} else if (isoperator(ch)) {
+				state = SCE_HPHP_OPERATOR;
+			} else if ((state == SCE_HPHP_OPERATOR) && (isspacechar(ch))) {
+				state = SCE_HPHP_DEFAULT;
 			}
 			break;
 			///////////// end - PHP state handling
 		}
 
-
-
+		// Some of the above terminated their lexeme but since the same character starts
+		// the same class again, only reenter if non empty segment.
+		bool nonEmptySegment = i >= static_cast<int>(styler.GetStartSegment());
 		if (state == SCE_HB_DEFAULT) {    // One of the above succeeded
-			if (ch == '\"') {
+			if ((ch == '\"') && (nonEmptySegment)) {
 				state = SCE_HB_STRING;
 			} else if (ch == '\'') {
 				state = SCE_HB_COMMENTLINE;
@@ -1105,7 +1316,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 				styler.ColourTo(i, SCE_HB_DEFAULT);
 			}
 		} else if (state == SCE_HBA_DEFAULT) {    // One of the above succeeded
-			if (ch == '\"') {
+			if ((ch == '\"') && (nonEmptySegment)) {
 				state = SCE_HBA_STRING;
 			} else if (ch == '\'') {
 				state = SCE_HBA_COMMENTLINE;
@@ -1122,14 +1333,14 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 					state = SCE_HJ_COMMENT;
 			} else if (ch == '/' && chNext == '/') {
 				state = SCE_HJ_COMMENTLINE;
-			} else if (ch == '\"') {
+			} else if ((ch == '\"') && (nonEmptySegment)) {
 				state = SCE_HJ_DOUBLESTRING;
-			} else if (ch == '\'') {
+			} else if ((ch == '\'')  && (nonEmptySegment)) {
 				state = SCE_HJ_SINGLESTRING;
 			} else if (iswordstart(ch)) {
 				state = SCE_HJ_WORD;
 			} else if (isoperator(ch)) {
-				styler.ColourTo(i, SCE_HJ_SYMBOLS);
+				styler.ColourTo(i, statePrintForState(SCE_HJ_SYMBOLS, inScriptType));
 			}
 		}
 	}
@@ -1140,12 +1351,10 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 	// Fill in the real level of the next line, keeping the current flags as they will be filled in later
 	if (fold) {
 		int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
-		//styler.SetLevel(lineCurrent, levelCurrent | flagsNext);
 		styler.SetLevel(lineCurrent, levelPrev | flagsNext);
-
 	}
 }
 
-LexerModule lmHTML(SCLEX_HTML, ColouriseHyperTextDoc);
-LexerModule lmXML(SCLEX_XML, ColouriseHyperTextDoc);
+LexerModule lmHTML(SCLEX_HTML, ColouriseHyperTextDoc, "hypertext");
+LexerModule lmXML(SCLEX_XML, ColouriseHyperTextDoc, "xml");
 
diff --git a/contrib/src/stc/scintilla/src/LexLisp.cxx b/contrib/src/stc/scintilla/src/LexLisp.cxx
new file mode 100644
index 0000000000..623ca7cfa0
--- /dev/null
+++ b/contrib/src/stc/scintilla/src/LexLisp.cxx
@@ -0,0 +1,195 @@
+// Scintilla source code edit control
+/** @file LexLisp.cxx
+ ** Lexer for Lisp.
+ ** Written by Alexey Yutkin.
+ **/
+// 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"
+
+
+inline bool isLispoperator(char ch) {
+	if (isascii(ch) && isalnum(ch))
+		return false;
+	if (ch == '\'' || ch == '(' || ch == ')' )
+		return true;
+	return false;
+}
+
+inline bool isLispwordstart(char ch) {
+	return isascii(ch) && ch != ';'  && !isspacechar(ch) && !isLispoperator(ch) &&
+		ch != '\n' && ch != '\r' &&  ch != '\"';
+}
+
+
+static void classifyWordLisp(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {
+	PLATFORM_ASSERT(end >= start);
+	char s[100];
+	unsigned int i;
+	bool digit_flag = true;
+	for (i = 0; (i < end - start + 1) && (i < 99); i++) {
+		s[i] = styler[start + i];
+		s[i + 1] = '\0';
+		if (!isdigit(s[i]) && (s[i] != '.')) digit_flag = false;
+	}
+	char chAttr = SCE_LISP_IDENTIFIER;
+
+	if(digit_flag) chAttr = SCE_LISP_NUMBER;
+	else {
+		if (keywords.InList(s)) {
+			chAttr = SCE_LISP_KEYWORD;
+		}
+	}
+	styler.ColourTo(end, chAttr);
+	return;
+}
+
+
+static void ColouriseLispDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
+                            Accessor &styler) {
+
+	WordList &keywords = *keywordlists[0];
+
+	styler.StartAt(startPos);
+
+	int state = initStyle;
+	if (state == SCE_LISP_STRINGEOL)	// Does not leak onto next line
+		state = SCE_LISP_DEFAULT;
+	char chPrev = ' ';
+	char chNext = styler[startPos];
+	unsigned int lengthDoc = startPos + length;
+	styler.StartSegment(startPos);
+	for (unsigned int i = startPos; i < lengthDoc; i++) {
+		char ch = chNext;
+		chNext = styler.SafeGetCharAt(i + 1);
+
+		bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
+		if (atEOL) {
+			// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)
+			// Avoid triggering two times on Dos/Win
+			// End of line
+			if (state == SCE_LISP_STRINGEOL) {
+				styler.ColourTo(i, state);
+				state = SCE_LISP_DEFAULT;
+			}
+		}
+
+		if (styler.IsLeadByte(ch)) {
+			chNext = styler.SafeGetCharAt(i + 2);
+			chPrev = ' ';
+			i += 1;
+			continue;
+		}
+
+		if (state == SCE_LISP_DEFAULT) {
+			if (isLispwordstart(ch)) {
+				styler.ColourTo(i - 1, state);
+				state = SCE_LISP_IDENTIFIER;
+			} 
+			else if (ch == ';') {
+				styler.ColourTo(i - 1, state);
+				state = SCE_LISP_COMMENT;
+			}
+			else if (isLispoperator(ch) || ch=='\'') {
+				styler.ColourTo(i - 1, state);
+				styler.ColourTo(i, SCE_LISP_OPERATOR);
+			}
+			
+			else if (ch == '\"') {
+					state = SCE_LISP_STRING;
+			}
+		} else if (state == SCE_LISP_IDENTIFIER) {
+			if (!isLispwordstart(ch)) {
+				classifyWordLisp(styler.GetStartSegment(), i - 1, keywords, styler);
+				state = SCE_LISP_DEFAULT;
+			} /*else*/ 
+			if (isLispoperator(ch) || ch=='\'') {
+				styler.ColourTo(i - 1, state);
+				styler.ColourTo(i, SCE_LISP_OPERATOR);
+			}
+			
+		} else {
+			if (state == SCE_LISP_COMMENT) {
+				if (atEOL) {
+					styler.ColourTo(i - 1, state);
+					state = SCE_LISP_DEFAULT;
+				}
+			} else if (state == SCE_LISP_STRING) {
+				if (ch == '\\') {
+					if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
+						i++;
+						ch = chNext;
+						chNext = styler.SafeGetCharAt(i + 1);
+					}
+				} else if (ch == '\"') {
+					styler.ColourTo(i, state);
+					state = SCE_LISP_DEFAULT;
+				} else if ((chNext == '\r' || chNext == '\n') && (chPrev != '\\')) {
+					styler.ColourTo(i - 1, SCE_LISP_STRINGEOL);
+					state = SCE_LISP_STRINGEOL;
+				}
+			}
+		}
+
+		chPrev = ch;
+	}
+	styler.ColourTo(lengthDoc - 1, state);
+}
+
+static void FoldLispDoc(unsigned int startPos, int length, int /* initStyle */, WordList *[],
+                            Accessor &styler) {
+	unsigned int lengthDoc = startPos + length;
+	int visibleChars = 0;
+	int lineCurrent = styler.GetLine(startPos);
+	int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
+	int levelCurrent = levelPrev;
+	char chNext = styler[startPos];
+	int styleNext = styler.StyleAt(startPos);
+	for (unsigned int i = startPos; i < lengthDoc; i++) {
+		char ch = chNext;
+		chNext = styler.SafeGetCharAt(i + 1);
+		int style = styleNext;
+		styleNext = styler.StyleAt(i + 1);
+		bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
+		if (style == SCE_LISP_OPERATOR) {
+			if (ch == '(') {
+				levelCurrent++;
+			} else if (ch == ')') {
+				levelCurrent--;
+			}
+		}
+		if (atEOL) {
+			int lev = levelPrev;
+			if (visibleChars == 0)
+				lev |= SC_FOLDLEVELWHITEFLAG;
+			if ((levelCurrent > levelPrev) && (visibleChars > 0))
+				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);
+}
+
+LexerModule lmLISP(SCLEX_LISP, ColouriseLispDoc, "lisp", FoldLispDoc);
diff --git a/contrib/src/stc/scintilla/src/LexLua.cxx b/contrib/src/stc/scintilla/src/LexLua.cxx
index e6da7668dd..2791d98ada 100644
--- a/contrib/src/stc/scintilla/src/LexLua.cxx
+++ b/contrib/src/stc/scintilla/src/LexLua.cxx
@@ -1,5 +1,10 @@
-// LexLua.cxx - lexer for Lua language
-// Written by Paul Winwood 
+// Scintilla source code edit control
+/** @file LexLua.cxx
+ ** Lexer for Lua language.
+ **
+ ** Written by Paul Winwood.
+ ** Folder by Alexey Yutkin.
+ **/
 
 #include <stdlib.h>
 #include <string.h>
@@ -16,283 +21,261 @@
 #include "Scintilla.h"
 #include "SciLexer.h"
 
-static void classifyWordLua(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';
-    }
+inline bool isLuaOperator(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 == ';' ||
+	        ch == '<' || ch == '>' || ch == ',' ||
+	        ch == '.' || ch == '^' || ch == '%' || ch == ':')
+		return true;
+	return false;
+}
+
+static void classifyWordLua(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_LUA_IDENTIFIER;
-    
-    if (wordIsNumber)
-        chAttr = SCE_LUA_NUMBER;
-    else
-    {
-        if (keywords.InList(s))
-        {
-            chAttr = SCE_LUA_WORD;
-        }
-    }
-    styler.ColourTo(end, chAttr);
+	char chAttr = SCE_LUA_IDENTIFIER;
+
+	if (wordIsNumber)
+		chAttr = SCE_LUA_NUMBER;
+	else {
+		if (keywords.InList(s)) {
+			chAttr = SCE_LUA_WORD;
+		}
+	}
+	styler.ColourTo(end, chAttr);
 }
 
-static void ColouriseLuaDoc(unsigned int startPos, 
-                            int          length, 
-                            int          initStyle, 
-                            WordList    *keywordlists[],
-                            Accessor    &styler)
-{
+static void ColouriseLuaDoc(unsigned int startPos,
+                            int length,
+                            int initStyle,
+                            WordList *keywordlists[],
+                            Accessor &styler) {
+
+	WordList &keywords = *keywordlists[0];
 
-    WordList &keywords = *keywordlists[0];
+	styler.StartAt(startPos);
+	styler.GetLine(startPos);
 
-    styler.StartAt(startPos);
-    styler.GetLine(startPos);
+	int state = initStyle;
+	char chPrev = ' ';
+	char chNext = styler[startPos];
+	unsigned int lengthDoc = startPos + length;
+	bool firstChar = true;
 
-    int  state = initStyle;
-    char chPrev = ' ';
-    char chNext = styler[startPos];
-    unsigned int lengthDoc = startPos + length;
-    bool firstChar = true;
-    int  literalString = 0;
+	/* Must initialize the literalString level, if we are inside such a string.
+	 * Note: this isn't enough, because literal strings can be nested,
+	 * we should go back to see at what level we are...
+	 */
+	int literalString = (initStyle == SCE_LUA_LITERALSTRING) ? 1 : 0;
 
-    styler.StartSegment(startPos);
-    for (unsigned int i = startPos; i <= lengthDoc; i++)
-    {
-        char ch = chNext;
-        chNext = styler.SafeGetCharAt(i + 1);
+	styler.StartSegment(startPos);
+	for (unsigned int i = startPos; i <= lengthDoc; i++) {
+		char ch = chNext;
+		chNext = styler.SafeGetCharAt(i + 1);
 
-        if (styler.IsLeadByte(ch))
-        {
-            chNext = styler.SafeGetCharAt(i + 2);
-            chPrev = ' ';
-            i += 1;
-            continue;
-        }
+		if (styler.IsLeadByte(ch)) {
+			chNext = styler.SafeGetCharAt(i + 2);
+			chPrev = ' ';
+			i += 1;
+			continue;
+		}
+
+		if (state == SCE_LUA_STRINGEOL) {
+			if (ch != '\r' && ch != '\n') {
+				styler.ColourTo(i - 1, state);
+				state = SCE_LUA_DEFAULT;
+			}
+		}
+
+		if (state == SCE_LUA_LITERALSTRING && ch == '[' && chNext == '[') {
+			literalString++;
+		} else if (state == SCE_LUA_DEFAULT) {
+			if (ch == '-' && chNext == '-') {
+				styler.ColourTo(i - 1, state);
+				state = SCE_LUA_COMMENTLINE;
+			} else if (ch == '[' && chNext == '[') {
+				state = SCE_LUA_LITERALSTRING;
+				literalString = 1;
+			} else if (ch == '\"') {
+				styler.ColourTo(i - 1, state);
+				state = SCE_LUA_STRING;
+			} else if (ch == '\'') {
+				styler.ColourTo(i - 1, state);
+				state = SCE_LUA_CHARACTER;
+			} else if (ch == '$' && firstChar) {
+				styler.ColourTo(i - 1, state);
+				state = SCE_LUA_PREPROCESSOR;
+			} else if (ch == '#' && firstChar)	// Should be only on the first line of the file! Cannot be tested here
+			{
+				styler.ColourTo(i - 1, state);
+				state = SCE_LUA_COMMENTLINE;
+			} else if (isLuaOperator(ch)) {
+				styler.ColourTo(i - 1, state);
+				styler.ColourTo(i, SCE_LUA_OPERATOR);
+			} else if (iswordstart(ch)) {
+				styler.ColourTo(i - 1, state);
+				state = SCE_LUA_WORD;
+			}
+		} else if (state == SCE_LUA_WORD) {
+			if (!iswordchar(ch)) {
+				classifyWordLua(styler.GetStartSegment(), i - 1, keywords, styler);
+				state = SCE_LUA_DEFAULT;
+				if (ch == '[' && chNext == '[') {
+					literalString = 1;
+					state = SCE_LUA_LITERALSTRING;
+				} else if (ch == '-' && chNext == '-') {
+					state = SCE_LUA_COMMENTLINE;
+				} else if (ch == '\"') {
+					state = SCE_LUA_STRING;
+				} else if (ch == '\'') {
+					state = SCE_LUA_CHARACTER;
+				} else if (ch == '$' && firstChar) {
+					state = SCE_LUA_PREPROCESSOR;
+				} else if (isLuaOperator(ch)) {
+					styler.ColourTo(i, SCE_LUA_OPERATOR);
+				}
+			} else if (ch == '.' && chNext == '.') {
+				classifyWordLua(styler.GetStartSegment(), i - 1, keywords, styler);
+				styler.ColourTo(i, SCE_LUA_OPERATOR);
+				state = SCE_LUA_DEFAULT;
+			}
+		} else {
+			if (state == SCE_LUA_LITERALSTRING) {
+				if (ch == ']' && (chPrev == ']') && (--literalString == 0)) {
+					styler.ColourTo(i, state);
+					state = SCE_LUA_DEFAULT;
+				}
+			} else if (state == SCE_LUA_PREPROCESSOR) {
+				if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) {
+					styler.ColourTo(i - 1, state);
+					state = SCE_LUA_DEFAULT;
+				}
+			} else if (state == SCE_LUA_COMMENTLINE) {
+				if (ch == '\r' || ch == '\n') {
+					styler.ColourTo(i - 1, state);
+					state = SCE_LUA_DEFAULT;
+				}
+			} else if (state == SCE_LUA_STRING) {
+				if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) {
+					styler.ColourTo(i - 1, state);
+					state = SCE_LUA_STRINGEOL;
+				} else if (ch == '\\') {
+					if (chNext == '\"' || chNext == '\\') {
+						i++;
+						ch = chNext;
+						chNext = styler.SafeGetCharAt(i + 1);
+					}
+				} else if (ch == '\"') {
+					styler.ColourTo(i, state);
+					state = SCE_LUA_DEFAULT;
+					i++;
+					ch = chNext;
+					chNext = styler.SafeGetCharAt(i + 1);
+				}
+			} else if (state == SCE_LUA_CHARACTER) {
+				if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) {
+					styler.ColourTo(i - 1, state);
+					state = SCE_LUA_STRINGEOL;
+				} else if (ch == '\\') {
+					if (chNext == '\'' || chNext == '\\') {
+						i++;
+						ch = chNext;
+						chNext = styler.SafeGetCharAt(i + 1);
+					}
+				} else if (ch == '\'') {
+					styler.ColourTo(i, state);
+					state = SCE_LUA_DEFAULT;
+					i++;
+					ch = chNext;
+					chNext = styler.SafeGetCharAt(i + 1);
+				}
+			}
+
+			if (state == SCE_LUA_DEFAULT) {
+				if (ch == '-' && chNext == '-') {
+					state = SCE_LUA_COMMENTLINE;
+				} else if (ch == '\"') {
+					state = SCE_LUA_STRING;
+				} else if (ch == '\'') {
+					state = SCE_LUA_CHARACTER;
+				} else if (ch == '$' && firstChar) {
+					state = SCE_LUA_PREPROCESSOR;
+				} else if (iswordstart(ch)) {
+					state = SCE_LUA_WORD;
+				} else if (isLuaOperator(ch)) {
+					styler.ColourTo(i, SCE_LUA_OPERATOR);
+				}
+			}
+		}
+		chPrev = ch;
+		firstChar = (ch == '\r' || ch == '\n');
+	}
+	styler.ColourTo(lengthDoc - 1, state);
+}
 
-        if (state == SCE_LUA_STRINGEOL)
-        {
-            if (ch != '\r' && ch != '\n')
-            {
-                styler.ColourTo(i-1, state);
-                state = SCE_LUA_DEFAULT;
-            }
-        }
+static void FoldLuaDoc(unsigned int startPos, int length, int /* initStyle */, WordList *[],
+                       Accessor &styler) {
+	unsigned int lengthDoc = startPos + length;
+	int visibleChars = 0;
+	int lineCurrent = styler.GetLine(startPos);
+	int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
+	int levelCurrent = levelPrev;
+	char chNext = styler[startPos];
+	int styleNext = styler.StyleAt(startPos);
+	char s[10];
+	for (unsigned int i = startPos; i < lengthDoc; i++) {
+		char ch = chNext;
+		chNext = styler.SafeGetCharAt(i + 1);
+		int style = styleNext;
+		styleNext = styler.StyleAt(i + 1);
+		bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
+		if (style == SCE_LUA_WORD)
+			if ( ch == 'e' || ch == 't' || ch == 'd' || ch == 'f') {
+				for (unsigned int j = 0; j < 8; j++) {
+					if (!iswordchar(styler[i + j])) break;
+					s[j] = styler[i + j];
+					s[j + 1] = '\0';
+				}
 
-        if (state == SCE_LUA_LITERALSTRING && ch == '[' && chNext == '[')
-        {
-            literalString++;
-        }
-        else
-        if (state == SCE_LUA_DEFAULT)
-        {
-            if (ch == '-' && chNext == '-')
-            {
-                styler.ColourTo(i-1, state);
-                state = SCE_LUA_COMMENTLINE;
-            }
-            else
-            if (ch == '[' && chNext == '[')
-            {
-                state = SCE_LUA_LITERALSTRING;
-                literalString = 1;
-            }
-            else
-            if (iswordstart(ch))
-            {
-                styler.ColourTo(i-1, state);
-                state = SCE_LUA_WORD;
-            }
-            else
-            if (ch == '\"')
-            {
-                styler.ColourTo(i-1, state);
-                state = SCE_LUA_STRING;
-            }
-            else
-            if (ch == '\'')
-            {
-                styler.ColourTo(i-1, state);
-                state = SCE_LUA_CHARACTER;
-            }
-            else
-            if (ch == '$' && firstChar)
-            {
-                styler.ColourTo(i-1, state);
-                state = SCE_LUA_PREPROCESSOR;
-            }
-            else
-            if (isoperator(ch))
-            {
-                styler.ColourTo(i-1, state);
-                styler.ColourTo(i, SCE_LUA_OPERATOR);
-            }
-        }
-        else
-        if (state == SCE_LUA_WORD)
-        {
-            if (!iswordchar(ch))
-            {
-                classifyWordLua(styler.GetStartSegment(), i - 1, keywords, styler);
-                state = SCE_LUA_DEFAULT;
-                if (ch == '[' && chNext == '[')
-                {
-                    literalString = 1;
-                    state = SCE_LUA_LITERALSTRING;
-                }
-                else
-                if (ch == '-' && chNext == '-')
-                {
-                    state = SCE_LUA_COMMENTLINE;
-                }
-                else
-                if (ch == '\"')
-                {
-                    state = SCE_LUA_STRING;
-                }
-                else
-                if (ch == '\'')
-                {
-                    state = SCE_LUA_CHARACTER;
-                }
-                else
-                if (ch == '$' && firstChar)
-                {
-                    state = SCE_LUA_PREPROCESSOR;
-                }
-                else
-                if (isoperator(ch))
-                {
-                    styler.ColourTo(i, SCE_LUA_OPERATOR);
-                }
-            }
-        }
-        else
-        {
-            if (state == SCE_LUA_LITERALSTRING)
-            {
-                if (ch == ']' && (chPrev == ']') && (--literalString == 0))
-                {
-                    styler.ColourTo(i, state);
-                    state = SCE_LUA_DEFAULT;
-                }
-            }
-            else
-            if (state == SCE_LUA_PREPROCESSOR)
-            {
-                if ((ch == '\r' || ch == '\n') && (chPrev != '\\'))
-                {
-                    styler.ColourTo(i-1, state);
-                    state = SCE_LUA_DEFAULT;
-                }
-            }
-            else
-            if (state == SCE_LUA_COMMENTLINE)
-            {
-                if (ch == '\r' || ch == '\n')
-                {
-                    styler.ColourTo(i-1, state);
-                    state = SCE_LUA_DEFAULT;
-                }
-            }
-            else
-            if (state == SCE_LUA_STRING)
-            {
-                if ((ch == '\r' || ch == '\n') && (chPrev != '\\'))
-                {
-                    styler.ColourTo(i-1, state);
-                    state = SCE_LUA_STRINGEOL;
-                }
-                else
-                if (ch == '\\')
-                {
-                    if (chNext == '\"' || chNext == '\\')
-                    {
-                        i++;
-                        ch = chNext;
-                        chNext = styler.SafeGetCharAt(i + 1);
-                    }
-                }
-                else
-                if (ch == '\"')
-                {
-                    styler.ColourTo(i, state);
-                    state = SCE_LUA_DEFAULT;
-                    i++;
-                    ch = chNext;
-                    chNext = styler.SafeGetCharAt(i + 1);
-                }
-            }
-            else
-            if (state == SCE_LUA_CHARACTER)
-            {
-                if ((ch == '\r' || ch == '\n') && (chPrev != '\\'))
-                {
-                    styler.ColourTo(i-1, state);
-                    state = SCE_LUA_STRINGEOL;
-                }
-                else
-                if (ch == '\\')
-                {
-                    if (chNext == '\'' || chNext == '\\')
-                    {
-                        i++;
-                        ch = chNext;
-                        chNext = styler.SafeGetCharAt(i + 1);
-                    }
-                }
-                else
-                if (ch == '\'')
-                {
-                    styler.ColourTo(i, state);
-                    state = SCE_LUA_DEFAULT;
-                    i++;
-                    ch = chNext;
-                    chNext = styler.SafeGetCharAt(i + 1);
-                }
-            }
+				if ((strcmp(s, "then") == 0) || (strcmp(s, "do") == 0)
+				        || (strcmp(s, "function") == 0))
+					levelCurrent++;
+				if (strcmp(s, "end") == 0) levelCurrent--;
+			}
 
-            if (state == SCE_LUA_DEFAULT)
-            {    
-                if (ch == '-' && chNext == '-')
-                {
-                    state = SCE_LUA_COMMENTLINE;
-                }
-                else
-                if (ch == '\"')
-                {
-                    state = SCE_LUA_STRING;
-                }
-                else
-                if (ch == '\'')
-                {
-                    state = SCE_LUA_CHARACTER;
-                }
-                else
-                if (ch == '$' && firstChar)
-                {
-                    state = SCE_LUA_PREPROCESSOR;
-                }
-                else
-                if (iswordstart(ch))
-                {
-                    state = SCE_LUA_WORD;
-                }
-                else
-                if (isoperator(ch))
-                {
-                    styler.ColourTo(i, SCE_LUA_OPERATOR);
-                }
-            }
-        }
-        chPrev = ch;
-        firstChar = (ch == '\r' || ch == '\n');
-    }
-    styler.ColourTo(lengthDoc - 1, state);
+		if (atEOL) {
+			int lev = levelPrev;
+			if (visibleChars == 0)
+				lev |= SC_FOLDLEVELWHITEFLAG;
+			if ((levelCurrent > levelPrev) && (visibleChars > 0))
+				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);
 }
 
-LexerModule lmLua(SCLEX_LUA, ColouriseLuaDoc);
+LexerModule lmLua(SCLEX_LUA, ColouriseLuaDoc, "lua", FoldLuaDoc);
diff --git a/contrib/src/stc/scintilla/src/LexOthers.cxx b/contrib/src/stc/scintilla/src/LexOthers.cxx
index dd86033687..0814d518c3 100644
--- a/contrib/src/stc/scintilla/src/LexOthers.cxx
+++ b/contrib/src/stc/scintilla/src/LexOthers.cxx
@@ -1,13 +1,16 @@
-// SciTE - Scintilla based Text Editor
-// LexOthers.cxx - lexers for properties files, batch files, make files and error lists
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file LexOthers.cxx
+ ** Lexers for batch files, diff results, properties files, make files and error lists.
+ ** Also lexer for LaTeX documents.
+ **/
+// 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"
 
@@ -17,36 +20,135 @@
 #include "Scintilla.h"
 #include "SciLexer.h"
 
-static void ColouriseBatchLine(char *lineBuffer, int endLine, Accessor &styler) {
-	if (0 == strncmp(lineBuffer, "REM", 3)) {
-		styler.ColourTo(endLine, 1);
-	} else if (0 == strncmp(lineBuffer, "rem", 3)) {
-		styler.ColourTo(endLine, 1);
-	} else if (0 == strncmp(lineBuffer, "SET", 3)) {
-		styler.ColourTo(endLine, 2);
-	} else if (0 == strncmp(lineBuffer, "set", 3)) {
-		styler.ColourTo(endLine, 2);
-	} else if (lineBuffer[0] == ':') {
-		styler.ColourTo(endLine, 3);
+static void ColouriseBatchLine(
+    char *lineBuffer,
+    unsigned int lengthLine,
+    unsigned int startLine,
+    unsigned int endPos,
+    WordList &keywords,
+    Accessor &styler) {
+
+	unsigned int i = 0;
+	unsigned int state = SCE_BAT_DEFAULT;
+
+	while (isspacechar(lineBuffer[i]) && (i < lengthLine)) {	// Skip initial spaces
+		i++;
+	}
+	if (lineBuffer[i] == '@') {	// Hide command (ECHO OFF)
+		styler.ColourTo(startLine + i, SCE_BAT_HIDE);
+		i++;
+		while (isspacechar(lineBuffer[i]) && (i < lengthLine)) {	// Skip next spaces
+			i++;
+		}
+	}
+	if (lineBuffer[i] == ':') {
+		// Label
+		if (lineBuffer[i + 1] == ':') {
+			// :: is a fake label, similar to REM, see http://content.techweb.com/winmag/columns/explorer/2000/21.htm
+			styler.ColourTo(endPos, SCE_BAT_COMMENT);
+		} else {	// Real label
+			styler.ColourTo(endPos, SCE_BAT_LABEL);
+		}
 	} else {
-		styler.ColourTo(endLine, 0);
+		// Check if initial word is a keyword
+		char wordBuffer[21];
+		unsigned int wbl = 0, offset = i;
+		// Copy word in buffer
+		for (; offset < lengthLine && wbl < 20 &&
+		        !isspacechar(lineBuffer[offset]); wbl++, offset++) {
+			wordBuffer[wbl] = static_cast<char>(tolower(lineBuffer[offset]));
+		}
+		wordBuffer[wbl] = '\0';
+		// Check if it is a comment
+		if (CompareCaseInsensitive(wordBuffer, "rem") == 0) {
+			styler.ColourTo(endPos, SCE_BAT_COMMENT);
+			return ;
+		}
+		// Check if it is in the list
+		if (keywords.InList(wordBuffer)) {
+			styler.ColourTo(startLine + offset - 1, SCE_BAT_WORD);	// Regular keyword
+		} else {
+			// Search end of word (can be a long path)
+			while (offset < lengthLine &&
+			        !isspacechar(lineBuffer[offset])) {
+				offset++;
+			}
+			styler.ColourTo(startLine + offset - 1, SCE_BAT_COMMAND);	// External command / program
+		}
+		// Remainder of the line: colourise the variables.
+
+		while (offset < lengthLine) {
+			if (state == SCE_BAT_DEFAULT && lineBuffer[offset] == '%') {
+				styler.ColourTo(startLine + offset - 1, state);
+				if (isdigit(lineBuffer[offset + 1])) {
+					styler.ColourTo(startLine + offset + 1, SCE_BAT_IDENTIFIER);
+					offset += 2;
+				} else if (lineBuffer[offset + 1] == '%' &&
+				           !isspacechar(lineBuffer[offset + 2])) {
+					// Should be safe, as there is CRLF at the end of the line...
+					styler.ColourTo(startLine + offset + 2, SCE_BAT_IDENTIFIER);
+					offset += 3;
+				} else {
+					state = SCE_BAT_IDENTIFIER;
+				}
+			} else if (state == SCE_BAT_IDENTIFIER && lineBuffer[offset] == '%') {
+				styler.ColourTo(startLine + offset, state);
+				state = SCE_BAT_DEFAULT;
+			} else if (state == SCE_BAT_DEFAULT &&
+			           (lineBuffer[offset] == '*' ||
+			            lineBuffer[offset] == '?' ||
+			            lineBuffer[offset] == '=' ||
+			            lineBuffer[offset] == '<' ||
+			            lineBuffer[offset] == '>' ||
+			            lineBuffer[offset] == '|')) {
+				styler.ColourTo(startLine + offset - 1, state);
+				styler.ColourTo(startLine + offset, SCE_BAT_OPERATOR);
+			}
+			offset++;
+		}
+		//		if (endPos > startLine + offset - 1) {
+		styler.ColourTo(endPos, SCE_BAT_DEFAULT);		// Remainder of line, currently not lexed
+		//		}
 	}
+
 }
+// ToDo: (not necessarily at beginning of line) GOTO, [IF] NOT, ERRORLEVEL
+// IF [NO] (test) (command) -- test is EXIST (filename) | (string1)==(string2) | ERRORLEVEL (number)
+// FOR %%(variable) IN (set) DO (command) -- variable is [a-zA-Z] -- eg for %%X in (*.txt) do type %%X
+// ToDo: %n (parameters), %EnvironmentVariable% colourising
+// ToDo: Colourise = > >> < | "
+
+static void ColouriseBatchDoc(
+    unsigned int startPos,
+    int length,
+    int /*initStyle*/,
+    WordList *keywordlists[],
+    Accessor &styler) {
 
-static void ColouriseBatchDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {
 	char lineBuffer[1024];
+	WordList &keywords = *keywordlists[0];
+
 	styler.StartAt(startPos);
 	styler.StartSegment(startPos);
-	unsigned int linePos = 0;
-	for (unsigned int i = startPos; i < startPos + length; i++) {
+	unsigned int linePos = 0, startLine = startPos;
+	for (unsigned int i = startPos; i <= startPos + length; i++) {
 		lineBuffer[linePos++] = styler[i];
-		if (styler[i] == '\r' || styler[i] == '\n' || (linePos >= sizeof(lineBuffer) - 1)) {
-			ColouriseBatchLine(lineBuffer, i, styler);
+		if (styler[i] == '\r' || styler[i] == '\n' || (linePos >=
+		        sizeof(lineBuffer) - 1)) {
+			// End of line (or of line buffer) met, colourise it
+			if (styler[i + 1] == '\n') {
+				lineBuffer[linePos++] = styler[++i];
+			}
+			lineBuffer[linePos] = '\0';
+			ColouriseBatchLine(lineBuffer, linePos, startLine, i, keywords, styler);
 			linePos = 0;
+			startLine = i + 1;
 		}
 	}
-	if (linePos > 0)
-		ColouriseBatchLine(lineBuffer, startPos + length, styler);
+	if (linePos > 0) {
+		ColouriseBatchLine(lineBuffer, linePos, startLine, startPos + length,
+		                   keywords, styler);
+	}
 }
 
 static void ColouriseDiffLine(char *lineBuffer, int endLine, Accessor &styler) {
@@ -89,25 +191,32 @@ static void ColouriseDiffDoc(unsigned int startPos, int length, int, WordList *[
 		ColouriseDiffLine(lineBuffer, startPos + length, styler);
 }
 
-static void ColourisePropsLine(char *lineBuffer, int lengthLine, int startLine, int endPos, Accessor &styler) {
-	int i = 0;
-	while (isspace(lineBuffer[i]) && (i < lengthLine))	// Skip initial spaces
+static void ColourisePropsLine(
+    char *lineBuffer,
+    unsigned int lengthLine,
+    unsigned int startLine,
+    unsigned int endPos,
+    Accessor &styler) {
+
+	unsigned int i = 0;
+	while (isspacechar(lineBuffer[i]) && (i < lengthLine))	// Skip initial spaces
 		i++;
 	if (lineBuffer[i] == '#' || lineBuffer[i] == '!' || lineBuffer[i] == ';') {
 		styler.ColourTo(endPos, 1);
 	} else if (lineBuffer[i] == '[') {
 		styler.ColourTo(endPos, 2);
 	} else if (lineBuffer[i] == '@') {
-		styler.ColourTo(startLine+i, 4);
+		styler.ColourTo(startLine + i, 4);
 		if (lineBuffer[++i] == '=')
-			styler.ColourTo(startLine+i, 3);
+			styler.ColourTo(startLine + i, 3);
 		styler.ColourTo(endPos, 0);
 	} else {
-		while (lineBuffer[i] != '=' && (i < lengthLine))	// Search the '=' character
+		// Search for the '=' character
+		while (lineBuffer[i] != '=' && (i < lengthLine - 1))
 			i++;
 		if (lineBuffer[i] == '=') {
-			styler.ColourTo(startLine+i-1, 0);
-			styler.ColourTo(startLine+i, 3);
+			styler.ColourTo(startLine + i - 1, 0);
+			styler.ColourTo(startLine + i, 3);
 			styler.ColourTo(endPos, 0);
 		} else {
 			styler.ColourTo(endPos, 0);
@@ -119,31 +228,77 @@ static void ColourisePropsDoc(unsigned int startPos, int length, int, WordList *
 	char lineBuffer[1024];
 	styler.StartAt(startPos);
 	styler.StartSegment(startPos);
-	unsigned int linePos = 0;
-	int startLine = startPos;
+	unsigned int linePos = 0, startLine = startPos;
 	for (unsigned int i = startPos; i <= startPos + length; i++) {
 		lineBuffer[linePos++] = styler[i];
-		if ((styler[i] == '\r' && styler.SafeGetCharAt(i+1) != '\n') || 
-			styler[i] == '\n' || 
-			(linePos >= sizeof(lineBuffer) - 1)) {
+		if ((styler[i] == '\r' && styler.SafeGetCharAt(i + 1) != '\n') ||
+		        styler[i] == '\n' ||
+		        (linePos >= sizeof(lineBuffer) - 1)) {
 			lineBuffer[linePos] = '\0';
 			ColourisePropsLine(lineBuffer, linePos, startLine, i, styler);
 			linePos = 0;
-			startLine = i+1;
+			startLine = i + 1;
 		}
 	}
 	if (linePos > 0)
 		ColourisePropsLine(lineBuffer, linePos, startLine, startPos + length, styler);
 }
 
-static void ColouriseMakeLine(char *lineBuffer, int lengthLine, int endPos, Accessor &styler) {
-	int i = 0;
-	while (isspace(lineBuffer[i]) && (i < lengthLine))
+static void ColouriseMakeLine(
+    char *lineBuffer,
+    unsigned int lengthLine,
+    unsigned int startLine,
+    unsigned int endPos,
+    Accessor &styler) {
+
+	unsigned int i = 0;
+        unsigned int lastNonSpace = 0;
+	unsigned int state = SCE_MAKE_DEFAULT;
+	bool bSpecial = false;
+	// Skip initial spaces
+	while (isspacechar(lineBuffer[i]) && (i < lengthLine)) {
 		i++;
-	if (lineBuffer[i] == '#' || lineBuffer[i] == '!') {
-		styler.ColourTo(endPos, 1);
+	}
+	if (lineBuffer[i] == '#') {	// Comment
+		styler.ColourTo(endPos, SCE_MAKE_COMMENT);
+		return;
+	}
+	if (lineBuffer[i] == '!') {	// Special directive
+		styler.ColourTo(endPos, SCE_MAKE_PREPROCESSOR);
+		return;
+	}
+	while (i < lengthLine) {
+		if (lineBuffer[i] == '$' && lineBuffer[i + 1] == '(') {
+			styler.ColourTo(startLine + i - 1, state);
+			state = SCE_MAKE_IDENTIFIER;
+		} else if (state == SCE_MAKE_IDENTIFIER && lineBuffer[i] == ')') {
+			styler.ColourTo(startLine + i, state);
+			state = SCE_MAKE_DEFAULT;
+		}
+		if (!bSpecial) {
+			if (lineBuffer[i] == ':') {
+				styler.ColourTo(startLine + lastNonSpace, SCE_MAKE_TARGET);
+				styler.ColourTo(startLine + i - 1, SCE_MAKE_DEFAULT);
+				styler.ColourTo(startLine + i, SCE_MAKE_OPERATOR);
+				bSpecial = true;	// Only react to the first ':' of the line
+				state = SCE_MAKE_DEFAULT;
+			} else if (lineBuffer[i] == '=') {
+				styler.ColourTo(startLine + lastNonSpace, SCE_MAKE_IDENTIFIER);
+				styler.ColourTo(startLine + i - 1, SCE_MAKE_DEFAULT);
+				styler.ColourTo(startLine + i, SCE_MAKE_OPERATOR);
+				bSpecial = true;	// Only react to the first '=' of the line
+				state = SCE_MAKE_DEFAULT;
+			}
+		}
+		if (!isspacechar(lineBuffer[i])) {
+			lastNonSpace = i;
+		}
+		i++;
+	}
+	if (state == SCE_MAKE_IDENTIFIER) {
+		styler.ColourTo(endPos, SCE_MAKE_IDEOL);	// Error, variable reference not ended
 	} else {
-		styler.ColourTo(endPos, 0);
+		styler.ColourTo(endPos, SCE_MAKE_DEFAULT);
 	}
 }
 
@@ -151,22 +306,38 @@ static void ColouriseMakeDoc(unsigned int startPos, int length, int, WordList *[
 	char lineBuffer[1024];
 	styler.StartAt(startPos);
 	styler.StartSegment(startPos);
-	unsigned int linePos = 0;
+	unsigned int linePos = 0, startLine = startPos;
 	for (unsigned int i = startPos; i <= startPos + length; i++) {
 		lineBuffer[linePos++] = styler[i];
 		if (styler[i] == '\r' || styler[i] == '\n' || (linePos >= sizeof(lineBuffer) - 1)) {
-			ColouriseMakeLine(lineBuffer, linePos, i, styler);
+			lineBuffer[linePos] = '\0';
+			ColouriseMakeLine(lineBuffer, linePos, startLine, i, styler);
 			linePos = 0;
+			startLine = i + 1;
 		}
 	}
-	if (linePos > 0)
-		ColouriseMakeLine(lineBuffer, linePos, startPos + length, styler);
+	if (linePos > 0) {
+		ColouriseMakeLine(lineBuffer, linePos, startLine, startPos + length, styler);
+	}
 }
 
-static void ColouriseErrorListLine(char *lineBuffer, int lengthLine, int endPos, Accessor &styler) {
+static void ColouriseErrorListLine(
+    char *lineBuffer,
+    unsigned int lengthLine,
+    //		unsigned int startLine,
+    unsigned int endPos,
+    Accessor &styler) {
 	if (lineBuffer[0] == '>') {
 		// Command or return status
 		styler.ColourTo(endPos, SCE_ERR_CMD);
+	} else if (lineBuffer[0] == '!') {
+		styler.ColourTo(endPos, SCE_ERR_DIFF_CHANGED);
+	} else if (lineBuffer[0] == '+') {
+		styler.ColourTo(endPos, SCE_ERR_DIFF_ADDITION);
+	} else if (lineBuffer[0] == '-' && lineBuffer[1] == '-' && lineBuffer[2] == '-') {
+		styler.ColourTo(endPos, SCE_ERR_DIFF_MESSAGE);
+	} else if (lineBuffer[0] == '-') {
+		styler.ColourTo(endPos, SCE_ERR_DIFF_DELETION);
 	} else if (strstr(lineBuffer, "File \"") && strstr(lineBuffer, ", line ")) {
 		styler.ColourTo(endPos, SCE_ERR_PYTHON);
 	} else if (0 == strncmp(lineBuffer, "Error ", strlen("Error "))) {
@@ -175,18 +346,28 @@ static void ColouriseErrorListLine(char *lineBuffer, int lengthLine, int endPos,
 	} else if (0 == strncmp(lineBuffer, "Warning ", strlen("Warning "))) {
 		// Borland warning message
 		styler.ColourTo(endPos, SCE_ERR_BORLAND);
-	} else if (strstr(lineBuffer, " at "  ) && 
-		strstr(lineBuffer, " at "  ) < lineBuffer+lengthLine && 
-		strstr(lineBuffer, " line ") && 
-		strstr(lineBuffer, " line ") < lineBuffer+lengthLine) {
+	} else if (strstr(lineBuffer, "at line " ) &&
+	           strstr(lineBuffer, "at line " ) < lineBuffer + lengthLine &&
+	           strstr(lineBuffer, "file ") &&
+	           strstr(lineBuffer, "file ") < lineBuffer + lengthLine) {
+		// Lua error message
+		styler.ColourTo(endPos, SCE_ERR_LUA);
+	} else if (strstr(lineBuffer, " at " ) &&
+	           strstr(lineBuffer, " at " ) < lineBuffer + lengthLine &&
+	           strstr(lineBuffer, " line ") &&
+	           strstr(lineBuffer, " line ") < lineBuffer + lengthLine) {
 		// perl error message
 		styler.ColourTo(endPos, SCE_ERR_PERL);
+	} else if ((memcmp(lineBuffer, "   at ", 6) == 0) &&
+		strstr(lineBuffer, ":line ")) {
+		// A .NET traceback
+		styler.ColourTo(endPos, SCE_ERR_NET);
 	} else {
 		// Look for <filename>:<line>:message
 		// Look for <filename>(line)message
 		// Look for <filename>(line,pos)message
 		int state = 0;
-		for (int i = 0; i < lengthLine; i++) {
+		for (unsigned int i = 0; i < lengthLine; i++) {
 			if (state == 0 && lineBuffer[i] == ':' && isdigit(lineBuffer[i + 1])) {
 				state = 1;
 			} else if (state == 0 && lineBuffer[i] == '(') {
@@ -240,15 +421,13 @@ static void ColouriseErrorListDoc(unsigned int startPos, int length, int, WordLi
 }
 
 static int isSpecial(char s) {
-
 	return (s == '\\') || (s == ',') || (s == ';') || (s == '\'') || (s == ' ') ||
 	       (s == '\"') || (s == '`') || (s == '^') || (s == '~');
 }
 
 static int isTag(int start, Accessor &styler) {
-
 	char s[6];
-	unsigned int i = 0, e=1;
+	unsigned int i = 0, e = 1;
 	while (i < 5 && e) {
 		s[i] = styler[start + i];
 		i++;
@@ -259,7 +438,7 @@ static int isTag(int start, Accessor &styler) {
 }
 
 static void ColouriseLatexDoc(unsigned int startPos, int length, int initStyle,
-			   WordList *[], Accessor &styler) {
+                              WordList *[], Accessor &styler) {
 
 	styler.StartAt(startPos);
 
@@ -277,75 +456,74 @@ static void ColouriseLatexDoc(unsigned int startPos, int length, int initStyle,
 			i++;
 			continue;
 		}
-		switch(state) {
-			case SCE_L_DEFAULT :
-				switch(ch) {
-					case '\\' :
-						styler.ColourTo(i - 1, state);
-						if (isSpecial(styler[i + 1])) {
-							styler.ColourTo(i + 1, SCE_L_COMMAND);
-							i++;
-							chNext = styler.SafeGetCharAt(i + 1);
-						}		
-						else {
-						    if (isTag(i+1, styler))
-							state = SCE_L_TAG;
-						    else
-						    	state = SCE_L_COMMAND;
-						}
-						break;
-					case '$' :
-						styler.ColourTo(i - 1, state);
-						state = SCE_L_MATH;
-						if (chNext == '$') {
-							i++;
-							chNext = styler.SafeGetCharAt(i + 1);
-						}
-						break;
-					case '%' :
-						styler.ColourTo(i - 1, state);
-						state = SCE_L_COMMENT;
-						break;
-				}
-				break;                          
-			case SCE_L_COMMAND :
-				if (chNext == '[' || chNext == '{' || chNext == '}' || 
-				    chNext == ' ' || chNext == '\r' || chNext == '\n') {
-					styler.ColourTo(i, state);
-					state = SCE_L_DEFAULT;
+		switch (state) {
+		case SCE_L_DEFAULT :
+			switch (ch) {
+			case '\\' :
+				styler.ColourTo(i - 1, state);
+				if (isSpecial(styler[i + 1])) {
+					styler.ColourTo(i + 1, SCE_L_COMMAND);
 					i++;
 					chNext = styler.SafeGetCharAt(i + 1);
-				}
-				break;                                  
-			case SCE_L_TAG :
-				if (ch == '}') {
-					styler.ColourTo(i, state);
-					state = SCE_L_DEFAULT;
+				} else {
+					if (isTag(i + 1, styler))
+						state = SCE_L_TAG;
+					else
+						state = SCE_L_COMMAND;
 				}
 				break;
-			case SCE_L_MATH :
-				if (ch == '$') {
-					if (chNext == '$') {
-						i++;
-						chNext = styler.SafeGetCharAt(i + 1);
-					}
-					styler.ColourTo(i, state);
-					state = SCE_L_DEFAULT;
+			case '$' :
+				styler.ColourTo(i - 1, state);
+				state = SCE_L_MATH;
+				if (chNext == '$') {
+					i++;
+					chNext = styler.SafeGetCharAt(i + 1);
 				}
 				break;
-			case SCE_L_COMMENT :
-				if (ch == '\r' || ch == '\n') {
-					styler.ColourTo(i - 1, state);
-					state = SCE_L_DEFAULT;
+			case '%' :
+				styler.ColourTo(i - 1, state);
+				state = SCE_L_COMMENT;
+				break;
+			}
+			break;
+		case SCE_L_COMMAND :
+			if (chNext == '[' || chNext == '{' || chNext == '}' ||
+			        chNext == ' ' || chNext == '\r' || chNext == '\n') {
+				styler.ColourTo(i, state);
+				state = SCE_L_DEFAULT;
+				i++;
+				chNext = styler.SafeGetCharAt(i + 1);
+			}
+			break;
+		case SCE_L_TAG :
+			if (ch == '}') {
+				styler.ColourTo(i, state);
+				state = SCE_L_DEFAULT;
+			}
+			break;
+		case SCE_L_MATH :
+			if (ch == '$') {
+				if (chNext == '$') {
+					i++;
+					chNext = styler.SafeGetCharAt(i + 1);
 				}
-		}               
+				styler.ColourTo(i, state);
+				state = SCE_L_DEFAULT;
+			}
+			break;
+		case SCE_L_COMMENT :
+			if (ch == '\r' || ch == '\n') {
+				styler.ColourTo(i - 1, state);
+				state = SCE_L_DEFAULT;
+			}
+		}
 	}
 	styler.ColourTo(lengthDoc, state);
 }
 
-LexerModule lmBatch(SCLEX_BATCH, ColouriseBatchDoc);
-LexerModule lmDiff(SCLEX_DIFF, ColouriseDiffDoc);
-LexerModule lmProps(SCLEX_PROPERTIES, ColourisePropsDoc);
-LexerModule lmMake(SCLEX_MAKEFILE, ColouriseMakeDoc);
-LexerModule lmErrorList(SCLEX_ERRORLIST, ColouriseErrorListDoc);
-LexerModule lmLatex(SCLEX_LATEX, ColouriseLatexDoc);
+LexerModule lmBatch(SCLEX_BATCH, ColouriseBatchDoc, "batch");
+LexerModule lmDiff(SCLEX_DIFF, ColouriseDiffDoc, "diff");
+LexerModule lmProps(SCLEX_PROPERTIES, ColourisePropsDoc, "props");
+LexerModule lmMake(SCLEX_MAKEFILE, ColouriseMakeDoc, "makefile");
+LexerModule lmErrorList(SCLEX_ERRORLIST, ColouriseErrorListDoc, "errorlist");
+LexerModule lmLatex(SCLEX_LATEX, ColouriseLatexDoc, "latex");
diff --git a/contrib/src/stc/scintilla/src/LexPascal.cxx b/contrib/src/stc/scintilla/src/LexPascal.cxx
new file mode 100644
index 0000000000..acc38b52de
--- /dev/null
+++ b/contrib/src/stc/scintilla/src/LexPascal.cxx
@@ -0,0 +1,222 @@
+// Scintilla source code edit control
+/** @file LexPascal.cxx
+ ** Lexer for Pascal.
+ ** Written by Laurent le Tynevez
+ **/
+
+#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"
+
+
+static int classifyWordPascal(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {
+	char s[100];
+	for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
+		s[i] = static_cast<char>(tolower(styler[start + i]));
+		s[i + 1] = '\0';
+	}
+	int lev= 0;
+	char chAttr = SCE_C_IDENTIFIER;
+	if (isdigit(s[0]) || (s[0] == '.')){
+		chAttr = SCE_C_NUMBER;
+	}
+	else {
+		if (keywords.InList(s)) {
+			chAttr = SCE_C_WORD;
+			if (strcmp(s, "begin") == 0 || strcmp(s, "object") == 0)
+				lev=1;
+			else if (strcmp(s, "end") == 0)
+				lev=-1;
+		}
+	}
+	styler.ColourTo(end, chAttr);
+	return lev;
+}
+
+static void ColourisePascalDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
+	Accessor &styler) {
+	WordList &keywords = *keywordlists[0];
+
+	styler.StartAt(startPos);
+
+	bool fold = styler.GetPropertyInt("fold");
+	int lineCurrent = styler.GetLine(startPos);
+	int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
+	int levelCurrent = levelPrev;
+
+	int state = initStyle;
+	if (state == SCE_C_STRINGEOL)	// Does not leak onto next line
+		state = SCE_C_DEFAULT;
+	char chPrev = ' ';
+	char chNext = styler[startPos];
+	unsigned int lengthDoc = startPos + length;
+	int visibleChars = 0;
+	styler.StartSegment(startPos);
+	for (unsigned int i = startPos; i < lengthDoc; i++) {
+		char ch = chNext;
+		chNext = styler.SafeGetCharAt(i + 1);
+
+		if ((ch == '\r' && chNext != '\n') || (ch == '\n')) {
+			// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)
+			// Avoid triggering two times on Dos/Win
+			// End of line
+			if (state == SCE_C_STRINGEOL) {
+				styler.ColourTo(i, state);
+				state = SCE_C_DEFAULT;
+			}
+			if (fold) {
+				int lev = levelPrev;
+				if (visibleChars == 0)
+					lev |= SC_FOLDLEVELWHITEFLAG;
+				if ((levelCurrent > levelPrev) && (visibleChars > 0))
+					lev |= SC_FOLDLEVELHEADERFLAG;
+				styler.SetLevel(lineCurrent, lev);
+				lineCurrent++;
+				levelPrev = levelCurrent;
+			}
+			visibleChars = 0;
+		}
+		if (!isspacechar(ch))
+			visibleChars++;
+
+		if (styler.IsLeadByte(ch)) {
+			chNext = styler.SafeGetCharAt(i + 2);
+			chPrev = ' ';
+			i += 1;
+			continue;
+		}
+
+		if (state == SCE_C_DEFAULT) {
+			if (iswordstart(ch) || (ch == '@')) {
+				styler.ColourTo(i-1, state);
+				state = SCE_C_IDENTIFIER;
+			} else if (ch == '{' && chNext != '$' && chNext != '&') {
+				styler.ColourTo(i-1, state);
+				state = SCE_C_COMMENT;
+			} else if (ch == '(' && chNext == '*'
+						&& styler.SafeGetCharAt(i + 2) != '$'
+						&& styler.SafeGetCharAt(i + 2) != '&') {
+				styler.ColourTo(i-1, state);
+				state = SCE_C_COMMENTDOC;
+			} else if (ch == '/' && chNext == '/') {
+				styler.ColourTo(i-1, state);
+				state = SCE_C_COMMENTLINE;
+			} else if (ch == '\"') {
+				styler.ColourTo(i-1, state);
+				state = SCE_C_STRING;
+			} else if (ch == '\'') {
+				styler.ColourTo(i-1, state);
+				state = SCE_C_CHARACTER;
+			} else if (ch == '{' && (chNext == '$' || chNext=='&') && visibleChars == 1) {
+				styler.ColourTo(i-1, state);
+				state = SCE_C_PREPROCESSOR;
+			} else if (isoperator(ch)) {
+				styler.ColourTo(i-1, state);
+				styler.ColourTo(i, SCE_C_OPERATOR);
+
+			}
+		} else if (state == SCE_C_IDENTIFIER) {
+			if (!iswordchar(ch)) {
+				int levelChange = classifyWordPascal(styler.GetStartSegment(), i - 1, keywords, styler);
+				state = SCE_C_DEFAULT;
+				chNext = styler.SafeGetCharAt(i + 1);
+				if (ch == '{' && chNext != '$' && chNext != '&') {
+					state = SCE_C_COMMENT;
+				} else if (ch == '(' && chNext == '*'
+						&& styler.SafeGetCharAt(i + 2) != '$'
+						&& styler.SafeGetCharAt(i + 2) != '&') {
+					styler.ColourTo(i-1, state);
+					state = SCE_C_COMMENTDOC;
+				} else if (ch == '/' && chNext == '/') {
+					state = SCE_C_COMMENTLINE;
+				} else if (ch == '\"') {
+					state = SCE_C_STRING;
+				} else if (ch == '\'') {
+					state = SCE_C_CHARACTER;
+				} else if (isoperator(ch)) {
+					styler.ColourTo(i, SCE_C_OPERATOR);
+				}
+				levelCurrent+=levelChange;
+			}
+		} else {
+			if (state == SCE_C_PREPROCESSOR) {
+				if (ch=='}'){
+					styler.ColourTo(i, state);
+					state = SCE_C_DEFAULT;
+				} else {
+					if ((ch == '\r' || ch == '\n') && !(chPrev == '\\' || chPrev == '\r')) {
+						styler.ColourTo(i-1, state);
+						state = SCE_C_DEFAULT;
+					}
+				}
+			} else if (state == SCE_C_COMMENT) {
+				if (ch == '}' ) {
+					styler.ColourTo(i, state);
+					state = SCE_C_DEFAULT;
+				}
+			} else if (state == SCE_C_COMMENTDOC) {
+				if (ch == ')' && chPrev == '*') {
+					if (((i > styler.GetStartSegment() + 2) || (
+						(initStyle == SCE_C_COMMENTDOC) &&
+						(styler.GetStartSegment() == static_cast<unsigned int>(startPos))))) {
+							styler.ColourTo(i, state);
+							state = SCE_C_DEFAULT;
+					}
+				}
+			} else if (state == SCE_C_COMMENTLINE) {
+				if (ch == '\r' || ch == '\n') {
+					styler.ColourTo(i-1, state);
+					state = SCE_C_DEFAULT;
+				}
+			} else if (state == SCE_C_STRING) {
+				if (ch == '\\') {
+					if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
+						i++;
+						ch = chNext;
+						chNext = styler.SafeGetCharAt(i + 1);
+					}
+				} else if (ch == '\"') {
+					styler.ColourTo(i, state);
+					state = SCE_C_DEFAULT;
+				} else if (chNext == '\r' || chNext == '\n') {
+					styler.ColourTo(i-1, SCE_C_STRINGEOL);
+					state = SCE_C_STRINGEOL;
+				}
+			} else if (state == SCE_C_CHARACTER) {
+				if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) {
+					styler.ColourTo(i-1, SCE_C_STRINGEOL);
+					state = SCE_C_STRINGEOL;
+				} else if (ch == '\\') {
+					if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
+						i++;
+						ch = chNext;
+						chNext = styler.SafeGetCharAt(i + 1);
+					}
+				} else if (ch == '\'') {
+					styler.ColourTo(i, state);
+					state = SCE_C_DEFAULT;
+				}
+			}
+		}
+		chPrev = ch;
+	}
+	styler.ColourTo(lengthDoc - 1, state);
+
+	// Fill in the real level of the next line, keeping the current flags as they will be filled in later
+	if (fold) {
+		int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
+		styler.SetLevel(lineCurrent, levelPrev | flagsNext);
+	}
+}
+
+LexerModule lmPascal(SCLEX_PASCAL, ColourisePascalDoc, "pascal");
diff --git a/contrib/src/stc/scintilla/src/LexPerl.cxx b/contrib/src/stc/scintilla/src/LexPerl.cxx
index a7186fe552..590d05d2a3 100644
--- a/contrib/src/stc/scintilla/src/LexPerl.cxx
+++ b/contrib/src/stc/scintilla/src/LexPerl.cxx
@@ -1,13 +1,15 @@
-// SciTE - Scintilla based Text Editor
-// LexPerl.cxx - lexer for subset of Perl
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file LexPerl.cxx
+ ** Lexer for subset of Perl.
+ **/
+// 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"
 
@@ -17,7 +19,18 @@
 #include "Scintilla.h"
 #include "SciLexer.h"
 
-inline bool isPerlOperator(char ch) {
+static inline bool isEOLChar(char ch) {
+	return (ch == '\r') || (ch == '\n');
+}
+
+static bool isSingleCharOp(char ch) {
+	char strCharSet[2];
+	strCharSet[0] = ch;
+	strCharSet[1] = '\0';
+	return (NULL != strstr("rwxoRWXOezsfdlpSbctugkTBMAC", strCharSet));
+}
+
+static inline bool isPerlOperator(char ch) {
 	if (isalnum(ch))
 		return false;
 	// '.' left out as it is used to make up numbers
@@ -49,7 +62,7 @@ static int classifyWordPerl(unsigned int start, unsigned int end, WordList &keyw
 	return chAttr;
 }
 
-static bool isEndVar(char ch) {
+static inline bool isEndVar(char ch) {
 	return !isalnum(ch) && ch != '#' && ch != '$' &&
 	       ch != '_' && ch != '\'';
 }
@@ -85,32 +98,86 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 	// Lexer for perl often has to backtrack to start of current style to determine
 	// which characters are being used as quotes, how deeply nested is the
 	// start position and what the termination string is for here documents
-	
+
 	WordList &keywords = *keywordlists[0];
-	
+
+	class HereDocCls {
+	public:
+		int State;		// 0: '<<' encountered
+		// 1: collect the delimiter
+		// 2: here doc text (lines after the 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
+		HereDocCls() {
+			State = 0;
+			DelimiterLength = 0;
+			Delimiter[0] = '\0';
+		}
+	};
+	HereDocCls HereDoc;	// TODO: FIFO for stacked here-docs
+
+	class QuoteCls {
+		public:
+		int  Rep;
+		int  Count;
+		char Up;
+		char Down;
+		QuoteCls() {
+			this->New(1);
+		}
+		void New(int r) {
+			Rep   = r;
+			Count = 0;
+			Up    = '\0';
+			Down  = '\0';
+		}
+		void Open(char u) {
+			Count++;
+			Up    = u;
+			Down  = opposite(Up);
+		}
+	};
+	QuoteCls Quote;
+
 	char sooked[100];
-	int quotes = 0;
-	char quoteDown = 'd';
-	char quoteUp = 'd';
-	int quoteRep = 1;
 	int sookedpos = 0;
 	bool preferRE = true;
 	sooked[sookedpos] = '\0';
 	int state = initStyle;
-	int lengthDoc = startPos + length;
+	unsigned int lengthDoc = startPos + length;
+
 	// If in a long distance lexical state, seek to the beginning  to find quote characters
-	if (state == SCE_PL_HERE || state == SCE_PL_REGEX || 
-		state == SCE_PL_REGSUBST || state == SCE_PL_LONGQUOTE) {
+	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--;
+		}
+		startPos = styler.LineStart(styler.GetLine(startPos));
+		state = styler.StyleAt(startPos - 1);
+	}
+	if ( state == SCE_PL_STRING_Q
+	|| state == SCE_PL_STRING_QQ
+	|| state == SCE_PL_STRING_QX
+	|| state == SCE_PL_STRING_QR
+	|| state == SCE_PL_STRING_QW
+	|| state == SCE_PL_REGEX
+	|| state == SCE_PL_REGSUBST
+	) {
 		while ((startPos > 1) && (styler.StyleAt(startPos - 1) == state)) {
 			startPos--;
 		}
 		state = SCE_PL_DEFAULT;
 	}
+
 	styler.StartAt(startPos);
 	char chPrev = styler.SafeGetCharAt(startPos - 1);
+	if (startPos == 0)
+		chPrev = '\n';
 	char chNext = styler[startPos];
 	styler.StartSegment(startPos);
-	for (int i = startPos; i < lengthDoc; i++) {
+
+	for (unsigned int i = startPos; i < lengthDoc; i++) {
 		char ch = chNext;
 		chNext = styler.SafeGetCharAt(i + 1);
 		char chNext2 = styler.SafeGetCharAt(i + 2);
@@ -121,41 +188,81 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 			i += 1;
 			continue;
 		}
+		if ((chPrev == '\r' && ch == '\n')) {	// skip on DOS/Windows
+			chPrev = ch;
+			continue;
+		}
+
+		if (HereDoc.State == 1 && isEOLChar(ch)) {
+			// Begin of here-doc (the line after the here-doc delimiter):
+			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.
+					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;
+					}
+				}
+			} else {
+				switch (HereDoc.Quote) {
+				case '\\':
+					state = SCE_PL_HERE_Q ;
+					break;
+				default :
+					state = SCE_PL_HERE_QQ;
+				}
+			}
+		}
 
 		if (state == SCE_PL_DEFAULT) {
 			if (iswordstart(ch)) {
 				styler.ColourTo(i - 1, state);
 				if (ch == 's' && !isalnum(chNext)) {
 					state = SCE_PL_REGSUBST;
-					quotes = 0;
-					quoteUp = '\0';
-					quoteDown = '\0';
-					quoteRep = 2;
+					Quote.New(2);
 				} else if (ch == 'm' && !isalnum(chNext)) {
 					state = SCE_PL_REGEX;
-					quotes = 0;
-					quoteUp = '\0';
-					quoteDown = '\0';
-					quoteRep = 1;
+					Quote.New(1);
+				} else if (ch == 'q' && !isalnum(chNext)) {
+					state = SCE_PL_STRING_Q;
+					Quote.New(1);
+				} else if (ch == 'y' && !isalnum(chNext)) {
+					state = SCE_PL_REGSUBST;
+					Quote.New(2);
 				} else if (ch == 't' && chNext == 'r' && !isalnum(chNext2)) {
 					state = SCE_PL_REGSUBST;
-					quotes = 0;
-					quoteUp = '\0';
-					quoteDown = '\0';
-					quoteRep = 2;
+					Quote.New(2);
 					i++;
 					chNext = chNext2;
 				} else if (ch == 'q' && (chNext == 'q' || chNext == 'r' || chNext == 'w' || chNext == 'x') && !isalnum(chNext2)) {
-					state = SCE_PL_LONGQUOTE;
+					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;
+					else if (chNext == 'w') state = SCE_PL_STRING_QW;
 					i++;
 					chNext = chNext2;
-					quotes = 0;
-					quoteUp = '\0';
-					quoteDown = '\0';
-					quoteRep = 1;
+					Quote.New(1);
 				} else {
 					state = SCE_PL_WORD;
 					preferRE = false;
+					if ((!iswordchar(chNext) && chNext != '\'')
+						|| (chNext == '.' && chNext2 == '.')) {
+						// We need that if length of word == 1!
+						// This test is copied from the SCE_PL_WORD handler.
+						classifyWordPerl(styler.GetStartSegment(), i, keywords, styler);
+						state = SCE_PL_DEFAULT;
+					}
 				}
 			} else if (ch == '#') {
 				styler.ColourTo(i - 1, state);
@@ -163,6 +270,8 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 			} else if (ch == '\"') {
 				styler.ColourTo(i - 1, state);
 				state = SCE_PL_STRING;
+				Quote.New(1);
+				Quote.Open(ch);
 			} else if (ch == '\'') {
 				if (chPrev == '&') {
 					// Archaic call
@@ -170,22 +279,24 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 				} else {
 					styler.ColourTo(i - 1, state);
 					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 == '$') {
 				preferRE = false;
 				styler.ColourTo(i - 1, state);
-				if (isalnum(chNext) || chNext == '#' || chNext == '$' || chNext == '_') {
-					state = SCE_PL_SCALAR;
-				} else if (chNext != '{' && chNext != '[') {
+				if ((chNext == '{') || isspacechar(chNext)) {
 					styler.ColourTo(i, SCE_PL_SCALAR);
-					i++;
-					ch = ' ';
-					chNext = ' ';
 				} else {
-					styler.ColourTo(i, SCE_PL_SCALAR);
+					state = SCE_PL_SCALAR;
+					i++;
+					ch = chNext;
+					chNext = chNext2;
 				}
 			} else if (ch == '@') {
 				preferRE = false;
@@ -204,12 +315,10 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 				styler.ColourTo(i - 1, state);
 				if (isalpha(chNext) || chNext == '#' || chNext == '$' || chNext == '_') {
 					state = SCE_PL_HASH;
-				} else if (chNext != '{' && chNext != '[') {
+				} else if (chNext == '{') {
 					styler.ColourTo(i, SCE_PL_HASH);
-					i++;
-					ch = ' ';
 				} else {
-					styler.ColourTo(i, SCE_PL_HASH);
+					styler.ColourTo(i, SCE_PL_OPERATOR);
 				}
 			} else if (ch == '*') {
 				styler.ColourTo(i - 1, state);
@@ -217,25 +326,29 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 			} else if (ch == '/' && preferRE) {
 				styler.ColourTo(i - 1, state);
 				state = SCE_PL_REGEX;
-				quoteUp = '/';
-				quoteDown = '/';
-				quotes = 1;
-				quoteRep = 1;
+				Quote.New(1);
+				Quote.Open(ch);
 			} else if (ch == '<' && chNext == '<') {
 				styler.ColourTo(i - 1, state);
-				state = SCE_PL_HERE;
-				i++;
-				ch = chNext;
-				chNext = chNext2;
-				quotes = 0;
-				sookedpos = 0;
-				sooked[sookedpos] = '\0';
-			} else if (ch == '=' && (chPrev == '\r' || chPrev == '\n') && isalpha(chNext)) {
+				state = SCE_PL_HERE_DELIM;
+				HereDoc.State = 0;
+			} else if (ch == '='
+			           && isalpha(chNext)
+			           && (isEOLChar(chPrev))) {
 				styler.ColourTo(i - 1, state);
 				state = SCE_PL_POD;
-				quotes = 0;
 				sookedpos = 0;
 				sooked[sookedpos] = '\0';
+			} else if (ch == '-'
+			           && isSingleCharOp(chNext)
+			           && !isalnum((chNext2 = styler.SafeGetCharAt(i+2)))) {
+				styler.ColourTo(i - 1, state);
+				styler.ColourTo(i + 1, SCE_PL_WORD);
+				state = SCE_PL_DEFAULT;
+				preferRE = false;
+				i += 2;
+				ch = chNext2;
+				chNext = chNext2 = styler.SafeGetCharAt(i + 1);
 			} else if (isPerlOperator(ch)) {
 				if (ch == ')' || ch == ']')
 					preferRE = false;
@@ -245,7 +358,10 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 				styler.ColourTo(i, SCE_PL_OPERATOR);
 			}
 		} else if (state == SCE_PL_WORD) {
-			if (!iswordchar(ch) && ch != '\'') {	// Archaic Perl has quotes inside names
+			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;
@@ -253,95 +369,106 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 					styler.ColourTo(i, SCE_PL_DATASECTION);
 					state = SCE_PL_DATASECTION;
 				} else {
-					if (classifyWordPerl(styler.GetStartSegment(), i - 1, keywords, styler) == SCE_PL_WORD)
+					if (classifyWordPerl(styler.GetStartSegment(), i, keywords, styler) == SCE_PL_WORD)
 						preferRE = true;
 					state = SCE_PL_DEFAULT;
-					if (ch == '#') {
-						state = SCE_PL_COMMENTLINE;
-					} else if (ch == '\"') {
-						state = SCE_PL_STRING;
-					} else if (ch == '\'') {
-						state = SCE_PL_CHARACTER;
-					} else if (ch == '<' && chNext == '<') {
-						state = SCE_PL_HERE;
-						quotes = 0;
-						sookedpos = 0;
-						sooked[sookedpos] = '\0';
-					} else if (isPerlOperator(ch)) {
-						if (ch == ')' || ch == ']')
-							preferRE = false;
-						else
-							preferRE = true;
-						styler.ColourTo(i, SCE_PL_OPERATOR);
-						state = SCE_PL_DEFAULT;
-					}
+					ch = ' ';
 				}
 			}
 		} else {
 			if (state == SCE_PL_COMMENTLINE) {
-				if (ch == '\r' || ch == '\n') {
+				if (isEOLChar(ch)) {
 					styler.ColourTo(i - 1, state);
 					state = SCE_PL_DEFAULT;
 				}
-			} else if (state == SCE_PL_HERE) {
-				if ((isalnum(ch) || ch == '_') && quotes < 2) {
-					sooked[sookedpos++] = ch;
-					sooked[sookedpos] = '\0';
-					if (quotes == 0)
-						quotes = 1;
-				} else {
-					quotes++;
-				}
-				if ((quotes > 1) && 
-					(chPrev == '\n' || chPrev == '\r') &&
-					isMatch(styler, lengthDoc, i, sooked)) {
-					i += sookedpos;
-					chNext = styler.SafeGetCharAt(i);
-					if (chNext == '\n' || chNext == '\r') {
-						styler.ColourTo(i - 1, SCE_PL_HERE);
-						state = SCE_PL_DEFAULT;
-					}
-					ch = chNext;
-					chNext = styler.SafeGetCharAt(i + 1);
-				}
-			} else if (state == SCE_PL_STRING) {
-				if (ch == '\\') {
-					if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
+			} else if (state == SCE_PL_HERE_DELIM) {
+				//
+				// From perldata.pod:
+				// ------------------
+				// A line-oriented form of quoting is based on the shell ``here-doc''
+				// syntax.
+				// Following a << you specify a string to terminate the quoted material,
+				// and all lines following the current line down to the terminating
+				// string are the value of the item.
+				// The terminating string may be either an identifier (a word),
+				// or some quoted text.
+				// If quoted, the type of quotes you use determines the treatment of
+				// the text, just as in regular quoting.
+				// An unquoted identifier works like double quotes.
+				// 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.)
+				// The terminating string must appear by itself (unquoted and with no
+				// surrounding whitespace) on the terminating line.
+				//
+				if (HereDoc.State == 0) { // '<<' encountered
+					HereDoc.State = 1;
+					HereDoc.Quote = chNext;
+					HereDoc.Quoted = false;
+					HereDoc.DelimiterLength = 0;
+					HereDoc.Delimiter[HereDoc.DelimiterLength] = '\0';
+					if (chNext == '\'' || chNext == '"' || chNext == '`') { // a quoted here-doc delimiter
 						i++;
 						ch = chNext;
-						chNext = styler.SafeGetCharAt(i + 1);
-					}
-				} else if (ch == '\"') {
-					styler.ColourTo(i, state);
-					state = SCE_PL_DEFAULT;
-					i++;
-					ch = chNext;
-					chNext = styler.SafeGetCharAt(i + 1);
-				}
-			} else if (state == SCE_PL_CHARACTER) {
-				if (ch == '\\') {
-					if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
+						chNext = chNext2;
+						HereDoc.Quoted = true;
+					} else if (chNext == '\\') { // ref?
 						i++;
 						ch = chNext;
-						chNext = styler.SafeGetCharAt(i + 1);
+						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 (HereDoc.State == 1) { // collect the delimiter
+					if (HereDoc.Quoted) { // a quoted here-doc delimiter
+						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++;
+								ch = chNext;
+								chNext = chNext2;
+							}
+							HereDoc.Delimiter[HereDoc.DelimiterLength++] = ch;
+							HereDoc.Delimiter[HereDoc.DelimiterLength] = '\0';
+						}
+					} else { // an unquoted here-doc delimiter
+						if (isalnum(ch) || ch == '_') {
+							HereDoc.Delimiter[HereDoc.DelimiterLength++] = ch;
+							HereDoc.Delimiter[HereDoc.DelimiterLength] = '\0';
+						} else {
+							styler.ColourTo(i - 1, state);
+							state = SCE_PL_DEFAULT;
+						}
+					}
+					if (HereDoc.DelimiterLength >= static_cast<int>(sizeof(HereDoc.Delimiter)) - 1) {
+						styler.ColourTo(i - 1, state);
+						state = SCE_PL_ERROR;
 					}
-				} else if (ch == '\'') {
-					styler.ColourTo(i, state);
-					state = SCE_PL_DEFAULT;
-					i++;
-					ch = chNext;
-					chNext = styler.SafeGetCharAt(i + 1);
 				}
-			} else if (state == SCE_PL_BACKTICKS) {
-				if (ch == '`') {
-					styler.ColourTo(i, state);
-					state = SCE_PL_DEFAULT;
-					i++;
+			} 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)) {
+						styler.ColourTo(i - 1, state);
+						state = SCE_PL_DEFAULT;
+						HereDoc.State = 0;
+					}
 					ch = chNext;
 					chNext = styler.SafeGetCharAt(i + 1);
 				}
 			} else if (state == SCE_PL_POD) {
-				if (ch == '=' && (chPrev == '\r' || chPrev == '\n')) {
+				if (ch == '=' && isEOLChar(chPrev)) {
 					if (isMatch(styler, lengthDoc, i, "=cut")) {
 						styler.ColourTo(i - 1 + 4, state);
 						i += 4;
@@ -352,7 +479,12 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 				}
 			} else if (state == SCE_PL_SCALAR) {
 				if (isEndVar(ch)) {
-					styler.ColourTo(i - 1, state);
+					if (i == (styler.GetStartSegment() + 1)) {
+						// Special variable: $(, $_ etc.
+						styler.ColourTo(i, state);
+					} else {
+						styler.ColourTo(i - 1, state);
+					}
 					state = SCE_PL_DEFAULT;
 				}
 			} else if (state == SCE_PL_ARRAY) {
@@ -370,36 +502,36 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 					styler.ColourTo(i - 1, state);
 					state = SCE_PL_DEFAULT;
 				}
-			} else if (state == SCE_PL_REF) {
-				if (isEndVar(ch)) {
-					styler.ColourTo(i - 1, state);
-					state = SCE_PL_DEFAULT;
-				}
-			} else if (state == SCE_PL_REGEX) {
-				if (!quoteUp && !isspace(ch)) {
-					quoteUp = ch;
-					quoteDown = opposite(ch);
-					quotes++;
+			} else if (state == SCE_PL_REGEX
+				|| state == SCE_PL_STRING_QR
+				) {
+				if (!Quote.Up && !isspacechar(ch)) {
+					Quote.Open(ch);
+				} else if (ch == '\\' && Quote.Up != '\\') {
+					// SG: Is it save to skip *every* escaped char?
+					i++;
+					ch = chNext;
+					chNext = styler.SafeGetCharAt(i + 1);
 				} else {
-					if (ch == quoteDown && chPrev != '\\') {
-						quotes--;
-						if (quotes == 0) {
-							quoteRep--;
-							if (quoteUp == quoteDown) {
-								quotes++;
+					if (ch == Quote.Down /*&& chPrev != '\\'*/) {
+						Quote.Count--;
+						if (Quote.Count == 0) {
+							Quote.Rep--;
+							if (Quote.Up == Quote.Down) {
+								Quote.Count++;
 							}
 						}
 						if (!isalpha(chNext)) {
-							if (quoteRep <= 0) {
+							if (Quote.Rep <= 0) {
 								styler.ColourTo(i, state);
 								state = SCE_PL_DEFAULT;
 								ch = ' ';
 							}
 						}
-					} else if (ch == quoteUp && chPrev != '\\') {
-						quotes++;
+					} else if (ch == Quote.Up /*&& chPrev != '\\'*/) {
+						Quote.Count++;
 					} else if (!isalpha(chNext)) {
-						if (quoteRep <= 0) {
+						if (Quote.Rep <= 0) {
 							styler.ColourTo(i, state);
 							state = SCE_PL_DEFAULT;
 							ch = ' ';
@@ -407,12 +539,15 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 					}
 				}
 			} else if (state == SCE_PL_REGSUBST) {
-				if (!quoteUp && !isspace(ch)) {
-					quoteUp = ch;
-					quoteDown = opposite(ch);
-					quotes++;
+				if (!Quote.Up && !isspacechar(ch)) {
+					Quote.Open(ch);
+				} else if (ch == '\\' && Quote.Up != '\\') {
+					// SG: Is it save to skip *every* escaped char?
+					i++;
+					ch = chNext;
+					chNext = styler.SafeGetCharAt(i + 1);
 				} else {
-					if (quotes == 0 && quoteRep == 1) {
+					if (Quote.Count == 0 && Quote.Rep == 1) {
 						/* We matched something like s(...) or tr{...}
 						* and are looking for the next matcher characters,
 						* which could be either bracketed ({...}) or non-bracketed
@@ -420,68 +555,76 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 						*
 						* Number-signs are problematic.  If they occur after
 						* the close of the first part, treat them like
-						* a quoteUp char, even if they actually start comments.
+						* a Quote.Up char, even if they actually start comments.
 						*
 						* If we find an alnum, we end the regsubst, and punt.
 						*
 						* Eric Promislow   ericp@activestate.com  Aug 9,2000
 						*/
-						if (isspace(ch)) {
+						if (isspacechar(ch)) {
 							// Keep going
-						} else if (isalnum(ch)) {
+						}
+						else if (isalnum(ch)) {
 							styler.ColourTo(i, state);
 							state = SCE_PL_DEFAULT;
 							ch = ' ';
 						} else {
-							quoteUp = ch;
-							quoteDown = opposite(ch);
-							quotes++;
+							Quote.Open(ch);
 						}
-					} else if (ch == quoteDown && chPrev != '\\') {
-						quotes--;
-						if (quotes == 0) {
-							quoteRep--;
+					} else if (ch == Quote.Down /*&& chPrev != '\\'*/) {
+						Quote.Count--;
+						if (Quote.Count == 0) {
+							Quote.Rep--;
 						}
 						if (!isalpha(chNext)) {
-							if (quoteRep <= 0) {
+							if (Quote.Rep <= 0) {
 								styler.ColourTo(i, state);
 								state = SCE_PL_DEFAULT;
 								ch = ' ';
 							}
 						}
-						if (quoteUp == quoteDown) {
-							quotes++;
+						if (Quote.Up == Quote.Down) {
+							Quote.Count++;
 						}
-					} else if (ch == quoteUp && chPrev != '\\') {
-						quotes++;
+					} else if (ch == Quote.Up /*&& chPrev != '\\'*/) {
+						Quote.Count++;
 					} else if (!isalpha(chNext)) {
-						if (quoteRep <= 0) {
+						if (Quote.Rep <= 0) {
 							styler.ColourTo(i, state);
 							state = SCE_PL_DEFAULT;
 							ch = ' ';
 						}
 					}
 				}
-			} else if (state == SCE_PL_LONGQUOTE) {
-				if (!quoteDown && !isspace(ch)) {
-					quoteUp = ch;
-					quoteDown = opposite(quoteUp);
-					quotes++;
-				} else if (ch == quoteDown) {
-					quotes--;
-					if (quotes == 0) {
-						quoteRep--;
-						if (quoteRep <= 0) {
+			} else if (state == SCE_PL_STRING_Q
+				|| state == SCE_PL_STRING_QQ
+				|| state == SCE_PL_STRING_QX
+				|| state == SCE_PL_STRING_QW
+				|| state == SCE_PL_STRING
+				|| state == SCE_PL_CHARACTER
+				|| state == SCE_PL_BACKTICKS
+				) {
+				if (!Quote.Down && !isspacechar(ch)) {
+					Quote.Open(ch);
+				} else if (ch == '\\' && Quote.Up != '\\') {
+					i++;
+					ch = chNext;
+					chNext = styler.SafeGetCharAt(i + 1);
+				} else if (ch == Quote.Down) {
+					Quote.Count--;
+					if (Quote.Count == 0) {
+						Quote.Rep--;
+						if (Quote.Rep <= 0) {
 							styler.ColourTo(i, state);
 							state = SCE_PL_DEFAULT;
 							ch = ' ';
 						}
-						if (quoteUp == quoteDown) {
-							quotes++;
+						if (Quote.Up == Quote.Down) {
+							Quote.Count++;
 						}
 					}
-				} else if (ch == quoteUp) {
-					quotes++;
+				} else if (ch == Quote.Up) {
+					Quote.Count++;
 				}
 			}
 
@@ -490,19 +633,30 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 					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 (isoperator(ch)) {
+				} else if (isPerlOperator(ch)) {
+					if (ch == ')' || ch == ']')
+						preferRE = false;
+					else
+						preferRE = true;
 					styler.ColourTo(i, SCE_PL_OPERATOR);
 				}
 			}
 		}
+		if (state == SCE_PL_ERROR) {
+			break;
+		}
 		chPrev = ch;
 	}
 	styler.ColourTo(lengthDoc, state);
 }
 
-LexerModule lmPerl(SCLEX_PERL, ColourisePerlDoc);
+LexerModule lmPerl(SCLEX_PERL, ColourisePerlDoc, "perl");
diff --git a/contrib/src/stc/scintilla/src/LexPython.cxx b/contrib/src/stc/scintilla/src/LexPython.cxx
index 492d21c7d9..6669694d1d 100644
--- a/contrib/src/stc/scintilla/src/LexPython.cxx
+++ b/contrib/src/stc/scintilla/src/LexPython.cxx
@@ -1,13 +1,15 @@
-// SciTE - Scintilla based Text Editor
-// LexPython.cxx - lexer for Python
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file LexPython.cxx
+ ** Lexer for Python.
+ **/
+// 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"
 
@@ -17,6 +19,32 @@
 #include "Scintilla.h"
 #include "SciLexer.h"
 
+/* Returns true if the "as" word that begins at start follows an import statement */
+static bool IsImportAs(unsigned int start, Accessor &styler) {
+	unsigned int i;
+	unsigned int j;
+	char s[10];
+
+	/* Find any import before start but after any statement terminator or quote */
+	i = start;
+	while (i > 0) {
+		char ch = styler[i - 1];
+
+		if (ch == '\n' || ch == '\r' || ch == ';' || ch == '\'' || ch == '"' || ch == '`')
+			break;
+		if (ch == 't' && i > 5) {
+			for (j = 0; j < 6; j++)
+				s[j] = styler[(i - 6) + j];
+			s[j] = '\0';
+			if (strcmp(s, "import") == 0)
+				return true;
+		}
+		i--;
+	}
+
+        return false;
+}
+
 static void ClassifyWordPy(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord) {
 	char s[100];
 	bool wordIsNumber = isdigit(styler[start]);
@@ -33,6 +61,8 @@ static void ClassifyWordPy(unsigned int start, unsigned int end, WordList &keywo
 		chAttr = SCE_P_NUMBER;
 	else if (keywords.InList(s))
 		chAttr = SCE_P_WORD;
+	else if (strcmp(s, "as") == 0 && IsImportAs(start, styler))
+		chAttr = SCE_P_WORD;
 	// make sure that dot-qualifiers inside the word are lexed correct
 	else for (unsigned int i = 0; i < end - start + 1; i++) {
 		if (styler[start + i] == '.') {
@@ -48,50 +78,107 @@ static bool IsPyComment(Accessor &styler, int pos, int len) {
 	return len>0 && styler[pos]=='#';
 }
 
-static void ColourisePyDoc(unsigned int startPos, int length, int initStyle, 
+static bool IsPyStringStart(char ch, char chNext, char chNext2) {
+	if (ch == '\'' || ch == '"')
+		return true;
+	if (ch == 'u' || ch == 'U') {
+		if (chNext == '"' || chNext == '\'')
+			return true;
+		if ((chNext == 'r' || chNext == 'R') && (chNext2 == '"' || chNext2 == '\''))
+			return true;
+	}
+	if ((ch == 'r' || ch == 'R') && (chNext == '"' || chNext == '\''))
+		return true;
+
+	return false;
+}
+
+static bool IsPyWordStart(char ch, char chNext, char chNext2) {
+	return (iswordchar(ch) && !IsPyStringStart(ch, chNext, chNext2));
+}
+
+/* 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 GetPyStringState(Accessor &styler, int i, int *nextIndex) {
+	char ch = styler.SafeGetCharAt(i);
+	char chNext = styler.SafeGetCharAt(i + 1);
+
+	// Advance beyond r, u, or ur prefix, but bail if there are any unexpected chars
+	if (ch == 'r' || ch == 'R') {
+		i++;
+		ch = styler.SafeGetCharAt(i);
+		chNext = styler.SafeGetCharAt(i + 1);
+	}
+	else if (ch == 'u' || ch == 'U') {
+		if (chNext == 'r' || chNext == 'R')
+			i += 2;
+		else
+			i += 1;
+		ch = styler.SafeGetCharAt(i);
+		chNext = styler.SafeGetCharAt(i + 1);
+	}
+
+	if (ch != '"' && ch != '\'') {
+		*nextIndex = i + 1;
+		return SCE_P_DEFAULT;
+	}
+
+	if (ch == chNext && ch == styler.SafeGetCharAt(i + 2)) {
+		*nextIndex = i + 3;
+
+		if (ch == '"')
+			return SCE_P_TRIPLEDOUBLE;
+		else
+			return SCE_P_TRIPLE;
+	} else {
+		*nextIndex = i + 1;
+
+		if (ch == '"')
+			return SCE_P_STRING;
+		else
+			return SCE_P_CHARACTER;
+	}
+}
+
+static void ColourisePyDoc(unsigned int startPos, int length, int initStyle,
 						   WordList *keywordlists[], Accessor &styler) {
 
 	int lengthDoc = startPos + length;
 
-	// Backtrack to previous line in case need to fix its fold status or tab whinging
+	// Backtrack to previous line in case need to fix its tab whinging
 	int lineCurrent = styler.GetLine(startPos);
 	if (startPos > 0) {
 		if (lineCurrent > 0) {
-			lineCurrent--;
-			startPos = styler.LineStart(lineCurrent);
+			startPos = styler.LineStart(lineCurrent-1);
 			if (startPos == 0)
 				initStyle = SCE_P_DEFAULT;
-			else 
+			else
 				initStyle = styler.StyleAt(startPos-1);
 		}
 	}
-	
+
 	// Python uses a different mask because bad indentation is marked by oring with 32
 	styler.StartAt(startPos, 127);
-	
+
 	WordList &keywords = *keywordlists[0];
-	
-	bool fold = styler.GetPropertyInt("fold");
+
 	int whingeLevel = styler.GetPropertyInt("tab.timmy.whinge.level");
 	char prevWord[200];
 	prevWord[0] = '\0';
 	if (length == 0)
 		return ;
-	int spaceFlags = 0;
 
 	int state = initStyle & 31;
 
-	int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsPyComment);
-	if ((state == SCE_P_TRIPLE) || (state == SCE_P_TRIPLEDOUBLE)) 
-		indentCurrent |= SC_FOLDLEVELWHITEFLAG;
-
+	int nextIndex = 0;
 	char chPrev = ' ';
 	char chPrev2 = ' ';
 	char chNext = styler[startPos];
 	styler.StartSegment(startPos);
 	bool atStartLine = true;
+	int spaceFlags = 0;
+	styler.IndentAmount(lineCurrent, &spaceFlags, IsPyComment);
 	for (int i = startPos; i < lengthDoc; i++) {
-	
+
 		if (atStartLine) {
 			char chBad = static_cast<char>(64);
 			char chGood = static_cast<char>(0);
@@ -108,40 +195,19 @@ static void ColourisePyDoc(unsigned int startPos, int length, int initStyle,
 			styler.SetFlags(chFlags, static_cast<char>(state));
 			atStartLine = false;
 		}
-		
+
 		char ch = chNext;
 		chNext = styler.SafeGetCharAt(i + 1);
 		char chNext2 = styler.SafeGetCharAt(i + 2);
-		
+
 		if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc)) {
 			if ((state == SCE_P_DEFAULT) || (state == SCE_P_TRIPLE) || (state == SCE_P_TRIPLEDOUBLE)) {
 				// Perform colourisation of white space and triple quoted strings at end of each line to allow
 				// tab marking to work inside white space and triple quoted strings
 				styler.ColourTo(i, state);
 			}
-
-			int lev = indentCurrent;
-			int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsPyComment);
-			if ((state == SCE_P_TRIPLE) || (state == 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, IsPyComment);
-					if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) {
-						lev |= SC_FOLDLEVELHEADERFLAG;
-					}
-				}
-			}
-			indentCurrent = indentNext;
-			if (fold) {
-				styler.SetLevel(lineCurrent, lev);
-			}
 			lineCurrent++;
+			styler.IndentAmount(lineCurrent, &spaceFlags, IsPyComment);
 			atStartLine = true;
 		}
 
@@ -160,33 +226,20 @@ static void ColourisePyDoc(unsigned int startPos, int length, int initStyle,
 			}
 		}
 		if (state == SCE_P_DEFAULT) {
-			if (iswordstart(ch)) {
+			if (IsPyWordStart(ch, chNext, chNext2)) {
 				styler.ColourTo(i - 1, state);
 				state = SCE_P_WORD;
 			} else if (ch == '#') {
 				styler.ColourTo(i - 1, state);
 				state = chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE;
-			} else if (ch == '\"') {
+			} else if (IsPyStringStart(ch, chNext, chNext2)) {
 				styler.ColourTo(i - 1, state);
-				if (chNext == '\"' && chNext2 == '\"') {
-					i += 2;
-					state = SCE_P_TRIPLEDOUBLE;
+				state = GetPyStringState(styler, i, &nextIndex);
+				if (nextIndex != i + 1) {
+					i = nextIndex - 1;
 					ch = ' ';
 					chPrev = ' ';
 					chNext = styler.SafeGetCharAt(i + 1);
-				} else {
-					state = SCE_P_STRING;
-				}
-			} else if (ch == '\'') {
-				styler.ColourTo(i - 1, state);
-				if (chNext == '\'' && chNext2 == '\'') {
-					i += 2;
-					state = SCE_P_TRIPLE;
-					ch = ' ';
-					chPrev = ' ';
-					chNext = styler.SafeGetCharAt(i + 1);
-				} else {
-					state = SCE_P_CHARACTER;
 				}
 			} else if (isoperator(ch)) {
 				styler.ColourTo(i - 1, state);
@@ -198,25 +251,14 @@ static void ColourisePyDoc(unsigned int startPos, int length, int initStyle,
 				state = SCE_P_DEFAULT;
 				if (ch == '#') {
 					state = chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE;
-				} else if (ch == '\"') {
-					if (chNext == '\"' && chNext2 == '\"') {
-						i += 2;
-						state = SCE_P_TRIPLEDOUBLE;
-						ch = ' ';
-						chPrev = ' ';
-						chNext = styler.SafeGetCharAt(i + 1);
-					} else {
-						state = SCE_P_STRING;
-					}
-				} else if (ch == '\'') {
-					if (chNext == '\'' && chNext2 == '\'') {
-						i += 2;
-						state = SCE_P_TRIPLE;
+				} else if (IsPyStringStart(ch, chNext, chNext2)) {
+					styler.ColourTo(i - 1, state);
+					state = GetPyStringState(styler, i, &nextIndex);
+					if (nextIndex != i + 1) {
+						i = nextIndex - 1;
 						ch = ' ';
 						chPrev = ' ';
 						chNext = styler.SafeGetCharAt(i + 1);
-					} else {
-						state = SCE_P_CHARACTER;
 					}
 				} else if (isoperator(ch)) {
 					styler.ColourTo(i, SCE_P_OPERATOR);
@@ -278,4 +320,131 @@ static void ColourisePyDoc(unsigned int startPos, int length, int initStyle,
 	}
 }
 
-LexerModule lmPython(SCLEX_PYTHON, ColourisePyDoc);
+static bool IsCommentLine(int line, Accessor &styler) {
+	int pos = styler.LineStart(line);
+	int eol_pos = styler.LineStart(line+1) - 1;
+	for (int i = pos; i < eol_pos; i++) {
+		char ch = styler[i];
+		if (ch == '#')
+			return true;
+		else if (ch != ' ' && ch != '\t')
+			return false;
+	}
+	return false;
+}
+
+static bool IsQuoteLine(int line, Accessor &styler) {
+	int style = styler.StyleAt(styler.LineStart(line)) & 31;
+	return ((style == SCE_P_TRIPLE) || (style== SCE_P_TRIPLEDOUBLE));
+}
+
+static void FoldPyDoc(unsigned int startPos, int length, int /*initStyle - unused*/,
+					WordList *[], Accessor &styler) {
+	int maxPos = startPos + length;
+	int maxLines = styler.GetLine(maxPos-1);
+						
+	bool foldComment = styler.GetPropertyInt("fold.comment.python");
+	bool foldQuotes = styler.GetPropertyInt("fold.quotes.python");
+
+	// Backtrack to previous non-blank line so we can determine indent level
+	// for any white space lines (needed esp. within triple quoted strings)
+	// 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)) &&
+			(!IsQuoteLine(lineCurrent, styler)))
+			break;
+	}
+	int indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK;
+	
+	startPos = styler.LineStart(lineCurrent);
+	// Set up initial state
+	int prev_state = SCE_P_DEFAULT & 31;
+	if (lineCurrent >= 1)
+		prev_state = styler.StyleAt(startPos-1) & 31;
+	int prevQuote = foldQuotes && ((prev_state == SCE_P_TRIPLE) || (prev_state == SCE_P_TRIPLEDOUBLE));
+	int prevComment = 0;
+	if (lineCurrent >= 1)
+		prevComment = foldComment && IsCommentLine(lineCurrent - 1, styler);
+
+	// Process all characters to end of requested range or end of any triple quote
+	// or comment that hangs over the end of the range
+	while ((lineCurrent <= maxLines) || prevQuote || prevComment) {
+
+		// Gather info
+		int lev = indentCurrent;
+		int lineNext = lineCurrent + 1;
+		int style = styler.StyleAt(styler.LineStart(lineNext)) & 31;
+		int indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);
+		int quote = foldQuotes && ((style == SCE_P_TRIPLE) || (style== SCE_P_TRIPLEDOUBLE));
+		int quote_start = (quote && !prevQuote);
+		int quote_continue = (quote && prevQuote);
+		int comment = foldComment && IsCommentLine(lineCurrent, styler);
+		int comment_start = (comment && !prevComment && 
+			IsCommentLine(lineNext, styler) && (lev > SC_FOLDLEVELBASE));
+		int comment_continue = (comment && prevComment);
+		if ((!quote || !prevQuote) && !comment)
+			indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK;
+		if (quote)
+			indentNext = indentCurrentLevel;
+		if (indentNext & SC_FOLDLEVELWHITEFLAG)
+			indentNext = SC_FOLDLEVELWHITEFLAG | indentCurrentLevel;
+
+		if (quote_start) {
+			// Place fold point at start of triple quoted string
+			lev |= SC_FOLDLEVELHEADERFLAG;
+		} else if (quote_continue || prevQuote) {
+			// Add level to rest of lines in the string
+			lev = lev + 1;
+		} else 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
+		// starting in column 0 which effectively folds them into surrounding code
+		// rather than screwing up folding.  Then set indent level on the lines
+		// we skipped to be same as maximum of current and next indent.  This approach
+		// does a reasonable job of collapsing white space into surrounding code
+		// without getting confused by white space at the start of an indented level.
+		while (!quote &&
+		       ((indentNext & SC_FOLDLEVELWHITEFLAG) || styler[styler.LineStart(lineNext)] == '#') &&
+		       (lineNext < maxLines)) {
+			int level = Platform::Maximum(indentCurrent, indentNext);
+			if (indentNext & SC_FOLDLEVELWHITEFLAG)
+				level = SC_FOLDLEVELWHITEFLAG | indentCurrentLevel;
+			styler.SetLevel(lineNext, level);
+			lineNext++;
+			indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);
+		}
+
+		// Set fold header on non-quote/non-comment line
+		if (!quote && !comment && !(indentCurrent & SC_FOLDLEVELWHITEFLAG) ) {
+			if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK))
+				lev |= SC_FOLDLEVELHEADERFLAG;
+		}
+
+		// Keep track of triple quote and block comment state of previous line
+		prevQuote = quote;
+		prevComment = comment_start || comment_continue;
+
+		// Set fold level for this line and move to next line
+		styler.SetLevel(lineCurrent, lev);
+		indentCurrent = indentNext;
+		lineCurrent = lineNext;
+	}
+
+	// Make sure last line indent level is set too
+	styler.SetLevel(lineCurrent, indentCurrent);
+}
+
+LexerModule lmPython(SCLEX_PYTHON, ColourisePyDoc, "python", FoldPyDoc);
diff --git a/contrib/src/stc/scintilla/src/LexRuby.cxx b/contrib/src/stc/scintilla/src/LexRuby.cxx
new file mode 100644
index 0000000000..b29eee3bb1
--- /dev/null
+++ b/contrib/src/stc/scintilla/src/LexRuby.cxx
@@ -0,0 +1,355 @@
+// Scintilla source code edit control
+/** @file LexRuby.cxx
+ ** Lexer for Ruby.
+ **/
+// Copyright 2001- by Clemens Wyss <wys@helbling.ch>
+// 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"
+
+static void ClassifyWordRb(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord) {
+	char s[100];
+	bool wordIsNumber = isdigit(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_P_IDENTIFIER;
+	if (0 == strcmp(prevWord, "class"))
+		chAttr = SCE_P_CLASSNAME;
+	else if (0 == strcmp(prevWord, "module"))
+		chAttr = SCE_P_CLASSNAME;
+	else if (0 == strcmp(prevWord, "def"))
+		chAttr = SCE_P_DEFNAME;
+	else if (wordIsNumber)
+		chAttr = SCE_P_NUMBER;
+	else if (keywords.InList(s))
+		chAttr = SCE_P_WORD;
+	// make sure that dot-qualifiers inside the word are lexed correct
+	else for (unsigned int i = 0; i < end - start + 1; 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);
+}
+
+static bool IsRbComment(Accessor &styler, int pos, int len) {
+	return len>0 && styler[pos]=='#';
+}
+
+static bool IsRbStringStart(char ch, char chNext, char chNext2) {
+	if (ch == '\'' || ch == '"')
+		return true;
+	if (ch == 'u' || ch == 'U') {
+		if (chNext == '"' || chNext == '\'')
+			return true;
+		if ((chNext == 'r' || chNext == 'R') && (chNext2 == '"' || chNext2 == '\''))
+			return true;
+	}
+	if ((ch == 'r' || ch == 'R') && (chNext == '"' || chNext == '\''))
+		return true;
+
+	return false;
+}
+
+static bool IsRbWordStart(char ch, char chNext, char chNext2) {
+	return (iswordchar(ch) && !IsRbStringStart(ch, chNext, chNext2));
+}
+
+/* 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 GetRbStringState(Accessor &styler, int i, int *nextIndex) {
+	char ch = styler.SafeGetCharAt(i);
+	char chNext = styler.SafeGetCharAt(i + 1);
+
+	// Advance beyond r, u, or ur prefix, but bail if there are any unexpected chars
+	if (ch == 'r' || ch == 'R') {
+		i++;
+		ch = styler.SafeGetCharAt(i);
+		chNext = styler.SafeGetCharAt(i + 1);
+	}
+	else if (ch == 'u' || ch == 'U') {
+		if (chNext == 'r' || chNext == 'R')
+			i += 2;
+		else
+			i += 1;
+		ch = styler.SafeGetCharAt(i);
+		chNext = styler.SafeGetCharAt(i + 1);
+	}
+
+	if (ch != '"' && ch != '\'') {
+		*nextIndex = i + 1;
+		return SCE_P_DEFAULT;
+	}
+
+	if (ch == chNext && ch == styler.SafeGetCharAt(i + 2)) {
+		*nextIndex = i + 3;
+
+		if (ch == '"')
+			return SCE_P_TRIPLEDOUBLE;
+		else
+			return SCE_P_TRIPLE;
+	} else {
+		*nextIndex = i + 1;
+
+		if (ch == '"')
+			return SCE_P_STRING;
+		else
+			return SCE_P_CHARACTER;
+	}
+}
+
+static void ColouriseRbDoc(unsigned int startPos, int length, int initStyle,
+						   WordList *keywordlists[], Accessor &styler) {
+
+	int lengthDoc = startPos + length;
+
+	// Backtrack to previous line in case need to fix its tab whinging
+	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);
+		}
+	}
+
+	// Ruby uses a different mask because bad indentation is marked by oring with 32
+	styler.StartAt(startPos, 127);
+
+	WordList &keywords = *keywordlists[0];
+
+	int whingeLevel = styler.GetPropertyInt("tab.timmy.whinge.level");
+	char prevWord[200];
+	prevWord[0] = '\0';
+	if (length == 0)
+		return ;
+
+	int state = initStyle & 31;
+
+	int nextIndex = 0;
+	char chPrev = ' ';
+	char chPrev2 = ' ';
+	char chNext = styler[startPos];
+	styler.StartSegment(startPos);
+	bool atStartLine = true;
+	int spaceFlags = 0;
+	for (int i = startPos; i < lengthDoc; i++) {
+
+		if (atStartLine) {
+			char chBad = static_cast<char>(64);
+			char chGood = static_cast<char>(0);
+			char chFlags = chGood;
+			if (whingeLevel == 1) {
+				chFlags = (spaceFlags & wsInconsistent) ? chBad : chGood;
+			} else if (whingeLevel == 2) {
+				chFlags = (spaceFlags & wsSpaceTab) ? chBad : chGood;
+			} else if (whingeLevel == 3) {
+				chFlags = (spaceFlags & wsSpace) ? chBad : chGood;
+			} else if (whingeLevel == 4) {
+				chFlags = (spaceFlags & wsTab) ? chBad : chGood;
+			}
+			styler.SetFlags(chFlags, static_cast<char>(state));
+			atStartLine = false;
+		}
+
+		char ch = chNext;
+		chNext = styler.SafeGetCharAt(i + 1);
+		char chNext2 = styler.SafeGetCharAt(i + 2);
+
+		if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc)) {
+			if ((state == SCE_P_DEFAULT) || (state == SCE_P_TRIPLE) || (state == SCE_P_TRIPLEDOUBLE)) {
+				// Perform colourisation of white space and triple quoted strings at end of each line to allow
+				// tab marking to work inside white space and triple quoted strings
+				styler.ColourTo(i, state);
+			}
+			atStartLine = true;
+		}
+
+		if (styler.IsLeadByte(ch)) {
+			chNext = styler.SafeGetCharAt(i + 2);
+			chPrev = ' ';
+			chPrev2 = ' ';
+			i += 1;
+			continue;
+		}
+
+		if (state == SCE_P_STRINGEOL) {
+			if (ch != '\r' && ch != '\n') {
+				styler.ColourTo(i - 1, state);
+				state = SCE_P_DEFAULT;
+			}
+		}
+		if (state == SCE_P_DEFAULT) {
+			if (IsRbWordStart(ch, chNext, chNext2)) {
+				styler.ColourTo(i - 1, state);
+				state = SCE_P_WORD;
+			} else if (ch == '#') {
+				styler.ColourTo(i - 1, state);
+				state = chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE;
+			} 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 (IsRbStringStart(ch, chNext, chNext2)) {
+				styler.ColourTo(i - 1, state);
+				state = GetRbStringState(styler, i, &nextIndex);
+				if (nextIndex != i + 1) {
+					i = nextIndex - 1;
+					ch = ' ';
+					chPrev = ' ';
+					chNext = styler.SafeGetCharAt(i + 1);
+				}
+			} else if (isoperator(ch)) {
+				styler.ColourTo(i - 1, state);
+				styler.ColourTo(i, SCE_P_OPERATOR);
+			} 
+			} else if (state == SCE_P_WORD) {
+			if (!iswordchar(ch)) {
+				ClassifyWordRb(styler.GetStartSegment(), i - 1, keywords, styler, prevWord);
+				state = SCE_P_DEFAULT;
+				if (ch == '#') {
+					state = chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE;
+				} else if (IsRbStringStart(ch, chNext, chNext2)) {
+					styler.ColourTo(i - 1, state);
+					state = GetRbStringState(styler, i, &nextIndex);
+					if (nextIndex != i + 1) {
+						i = nextIndex - 1;
+						ch = ' ';
+						chPrev = ' ';
+						chNext = styler.SafeGetCharAt(i + 1);
+					}
+				} else if (isoperator(ch)) {
+					styler.ColourTo(i, SCE_P_OPERATOR);
+				}
+			}
+		} else {
+			if (state == SCE_P_COMMENTLINE || state == SCE_P_COMMENTBLOCK) {
+				if (ch == '\r' || ch == '\n') {
+					styler.ColourTo(i - 1, state);
+					state = SCE_P_DEFAULT;
+				}
+			} else if (state == SCE_P_STRING) {
+				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 == '\"') {
+					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 == '\'') {
+					styler.ColourTo(i, state);
+					state = SCE_P_DEFAULT;
+				}
+			} else if (state == SCE_P_TRIPLE) {
+				if (ch == '\'' && chPrev == '\'' && chPrev2 == '\'') {
+					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;
+					}
+				}
+			}
+		}
+		chPrev2 = chPrev;
+		chPrev = ch;
+	}
+	if (state == SCE_P_WORD) {
+		ClassifyWordRb(styler.GetStartSegment(), lengthDoc, keywords, styler, prevWord);
+	} else {
+		styler.ColourTo(lengthDoc, state);
+	}
+}
+
+static void FoldRbDoc(unsigned int startPos, int length, int initStyle,
+						   WordList *[], Accessor &styler) {
+	int lengthDoc = startPos + length;
+
+	// Backtrack to previous line in case need to fix its fold status
+	int lineCurrent = styler.GetLine(startPos);
+	if (startPos > 0) {
+		if (lineCurrent > 0) {
+			lineCurrent--;
+			startPos = styler.LineStart(lineCurrent);
+			if (startPos == 0)
+				initStyle = SCE_P_DEFAULT;
+			else
+				initStyle = styler.StyleAt(startPos-1);
+		}
+	}
+	int state = initStyle & 31;
+	int spaceFlags = 0;
+	int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsRbComment);
+	if ((state == SCE_P_TRIPLE) || (state == SCE_P_TRIPLEDOUBLE))
+		indentCurrent |= SC_FOLDLEVELWHITEFLAG;
+	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)) {
+			int lev = indentCurrent;
+			int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsRbComment);
+			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, IsRbComment);
+					if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) {
+						lev |= SC_FOLDLEVELHEADERFLAG;
+					}
+				}
+			}
+			indentCurrent = indentNext;
+			styler.SetLevel(lineCurrent, lev);
+			lineCurrent++;
+		}
+	}
+}
+						   
+LexerModule lmRuby(SCLEX_RUBY, ColouriseRbDoc, "ruby", FoldRbDoc);
diff --git a/contrib/src/stc/scintilla/src/LexSQL.cxx b/contrib/src/stc/scintilla/src/LexSQL.cxx
index facd0e6b7b..84d7d1c52e 100644
--- a/contrib/src/stc/scintilla/src/LexSQL.cxx
+++ b/contrib/src/stc/scintilla/src/LexSQL.cxx
@@ -1,13 +1,15 @@
-// SciTE - Scintilla based Text Editor
-// LexSQL.cxx - lexer for SQL
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file LexSQL.cxx
+ ** Lexer for SQL.
+ **/
+// 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"
 
@@ -38,7 +40,7 @@ static void ColouriseSQLDoc(unsigned int startPos, int length,
                             int initStyle, WordList *keywordlists[], Accessor &styler) {
 
 	WordList &keywords = *keywordlists[0];
-	
+
 	styler.StartAt(startPos);
 
 	bool fold = styler.GetPropertyInt("fold");
@@ -153,4 +155,4 @@ static void ColouriseSQLDoc(unsigned int startPos, int length,
 	styler.ColourTo(lengthDoc - 1, state);
 }
 
-LexerModule lmSQL(SCLEX_SQL, ColouriseSQLDoc);
+LexerModule lmSQL(SCLEX_SQL, ColouriseSQLDoc, "sql");
diff --git a/contrib/src/stc/scintilla/src/LexVB.cxx b/contrib/src/stc/scintilla/src/LexVB.cxx
index 67dfa78427..61e4035b18 100644
--- a/contrib/src/stc/scintilla/src/LexVB.cxx
+++ b/contrib/src/stc/scintilla/src/LexVB.cxx
@@ -1,13 +1,15 @@
-// SciTE - Scintilla based Text Editor
-// LexVB.cxx - lexer for Visual Basic and VBScript
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file LexVB.cxx
+ ** Lexer for Visual Basic and VBScript.
+ **/
+// 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"
 
@@ -43,11 +45,15 @@ static int classifyWordVB(unsigned int start, unsigned int end, WordList &keywor
 		return SCE_C_DEFAULT;
 }
 
+static bool IsVBComment(Accessor &styler, int pos, int len) {
+	return len>0 && styler[pos]=='\'';
+}
+
 static void ColouriseVBDoc(unsigned int startPos, int length, int initStyle,
                            WordList *keywordlists[], Accessor &styler) {
 
 	WordList &keywords = *keywordlists[0];
-	
+
 	styler.StartAt(startPos);
 
 	int visibleChars = 0;
@@ -73,7 +79,7 @@ static void ColouriseVBDoc(unsigned int startPos, int length, int initStyle,
 			}
 			visibleChars = 0;
 		}
-		if (!isspace(ch))
+		if (!isspacechar(ch))
 			visibleChars++;
 
 		if (state == SCE_C_DEFAULT) {
@@ -136,4 +142,56 @@ static void ColouriseVBDoc(unsigned int startPos, int length, int initStyle,
 	styler.ColourTo(lengthDoc, state);
 }
 
-LexerModule lmVB(SCLEX_VB, ColouriseVBDoc);
+static void FoldVBDoc(unsigned int startPos, int length, int initStyle,
+						   WordList *[], Accessor &styler) {
+	int lengthDoc = startPos + length;
+
+	// Backtrack to previous line in case need to fix its fold status
+	int lineCurrent = styler.GetLine(startPos);
+	if (startPos > 0) {
+		if (lineCurrent > 0) {
+			lineCurrent--;
+			startPos = styler.LineStart(lineCurrent);
+			if (startPos == 0)
+				initStyle = SCE_P_DEFAULT;
+			else
+				initStyle = styler.StyleAt(startPos-1);
+		}
+	}
+	int state = initStyle & 31;
+	int spaceFlags = 0;
+	int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsVBComment);
+	if ((state == SCE_P_TRIPLE) || (state == SCE_P_TRIPLEDOUBLE))
+		indentCurrent |= SC_FOLDLEVELWHITEFLAG;
+	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)) {
+			int lev = indentCurrent;
+			int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsVBComment);
+			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, IsVBComment);
+					if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) {
+						lev |= SC_FOLDLEVELHEADERFLAG;
+					}
+				}
+			}
+			indentCurrent = indentNext;
+			styler.SetLevel(lineCurrent, lev);
+			lineCurrent++;
+		}
+	}
+}
+
+LexerModule lmVB(SCLEX_VB, ColouriseVBDoc, "vb", FoldVBDoc);
diff --git a/contrib/src/stc/scintilla/src/LineMarker.cxx b/contrib/src/stc/scintilla/src/LineMarker.cxx
index f54978c3fc..dc1468d832 100644
--- a/contrib/src/stc/scintilla/src/LineMarker.cxx
+++ b/contrib/src/stc/scintilla/src/LineMarker.cxx
@@ -1,6 +1,8 @@
 // Scintilla source code edit control
-// LineMarker.cxx - defines the look of a line marker in the margin 
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file LineMarker.cxx
+ ** Defines the look of a line marker in the margin .
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include "Platform.h"
@@ -8,13 +10,49 @@
 #include "Scintilla.h"
 #include "LineMarker.h"
 
-void LineMarker::Draw(Surface *surface, PRectangle &rc) {
+static void DrawBox(Surface *surface, int centreX, int centreY, int armSize, Colour fore, Colour back) {
+	PRectangle rc;
+	rc.left = centreX - armSize;
+	rc.top = centreY - armSize;
+	rc.right = centreX + armSize + 1;
+	rc.bottom = centreY + armSize + 1;
+	surface->RectangleDraw(rc, back, fore);
+}
+
+static void DrawCircle(Surface *surface, int centreX, int centreY, int armSize, Colour fore, Colour back) {
+	PRectangle rcCircle;
+	rcCircle.left = centreX - armSize;
+	rcCircle.top = centreY - armSize;
+	rcCircle.right = centreX + armSize + 1;
+	rcCircle.bottom = centreY + armSize + 1;
+	surface->Ellipse(rcCircle, back, fore);
+}
+
+static void DrawPlus(Surface *surface, int centreX, int centreY, int armSize, Colour fore) {
+	PRectangle rcV(centreX, centreY - armSize + 2, centreX + 1, centreY + armSize - 2 + 1);
+	surface->FillRectangle(rcV, fore);
+	PRectangle rcH(centreX - armSize + 2, centreY, centreX + armSize - 2 + 1, centreY+1);
+	surface->FillRectangle(rcH, fore);
+}
+
+static void DrawMinus(Surface *surface, int centreX, int centreY, int armSize, Colour fore) {
+	PRectangle rcH(centreX - armSize + 2, centreY, centreX + armSize - 2 + 1, centreY+1);
+	surface->FillRectangle(rcH, fore);
+}
+
+void LineMarker::Draw(Surface *surface, PRectangle &rcWhole) {
+	// Restrict most shapes a bit
+	PRectangle rc = rcWhole;
+	rc.top++;
+	rc.bottom--;
 	int minDim = Platform::Minimum(rc.Width(), rc.Height());
 	minDim--;	// Ensure does not go beyond edge
 	int centreX = (rc.right + rc.left) / 2;
 	int centreY = (rc.bottom + rc.top) / 2;
 	int dimOn2 = minDim / 2;
 	int dimOn4 = minDim / 4;
+	int blobSize = dimOn2-1;
+	int armSize = dimOn2-2;
 	if (rc.Width() > (rc.Height() * 2)) {
 		// Wide column is line number so move to left to try to avoid overlapping number
 		centreX = rc.left + dimOn2 + 1;
@@ -50,7 +88,6 @@ void LineMarker::Draw(Surface *surface, PRectangle &rc) {
                  		fore.allocated, back.allocated);
 
 	} else if (markType == SC_MARK_PLUS) {
-		int armSize = dimOn2-2;
 		Point pts[] = {
     		Point(centreX - armSize, centreY - 1),
     		Point(centreX - 1, centreY - 1),
@@ -69,7 +106,6 @@ void LineMarker::Draw(Surface *surface, PRectangle &rc) {
                  		fore.allocated, back.allocated);
 
 	} else if (markType == SC_MARK_MINUS) {
-		int armSize = dimOn2-2;
 		Point pts[] = {
     		Point(centreX - armSize, centreY - 1),
     		Point(centreX + armSize, centreY -1),
@@ -86,8 +122,114 @@ void LineMarker::Draw(Surface *surface, PRectangle &rc) {
 		rcSmall.right = rc.right - 1;
 		rcSmall.bottom = rc.bottom - 2;
 		surface->RectangleDraw(rcSmall, fore.allocated, back.allocated);
+		
 	} else if (markType == SC_MARK_EMPTY) {
 		// An invisible marker so don't draw anything
+		
+	} else if (markType == SC_MARK_VLINE) {
+		surface->PenColour(back.allocated);
+		surface->MoveTo(centreX, rcWhole.top);
+		surface->LineTo(centreX, rcWhole.bottom);
+		
+	} else if (markType == SC_MARK_LCORNER) {
+		surface->PenColour(back.allocated);
+		surface->MoveTo(centreX, rcWhole.top);
+		surface->LineTo(centreX, rc.top + dimOn2);
+		surface->LineTo(rc.right - 2, rc.top + dimOn2);
+		
+	} else if (markType == SC_MARK_TCORNER) {
+		surface->PenColour(back.allocated);
+		surface->MoveTo(centreX, rcWhole.top);
+		surface->LineTo(centreX, rcWhole.bottom);
+		surface->MoveTo(centreX, rc.top + dimOn2);
+		surface->LineTo(rc.right - 2, rc.top + dimOn2);
+		
+	} else if (markType == SC_MARK_LCORNERCURVE) {
+		surface->PenColour(back.allocated);
+		surface->MoveTo(centreX, rcWhole.top);
+		surface->LineTo(centreX, rc.top + dimOn2-3);
+		surface->LineTo(centreX+3, rc.top + dimOn2);
+		surface->LineTo(rc.right - 1, rc.top + dimOn2);
+		
+	} else if (markType == SC_MARK_TCORNERCURVE) {
+		surface->PenColour(back.allocated);
+		surface->MoveTo(centreX, rcWhole.top);
+		surface->LineTo(centreX, rcWhole.bottom);
+		
+		surface->MoveTo(centreX, rc.top + dimOn2-3);
+		surface->LineTo(centreX+3, rc.top + dimOn2);
+		surface->LineTo(rc.right - 1, rc.top + dimOn2);
+		
+	} else if (markType == SC_MARK_BOXPLUS) {
+		surface->PenColour(back.allocated);
+		DrawBox(surface, centreX, centreY, blobSize, fore.allocated, back.allocated);
+		DrawPlus(surface, centreX, centreY, blobSize, back.allocated);
+		
+	} else if (markType == SC_MARK_BOXPLUSCONNECTED) {
+		surface->PenColour(back.allocated);
+		DrawBox(surface, centreX, centreY, blobSize, fore.allocated, back.allocated);
+		DrawPlus(surface, centreX, centreY, blobSize, back.allocated);
+		
+		surface->MoveTo(centreX, centreY + blobSize);
+		surface->LineTo(centreX, rcWhole.bottom);
+		
+		surface->MoveTo(centreX, rcWhole.top);
+		surface->LineTo(centreX, centreY - blobSize);
+		
+	} else if (markType == SC_MARK_BOXMINUS) {
+		surface->PenColour(back.allocated);
+		DrawBox(surface, centreX, centreY, blobSize, fore.allocated, back.allocated);
+		DrawMinus(surface, centreX, centreY, blobSize, back.allocated);
+		
+		surface->MoveTo(centreX, centreY + blobSize);
+		surface->LineTo(centreX, rcWhole.bottom);
+		
+	} else if (markType == SC_MARK_BOXMINUSCONNECTED) {
+		surface->PenColour(back.allocated);
+		DrawBox(surface, centreX, centreY, blobSize, fore.allocated, back.allocated);
+		DrawMinus(surface, centreX, centreY, blobSize, back.allocated);
+		
+		surface->MoveTo(centreX, centreY + blobSize);
+		surface->LineTo(centreX, rcWhole.bottom);
+		
+		surface->MoveTo(centreX, rcWhole.top);
+		surface->LineTo(centreX, centreY - blobSize);
+		
+	} else if (markType == SC_MARK_CIRCLEPLUS) {
+		DrawCircle(surface, centreX, centreY, blobSize, fore.allocated, back.allocated);
+		surface->PenColour(back.allocated);
+		DrawPlus(surface, centreX, centreY, blobSize, back.allocated);
+		
+	} else if (markType == SC_MARK_CIRCLEPLUSCONNECTED) {
+		DrawCircle(surface, centreX, centreY, blobSize, fore.allocated, back.allocated);
+		surface->PenColour(back.allocated);
+		DrawPlus(surface, centreX, centreY, blobSize, back.allocated);
+		
+		surface->MoveTo(centreX, centreY + blobSize);
+		surface->LineTo(centreX, rcWhole.bottom);
+		
+		surface->MoveTo(centreX, rcWhole.top);
+		surface->LineTo(centreX, centreY - blobSize);
+		
+	} else if (markType == SC_MARK_CIRCLEMINUS) {
+		DrawCircle(surface, centreX, centreY, blobSize, fore.allocated, back.allocated);
+		surface->PenColour(back.allocated);
+		DrawMinus(surface, centreX, centreY, blobSize, back.allocated);
+		
+		surface->MoveTo(centreX, centreY + blobSize);
+		surface->LineTo(centreX, rcWhole.bottom);
+		
+	} else if (markType == SC_MARK_CIRCLEMINUSCONNECTED) {
+		DrawCircle(surface, centreX, centreY, blobSize, fore.allocated, back.allocated);
+		surface->PenColour(back.allocated);
+		DrawMinus(surface, centreX, centreY, blobSize, back.allocated);
+		
+		surface->MoveTo(centreX, centreY + blobSize);
+		surface->LineTo(centreX, rcWhole.bottom);
+		
+		surface->MoveTo(centreX, rcWhole.top);
+		surface->LineTo(centreX, centreY - blobSize);
+		
 	} else { // SC_MARK_SHORTARROW
 		Point pts[] = {
 			Point(centreX, centreY + dimOn2),
diff --git a/contrib/src/stc/scintilla/src/LineMarker.h b/contrib/src/stc/scintilla/src/LineMarker.h
index f22241bb19..ee0f36c256 100644
--- a/contrib/src/stc/scintilla/src/LineMarker.h
+++ b/contrib/src/stc/scintilla/src/LineMarker.h
@@ -1,11 +1,15 @@
 // Scintilla source code edit control
-// LineMarker.h - defines the look of a line marker in the margin 
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file LineMarker.h
+ ** Defines the look of a line marker in the margin .
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef LINEMARKER_H
 #define LINEMARKER_H
 
+/**
+ */
 class LineMarker {
 public:
 	int markType;
diff --git a/contrib/src/stc/scintilla/src/PosRegExp.cxx b/contrib/src/stc/scintilla/src/PosRegExp.cxx
deleted file mode 100644
index ea719b7c28..0000000000
--- a/contrib/src/stc/scintilla/src/PosRegExp.cxx
+++ /dev/null
@@ -1,1181 +0,0 @@
-#include <string.h>
-#include <stdio.h>
-#include <ctype.h>
-#include <malloc.h>
-
-#include "PosRegExp.h"
-
-//Up: /[A-Z \x80-\x9f \xf0 ]/x
-//Lo: /[a-z \xa0-\xaf \xe0-\xef \xf1 ]/x
-//Wd: /[\d _ A-Z a-z \xa0-\xaf \xe0-\xf1 \x80-\x9f]/x
-//*   // Dos866
-SCharData UCData  = {0x0, 0x0, 0x7fffffe, 0x0, 0xffffffff, 0x0, 0x0, 0x10000},
-                     LCData  = {0x0, 0x0, 0x0, 0x7fffffe, 0x0, 0xffff, 0x0, 0x2ffff},
-                     WdData  = {0x0, 0x3ff0000, 0x87fffffe, 0x7fffffe, 0xffffffff, 0xffff, 0x0, 0x3ffff},
-                     DigData = {0x0, 0x3ff0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
-/*/   // cp1251
-SCharData UCData  = {0x0, 0x0, 0x7fffffe, 0x0, 0x0, 0x0, 0xffffffff, 0x0},
-          LCData  = {0x0, 0x0, 0x0, 0x7fffffe, 0x0, 0x0, 0x0, 0xffffffff},
-          WdData  = {0x0, 0x3ff0000, 0x87fffffe, 0x7fffffe, 0x0, 0x0, 0xffffffff, 0xffffffff},
-          DigData = {0x0, 0x3ff0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
-//*/
-
-///////////////////////////////////////////////
-
-int GetNumber(int *str,int s,int e) {
-	int r = 1, num = 0;
-	if (e < s) return -1;
-	for(int i = e-1; i >= s; i--) {
-		if (str[i] > '9' || str[i] < '0') return -1;
-		num += (str[i] - 0x30)*r;
-		r *= 10;
-	};
-	return num;
-	/*
-	char tmp[20];
-	double Res;
-	  if (e == s) return -1;
-	  for (int i = s;i < e;i++)
-	    tmp[i-s] = (char)Str[i];
-	  tmp[e-s] = 0;
-	  GetNumber(tmp,&Res);
-	  return (int)Res;
-	*/
-};
-
-bool IsDigit(char Symb) {
-	return DigData.GetBit(Symb);
-};
-bool IsWord(char Symb) {
-	return WdData.GetBit(Symb);
-};
-bool IsUpperCase(char Symb) {
-	return UCData.GetBit(Symb);
-};
-bool IsLowerCase(char Symb) {
-	return LCData.GetBit(Symb);
-};
-char LowCase(char Chr) {
-	if (UCData.GetBit(Chr))
-		return Chr+0x20;
-	return Chr;
-};
-
-///////////////////////////////////////////////
-
-SRegInfo::SRegInfo() {
-	Next = Parent = 0;
-	un.Param = 0;
-	Op = ReEmpty;
-};
-SRegInfo::~SRegInfo() {
-	if (Next) delete Next;
-	if (un.Param)
-		switch(Op) {
-		case ReEnum:
-		case ReNEnum:
-			delete un.ChrClass;
-			break;
-		default:
-			if (Op > ReBlockOps && Op < ReSymbolOps || Op == ReBrackets)
-				delete un.Param;
-			break;
-		};
-};
-
-///////////////////////////////////////////////
-
-void SCharData::SetBit(unsigned char Bit) {
-	int p = Bit/8;
-	CArr[p] |= (1 << Bit%8);
-};
-void SCharData::ClearBit(unsigned char Bit) {
-	int p = Bit/8;
-	CArr[p] &= ~(1 << Bit%8);
-};
-bool SCharData::GetBit(unsigned char Bit) {
-	int p = (unsigned char)Bit/8;
-	return (CArr[p] & (1 << Bit%8))!=0;
-};
-
-/////////////////////////////////////////////////////////////////
-//////////////////////  RegExp Class  ///////////////////////////
-/////////////////////////////////////////////////////////////////
-
-PosRegExp::PosRegExp() {
-	Info = 0;
-	Exprn = 0;
-	NoMoves = false;
-	Error = true;
-	FirstChar = 0;
-	CurMatch = 0;
-};
-PosRegExp::~PosRegExp() {
-	if (Info) delete Info;
-};
-
-bool PosRegExp::SetExpr(const char *Expr) {
-	if (!this) return false;
-	Error = true;
-	CurMatch = 0;
-	if (SetExprLow(Expr)) Error = false;
-	return !Error;
-};
-bool PosRegExp::isok() {
-	return !Error;
-};
-
-
-bool PosRegExp::SetExprLow(const char *Expr) {
-	int Len = strlen(Expr);
-	bool  Ok = false;
-	int i,j,s = 0,pos,tmp;
-	int EnterBr = 0,EnterGr = 0,EnterFg = 0;
-
-	if (Info) delete Info;
-	Info = new SRegInfo;
-	Exprn = new int[Len];
-
-	NoCase = false;
-	Extend = false;
-	if (Expr[0] == '/') s++;
-	else return false;
-
-	for (i = Len; i > 0 && !Ok;i--)
-		if (Expr[i] == '/') {
-			Len = i-s;
-			Ok = true;
-			for (int j = i+1; Expr[j]; j++) {
-				if (Expr[j] == 'i') NoCase = true;
-				if (Expr[j] == 'x') Extend = true;
-			};
-		};
-	if (!Ok) return false;
-
-	////////////////////////////////
-	for (j = 0,pos = 0; j < Len; j++,pos++) {
-		if (Extend && Expr[j+s] == ' ') {
-			pos--;
-			continue;
-		};
-
-		Exprn[pos] = (int)(unsigned char)Expr[j+s];
-
-		if (Expr[j+s] == BackSlash) {
-			switch (Expr[j+s+1]) {
-			case 'd':
-				Exprn[pos] = ReDigit;
-				break;
-			case 'D':
-				Exprn[pos] = ReNDigit;
-				break;
-			case 'w':
-				Exprn[pos] = ReWordSymb;
-				break;
-			case 'W':
-				Exprn[pos] = ReNWordSymb;
-				break;
-			case 's':
-				Exprn[pos] = ReWSpace;
-				break;
-			case 'S':
-				Exprn[pos] = ReNWSpace;
-				break;
-			case 'u':
-				Exprn[pos] = ReUCase;
-				break;
-			case 'l':
-				Exprn[pos] = ReNUCase;
-				break;
-			case 't':
-				Exprn[pos] = '\t';
-				break;
-			case 'n':
-				Exprn[pos] = '\n';
-				break;
-			case 'r':
-				Exprn[pos] = '\r';
-				break;
-			case 'b':
-				Exprn[pos] = ReWBound;
-				break;
-			case 'B':
-				Exprn[pos] = ReNWBound;
-				break;
-			case 'c':
-				Exprn[pos] = RePreNW;
-				break;
-			case 'm':
-				Exprn[pos] = ReStart;
-				break;
-			case 'M':
-				Exprn[pos] = ReEnd;
-				break;
-			case 'x':
-				tmp = toupper(Expr[j+s+2])-0x30;
-				tmp = (tmp>9?tmp-7:tmp)<<4;
-				tmp += (toupper(Expr[j+s+3])-0x30)>9?toupper(Expr[j+s+3])-0x37:(toupper(Expr[j+s+3])-0x30);
-				Exprn[pos] = tmp;
-				j+=2;
-				break;
-			case 'y':
-				tmp = Expr[j+s+2] - 0x30;
-				if (tmp >= 0 && tmp <= 9) {
-					if (tmp == 1) {
-						tmp = 10 + Expr[j+s+3] - 0x30;
-						if (tmp >= 10 && tmp <= 19) j++;
-						else tmp = 1;
-					};
-					Exprn[pos] = ReBkTrace + tmp;
-					j++;
-					break;
-				};
-			default:
-				tmp = Expr[j+s+1] - 0x30;
-				if (tmp >= 0 && tmp <= 9) {
-					if (tmp == 1) {
-						tmp = 10 + Expr[j+s+2] - 0x30;
-						if (tmp >= 10 && tmp <= 19) j++;
-						else tmp = 1;
-					};
-					Exprn[pos] = ReBkBrack + tmp;
-					break;
-				} else
-					Exprn[pos] = Expr[j+s+1];
-				break;
-			};
-			j++;
-			continue;
-		};
-		if (Expr[j+s] == ']') {
-			Exprn[pos] = ReEnumE;
-			if (EnterFg || !EnterGr) return false;
-			EnterGr--;
-		};
-		if (Expr[j+s] == '-' && EnterGr) Exprn[pos] = ReFrToEnum;
-
-		if (EnterGr) continue;
-
-		if (Expr[j+s] == '[' && Expr[j+s+1] == '^') {
-			Exprn[pos] = ReNEnumS;
-			if (EnterFg) return false;
-			EnterGr++;
-			j++;
-			continue;
-		};
-		if (Expr[j+s] == '*' && Expr[j+s+1] == '?') {
-			Exprn[pos] = ReNGMul;
-			j++;
-			continue;
-		};
-		if (Expr[j+s] == '+' && Expr[j+s+1] == '?') {
-			Exprn[pos] = ReNGPlus;
-			j++;
-			continue;
-		};
-		if (Expr[j+s] == '?' && Expr[j+s+1] == '?') {
-			Exprn[pos] = ReNGQuest;
-			j++;
-			continue;
-		};
-		if (Expr[j+s] == '?' && Expr[j+s+1] == '#' &&
-		        Expr[j+s+2]>='0' && Expr[j+s+2]<='9') {
-			Exprn[pos] = ReBehind+Expr[j+s+2]-0x30;
-			j+=2;
-			continue;
-		};
-		if (Expr[j+s] == '?' && Expr[j+s+1] == '~' &&
-		        Expr[j+s+2]>='0' && Expr[j+s+2]<='9') {
-			Exprn[pos] = ReNBehind+Expr[j+s+2]-0x30;
-			j+=2;
-			continue;
-		};
-		if (Expr[j+s] == '?' && Expr[j+s+1] == '=') {
-			Exprn[pos] = ReAhead;
-			j++;
-			continue;
-		};
-		if (Expr[j+s] == '?' && Expr[j+s+1] == '!') {
-			Exprn[pos] = ReNAhead;
-			j++;
-			continue;
-		};
-
-		if (Expr[j+s] == '(') {
-			Exprn[pos] = ReLBrack;
-			if (EnterFg) return false;
-			EnterBr++;
-		};
-		if (Expr[j+s] == ')') {
-			Exprn[pos] = ReRBrack;
-			if (!EnterBr || EnterFg) return false;
-			EnterBr--;
-		};
-		if (Expr[j+s] == '[') {
-			Exprn[pos] = ReEnumS;
-			if (EnterFg) return false;
-			EnterGr++;
-		};
-		if (Expr[j+s] == '{') {
-			Exprn[pos] = ReRangeS;
-			if (EnterFg) return false;
-			EnterFg++;
-		};
-		if (Expr[j+s] == '}' && Expr[j+s+1] == '?') {
-			Exprn[pos] = ReNGRangeE;
-			if (!EnterFg) return false;
-			EnterFg--;
-			j++;
-			continue;
-		};
-		if (Expr[j+s] == '}') {
-			Exprn[pos] = ReRangeE;
-			if (!EnterFg) return false;
-			EnterFg--;
-		};
-
-		if (Expr[j+s] == '^') Exprn[pos] = ReSoL;
-		if (Expr[j+s] == '$') Exprn[pos] = ReEoL;
-		if (Expr[j+s] == '.') Exprn[pos] = ReAnyChr;
-		if (Expr[j+s] == '*') Exprn[pos] = ReMul;
-		if (Expr[j+s] == '+') Exprn[pos] = RePlus;
-		if (Expr[j+s] == '?') Exprn[pos] = ReQuest;
-		if (Expr[j+s] == '|') Exprn[pos] = ReOr;
-	};
-	if (EnterGr || EnterBr || EnterFg) return false;
-
-	Info->Op = ReBrackets;
-	Info->un.Param = new SRegInfo;
-	Info->s = CurMatch++;
-
-	if (!SetStructs(Info->un.Param,0,pos)) return false;
-	Optimize();
-	delete Exprn;
-	return true;
-};
-
-void PosRegExp::Optimize() {
-	PRegInfo Next = Info;
-	FirstChar = 0;
-	while(Next) {
-		if (Next->Op == ReBrackets || Next->Op == RePlus  || Next->Op == ReNGPlus) {
-			Next = Next->un.Param;
-			continue;
-		};
-		if (Next->Op == ReSymb) {
-			if (Next->un.Symb & 0xFF00 &&  Next->un.Symb != ReSoL && Next->un.Symb != ReWBound)
-				break;
-			FirstChar = Next->un.Symb;
-			break;
-		};
-		break;
-	};
-};
-
-bool PosRegExp::SetStructs(PRegInfo &re,int start,int end) {
-	PRegInfo Next,Prev,Prev2;
-	int comma,st,en,ng,i, j,k;
-	int EnterBr;
-	bool Add;
-
-	if (end - start < 0) return false;
-	Next = re;
-	for (i = start; i < end; i++) {
-		Add = false;
-		// Ops
-		if (Exprn[i] > ReBlockOps && Exprn[i] < ReSymbolOps) {
-			Next->un.Param = 0;
-			Next->Op = (EOps)Exprn[i];
-			Add = true;
-		};
-		// {n,m}
-		if (Exprn[i] == ReRangeS) {
-			st = i;
-			en = -1;
-			comma = -1;
-			ng = 0;
-			for (j = i;j < end;j++) {
-				if (Exprn[j] == ReNGRangeE) {
-					en = j;
-					ng = 1;
-					break;
-				};
-				if (Exprn[j] == ReRangeE) {
-					en = j;
-					break;
-				};
-				if ((char)Exprn[j] == ',')
-					comma = j;
-			};
-			if (en == -1) return false;
-			if (comma == -1) comma = en;
-			Next->s = (char)GetNumber(Exprn,st+1,comma);
-			if (comma != en)
-				Next->e = (char)GetNumber(Exprn,comma+1,en);
-			else
-				Next->e = Next->s;
-			Next->un.Param = 0;
-			Next->Op = ng?ReNGRangeNM:ReRangeNM;
-			if (en-comma == 1) {
-				Next->e = -1;
-				Next->Op = ng?ReNGRangeN:ReRangeN;
-			};
-			i=j;
-			Add = true;
-		};
-		// [] [^]
-		if (Exprn[i] == ReEnumS || Exprn[i] == ReNEnumS) {
-			Next->Op = (Exprn[i] == ReEnumS)?ReEnum:ReNEnum;
-			for (j = i+1;j < end;j++) {
-				if (Exprn[j] == ReEnumE)
-					break;
-			};
-			if (j == end) return false;
-			Next->un.ChrClass = new SCharData;
-			memset(Next->un.ChrClass, 0, 32);
-			for (j = i+1;Exprn[j] != ReEnumE;j++) {
-				if (Exprn[j+1] == ReFrToEnum) {
-					for (i = (Exprn[j]&0xFF); i < (Exprn[j+2]&0xFF);i++)
-						Next->un.ChrClass->SetBit(i&0xFF);
-					j++;
-					continue;
-				};
-				switch(Exprn[j]) {
-				case ReDigit:
-					for (k = 0x30;k < 0x40;k++)
-						if (IsDigit((char)k))
-							Next->un.ChrClass->SetBit(k);
-					break;
-				case ReNDigit:
-					for (k = 0x30;k < 0x40;k++)
-						if (!IsDigit((char)k))
-							Next->un.ChrClass->SetBit(k);
-					Next->un.ChrClass->ClearBit(0x0a);
-					Next->un.ChrClass->ClearBit(0x0d);
-					break;
-				case ReWordSymb:
-					for (k = 0;k < 256;k++)
-						if (IsWord((char)k))
-							Next->un.ChrClass->SetBit(k);
-					break;
-				case ReNWordSymb:
-					for (k = 0;k < 256;k++)
-						if (!IsWord((char)k))
-							Next->un.ChrClass->SetBit(k);
-					Next->un.ChrClass->ClearBit(0x0a);
-					Next->un.ChrClass->ClearBit(0x0d);
-					break;
-				case ReWSpace:
-					Next->un.ChrClass->SetBit(0x20);
-					Next->un.ChrClass->SetBit(0x09);
-					break;
-				case ReNWSpace:
-					memset(Next->un.ChrClass->IArr, 0xFF, 32);
-					Next->un.ChrClass->ClearBit(0x20);
-					Next->un.ChrClass->ClearBit(0x09);
-					Next->un.ChrClass->ClearBit(0x0a);
-					Next->un.ChrClass->ClearBit(0x0d);
-					break;
-				default:
-					if (!(Exprn[j]&0xFF00))
-						Next->un.ChrClass->SetBit(Exprn[j]&0xFF);
-					break;
-				};
-			};
-			Add = true;
-			i=j;
-		};
-		// ( ... )
-		if (Exprn[i] == ReLBrack) {
-			EnterBr = 1;
-			for (j = i+1;j < end;j++) {
-				if (Exprn[j] == ReLBrack) EnterBr++;
-				if (Exprn[j] == ReRBrack) EnterBr--;
-				if (!EnterBr) break;
-			};
-			if (EnterBr) return false;
-			Next->Op = ReBrackets;
-			Next->un.Param = new SRegInfo;
-			Next->un.Param->Parent = Next;
-			Next->s = CurMatch++;
-			if (CurMatch > MatchesNum) CurMatch = MatchesNum;
-			if (!SetStructs(Next->un.Param,i+1,j)) return false;
-			Add = true;
-			i=j;
-		};
-		if ((Exprn[i]&0xFF00) == ReBkTrace) {
-			Next->Op = ReBkTrace;
-			Next->un.Symb = Exprn[i]&0xFF;
-			Add = true;
-		};
-		if ((Exprn[i]&0xFF00) == ReBkBrack) {
-			Next->Op = ReBkBrack;
-			Next->un.Symb = Exprn[i]&0xFF;
-			Add = true;
-		};
-		if ((Exprn[i]&0xFF00) == ReBehind) {
-			Next->Op = ReBehind;
-			Next->s = Exprn[i]&0xFF;
-			Add = true;
-		};
-		if ((Exprn[i]&0xFF00) == ReNBehind) {
-			Next->Op = ReNBehind;
-			Next->s = Exprn[i]&0xFF;
-			Add = true;
-		};
-		// Chars
-		if (Exprn[i] >= ReAnyChr && Exprn[i] < ReTemp || Exprn[i] < 0x100) {
-			Next->Op = ReSymb;
-			Next->un.Symb = Exprn[i];
-			Add = true;
-		};
-		// Next
-		if (Add && i != end-1) {
-			Next->Next = new SRegInfo;
-			Next->Next->Parent = Next->Parent;
-			Next = Next->Next;
-		};
-	};
-	Next = re;
-	Prev = Prev2 = 0;
-	while(Next) {
-		if (Next->Op > ReBlockOps && Next->Op < ReSymbolOps) {
-			if (!Prev) return false;
-			if (!Prev2) re = Next;
-			else Prev2->Next = Next;
-			//if (Prev->Op > ReBlockOps && Prev->Op < ReSymbolOps) return false;
-			Prev->Parent = Next;
-			Prev->Next = 0;
-			Next->un.Param = Prev;
-			Prev = Prev2;
-		};
-		Prev2 = Prev;
-		Prev = Next;
-		Next = Next->Next;
-	};
-
-	return true;
-};
-
-/////////////////////////////////////////////////////////////////
-/////////////////////////  Parsing  /////////////////////////////
-/////////////////////////////////////////////////////////////////
-
-bool PosRegExp::CheckSymb(int Symb,bool Inc) {
-	bool Res;
-	char ch;
-	switch(Symb) {
-	case ReAnyChr:
-		if (posParse >= posEnd) return false;
-		ch = CharAt(posParse,param);
-		Res = ch != '\r' && ch != '\n';
-		if (Res && Inc) posParse++;
-		return Res;
-	case ReSoL:
-		if (posStart == posParse)
-			return true;
-		ch = CharAt(posParse-1,param);
-		return ch == '\n' || ch == '\r';
-	case ReEoL:
-		if (posEnd == posParse)
-			return true;
-		ch = CharAt(posParse,param);
-		return ch == '\n' || ch == '\r';
-	case ReDigit:
-		if (posParse >= posEnd) return false;
-		ch = CharAt(posParse,param);
-		Res = (ch >= 0x30 && ch <= 0x39);
-		if (Res && Inc) posParse++;
-		return Res;
-	case ReNDigit:
-		if (posParse >= posEnd) return false;
-		ch = CharAt(posParse,param);
-		Res = !(ch >= 0x30 && ch <= 0x39) && ch != '\r' && ch != '\n';
-		if (Res && Inc) posParse++;
-		return Res;
-	case ReWordSymb:
-		if (posParse >= posEnd) return false;
-		Res = IsWord(CharAt(posParse,param));
-		if (Res && Inc) posParse++;
-		return Res;
-	case ReNWordSymb:
-		if (posParse >= posEnd) return false;
-		ch = CharAt(posParse,param);
-		Res = !IsWord(ch) && ch != '\r' && ch != '\n';
-		if (Res && Inc) posParse++;
-		return Res;
-	case ReWSpace:
-		if (posParse >= posEnd) return false;
-		ch = CharAt(posParse,param);
-		Res = (ch == 0x20 || ch == '\t');
-		if (Res && Inc) posParse++;
-		return Res;
-	case ReNWSpace:
-		if (posParse >= posEnd) return false;
-		ch = CharAt(posParse,param);
-		Res = !(ch == 0x20 || ch == '\t') && ch != '\r' && ch != '\n';
-		if (Res && Inc) posParse++;
-		return Res;
-	case ReUCase:
-		if (posParse >= posEnd) return false;
-		Res = IsUpperCase(CharAt(posParse,param));
-		if (Res && Inc) posParse++;
-		return Res;
-	case ReNUCase:
-		if (posParse >= posEnd) return false;
-		Res = IsLowerCase(CharAt(posParse,param));
-		if (Res && Inc) posParse++;
-		return Res;
-	case ReWBound:
-		if (posParse >= posEnd) return true;
-		ch = CharAt(posParse,param);
-		return IsWord(CharAt(posParse,param)) && (posParse == posStart || !IsWord(CharAt(posParse-1,param)));
-	case ReNWBound:
-		if (posParse >= posEnd) return true;
-		return !IsWord(CharAt(posParse,param)) && IsWord(CharAt(posParse-1,param));
-	case RePreNW:
-		if (posParse >= posEnd) return true;
-		return (posParse == posStart || !IsWord(CharAt(posParse-1,param)));
-	case ReStart:
-		Matches->s[0] = (posParse-posStart);
-		return true;
-	case ReEnd:
-		Matches->e[0] = (posParse-posStart);
-		return true;
-	default:
-		if ((Symb & 0xFF00) || posParse >= posEnd) return false;
-		if (NoCase) {
-			if (LowCase(CharAt(posParse,param)) != LowCase((char)Symb&0xFF)) return false;
-		} else
-			if (CharAt(posParse,param) != (char)(Symb&0xFF)) return false;
-		if (Inc) posParse++;
-		return true;
-	};
-}
-
-bool PosRegExp::LowParseRe(PRegInfo &Next) {
-	PRegInfo OrNext;
-	int i,match,sv;
-	int posStr;
-
-	switch(Next->Op) {
-	case ReSymb:
-		if (!CheckSymb(Next->un.Symb,true)) return false;
-		break;
-	case ReEmpty:
-		break;
-	case ReBkTrace:
-		if (!posBkStr | !BkTrace) return false;
-		sv = Next->un.Symb;
-		posStr = posParse;
-		for (i = BkTrace->s[sv]; i < BkTrace->e[sv]; i++) {
-			if (CharAt(posStr,param) != CharAt(posBkStr+i,param) || posEnd == posStr) return false;
-			posStr++;
-		};
-		posParse = posStr;
-		break;
-	case ReBkBrack:
-		sv = Next->un.Symb;
-		posStr = posParse;
-		if (Matches->s[sv] == -1 || Matches->e[sv] == -1) return false;
-		for (i = Matches->s[sv]; i < Matches->e[sv]; i++) {
-			if (CharAt(posStr,param) != CharAt(posStart+i,param) || posEnd == posStr) return false;
-			posStr++;
-		};
-		posParse = posStr;
-		break;
-	case ReBehind:
-		sv = Next->s;
-		posStr = posParse;
-		posParse -= sv;
-		if (!LowParse(Next->un.Param)) return false;
-		posParse = posStr;
-		break;
-	case ReNBehind:
-		sv = Next->s;
-		posStr = posParse;
-		posParse -= sv;
-		if (LowParse(Next->un.Param)) return false;
-		posParse = posStr;
-		break;
-	case ReAhead:
-		posStr = posParse;
-		if (!LowParse(Next->un.Param)) return false;
-		posParse = posStr;
-		break;
-	case ReNAhead:
-		posStr = posParse;
-		if (LowParse(Next->un.Param)) return false;
-		posParse = posStr;
-		break;
-	case ReEnum:
-		if (posParse >= posEnd) return false;
-		if (!Next->un.ChrClass->GetBit(CharAt(posParse,param))) return false;
-		posParse++;
-		break;
-	case ReNEnum:
-		if (posParse >= posEnd) return false;
-		if (Next->un.ChrClass->GetBit(CharAt(posParse,param))) return false;
-		posParse++;
-		break;
-	case ReBrackets:
-		match = Next->s;
-		sv = posParse-posStart;
-		posStr = posParse;
-		if (LowParse(Next->un.Param)) {
-			if (match || (Matches->s[match] == -1))
-				Matches->s[match] = sv;
-			if (match || (Matches->e[match] == -1))
-				Matches->e[match] = posParse-posStart;
-			return true;
-		};
-		posParse = posStr;
-		return false;
-	case ReMul:
-		posStr = posParse;
-		while (LowParse(Next->un.Param));
-		while(!LowCheckNext(Next) && posStr < posParse) posParse--;
-		break;
-	case ReNGMul:
-		do {
-			if (LowCheckNext(Next)) break;
-		} while (LowParse(Next->un.Param));
-		break;
-	case RePlus:
-		posStr = posParse;
-		match = false;
-		while (LowParse(Next->un.Param))
-			match = true;
-		if (!match) return false;
-		while(!LowCheckNext(Next) && posStr < posParse) posParse--;
-		break;
-	case ReNGPlus:
-		if (!LowParse(Next->un.Param)) return false;
-		do {
-			if (LowCheckNext(Next)) break;
-		} while (LowParse(Next->un.Param));
-		break;
-	case ReQuest:
-		LowParse(Next->un.Param);
-		break;
-	case ReNGQuest:
-		if (LowCheckNext(Next)) break;
-		if (!LowParse(Next->un.Param)) return false;
-		break;
-	case ReOr:
-		OrNext = Next;
-		// posStr = posParse;
-		if (LowParse(Next->un.Param)) {
-			while (OrNext && OrNext->Op == ReOr)
-				OrNext = OrNext->Next;
-			/*if (!LowCheckNext(OrNext)){
-			  posParse = posStr;
-			  OrNext = Next;
-		};*/
-		};
-		Next = OrNext;
-		break;
-	case ReRangeN:
-		posStr = posParse;
-		i = 0;
-		while (LowParse(Next->un.Param)) i++; // ???
-		do {
-			if (i < Next->s) {
-				posParse = posStr;
-				return false;
-			};
-			i--;
-		} while(!LowCheckNext(Next) && posStr < posParse--);
-		break;
-	case ReNGRangeN:
-		posStr = posParse;
-		i = 0;
-		while (LowParse(Next->un.Param)) {
-			i++;
-			if (i >= Next->s && LowCheckNext(Next)) // ???
-				break;
-		};
-		if (i < Next->s) {
-			posParse = posStr;
-			return false;
-		};
-		break;
-	case ReRangeNM:
-		posStr = posParse;
-		i = 0;
-		while (i < Next->s && LowParse(Next->un.Param)) // ???
-			i++;
-		if (i < Next->s) {
-			posParse = posStr;
-			return false;
-		};
-		while (i < Next->e && LowParse(Next->un.Param)) // ???
-			i++;
-
-		while(!LowCheckNext(Next)) {
-			i--;
-			posParse--;
-			if (i < Next->s) {
-				posParse = posStr;
-				return false;
-			};
-		};
-		break;
-	case ReNGRangeNM:
-		posStr = posParse;
-		i = 0;
-		while (i < Next->s && LowParse(Next->un.Param)) // ???
-			i++;
-		if (i < Next->s) {
-			posParse = posStr;
-			return false;
-		};
-		while(!LowCheckNext(Next)) {
-			i++;
-			if (!LowParse(Next->un.Param) || i > Next->e) { // ???
-				posParse = posStr;
-				return false;
-			};
-		};
-		break;
-	};
-	return true;
-};
-
-bool PosRegExp::LowCheckNext(PRegInfo Re) {
-	PRegInfo Next;
-	int tmp = posParse;
-	Next = Re;
-	do {
-		if (Next && Next->Op == ReOr)
-			while (Next && Next->Op == ReOr)
-				Next = Next->Next;
-		if (Next->Next && !LowParse(Next->Next)) {
-			posParse = tmp;
-			Ok = false;
-			return false;
-		};
-		Next = Next->Parent;
-	} while(Next);
-	posParse = tmp;
-	if (Ok != false) Ok = true;
-	return true;
-};
-
-bool PosRegExp::LowParse(PRegInfo Re) {
-	while(Re && posParse <= posEnd) {
-		if (!LowParseRe(Re)) return false;
-		if (Re) Re = Re->Next;
-	};
-	return true;
-};
-
-bool PosRegExp::QuickCheck() {
-	if (!NoMoves || !FirstChar)
-		return true;
-	switch(FirstChar) {
-	case ReSoL:
-		if (posParse != posStart) return false;
-		return true;
-	case ReWBound:
-		return IsWord(CharAt(posParse,param)) && (posParse == posStart || !IsWord(CharAt(posParse-1,param)));
-	default:
-		if (NoCase && LowCase(CharAt(posParse,param)) != LowCase(FirstChar)) return false;
-		if (!NoCase && CharAt(posParse,param) != (char)FirstChar) return false;
-		return true;
-	};
-};
-
-bool PosRegExp::ParseRe(int posStr) {
-	if (Error) return false;
-
-	posParse = posStr;
-	if (!QuickCheck()) return false;
-
-	for (int i = 0; i < MatchesNum; i++)
-		Matches->s[i] = Matches->e[i] = -1;
-	Matches->CurMatch = CurMatch;
-
-	Ok = -1;
-	//try{
-	do {
-		if (!LowParse(Info)) {
-			if (NoMoves) return false;
-		} else
-			return true;
-		posParse = ++posStr;
-	} while(posParse != posEnd+1);
-	return false;
-	//}__except(){
-	//  return true;
-	//};
-}
-;
-
-bool PosRegExp::Parse(int posStr,int posSol, int posEol, PMatches Mtch, int Moves) {
-	if (!this) return false;
-
-	bool s = NoMoves;
-	if (Moves != -1) NoMoves = Moves!=0;
-	posStart = posSol;
-	posEnd   = posEol;
-	Matches = Mtch;
-	bool r = ParseRe(posStr);
-	NoMoves = s;
-	return r;
-};
-
-bool PosRegExp::Parse(int posStr, int posStop, PMatches Mtch) {
-	if (!this) return false;
-	posStart = posStr;
-	posEnd = posStop;
-	Matches = Mtch;
-	return ParseRe(posStr);
-};
-
-bool PosRegExp::SetNoMoves(bool Moves) {
-	NoMoves = Moves;
-	return true;
-};
-
-bool PosRegExp::SetBkTrace(int posStr,PMatches Trace) {
-	BkTrace = Trace;
-	posBkStr = posStr;
-	return true;
-};
-
-#define EVAL_MATCHES 16
-#define EVAL_CHUNKSIZE 256
-
-#define EVAL_LOWERCASE 1
-#define EVAL_UPPERCASE 2
-#define EVAL_LOWERCASE_NEXT 4
-#define EVAL_UPPERCASE_NEXT 8
-
-bool PosRegExp::Evaluate(char *Expr, int posStr, PMatches Mtch, char **Res) {
-	int length,
-	newlength,
-	chunklength,
-	value,
-	size,
-	src,
-	end;
-	unsigned flag;
-	char ch,
-	*dest,
-	*pool;
-
-	size = EVAL_CHUNKSIZE;
-	pool = (char*) malloc (size);
-	dest = pool;
-	length = 0;
-	flag = 0;
-	while (*Expr) {
-		switch (ch = *Expr++) {
-		case '\\':
-			switch (ch = *Expr++) {
-			case 'A':
-			case 'B':
-			case 'C':
-			case 'D':
-			case 'E':
-			case 'F':
-				ch -= ('A' - '0');
-			case '0':
-			case '1':
-			case '2':
-			case '3':
-			case '4':
-			case '5':
-			case '6':
-			case '7':
-			case '8':
-			case '9':
-				value = ch - '0';
-				if (Mtch->s[value] != -1 && value < EVAL_MATCHES) {
-					chunklength = Mtch->e[value] - Mtch->s[value];
-					if (chunklength) {
-						newlength = chunklength + length;
-						if (newlength > size) {
-							do
-								size += EVAL_CHUNKSIZE;
-							while (size < newlength);
-							pool = (char*) realloc (pool, size);
-							dest = pool + length;
-						}
-						length = newlength;
-						src = posStr + Mtch->s[value];
-						end = posStr + Mtch->e[value];
-						if (flag & EVAL_UPPERCASE) {
-							if (flag & EVAL_LOWERCASE_NEXT) {
-								*dest++ = tolower (CharAt(src++,param));
-								flag &= ~EVAL_LOWERCASE_NEXT;
-							}
-							while (src < end)
-								*dest++ = toupper (CharAt(src++,param));
-						} else if (flag & EVAL_LOWERCASE) {
-							if (flag & EVAL_UPPERCASE_NEXT) {
-								*dest++ = toupper (CharAt(src++,param));
-								flag &= ~EVAL_UPPERCASE_NEXT;
-							}
-							while (src < end)
-								*dest++ = tolower (CharAt(src++,param));
-						} else {
-							if (flag & EVAL_LOWERCASE_NEXT) {
-								*dest++ = tolower (CharAt(src++,param));
-								flag &= ~EVAL_LOWERCASE_NEXT;
-							} else if (flag & EVAL_UPPERCASE_NEXT) {
-								*dest++ = toupper (CharAt(src++,param));
-								flag &= ~EVAL_UPPERCASE_NEXT;
-							}
-							while (src < end)
-								*dest++ = CharAt(src++,param);
-						}
-					}
-				} else
-					goto error;
-				continue;
-			case '\0':
-				goto error;
-			case 'r':
-				ch = '\r';
-				break;
-			case 'n':
-				ch = '\n';
-				break;
-			case 'b':
-				ch = '\b';
-				break;
-			case 'a':
-				ch = '\a';
-				break;
-			case 't':
-				ch = '\t';
-				break;
-			case 'U':
-				flag |= EVAL_UPPERCASE;
-				continue;
-			case 'u':
-				flag |= EVAL_UPPERCASE_NEXT;
-				continue;
-			case 'L':
-				flag |= EVAL_LOWERCASE;
-				continue;
-			case 'l':
-				flag |= EVAL_LOWERCASE_NEXT;
-				continue;
-			case 'Q':
-			case 'q':
-				flag &= ~(EVAL_UPPERCASE | EVAL_LOWERCASE);
-				continue;
-			case 'x':
-				{
-					if (!*Expr)
-						goto error;
-					value = toupper (*Expr) - '0';
-					if (value > 9)
-						value = value + '0' - 'A' + 10;
-					if (value > 15)
-						goto error;
-					ch = value << 4;
-					Expr++;
-					if (!*Expr)
-						goto error;
-					value = toupper (*Expr) - '0';
-					if (value > 9)
-						value = value + '0' - 'A' + 10;
-					if (value > 15)
-						goto error;
-					Expr++;
-					ch |= value;
-					break;
-				}
-			case 'd':
-				{
-					if (!*Expr)
-						goto error;
-					value = toupper (*Expr) - '0';
-					if (value > 9)
-						goto error;
-					ch = value * 100;
-					Expr++;
-					if (!*Expr)
-						goto error;
-					value = toupper (*Expr) - '0';
-					if (value > 9)
-						goto error;
-					ch += value * 10;
-					Expr++;
-					if (!*Expr)
-						goto error;
-					value = toupper (*Expr) - '0';
-					if (value > 9)
-						goto error;
-					ch += value;
-					Expr++;
-					break;
-				}
-			case 'o':
-				{
-					if (!*Expr)
-						goto error;
-					value = toupper (*Expr) - '0';
-					if (value > 9)
-						goto error;
-					ch = value << 6;
-					Expr++;
-					if (!*Expr)
-						goto error;
-					value = toupper (*Expr) - '0';
-					if (value > 9)
-						goto error;
-					ch += value << 3;
-					Expr++;
-					if (!*Expr)
-						goto error;
-					value = toupper (*Expr) - '0';
-					if (value > 9)
-						goto error;
-					ch |= value;
-					Expr++;
-					/* break; */
-				}
-				/* default:
-					break; */
-			}
-		default:
-			if (++length > size) {
-				do
-					size += EVAL_CHUNKSIZE;
-				while (size < length);
-				pool = (char*) realloc (pool, size);
-				dest = pool + length - 1;
-			}
-			if (flag & EVAL_LOWERCASE_NEXT) {
-				*dest++ = tolower (ch);
-				flag &= ~EVAL_LOWERCASE_NEXT;
-			} else if (flag & EVAL_UPPERCASE_NEXT) {
-				*dest++ = toupper (ch);
-				flag &= ~EVAL_UPPERCASE_NEXT;
-			} else if (flag & EVAL_UPPERCASE)
-				*dest++ = toupper (ch);
-			else if (flag & EVAL_LOWERCASE)
-				*dest++ = tolower (ch);
-			else
-				*dest++ = ch;
-		}
-	}
-	if (++length > size) {
-		do
-			size += EVAL_CHUNKSIZE;
-		while (size < length);
-		pool = (char*) realloc (pool, size);
-		dest = pool + length - 1;
-	}
-	*dest = '\0';
-	*Res = pool;
-	return true;
-error:
-	free (pool);
-	return false;
-}
diff --git a/contrib/src/stc/scintilla/src/PropSet.cxx b/contrib/src/stc/scintilla/src/PropSet.cxx
index a58d143164..701b2a82c7 100644
--- a/contrib/src/stc/scintilla/src/PropSet.cxx
+++ b/contrib/src/stc/scintilla/src/PropSet.cxx
@@ -1,6 +1,8 @@
 // SciTE - Scintilla based Text Editor
-// PropSet.cxx - a java style properties file module
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file PropSet.cxx
+ ** A Java style properties file module.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 // Maintain a dictionary of properties
@@ -14,62 +16,68 @@
 
 #include "PropSet.h"
 
-bool EqualCaseInsensitive(const char *a, const char *b) {
-#if PLAT_GTK
-	return 0 == strcasecmp(a, b);
-#elif PLAT_WIN
-	return 0 == stricmp(a, b);
-#elif PLAT_WX
-	return 0 == wxStricmp(a, b);
-#endif
-}
-
-SString::size_type SString::npos = -1;
-
-inline unsigned int HashString(const char *s) {
-    unsigned int ret = 0;
-    while (*s) {
-        ret <<= 4;
-        ret ^= *s;
-        s++;
-    }
-    return ret;
-}
-
-// Get a line of input. If end of line escaped with '\\' then continue reading.
-static bool GetFullLine(const char *&fpc, int &lenData, char *s, int len) {
-	bool continuation = true;
-	s[0] = '\0';
-	while ((len > 1) && lenData > 0) {
-		char ch = *fpc;
-		fpc++;
-		lenData--;
-		if ((ch == '\r') || (ch == '\n')) {
-			if (!continuation) {
-				if ((lenData > 0) && (ch == '\r') && ((*fpc) == '\n')) {
-					// munch the second half of a crlf
-					fpc++;
-					lenData--;
-				}
-				*s = '\0';
-				return true;
-			}
-		} else if ((ch == '\\') && (lenData > 0) && ((*fpc == '\r') || (*fpc == '\n'))) {
-			continuation = true;
-		} else {
-			continuation = false;
-			*s++ = ch;
-			*s = '\0';
-			len--;
+// The comparison and case changing functions here assume ASCII
+// or extended ASCII such as the normal Windows code page.
+
+static inline char MakeUpperCase(char ch) {
+	if (ch < 'a' || ch > 'z')
+		return ch;
+	else
+		return static_cast<char>(ch - 'a' + 'A');
+}
+
+int CompareCaseInsensitive(const char *a, const char *b) {
+	while (*a && *b) {
+		if (*a != *b) {
+			char upperA = MakeUpperCase(*a);
+			char upperB = MakeUpperCase(*b);
+			if (upperA != upperB)
+				return upperA - upperB;
 		}
+		a++;
+		b++;
 	}
-	return false;
+	// Either *a or *b is nul
+	return *a - *b;
+}
+
+int CompareNCaseInsensitive(const char *a, const char *b, int len) {
+	while (*a && *b && len) {
+		if (*a != *b) {
+			char upperA = MakeUpperCase(*a);
+			char upperB = MakeUpperCase(*b);
+			if (upperA != upperB)
+				return upperA - upperB;
+		}
+		a++;
+		b++;
+		len--;
+	}
+	if (len == 0)
+		return 0;
+	else
+		// Either *a or *b is nul
+		return *a - *b;
+}
+
+bool EqualCaseInsensitive(const char *a, const char *b) {
+	return 0 == CompareCaseInsensitive(a, b);
+}
+
+inline unsigned int HashString(const char *s, int len) {
+	unsigned int ret = 0;
+	while (len--) {
+		ret <<= 4;
+		ret ^= *s;
+		s++;
+	}
+	return ret;
 }
 
 PropSet::PropSet() {
 	superPS = 0;
-    for (int root=0; root < hashRoots; root++)
-        props[root] = 0;
+	for (int root = 0; root < hashRoots; root++)
+		props[root] = 0;
 }
 
 PropSet::~PropSet() {
@@ -77,45 +85,66 @@ PropSet::~PropSet() {
 	Clear();
 }
 
-void PropSet::Set(const char *key, const char *val) {
-    unsigned int hash = HashString(key);
-	for (Property *p=props[hash % hashRoots]; p; p=p->next) {
-		if ((hash == p->hash) && (0 == strcmp(p->key, key))) {
+void PropSet::Set(const char *key, const char *val, int lenKey, int lenVal) {
+	if (!*key)	// Empty keys are not supported
+		return;
+	if (lenKey == -1)
+		lenKey = strlen(key);
+	if (lenVal == -1)
+		lenVal = strlen(val);
+	unsigned int hash = HashString(key, lenKey);
+	for (Property *p = props[hash % hashRoots]; p; p = p->next) {
+		if ((hash == p->hash) && 
+			((strlen(p->key) == static_cast<unsigned int>(lenKey)) && 
+				(0 == strncmp(p->key, key, lenKey)))) {
 			// Replace current value
 			delete [](p->val);
-			p->val = StringDup(val);
-			return;
+			p->val = StringDup(val, lenVal);
+			return ;
 		}
 	}
 	// Not found
-    Property *pNew = new Property;
-    if (pNew) {
-        pNew->hash = HashString(key);
-	    pNew->key = StringDup(key);
-	    pNew->val = StringDup(val);
-	    pNew->next = props[hash % hashRoots];
-        props[hash % hashRoots] = pNew;
-    }
+	Property *pNew = new Property;
+	if (pNew) {
+		pNew->hash = hash;
+		pNew->key = StringDup(key, lenKey);
+		pNew->val = StringDup(val, lenVal);
+		pNew->next = props[hash % hashRoots];
+		props[hash % hashRoots] = pNew;
+	}
 }
 
-void PropSet::Set(char *keyval) {
-    while (isspace(*keyval))
-        keyval++;
-	char *eqat = strchr(keyval, '=');
-	if (eqat) {
-		*eqat = '\0';
-		Set(keyval, eqat + 1);
-		*eqat = '=';
+void PropSet::Set(const char *keyVal) {
+	while (isspace(*keyVal))
+		keyVal++;
+	const char *endVal = keyVal;
+	while (*endVal && (*endVal != '\n'))
+		endVal++;
+	const char *eqAt = strchr(keyVal, '=');
+	if (eqAt) {
+		Set(keyVal, eqAt + 1, eqAt-keyVal, endVal - eqAt - 1);
+	} else if (*keyVal) {	// No '=' so assume '=1'
+		Set(keyVal, "1", endVal-keyVal, 1);
 	}
 }
 
+void PropSet::SetMultiple(const char *s) {
+	const char *eol = strchr(s, '\n');
+	while (eol) {
+		Set(s);
+		s = eol + 1;
+		eol = strchr(s, '\n');
+	}
+	Set(s);
+}
+
 SString PropSet::Get(const char *key) {
-    unsigned int hash = HashString(key);
-	for (Property *p=props[hash % hashRoots]; p; p=p->next) {
+	unsigned int hash = HashString(key, strlen(key));
+	for (Property *p = props[hash % hashRoots]; p; p = p->next) {
 		if ((hash == p->hash) && (0 == strcmp(p->key, key))) {
-            return p->val;
-        }
-    }
+			return p->val;
+		}
+	}
 	if (superPS) {
 		// Failed here, so try in base property set
 		return superPS->Get(key);
@@ -124,19 +153,35 @@ SString PropSet::Get(const char *key) {
 	}
 }
 
+static bool IncludesVar(const char *value, const char *key) {
+	const char *var = strstr(value, "$(");
+	while (var) {
+		if (isprefix(var + 2, key) && (var[2 + strlen(key)] == ')')) {
+			// Found $(key) which would lead to an infinite loop so exit
+			return true;
+		}
+		var = strstr(var + 2, ")");
+		if (var)
+			var = strstr(var + 1, "$(");
+	}
+	return false;
+}
+
 SString PropSet::GetExpanded(const char *key) {
-    SString val = Get(key);
-    return Expand(val.c_str());
+	SString val = Get(key);
+	if (IncludesVar(val.c_str(), key))
+		return val;
+	return Expand(val.c_str());
 }
 
-SString PropSet::Expand(const char *withvars) {
-	char *base = StringDup(withvars);
+SString PropSet::Expand(const char *withVars) {
+	char *base = StringDup(withVars);
 	char *cpvar = strstr(base, "$(");
 	while (cpvar) {
 		char *cpendvar = strchr(cpvar, ')');
 		if (cpendvar) {
 			int lenvar = cpendvar - cpvar - 2;  	// Subtract the $()
-			char *var = StringDup(cpvar+2, lenvar);
+			char *var = StringDup(cpvar + 2, lenvar);
 			SString val = GetExpanded(var);
 			int newlenbase = strlen(base) + val.length() - lenvar;
 			char *newbase = new char[newlenbase];
@@ -155,14 +200,13 @@ SString PropSet::Expand(const char *withvars) {
 }
 
 int PropSet::GetInt(const char *key, int defaultValue) {
-	SString val = Get(key);
+	SString val = GetExpanded(key);
 	if (val.length())
 		return val.value();
-	else
-		return defaultValue;
+	return defaultValue;
 }
 
-inline bool isprefix(const char *target, const char *prefix) {
+bool isprefix(const char *target, const char *prefix) {
 	while (*target && *prefix) {
 		if (*target != *prefix)
 			return false;
@@ -175,69 +219,70 @@ inline bool isprefix(const char *target, const char *prefix) {
 		return true;
 }
 
-bool issuffix(const char *target, const char *suffix) {
+static bool IsSuffixCaseInsensitive(const char *target, const char *suffix) {
 	int lentarget = strlen(target);
 	int lensuffix = strlen(suffix);
 	if (lensuffix > lentarget)
 		return false;
 	for (int i = lensuffix - 1; i >= 0; i--) {
-		if (target[i + lentarget - lensuffix] != suffix[i])
+		if (MakeUpperCase(target[i + lentarget - lensuffix]) !=
+		        MakeUpperCase(suffix[i]))
 			return false;
 	}
 	return true;
 }
 
 SString PropSet::GetWild(const char *keybase, const char *filename) {
-    for (int root=0; root < hashRoots; root++) {
-	    for (Property *p=props[root]; p; p=p->next) {
-		    if (isprefix(p->key, keybase)) {
-			    char *orgkeyfile = p->key + strlen(keybase);
-			    char *keyfile = NULL;
-
-			    if (strstr(orgkeyfile, "$(") == orgkeyfile) {
-				    char *cpendvar = strchr(orgkeyfile, ')');
-				    if (cpendvar) {
-					    *cpendvar = '\0';
-					    SString s = Get(orgkeyfile + 2);
-					    *cpendvar= ')';
-					    keyfile = strdup(s.c_str());
-				    }
-			    }
-			    char *keyptr = keyfile;
-
-			    if (keyfile == NULL)
-				    keyfile = orgkeyfile;
-
-			    for (; ; ) {
-				    char *del = strchr(keyfile, ';');
-				    if (del == NULL)
-					    del = keyfile + strlen(keyfile);
-				    char delchr = *del;
-				    *del = '\0';
-				    if (*keyfile == '*') {
-					    if (issuffix(filename, keyfile + 1)) {
-						    *del = delchr;
-						    free(keyptr);
-						    return p->val;
-					    }
-				    } else if (0 == strcmp(keyfile, filename)) {
-					    *del = delchr;
-					    free(keyptr);
-					    return p->val;
-				    }
-				    if (delchr == '\0')
-					    break;
-				    *del = delchr;
-				    keyfile = del + 1;
-			    }
-			    free(keyptr);
-
-			    if (0 == strcmp(p->key, keybase)) {
-				    return p->val;
-			    }
-		    }
-	    }
-    }
+	for (int root = 0; root < hashRoots; root++) {
+		for (Property *p = props[root]; p; p = p->next) {
+			if (isprefix(p->key, keybase)) {
+				char * orgkeyfile = p->key + strlen(keybase);
+				char *keyfile = NULL;
+
+				if (strstr(orgkeyfile, "$(") == orgkeyfile) {
+					char *cpendvar = strchr(orgkeyfile, ')');
+					if (cpendvar) {
+						*cpendvar = '\0';
+						SString s = GetExpanded(orgkeyfile + 2);
+						*cpendvar = ')';
+						keyfile = StringDup(s.c_str());
+					}
+				}
+				char *keyptr = keyfile;
+
+				if (keyfile == NULL)
+					keyfile = orgkeyfile;
+
+				for (; ; ) {
+					char *del = strchr(keyfile, ';');
+					if (del == NULL)
+						del = keyfile + strlen(keyfile);
+					char delchr = *del;
+					*del = '\0';
+					if (*keyfile == '*') {
+						if (IsSuffixCaseInsensitive(filename, keyfile + 1)) {
+							*del = delchr;
+							delete []keyptr;
+							return p->val;
+						}
+					} else if (0 == strcmp(keyfile, filename)) {
+						*del = delchr;
+						delete []keyptr;
+						return p->val;
+					}
+					if (delchr == '\0')
+						break;
+					*del = delchr;
+					keyfile = del + 1;
+				}
+				delete []keyptr;
+
+				if (0 == strcmp(p->key, keybase)) {
+					return p->val;
+				}
+			}
+		}
+	}
 	if (superPS) {
 		// Failed here, so try in base property set
 		return superPS->GetWild(keybase, filename);
@@ -246,6 +291,8 @@ SString PropSet::GetWild(const char *keybase, const char *filename) {
 	}
 }
 
+// GetNewExpand does not use Expand as it has to use GetWild with the filename for each
+// variable reference found.
 SString PropSet::GetNewExpand(const char *keybase, const char *filename) {
 	char *base = StringDup(GetWild(keybase, filename).c_str());
 	char *cpvar = strstr(base, "$(");
@@ -253,7 +300,7 @@ SString PropSet::GetNewExpand(const char *keybase, const char *filename) {
 		char *cpendvar = strchr(cpvar, ')');
 		if (cpendvar) {
 			int lenvar = cpendvar - cpvar - 2;  	// Subtract the $()
-			char *var = StringDup(cpvar+2, lenvar);
+			char *var = StringDup(cpvar + 2, lenvar);
 			SString val = GetWild(var, filename);
 			int newlenbase = strlen(base) + val.length() - lenvar;
 			char *newbase = new char[newlenbase];
@@ -272,57 +319,92 @@ SString PropSet::GetNewExpand(const char *keybase, const char *filename) {
 }
 
 void PropSet::Clear() {
-    for (int root=0; root < hashRoots; root++) {
-        Property *p=props[root];
-	    while (p) {
-            Property *pNext=p->next;
-		    p->hash = 0;
-		    delete p->key;
-		    p->key = 0;
-		    delete p->val;
-		    p->val = 0;
-            delete p;
-            p = pNext;
-        }
-        props[root] = 0;
-    }
-}
-
-void PropSet::ReadFromMemory(const char *data, int len, const char *directoryForImports) {
-	const char *pd = data;
-	char linebuf[60000];
-	bool ifIsTrue = true;
-	while (len > 0) {
-		GetFullLine(pd, len, linebuf, sizeof(linebuf));
-		if (isalpha(linebuf[0]))    // If clause ends with first non-indented line
-			ifIsTrue = true;
-		if (isprefix(linebuf, "if ")) {
-			const char *expr = linebuf + strlen("if") + 1;
-			ifIsTrue = GetInt(expr);
-		} else if (isprefix(linebuf, "import ") && directoryForImports) {
-			char importPath[1024];
-			strcpy(importPath, directoryForImports);
-			strcat(importPath, linebuf + strlen("import") + 1);
-			strcat(importPath, ".properties");
-            		Read(importPath,directoryForImports);
-		} else if (isalpha(linebuf[0])) {
-			Set(linebuf);
-		} else if (isspace(linebuf[0]) && ifIsTrue) {
-			Set(linebuf);
+	for (int root = 0; root < hashRoots; root++) {
+		Property *p = props[root];
+		while (p) {
+			Property *pNext = p->next;
+			p->hash = 0;
+			delete p->key;
+			p->key = 0;
+			delete p->val;
+			p->val = 0;
+			delete p;
+			p = pNext;
 		}
+		props[root] = 0;
 	}
 }
 
-void PropSet::Read(const char *filename, const char *directoryForImports) {
-	char propsData[60000];
-	FILE *rcfile = fopen(filename, "rb");
-	if (rcfile) {
-		int lenFile = fread(propsData, 1, sizeof(propsData), rcfile);
-		fclose(rcfile);
-		ReadFromMemory(propsData, lenFile, directoryForImports);
-	} else {
-		//printf("Could not open <%s>\n", filename);
+char *PropSet::ToString() {
+	unsigned int len=0;
+	for (int r = 0; r < hashRoots; r++) {
+		for (Property *p = props[r]; p; p = p->next) {
+			len += strlen(p->key) + 1;
+			len += strlen(p->val) + 1;
+		}
+	}
+	if (len == 0)
+		len = 1;	// Return as empty string
+	char *ret = new char [len];
+	if (ret) {
+		char *w = ret;
+		for (int root = 0; root < hashRoots; root++) {
+			for (Property *p = props[root]; p; p = p->next) {
+				strcpy(w, p->key);
+				w += strlen(p->key);
+				*w++ = '=';
+				strcpy(w, p->val);
+				w += strlen(p->val);
+				*w++ = '\n';
+			}
+		}
+		ret[len-1] = '\0';
+	}
+	return ret;
+}
+
+/**
+ * Initiate enumeration.
+ */
+bool PropSet::GetFirst(char **key, char **val) {
+	for (int i = 0; i < hashRoots; i++) {
+		for (Property *p = props[i]; p; p = p->next) {
+			if (p) {
+				*key = p->key;
+				*val = p->val;
+				enumnext = p->next; // GetNext will begin here ...
+				enumhash = i;		  // ... in this block
+				return true;
+			}
+		}
+	}
+	return false;
+}
+
+/**
+ * Continue enumeration.
+ */
+bool PropSet::GetNext(char ** key, char ** val) {
+	bool firstloop = true;
+
+	// search begins where we left it : in enumhash block
+	for (int i = enumhash; i < hashRoots; i++) {
+		if (!firstloop)
+			enumnext = props[i]; // Begin with first property in block
+		// else : begin where we left
+		firstloop = false;
+
+		for (Property *p = enumnext; p; p = p->next) {
+			if (p) {
+				*key = p->key;
+				*val = p->val;
+				enumnext = p->next; // for GetNext
+				enumhash = i;
+				return true;
+			}
+		}
 	}
+	return false;
 }
 
 static bool iswordsep(char ch, bool onlyLineEnds) {
@@ -333,10 +415,11 @@ static bool iswordsep(char ch, bool onlyLineEnds) {
 	return ch == '\r' || ch == '\n';
 }
 
-// Creates an array that points into each word in the string and puts \0 terminators
-// after each word.
+/**
+ * Creates an array that points into each word in the string and puts \0 terminators
+ * after each word.
+ */
 static char **ArrayFromWordList(char *wordlist, int *len, bool onlyLineEnds = false) {
-#if 1
 	char prev = '\n';
 	int words = 0;
 	for (int j = 0; wordlist[j]; j++) {
@@ -365,50 +448,14 @@ static char **ArrayFromWordList(char *wordlist, int *len, bool onlyLineEnds = fa
 	} else {
 		*len = 0;
 	}
-#else
-	int words = 0; // length of the returned buffer of pointers
-	#undef APICHUNK // how many pointers will be pre-allocated (to avoid buffer reallocation on each new pointer)
-	#define APICHUNK 256
-	int size = APICHUNK; // real size of the returned buffer of pointers
-	char **keywords; // buffer for the pointers returned
-	int slen = strlen(wordlist); //length of the buffer with api file
-	keywords = (char**) malloc((size + 1) * sizeof (*keywords));
-	words = 0;
-	for (int k = 0;;) {
-		while (iswordsep(wordlist[k], onlyLineEnds))
-			wordlist[k++] = '\0';
-		if (k >= slen)
-			break;
-		if (words >= size) {
-			do
-				size += APICHUNK;
-			while (size <= words);
-			keywords = (char**) realloc(keywords, (size + 1) * sizeof (*keywords));
-		}
-		keywords[words++] = wordlist + k;
-		do
-			if (k < slen)
-				k++;
-			else
-				goto out;
-		while (!iswordsep(wordlist[k], onlyLineEnds));
-	}
-out:
-	keywords[words] = wordlist + slen;
-	*len = words;
-#endif
 	return keywords;
 }
 
 void WordList::Clear() {
 	if (words) {
 		delete []list;
-#if 1
-        delete []words;
-#else
-		free(words);
-#endif
-		free(wordsNoCase);
+		delete []words;
+		delete []wordsNoCase;
 	}
 	words = 0;
 	wordsNoCase = 0;
@@ -421,7 +468,7 @@ void WordList::Set(const char *s) {
 	list = StringDup(s);
 	sorted = false;
 	words = ArrayFromWordList(list, &len, onlyLineEnds);
-	wordsNoCase = (char**) malloc ((len + 1) * sizeof (*wordsNoCase));
+	wordsNoCase = new char * [len + 1];
 	memcpy(wordsNoCase, words, (len + 1) * sizeof (*words));
 }
 
@@ -434,27 +481,27 @@ char *WordList::Allocate(int size) {
 void WordList::SetFromAllocated() {
 	sorted = false;
 	words = ArrayFromWordList(list, &len, onlyLineEnds);
-	wordsNoCase = (char**) malloc ((len + 1) * sizeof (*wordsNoCase));
+	wordsNoCase = new char * [len + 1];
 	memcpy(wordsNoCase, words, (len + 1) * sizeof (*words));
 }
 
 int cmpString(const void *a1, const void *a2) {
-    // Can't work out the correct incantation to use modern casts here
-    return strcmp(*(char**)(a1), *(char**)(a2));
+	// Can't work out the correct incantation to use modern casts here
+	return strcmp(*(char**)(a1), *(char**)(a2));
 }
 
 int cmpStringNoCase(const void *a1, const void *a2) {
-    // Can't work out the correct incantation to use modern casts here
-    return strcasecmp(*(char**)(a1), *(char**)(a2));
+	// Can't work out the correct incantation to use modern casts here
+	return CompareCaseInsensitive(*(char**)(a1), *(char**)(a2));
 }
 
 static void SortWordList(char **words, char **wordsNoCase, unsigned int len) {
 	qsort(reinterpret_cast<void*>(words), len, sizeof(*words),
-		cmpString);
+	      cmpString);
 	qsort(reinterpret_cast<void*>(wordsNoCase), len, sizeof(*wordsNoCase),
-		cmpStringNoCase);
+	      cmpStringNoCase);
 }
- 
+
 bool WordList::InList(const char *s) {
 	if (0 == words)
 		return false;
@@ -485,13 +532,28 @@ bool WordList::InList(const char *s) {
 			j++;
 		}
 	}
+	j = starts['^'];
+	if (j >= 0) {
+		while (words[j][0] == '^') {
+			const char *a = words[j] + 1;
+			const char *b = s;
+			while (*a && *a == *b) {
+				a++;
+				b++;
+			}
+			if (!*a)
+				return true;
+			j++;
+		}
+	}
 	return false;
 }
 
 /**
- * Returns an element (complete) of the wordlist array which has the beginning
- * the same as the passed string. The length of the word to compare is passed
- * too. Letter case can be ignored or preserved (default).
+ * Returns an element (complete) of the wordlist array which has
+ * the same beginning as the passed string.
+ * 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*/) {
 	int start = 0; // lower bound of the api array block to search
@@ -506,57 +568,84 @@ const char *WordList::GetNearestWord(const char *wordStart, int searchLen /*= -1
 		sorted = true;
 		SortWordList(words, wordsNoCase, len);
 	}
-	if (ignoreCase)
+	if (ignoreCase) {
 		while (start <= end) { // binary searching loop
 			pivot = (start + end) >> 1;
 			word = wordsNoCase[pivot];
-			cond = strncasecmp(wordStart, word, searchLen);
+			cond = CompareNCaseInsensitive(wordStart, word, searchLen);
 			if (!cond && nonFuncChar(word[searchLen])) // maybe there should be a "non-word character" test here?
 				return word; // result must not be freed with free()
-			else if (cond < 0)
-				end = pivot - 1;
 			else if (cond > 0)
 				start = pivot + 1;
+			else if (cond <= 0)
+				end = pivot - 1;
 		}
-	else // preserve the letter case
+	} else { // preserve the letter case
 		while (start <= end) { // binary searching loop
 			pivot = (start + end) >> 1;
 			word = words[pivot];
 			cond = strncmp(wordStart, word, searchLen);
 			if (!cond && nonFuncChar(word[searchLen])) // maybe there should be a "non-word character" test here?
 				return word; // result must not be freed with free()
-			else if (cond >= 0)
+			else if (cond > 0)
 				start = pivot + 1;
-			else if (cond < 0)
+			else if (cond <= 0)
 				end = pivot - 1;
 		}
+	}
 	return NULL;
 }
-	
+
+/**
+ * Find the length of a 'word' which is actually an identifier in a string
+ * which looks like "identifier(..." or "identifier:" or "identifier" and where
+ * there may be extra spaces after the identifier that should not be
+ * counted in the length.
+ */
+static unsigned int LengthWord(const char *word, char otherSeparator) {
+	// Find a '(', or ':'. If that fails go to the end of the string.
+	const char *endWord = strchr(word, '(');
+	if (!endWord)
+		endWord = strchr(word, ':');
+	if (!endWord && otherSeparator)
+		endWord = strchr(word, otherSeparator);
+	if (!endWord)
+		endWord = word + strlen(word);
+	// Last case always succeeds so endWord != 0
+
+	// Drop any space characters.
+	if (endWord > word) {
+		endWord--;	// Back from the '(', ':', or '\0'
+		// Move backwards over any spaces
+		while ((endWord > word) && (isspace(*endWord))) {
+			endWord--;
+		}
+	}
+	return endWord - word;
+}
+
 /**
  * Returns elements (first words of them) of the wordlist array which have
- * the beginning the same as the passed string. The length of the word to
- * compare is passed too. Letter case can be ignored or preserved (default).
+ * the same beginning as the passed string.
+ * The length of the word to compare is passed too.
+ * Letter case can be ignored or preserved (default).
  * If there are more words meeting the condition they are returned all of
  * them in the ascending order separated with spaces.
  *
- * NOTE: returned buffer has to be freed with a free() call.
+ * NOTE: returned buffer has to be freed with delete[].
  */
-char *WordList::GetNearestWords(const char *wordStart, int searchLen /*= -1*/, bool ignoreCase /*= false*/) {
+char *WordList::GetNearestWords(
+    const char *wordStart,
+    int searchLen /*= -1*/,
+    bool ignoreCase /*= false*/,
+    char otherSeparator /*= '\0'*/) {
 	int wordlen; // length of the word part (before the '(' brace) of the api array element
-	int length = 0; // length of the returned buffer of words (string)
-	int newlength; // length of the new buffer before the reallocating itself
-	#undef WORDCHUNK // how many characters will be pre-allocated (to avoid buffer reallocation on each new word)
-	#define WORDCHUNK 100
-	int size = WORDCHUNK; // real size of the returned buffer of words
-	char *buffer; // buffer for the words returned
+	SString wordsNear;
+	wordsNear.setsizegrowth(1000);
 	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 cond; // comparison result (in the sense of strcmp() result)
-	int oldpivot; // pivot storage to be able to browse the api array upwards and then downwards
-	const char *word; // api array element just being compared
-	const char *brace; // position of the opening brace in the api array element just being compared
 
 	if (0 == words)
 		return NULL;
@@ -564,179 +653,58 @@ char *WordList::GetNearestWords(const char *wordStart, int searchLen /*= -1*/, b
 		sorted = true;
 		SortWordList(words, wordsNoCase, len);
 	}
-	buffer = (char*) malloc(size);
-	*buffer = '\0';
-	if (ignoreCase)
-		while (start <= end) { // binary searching loop
-			pivot = (start + end) >> 1;
-			word = wordsNoCase[pivot];
-			cond = strncasecmp(wordStart, word, searchLen);
+	if (ignoreCase) {
+		while (start <= end) { // Binary searching loop
+			pivot = (start + end) / 2;
+			cond = CompareNCaseInsensitive(wordStart, wordsNoCase[pivot], searchLen);
 			if (!cond) {
-				oldpivot = pivot;
-				do { // browse sequentially the rest after the hit
-					brace = strchr(word, '(');
-					if (brace)
-						do
-							if (--brace < word)
-								break;
-						while (isspace(*brace));
-					else {
-						brace = word + strlen(word);
-						do
-							if (--brace < word)
-								break;
-						while (isspace(*brace));
-					}
-					wordlen = brace - word + 1;
-					newlength = length + wordlen; // stretch the buffer
-					if (length)
-						newlength++;
-					if (newlength >= size) {
-						do
-							size += WORDCHUNK;
-						while (size <= newlength);
-						buffer = (char*) realloc(buffer, size);
-					}
-					if (length) // append a new entry
-						buffer[length++] = ' ';
-					memcpy(buffer + length, word, wordlen);
-					length = newlength;
-					buffer[length] = '\0';
-					if (++pivot > end)
-						break;
-					word = wordsNoCase[pivot];
-				} while (!strncasecmp(wordStart, word, searchLen));
-
-				pivot = oldpivot;
-				for (;;) { // browse sequentially the rest before the hit
-					if (--pivot < start)
-						break;
-					word = wordsNoCase[pivot];
-					if (strncasecmp(wordStart, word, searchLen))
-						break;                 
-					brace = strchr(word, '(');
-					if (brace)
-						do
-							if (--brace < word)
-								break;
-						while (isspace(*brace));
-					else {
-						brace = word + strlen(word);
-						do
-							if (--brace < word)
-								break;
-						while (isspace(*brace));
-					}
-					wordlen = brace - word + 1;
-					newlength = length + wordlen; // stretch the buffer
-					if (length)
-						newlength++;
-					if (newlength >= size)
-					{
-						do
-							size += WORDCHUNK;
-						while (size <= newlength);
-						buffer = (char*) realloc(buffer, size);
-					}
-					if (length) // append a new entry
-						buffer[length++] = ' ';
-					memcpy(buffer + length, word, wordlen);
-					length = newlength;
-					buffer[length] = '\0';
+				// Find first match
+				while ((pivot > start) &&
+					(0 == CompareNCaseInsensitive(wordStart, 
+						wordsNoCase[pivot-1], searchLen))) {
+					--pivot;
 				}
-				return buffer; // result has to be freed with free()
-			}
-			else if (cond < 0)
+				// Grab each match
+				while ((pivot <= end) &&
+					(0 == CompareNCaseInsensitive(wordStart, 
+						wordsNoCase[pivot], searchLen))) {
+					wordlen = LengthWord(wordsNoCase[pivot], otherSeparator) + 1;
+					wordsNear.append(wordsNoCase[pivot], wordlen, ' ');
+					++pivot;
+				}
+				return wordsNear.detach();
+			} else if (cond < 0) {
 				end = pivot - 1;
-			else if (cond > 0)
+			} else if (cond > 0) {
 				start = pivot + 1;
+			}
 		}
-	else // preserve the letter case
-		while (start <= end) { // binary searching loop
-			pivot = (start + end) >> 1;
-			word = words[pivot];
-			cond = strncmp(wordStart, word, searchLen);
+	} else {	// Preserve the letter case
+		while (start <= end) { // Binary searching loop
+			pivot = (start + end) / 2;
+			cond = strncmp(wordStart, words[pivot], searchLen);
 			if (!cond) {
-				oldpivot = pivot;
-				do { // browse sequentially the rest after the hit
-					brace = strchr(word, '(');
-					if (brace)
-						do
-							if (--brace < word)
-								break;
-						while (isspace(*brace));
-					else {
-						brace = word + strlen(word);
-						do
-							if (--brace < word)
-								break;
-						while (isspace(*brace));
-					}
-					wordlen = brace - word + 1;
-					newlength = length + wordlen; // stretch the buffer
-					if (length)
-						newlength++;
-					if (newlength >= size)
-					{
-						do
-							size += WORDCHUNK;
-						while (size <= newlength);
-						buffer = (char*) realloc(buffer, size);
-					}
-					if (length) // append a new entry
-						buffer[length++] = ' ';
-					memcpy(buffer + length, word, wordlen);
-					length = newlength;
-					buffer[length] = '\0';
-					if (++pivot > end)
-						break;
-					word = words[pivot];
-				} while (!strncmp(wordStart, word, searchLen));
-
-				pivot = oldpivot;
-				for (;;) { // browse sequentially the rest before the hit
-					if (--pivot < start)
-						break;
-					word = words[pivot];
-					if (strncmp(wordStart, word, searchLen))
-						break;
-					brace = strchr(word, '(');
-					if (brace)
-						do
-							if (--brace < word)
-								break;
-						while (isspace(*brace));
-					else {
-						brace = word + strlen(word);
-						do
-							if (--brace < word)
-								break;
-						while (isspace(*brace));
-					}
-					wordlen = brace - word + 1;
-					newlength = length + wordlen; // stretch the buffer
-					if (length)
-						newlength++;
-					if (newlength >= size)
-					{
-						do
-							size += WORDCHUNK;
-						while (size <= newlength);
-						buffer = (char*) realloc(buffer, size);
-					}
-					if (length) // append a new entry
-						buffer[length++] = ' ';
-					memcpy(buffer + length, word, wordlen);
-					length = newlength;
-					buffer[length] = '\0';
+				// Find first match
+				while ((pivot > start) &&
+					(0 == strncmp(wordStart, 
+						words[pivot-1], searchLen))) { 
+					--pivot;
 				}
-				return buffer; // result has to be freed with free()
-			}
-			else if (cond < 0)
+				// Grab each match
+				while ((pivot <= end) &&
+					(0 == strncmp(wordStart, 
+						words[pivot], searchLen))) { 
+					wordlen = LengthWord(words[pivot], otherSeparator) + 1;
+					wordsNear.append(words[pivot], wordlen, ' ');
+					++pivot;
+				}
+				return wordsNear.detach();
+			} else if (cond < 0) {
 				end = pivot - 1;
-			else if (cond > 0)
+			} else if (cond > 0) {
 				start = pivot + 1;
+			}
 		}
-	free(buffer);
+	}
 	return NULL;
 }
diff --git a/contrib/src/stc/scintilla/src/RESearch.cxx b/contrib/src/stc/scintilla/src/RESearch.cxx
new file mode 100644
index 0000000000..07534db1ef
--- /dev/null
+++ b/contrib/src/stc/scintilla/src/RESearch.cxx
@@ -0,0 +1,865 @@
+// Scintilla source code edit control
+/** @file RESearch.cxx
+ ** Regular expression search library.
+ **/
+
+/*
+ * regex - Regular expression pattern matching  and replacement
+ *
+ * By:  Ozan S. Yigit (oz)
+ *      Dept. of Computer Science
+ *      York University
+ *
+ * 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.
+ * 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
+ * routines as found in 4.nBSD UN*X, with minor extensions.
+ *
+ * These routines are derived from various implementations found
+ * in software tools books, and Conroy's grep. They are NOT derived
+ * from licensed/restricted software.
+ * For more interesting/academic/complicated implementations,
+ * see Henry Spencer's regexp routines, or GNU Emacs pattern
+ * matching module.
+ *
+ * Modification history:
+ *
+ * $Log$
+ * Revision 1.1  2001/09/01 03:05:24  RD
+ * Upgraded to version 1.39 of Scintilla, and upated wxStyledTextCtrl
+ * accordingly.
+ *
+ * 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.
+ * 
+ * Interfaces:
+ *      RESearch::Compile:        compile a regular expression into a NFA.
+ *
+ *			char *RESearch::Compile(s)
+ *			char *s;
+ *
+ *      RESearch::Execute:        execute the NFA to match a pattern.
+ *
+ *			int RESearch::Execute(s)
+ *			char *s;
+ *
+ *	RESearch::ModifyWord		change RESearch::Execute's understanding of what a "word"
+ *			looks like (for \< and \>) by adding into the
+ *			hidden word-syntax table.
+ *
+ *			void RESearch::ModifyWord(s)
+ *			char *s;
+ *
+ *      RESearch::Substitute:	substitute the matched portions in a new string.
+ *
+ *			int RESearch::Substitute(src, dst)
+ *			char *src;
+ *			char *dst;
+ *
+ *	re_fail:	failure routine for RESearch::Execute.
+ *
+ *			void re_fail(msg, op)
+ *			char *msg;
+ *			char op;
+ *  
+ * Regular Expressions:
+ *
+ *      [1]     char    matches itself, unless it is a special
+ *                      character (metachar): . \ [ ] * + ^ $
+ *
+ *      [2]     .       matches any character.
+ *
+ *      [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. 
+ *			(see [7], [8] and [9])
+ *			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 "^",
+ *                      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:
+ *
+ *                              [a-z]    any lowercase alpha
+ *
+ *                              [^]-]    any char except ] and -
+ *
+ *                              [^A-Z]   any char except uppercase
+ *                                       alpha
+ *
+ *                              [a-zA-Z] any alpha
+ *
+ *      [5]     *       any regular expression form [1] to [4], followed by
+ *                      closure char (*) matches zero or more matches of
+ *                      that form.
+ *
+ *      [6]     +       same as [5], except it matches one or more.
+ *
+ *      [7]             a regular expression in the form [1] to [10], enclosed
+ *                      as \(form\) matches what form matches. The enclosure
+ *                      creates a set of tags, used for [8] and for
+ *                      pattern substution. The tagged forms are numbered
+ *			starting from 1.
+ *
+ *      [8]             a \ followed by a digit 1 to 9 matches whatever a
+ *                      previously tagged regular expression ([7]) matched.
+ *
+ *	[9]	\<	a regular expression starting with a \< construct
+ *		\>	and/or ending with a \> construct, restricts the
+ *			pattern matching to the beginning of a word, and/or
+ *			the end of a word. A word is defined to be a character
+ *			string beginning and/or ending with the characters
+ *			A-Z a-z 0-9 and _. It must also be preceded and/or
+ *			followed by any character outside those mentioned.
+ *
+ *      [10]            a composite regular expression xy where x and y
+ *                      are in the form [1] to [10] matches the longest
+ *                      match of x followed by a match for y.
+ *
+ *      [11]	^	a regular expression starting with a ^ character
+ *		$	and/or ending with a $ character, restricts the
+ *                      pattern matching to the beginning of the line,
+ *                      or the end of line. [anchors] Elsewhere in the
+ *			pattern, ^ and $ are treated as ordinary characters.
+ *
+ *
+ * Acknowledgements:
+ *
+ *	HCR's Hugh Redelmeier has been most helpful in various
+ *	stages of development. He convinced me to include BOW
+ *	and EOW constructs, originally invented by Rob Pike at
+ *	the University of Toronto.
+ *
+ * References:
+ *              Software tools			Kernighan & Plauger
+ *              Software tools in Pascal        Kernighan & Plauger
+ *              Grep [rsx-11 C dist]            David Conroy
+ *		ed - text editor		Un*x Programmer's Manual
+ *		Advanced editing on Un*x	B. W. Kernighan
+ *		RegExp routines			Henry Spencer
+ *
+ * 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 
+ *	constant 16 bytes in the internal nfa, and RESearch::Execute does a single
+ *	bit comparison to locate the character in the set.
+ *
+ * Examples:
+ *
+ *	pattern:	foo*.*
+ *	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]	
+ *	compile:	CHR f CHR o CCL bitset CHR a CCL bitset END
+ *	matches:	fobar fooar fobaz fooaz
+ *
+ *	pattern:	foo\\+
+ *	compile:	CHR f CHR o CHR o CHR \ CLO CHR \ END END
+ *	matches:	foo\ foo\\ foo\\\  ...
+ *
+ *	pattern:	\(foo\)[1-3]\1	(same as foo[1-3]foo)
+ *	compile:	BOT 1 CHR f CHR o CHR o EOT 1 CCL bitset REF 1 END
+ *	matches:	foo1foo foo2foo foo3foo
+ *
+ *	pattern:	\(fo.*\)-\1
+ *	compile:	BOT 1 CHR f CHR o CLO ANY END EOT 1 CHR - REF 1 END
+ *	matches:	foo-foo fo-fo fob-fob foobar-foobar ...
+ */
+
+#include "RESearch.h"
+
+#define OKP     1
+#define NOP     0
+
+#define CHR     1
+#define ANY     2
+#define CCL     3
+#define BOL     4
+#define EOL     5
+#define BOT     6
+#define EOT     7
+#define BOW	8
+#define EOW	9
+#define REF     10
+#define CLO     11
+
+#define END     0
+
+/*
+ * The following defines are not meant to be changeable.
+ * They are for readability only.
+ */
+#define BLKIND	0170
+#define BITIND	07
+
+#define ASCIIB	0177
+
+const char bitarr[] = {1,2,4,8,16,32,64,'\200'};
+
+#define badpat(x)	(*nfa = END, x)
+ 
+RESearch::RESearch() {
+	Init();
+}
+
+RESearch::~RESearch() {
+	Clear();
+}
+
+void RESearch::Init() {
+	sta = NOP;               	/* status of lastpat */
+	bol = 0;
+	for (int i=0; i<MAXTAG; i++)
+		pat[i] = 0;
+	for (int j=0; j<BITBLK; j++)
+		bittab[j] = 0;
+}
+
+void RESearch::Clear() {
+	for (int i=0; i<MAXTAG; i++) {
+		delete []pat[i];
+		pat[i] = 0;
+		bopat[i] = NOTFOUND;
+		eopat[i] = NOTFOUND;
+	}
+}
+
+bool RESearch::GrabMatches(CharacterIndexer &ci) {
+	bool success = true;
+	for (unsigned int i=0; i<MAXTAG; i++) {
+		if ((bopat[i] != NOTFOUND) && (eopat[i] != NOTFOUND)) {
+			unsigned int len = eopat[i] - bopat[i];
+			pat[i] = new char[len + 1];
+			if (pat[i]) {
+				for (unsigned int j=0; j<len; j++)
+					pat[i][j] = ci.CharAt(bopat[i] + j);
+				pat[i][len] = '\0';
+			} else {
+				success = false;
+			}
+		}
+	}
+	return success;
+}
+
+void RESearch::ChSet(char c) {
+	bittab[((c) & BLKIND) >> 3] |= bitarr[(c) & BITIND];
+}
+
+void RESearch::ChSetWithCase(char c, bool caseSensitive) {
+	if (caseSensitive) {
+		ChSet(c);
+	} else {
+		if ((c >= 'a') && (c <= 'z')) {
+			ChSet(c);
+			ChSet(static_cast<char>(c - 'a' + 'A'));
+		} else if ((c >= 'A') && (c <= 'Z')) {
+			ChSet(c);
+			ChSet(static_cast<char>(c - 'A' + 'a'));
+		} else {
+			ChSet(c);
+		}
+	}
+}
+
+const char escapeValue(char ch) {
+	switch (ch) {
+	case 'a':	return '\a';
+	case 'b':	return '\b';
+	case 'f':	return '\f';
+	case 'n':	return '\n';
+	case 'r':	return '\r';
+	case 't':	return '\t';
+	case 'v':	return '\v';
+	}
+	return 0;
+}
+
+const char *RESearch::Compile(const char *pat, int length, bool caseSensitive) {
+	char *mp=nfa;          /* nfa pointer       */
+	char *lp;              /* saved pointer..   */
+	char *sp=nfa;          /* another one..     */
+
+	int tagi = 0;          /* tag stack index   */
+	int tagc = 1;          /* actual tag count  */
+
+	int n;
+	char mask;		/* xor mask -CCL/NCL */
+	int c1, c2;
+		
+	if (!pat || !length)
+		if (sta)
+			return 0;
+		else
+			return badpat("No previous regular expression");
+	sta = NOP;
+
+	const char *p=pat;               /* pattern pointer   */
+	for (int i=0; i<length; i++, p++) {
+		lp = mp;
+		switch(*p) {
+
+		case '.':               /* match any char..  */
+			*mp++ = ANY;
+			break;
+
+		case '^':               /* match beginning.. */
+			if (p == pat)
+				*mp++ = BOL;
+			else {
+				*mp++ = CHR;
+				*mp++ = *p;
+			}
+			break;
+
+		case '$':               /* match endofline.. */
+			if (!*(p+1))
+				*mp++ = EOL;
+			else {
+				*mp++ = CHR;
+				*mp++ = *p;
+			}
+			break;
+
+		case '[':               /* match char class..*/
+			*mp++ = CCL;
+
+			i++;
+			if (*++p == '^') {
+				mask = '\377';	
+				i++;
+				p++;
+			} else
+				mask = 0;
+
+			if (*p == '-') {		/* real dash */
+				i++;
+				ChSet(*p++);
+			}
+			if (*p == ']') {	/* real brace */
+				i++;
+				ChSet(*p++);
+			}
+			while (*p && *p != ']') {
+				if (*p == '-' && *(p+1) && *(p+1) != ']') {
+					i++;
+					p++;
+					c1 = *(p-2) + 1;
+					i++;
+					c2 = *p++;
+					while (c1 <= c2) {
+						ChSetWithCase(static_cast<char>(c1++), caseSensitive);
+					}
+				} else if (*p == '\\' && *(p+1)) {
+					i++;
+					p++;
+					char escape = escapeValue(*p);
+					if (escape)
+						ChSetWithCase(escape, caseSensitive);
+					else
+						ChSetWithCase(*p, caseSensitive);
+					i++;
+					p++;
+				} else {
+					i++;
+					ChSetWithCase(*p++, caseSensitive);
+				}
+			}
+			if (!*p)
+				return badpat("Missing ]");
+
+			for (n = 0; n < BITBLK; bittab[n++] = (char) 0)
+				*mp++ = static_cast<char>(mask ^ bittab[n]);
+	
+			break;
+
+		case '*':               /* match 0 or more.. */
+		case '+':               /* match 1 or more.. */
+			if (p == pat)
+				return badpat("Empty closure");
+			lp = sp;		/* previous opcode */
+			if (*lp == CLO)		/* equivalence..   */
+				break;
+			switch(*lp) {
+
+			case BOL:
+			case BOT:
+			case EOT:
+			case BOW:
+			case EOW:
+			case REF:
+				return badpat("Illegal closure");
+			default:
+				break;
+			}
+
+			if (*p == '+')
+				for (sp = mp; lp < sp; lp++)
+					*mp++ = *lp;
+
+			*mp++ = END;
+			*mp++ = END;
+			sp = mp;
+			while (--mp > lp)
+				*mp = mp[-1];
+			*mp = CLO;
+			mp = sp;
+			break;
+
+		case '\\':              /* tags, backrefs .. */
+			i++;
+			switch(*++p) {
+
+			case '(':
+				if (tagc < MAXTAG) {
+					tagstk[++tagi] = tagc;
+					*mp++ = BOT;
+					*mp++ = static_cast<char>(tagc++);
+				}
+				else
+					return badpat("Too many \\(\\) pairs");
+				break;
+			case ')':
+				if (*sp == BOT)
+					return badpat("Null pattern inside \\(\\)");
+				if (tagi > 0) {
+					*mp++ = static_cast<char>(EOT);
+					*mp++ = static_cast<char>(tagstk[tagi--]);
+				}
+				else
+					return badpat("Unmatched \\)");
+				break;
+			case '<':
+				*mp++ = BOW;
+				break;
+			case '>':
+				if (*sp == BOW)
+					return badpat("Null pattern inside \\<\\>");
+				*mp++ = EOW;
+				break;
+			case '1':
+			case '2':
+			case '3':
+			case '4':
+			case '5':
+			case '6':
+			case '7':
+			case '8':
+			case '9':
+				n = *p-'0';
+				if (tagi > 0 && tagstk[tagi] == n)
+					return badpat("Cyclical reference");
+				if (tagc > n) {
+					*mp++ = static_cast<char>(REF);
+					*mp++ = static_cast<char>(n);
+				}
+				else
+					return badpat("Undetermined reference");
+				break;
+			case 'a':
+			case 'b':
+			case 'n':
+			case 'f':
+			case 'r':
+			case 't':
+			case 'v':
+				*mp++ = CHR;
+				*mp++ = escapeValue(*p);
+				break;
+			default:
+				*mp++ = CHR;
+				*mp++ = *p;
+			}
+			break;
+
+		default :               /* an ordinary char  */
+			if (caseSensitive) {
+				*mp++ = CHR;
+				*mp++ = *p;
+			} else {
+				*mp++ = CCL;
+				mask = 0;
+				ChSetWithCase(*p, false);
+				for (n = 0; n < BITBLK; bittab[n++] = (char) 0)
+					*mp++ = static_cast<char>(mask ^ bittab[n]);
+			}
+			break;
+		}
+		sp = lp;
+	}
+	if (tagi > 0)
+		return badpat("Unmatched \\(");
+	*mp = END;
+	sta = OKP;
+	return 0;
+}
+
+/*
+ * RESearch::Execute:
+ * 	execute nfa to find a match.
+ *
+ *	special cases: (nfa[0])	
+ *		BOL
+ *			Match only once, starting from the
+ *			beginning.
+ *		CHR
+ *			First locate the character without
+ *			calling PMatch, and if found, call
+ *			PMatch for the remaining string.
+ *		END
+ *			RESearch::Compile failed, poor luser did not
+ *			check for it. Fail fast.
+ *
+ *	If a match is found, bopat[0] and eopat[0] are set
+ *	to the beginning and the end of the matched fragment,
+ *	respectively.
+ *
+ */
+
+int RESearch::Execute(CharacterIndexer &ci, int lp, int endp) {
+	char c;
+	int ep = NOTFOUND;
+	char *ap = nfa;
+
+	bol = lp;
+	failure = 0;
+	
+	Clear();
+
+	switch(*ap) {
+
+	case BOL:			/* anchored: match from BOL only */
+		ep = PMatch(ci, lp, endp, ap);
+		break;
+	case EOL:			/* just searching for end of line normal path doesn't work */
+		if (*(ap+1) == END) {
+			lp = endp;
+			ep = lp;
+			break;
+		} else {
+			return 0;
+		}
+	case CHR:			/* ordinary char: locate it fast */
+		c = *(ap+1);
+		while ((lp < endp) && (ci.CharAt(lp) != c))
+			lp++;
+		if (lp >= endp)		/* if EOS, fail, else fall thru. */
+			return 0;
+	default:			/* regular matching all the way. */
+		while (lp < endp) {
+			ep = PMatch(ci, lp, endp, ap);
+			if (ep != NOTFOUND)
+				break;
+			lp++;
+		}
+		break;
+	case END:			/* munged automaton. fail always */
+		return 0;
+	}
+	if (ep == NOTFOUND)
+		return 0;
+
+	bopat[0] = lp;
+	eopat[0] = ep;
+	return 1;
+}
+
+/* 
+ * PMatch: internal routine for the hard part
+ *
+ * 	This code is partly snarfed from an early grep written by
+ *	David Conroy. The backref and tag stuff, and various other
+ *	innovations are by oz.
+ *
+ *	special case optimizations: (nfa[n], nfa[n+1])
+ *		CLO ANY
+ *			We KNOW .* will match everything upto the
+ *			end of line. Thus, directly go to the end of
+ *			line, without recursive PMatch calls. As in
+ *			the other closure cases, the remaining pattern
+ *			must be matched by moving backwards on the
+ *			string recursively, to find a match for xy
+ *			(x is ".*" and y is the remaining pattern)
+ *			where the match satisfies the LONGEST match for
+ *			x followed by a match for y.
+ *		CLO CHR
+ *			We can again scan the string forward for the
+ *			single char and at the point of failure, we
+ *			execute the remaining nfa recursively, same as
+ *			above.
+ *
+ *	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).	
+ *
+ */
+
+extern void re_fail(char *,char);
+
+/*
+ * character classification table for word boundary operators BOW
+ * 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. 
+ *
+ *	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, 
+	1, 1, 1, 0, 0, 0, 0, 0
+	};
+
+#define inascii(x)	(0177&(x))
+#define iswordc(x) 	chrtyp[inascii(x)]
+#define isinset(x,y) 	((x)[((y)&BLKIND)>>3] & bitarr[(y)&BITIND])
+
+/*
+ * skip values for CLO XXX to skip past the closure
+ */
+
+#define ANYSKIP	2 	/* [CLO] ANY END ...	     */
+#define CHRSKIP	3	/* [CLO] CHR chr END ...     */
+#define CCLSKIP 18	/* [CLO] CCL 16bytes END ... */
+
+int RESearch::PMatch(CharacterIndexer &ci, int lp, int endp, char *ap) {
+	int op, c, n;
+	int e;		/* extra pointer for CLO */
+	int bp;		/* beginning of subpat.. */
+	int ep;		/* ending of subpat..	 */
+	int are;			/* to save the line ptr. */
+
+	while ((op = *ap++) != END)
+		switch(op) {
+
+		case CHR:
+			if (ci.CharAt(lp++) != *ap++)
+				return NOTFOUND;
+			break;
+		case ANY:
+			if (lp++ >= endp)
+				return NOTFOUND;
+			break;
+		case CCL:
+			c = ci.CharAt(lp++);
+			if (!isinset(ap,c))
+				return NOTFOUND;
+			ap += BITBLK;
+			break;
+		case BOL:
+			if (lp != bol)
+				return NOTFOUND;
+			break;
+		case EOL:
+			if (lp < endp)
+				return NOTFOUND;
+			break;
+		case BOT:
+			bopat[*ap++] = lp;
+			break;
+		case EOT:
+			eopat[*ap++] = lp;
+			break;
+ 		case BOW:
+			if (lp!=bol && iswordc(ci.CharAt(lp-1)) || !iswordc(ci.CharAt(lp)))
+				return NOTFOUND;
+			break;
+		case EOW:
+			if (lp==bol || !iswordc(ci.CharAt(lp-1)) || iswordc(ci.CharAt(lp)))
+				return NOTFOUND;
+			break;
+		case REF:
+			n = *ap++;
+			bp = bopat[n];
+			ep = eopat[n];
+			while (bp < ep)
+				if (ci.CharAt(bp++) != ci.CharAt(lp++))
+					return NOTFOUND;
+			break;
+		case CLO:
+			are = lp;
+			switch(*ap) {
+
+			case ANY:
+				while (lp < endp)
+					lp++;
+				n = ANYSKIP;
+				break;
+			case CHR:
+				c = *(ap+1);
+				while ((lp < endp) && (c == ci.CharAt(lp)))
+					lp++;
+				n = CHRSKIP;
+				break;
+			case CCL:
+				while ((lp < endp) && isinset(ap+1,ci.CharAt(lp)))
+					lp++;
+				n = CCLSKIP;
+				break;
+			default:
+				failure = true;
+				//re_fail("closure: bad nfa.", *ap);
+				return NOTFOUND;
+			}
+
+			ap += n;
+
+			while (lp >= are) {
+				if ((e = PMatch(ci, lp, endp, ap)) != NOTFOUND)
+					return e;
+				--lp;
+			}
+			return NOTFOUND;
+		default:
+			//re_fail("RESearch::Execute: bad nfa.", static_cast<char>(op));
+			return NOTFOUND;
+		}
+	return lp;
+}
+
+/*
+ * RESearch::ModifyWord:
+ *	add new characters into the word table to change RESearch::Execute's
+ *	understanding of what a word should look like. Note that we
+ *	only accept additions into the word definition.
+ *
+ *	If the string parameter is 0 or null string, the table is
+ *	reset back to the default containing A-Z a-z 0-9 _. [We use
+ *	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 
+}; 
+
+void RESearch::ModifyWord(char *s) {
+	int i;
+
+	if (!s || !*s) {
+		for (i = 0; i < MAXCHR; i++)
+			if (!isinset(deftab,i))
+				iswordc(i) = 0;
+	}
+	else
+		while(*s)
+			iswordc(*s++) = 1;
+}
+
+/*
+ * RESearch::Substitute:
+ *	substitute the matched portions of the src in dst.
+ *
+ *	&	substitute the entire matched pattern.
+ *
+ *	\digit	substitute a subpattern, with the given	tag number.
+ *		Tags are numbered from 1 to 9. If the particular
+ *		tagged subpattern does not exist, null is substituted.
+ */
+int RESearch::Substitute(CharacterIndexer &ci, char *src, char *dst) {
+	char c;
+	int  pin;
+	int bp;
+	int ep;
+
+	if (!*src || !bopat[0])
+		return 0;
+
+	while ((c = *src++) != 0) {
+		switch(c) {
+
+		case '&':
+			pin = 0;
+			break;
+
+		case '\\':
+			c = *src++;
+			if (c >= '0' && c <= '9') {
+				pin = c - '0';
+				break;
+			}
+			
+		default:
+			*dst++ = c;
+			continue;
+		}
+
+		if ((bp = bopat[pin]) != 0 && (ep = eopat[pin]) != 0) {
+			while (ci.CharAt(bp) && bp < ep)
+				*dst++ = ci.CharAt(bp++);
+			if (bp < ep)
+				return 0;
+		}
+	}
+	*dst = (char) 0;
+	return 1;
+}
diff --git a/contrib/src/stc/scintilla/src/RESearch.h b/contrib/src/stc/scintilla/src/RESearch.h
new file mode 100644
index 0000000000..28238bfb7c
--- /dev/null
+++ b/contrib/src/stc/scintilla/src/RESearch.h
@@ -0,0 +1,60 @@
+// Scintilla source code edit control
+/** @file RESearch.h
+ ** Interface to the regular expression search library.
+ **/
+// Written by Neil Hodgson <neilh@scintilla.org>
+// Based on the work of Ozan S. Yigit.
+// This file is in the public domain.
+
+#ifndef RESEARCH_H
+#define RESEARCH_H
+
+/*
+ * The following defines are not meant to be changeable.
+ * They are for readability only.
+ */
+#define MAXCHR	128
+#define CHRBIT	8
+#define BITBLK	MAXCHR/CHRBIT
+
+class CharacterIndexer {
+public: 
+	virtual char CharAt(int index)=0;
+};
+
+class RESearch {
+
+public:
+	RESearch();
+	~RESearch();
+	void Init();
+	void Clear();
+	bool GrabMatches(CharacterIndexer &ci);
+	void ChSet(char c);
+	void ChSetWithCase(char c, bool caseSensitive);
+	const char *Compile(const char *pat, int length, bool caseSensitive);
+	int Execute(CharacterIndexer &ci, int lp, int endp);
+	void ModifyWord(char *s);
+	int Substitute(CharacterIndexer &ci, char *src, char *dst);
+
+	enum {MAXTAG=10};
+	enum {MAXNFA=2048};
+	enum {NOTFOUND=-1};
+
+	int bopat[MAXTAG];
+	int eopat[MAXTAG];
+	char *pat[MAXTAG];
+
+private:
+	int PMatch(CharacterIndexer &ci, int lp, int endp, char *ap);
+
+	int bol;
+	int  tagstk[MAXTAG];             /* subpat tag stack..*/
+	char nfa[MAXNFA];		/* automaton..       */
+	int sta;
+	char bittab[BITBLK];		/* bit table for CCL */
+						/* pre-set bits...   */
+	int failure;
+};
+
+#endif
diff --git a/contrib/src/stc/scintilla/src/SVector.h b/contrib/src/stc/scintilla/src/SVector.h
index d4d49c717d..c8edb513bc 100644
--- a/contrib/src/stc/scintilla/src/SVector.h
+++ b/contrib/src/stc/scintilla/src/SVector.h
@@ -1,26 +1,31 @@
 // Scintilla source code edit control
-// SVector.h - a simple expandable vector
-// Copyright 1998-1999 by Neil Hodgson <neilh@hare.net.au>
+/** @file SVector.h
+ ** A simple expandable vector.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@hare.net.au>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef SVECTOR_H
 #define SVECTOR_H
 
-// A simple expandable integer vector. 
-// Storage not allocated for elements until an element is used. 
-// This makes it very lightweight unless used so is a good match for optional features.
-
+/**
+ * A simple expandable integer vector.
+ * Storage not allocated for elements until an element is used.
+ * This makes it very lightweight unless used so is a good match for optional features.
+ */
 class SVector {
-	int *v;
-	unsigned int size;	// Number of elements allocated
-	unsigned int len;	// Number of elements in vector
-	bool allocFailure;	// A memory allocation call has failed
+	enum { allocSize = 4000 };
+	
+	int *v;				///< The vector
+	unsigned int size;	///< Number of elements allocated
+	unsigned int len;	///< Number of elements used in vector
+	bool allocFailure;	///< A memory allocation call has failed
 	
-	// Internally allocate more elements than the user wants to avoid 
-	// thrashng the memory allocator
+	/** Internally allocate more elements than the user wants
+	 * to avoid thrashing the memory allocator. */
 	void SizeTo(int newSize) {
-		if (newSize < 4000)
-			newSize += 4000;
+		if (newSize < allocSize)
+			newSize += allocSize;
 		else 
 			newSize = (newSize * 3) / 2;
 		int* newv = new int[newSize];
@@ -50,6 +55,7 @@ public:
 	~SVector() {
 		Free();
 	}
+	/// Constructor from another vector.
 	SVector(const SVector &other) {
 		allocFailure = false;
 		v = 0;
@@ -64,6 +70,7 @@ public:
 			}
 		}
 	}
+	/// Copy constructor.
 	SVector &operator=(const SVector &other) {
 		if (this != &other) {
 			delete []v;
@@ -82,6 +89,9 @@ public:
 		}
 		return *this;
 	}
+	/** @brief Accessor.
+	 * Allows to access values from the list, and grows it if accessing
+	 * outside the current bounds. The returned value in this case is 0. */
 	int &operator[](unsigned int i) {
 		if (i >= len) {
 			if (i >= size) {
@@ -91,12 +101,15 @@ public:
 		}
 		return v[i];
 	}
+	/// Reset vector.
 	void Free() {
 		delete []v;
 		v = 0;
 		size = 0;
 		len = 0;
 	}
+	/** @brief Grow vector size.
+	 * Doesn't allow a vector to be shrinked. */
 	void SetLength(unsigned int newLength) {
 		if (newLength > len) {
 			if (newLength >= size) {
@@ -105,6 +118,7 @@ public:
 		}
 		len = newLength;
 	}
+	/// Get the current length (number of used elements) of the vector.
 	int Length() const {
 		return len;
 	}
diff --git a/contrib/src/stc/scintilla/src/ScintillaBase.cxx b/contrib/src/stc/scintilla/src/ScintillaBase.cxx
index 4f182850ad..707f59b9f4 100644
--- a/contrib/src/stc/scintilla/src/ScintillaBase.cxx
+++ b/contrib/src/stc/scintilla/src/ScintillaBase.cxx
@@ -1,6 +1,8 @@
 // Scintilla source code edit control
-// ScintillaBase.cxx - an enhanced subclass of Editor with calltips, autocomplete and context menu
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file ScintillaBase.cxx
+ ** An enhanced subclass of Editor with calltips, autocomplete and context menu.
+ **/
+// 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>
@@ -15,7 +17,6 @@
 #ifdef SCI_LEXER
 #include "SciLexer.h"
 #include "Accessor.h"
-#include "WindowAccessor.h"
 #include "DocumentAccessor.h"
 #include "KeyWords.h"
 #endif
@@ -34,22 +35,25 @@
 #include "ScintillaBase.h"
 
 ScintillaBase::ScintillaBase() {
-#ifdef SCI_LEXER	
+	listType = 0;
+#ifdef SCI_LEXER
 	lexLanguage = SCLEX_CONTAINER;
-	for (int wl=0;wl<numWordLists;wl++)
+	lexCurrent = 0;
+	for (int wl = 0;wl < numWordLists;wl++)
 		keyWordLists[wl] = new WordList;
+	keyWordLists[numWordLists] = 0;
 #endif
 }
 
 ScintillaBase::~ScintillaBase() {
-#ifdef SCI_LEXER	
-	for (int wl=0;wl<numWordLists;wl++)
+#ifdef SCI_LEXER
+	for (int wl = 0;wl < numWordLists;wl++)
 		delete keyWordLists[wl];
 #endif
 }
 
 void ScintillaBase::Finalise() {
-    Editor::Finalise();
+	Editor::Finalise();
 	popup.Destroy();
 }
 
@@ -70,10 +74,12 @@ void ScintillaBase::Command(int cmdId) {
 
 	switch (cmdId) {
 
-	case idAutoComplete: 	// Nothing to do
+	case idAutoComplete:  	// Nothing to do
+
 		break;
 
-	case idCallTip: 	// Nothing to do
+	case idCallTip:  	// Nothing to do
+
 		break;
 
 	case idcmdUndo:
@@ -170,7 +176,7 @@ void ScintillaBase::AutoCompleteStart(int lenEntered, const char *list) {
 	//Platform::DebugPrintf("AutoComplete %s\n", list);
 	ct.CallTipCancel();
 
-	if (ac.chooseSingle) {
+	if (ac.chooseSingle && (listType == 0)) {
 		if (list && !strchr(list, ac.GetSeparator())) {
 			if (ac.ignoreCase) {
 				SetEmptySelection(currentPos - lenEntered);
@@ -183,13 +189,13 @@ void ScintillaBase::AutoCompleteStart(int lenEntered, const char *list) {
 				pdoc->InsertString(currentPos, list + lenEntered);
 				SetEmptySelection(currentPos + strlen(list + lenEntered));
 			}
-			return;
+			return ;
 		}
 	}
-	ac.Start(wDraw, idAutoComplete, currentPos, lenEntered);
+	ac.Start(wMain, idAutoComplete, currentPos, lenEntered);
 
 	PRectangle rcClient = GetClientRectangle();
-	Point pt = LocationFromPosition(currentPos-lenEntered);
+	Point pt = LocationFromPosition(currentPos - lenEntered);
 
 	int heightLB = 100;
 	int widthLB = 100;
@@ -200,8 +206,8 @@ void ScintillaBase::AutoCompleteStart(int lenEntered, const char *list) {
 	}
 	PRectangle rcac;
 	rcac.left = pt.x - 5;
-	if (pt.y >= rcClient.bottom - heightLB && // Wont fit below.
-	    pt.y >= (rcClient.bottom + rcClient.top) / 2) { // and there is more room above.
+	if (pt.y >= rcClient.bottom - heightLB &&  // Wont fit below.
+	        pt.y >= (rcClient.bottom + rcClient.top) / 2) { // and there is more room above.
 		rcac.top = pt.y - heightLB;
 		if (rcac.top < 0) {
 			heightLB += rcac.top;
@@ -225,8 +231,8 @@ void ScintillaBase::AutoCompleteStart(int lenEntered, const char *list) {
 	// Make an allowance for large strings in list
 	rcList.left = pt.x - 5;
 	rcList.right = rcList.left + widthLB;
-	if (pt.y >= rcClient.bottom - heightLB && // Wont fit below.
-	    pt.y >= (rcClient.bottom + rcClient.top) / 2) { // and there is more room above.
+	if (pt.y >= rcClient.bottom - heightLB &&  // Wont fit below.
+	        pt.y >= (rcClient.bottom + rcClient.top) / 2) { // and there is more room above.
 		rcList.top = pt.y - heightAlloced;
 	} else {
 		rcList.top = pt.y + vs.lineHeight;
@@ -236,7 +242,7 @@ void ScintillaBase::AutoCompleteStart(int lenEntered, const char *list) {
 	ac.Show();
 	if (lenEntered != 0) {
 		AutoCompleteMoveToCurrentWord();
-	}		
+	}
 }
 
 void ScintillaBase::AutoCompleteCancel() {
@@ -278,44 +284,45 @@ void ScintillaBase::AutoCompleteCompleted(char fillUp/*='\0'*/) {
 		ac.lb.GetValue(item, selected, sizeof(selected));
 	}
 	ac.Cancel();
-	
-	if (ac.ignoreCase) {
-		if (currentPos != ac.posStart) {
-			pdoc->DeleteChars(ac.posStart, currentPos - ac.posStart);
-		}
-		SetEmptySelection(ac.posStart - ac.startLen);
-		pdoc->DeleteChars(ac.posStart - ac.startLen, ac.startLen);
-		if (item != -1) {
-			SString piece = selected;
-			if (fillUp)
-				piece += fillUp;
-			pdoc->InsertString(currentPos, piece.c_str());
-			SetEmptySelection(currentPos + piece.length());
-		}
-	} else {
-		if (currentPos != ac.posStart) {
-			pdoc->DeleteChars(ac.posStart, currentPos - ac.posStart);
-		}
-		SetEmptySelection(ac.posStart);
-		if (item != -1) {
-			SString piece = selected + ac.startLen;
-			if (fillUp)
-				piece += fillUp;
-			pdoc->InsertString(currentPos, piece.c_str());
-			SetEmptySelection(currentPos + piece.length());
-		}
+
+	if (listType > 0) {
+		userListSelected = selected;
+		SCNotification scn;
+		scn.nmhdr.code = SCN_USERLISTSELECTION;
+		scn.message = 0;
+		scn.wParam = listType;
+		scn.lParam = 0;
+		scn.text = userListSelected.c_str();
+		NotifyParent(scn);
+		return ;
+	}
+
+	Position firstPos = ac.posStart - ac.startLen;
+	if (currentPos < firstPos)
+		return ;
+	if (currentPos != firstPos) {
+		pdoc->DeleteChars(firstPos, currentPos - firstPos);
+	}
+	SetEmptySelection(ac.posStart);
+	if (item != -1) {
+		SString piece = selected;
+		if (fillUp)
+			piece += fillUp;
+		pdoc->InsertString(firstPos, piece.c_str());
+		SetEmptySelection(firstPos + piece.length());
 	}
 }
 
 void ScintillaBase::ContextMenu(Point pt) {
+	bool writable = !WndProc(SCI_GETREADONLY, 0, 0);
 	popup.CreatePopUp();
-	AddToPopUp("Undo", idcmdUndo, pdoc->CanUndo());
-	AddToPopUp("Redo", idcmdRedo, pdoc->CanRedo());
+	AddToPopUp("Undo", idcmdUndo, writable && pdoc->CanUndo());
+	AddToPopUp("Redo", idcmdRedo, writable && pdoc->CanRedo());
 	AddToPopUp("");
-	AddToPopUp("Cut", idcmdCut, currentPos != anchor);
+	AddToPopUp("Cut", idcmdCut, writable && currentPos != anchor);
 	AddToPopUp("Copy", idcmdCopy, currentPos != anchor);
-	AddToPopUp("Paste", idcmdPaste, WndProc(SCI_CANPASTE, 0, 0));
-	AddToPopUp("Delete", idcmdDelete, currentPos != anchor);
+	AddToPopUp("Paste", idcmdPaste, writable && WndProc(SCI_CANPASTE, 0, 0));
+	AddToPopUp("Delete", idcmdDelete, writable && currentPos != anchor);
 	AddToPopUp("");
 	AddToPopUp("Select All", idcmdSelectAll);
 	popup.Show(pt, wMain);
@@ -333,41 +340,67 @@ void ScintillaBase::ButtonDown(Point pt, unsigned int curTime, bool shift, bool
 }
 
 #ifdef SCI_LEXER
+void ScintillaBase::SetLexer(uptr_t wParam) {
+	lexLanguage = wParam;
+	lexCurrent = LexerModule::Find(lexLanguage);
+	if (!lexCurrent)
+		lexCurrent = LexerModule::Find(SCLEX_NULL);
+}
+
+void ScintillaBase::SetLexerLanguage(const char *languageName) {
+	lexLanguage = SCLEX_CONTAINER;
+	lexCurrent = LexerModule::Find(languageName);
+	if (!lexCurrent)
+		lexCurrent = LexerModule::Find(SCLEX_NULL);
+	if (lexCurrent)
+		lexLanguage = lexCurrent->GetLanguage();
+}
+
 void ScintillaBase::Colourise(int start, int end) {
-	int lengthDoc = Platform::SendScintilla(wMain.GetID(), SCI_GETLENGTH, 0, 0);
+	int lengthDoc = pdoc->Length();
 	if (end == -1)
 		end = lengthDoc;
 	int len = end - start;
 
+	PLATFORM_ASSERT(len >= 0);
+	PLATFORM_ASSERT(start + len <= lengthDoc);
+
 	//WindowAccessor styler(wMain.GetID(), props);
-	DocumentAccessor styler(pdoc, props);
+	DocumentAccessor styler(pdoc, props, wMain.GetID());
 
 	int styleStart = 0;
 	if (start > 0)
 		styleStart = styler.StyleAt(start - 1);
 	styler.SetCodePage(pdoc->dbcsCodePage);
-	
-	LexerModule::Colourise(start, len, styleStart, lexLanguage, keyWordLists, styler);
-	styler.Flush();
+
+	if (lexCurrent) {	// Should always succeed as null lexer should always be available
+		lexCurrent->Lex(start, len, styleStart, keyWordLists, styler);
+		styler.Flush();
+		if (styler.GetPropertyInt("fold")) {
+			lexCurrent->Fold(start, len, styleStart, keyWordLists, styler);
+			styler.Flush();
+		}
+	}
 }
 #endif
 
 void ScintillaBase::NotifyStyleToNeeded(int endStyleNeeded) {
 #ifdef SCI_LEXER
 	if (lexLanguage != SCLEX_CONTAINER) {
-		int endStyled = Platform::SendScintilla(wMain.GetID(), SCI_GETENDSTYLED, 0, 0);
-		int lineEndStyled = Platform::SendScintilla(wMain.GetID(), SCI_LINEFROMPOSITION, endStyled, 0);
-		endStyled = Platform::SendScintilla(wMain.GetID(), SCI_POSITIONFROMLINE, lineEndStyled, 0);
+		int endStyled = WndProc(SCI_GETENDSTYLED, 0, 0);
+		int lineEndStyled = WndProc(SCI_LINEFROMPOSITION, endStyled, 0);
+		endStyled = WndProc(SCI_POSITIONFROMLINE, lineEndStyled, 0);
 		Colourise(endStyled, endStyleNeeded);
-		return;
+		return ;
 	}
 #endif
 	Editor::NotifyStyleToNeeded(endStyleNeeded);
 }
 
-long ScintillaBase::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
+sptr_t ScintillaBase::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
 	switch (iMessage) {
 	case SCI_AUTOCSHOW:
+		listType = 0;
 		AutoCompleteStart(wParam, reinterpret_cast<const char *>(lParam));
 		break;
 
@@ -395,15 +428,15 @@ long ScintillaBase::WndProc(unsigned int iMessage, unsigned long wParam, long lP
 	case SCI_AUTOCSTOPS:
 		ac.SetStopChars(reinterpret_cast<char *>(lParam));
 		break;
-		
+
 	case SCI_AUTOCSELECT:
 		ac.Select(reinterpret_cast<char *>(lParam));
 		break;
-	
+
 	case SCI_AUTOCSETCANCELATSTART:
 		ac.cancelAtStartPos = wParam;
 		break;
-	
+
 	case SCI_AUTOCGETCANCELATSTART:
 		return ac.cancelAtStartPos;
 
@@ -417,20 +450,35 @@ long ScintillaBase::WndProc(unsigned int iMessage, unsigned long wParam, long lP
 
 	case SCI_AUTOCGETCHOOSESINGLE:
 		return ac.chooseSingle;
-		
+
 	case SCI_AUTOCSETIGNORECASE:
 		ac.ignoreCase = wParam;
 		break;
-		
+
 	case SCI_AUTOCGETIGNORECASE:
 		return ac.ignoreCase;
-		
+
+	case SCI_USERLISTSHOW:
+		listType = wParam;
+		AutoCompleteStart(0, reinterpret_cast<const char *>(lParam));
+		break;
+
+	case SCI_AUTOCSETAUTOHIDE:
+		ac.autoHide = wParam;
+		break;
+
+	case SCI_AUTOCGETAUTOHIDE:
+		return ac.autoHide;
+
 	case SCI_CALLTIPSHOW: {
 			AutoCompleteCancel();
 			if (!ct.wCallTip.Created()) {
-				PRectangle rc = ct.CallTipStart(currentPos, LocationFromPosition(wParam),
+				Point pt = LocationFromPosition(wParam);
+				pt.y += vs.lineHeight;
+				PRectangle rc = ct.CallTipStart(currentPos, pt,
 				                                reinterpret_cast<char *>(lParam),
-				                                vs.styles[STYLE_DEFAULT].fontName, vs.styles[STYLE_DEFAULT].size);
+				                                vs.styles[STYLE_DEFAULT].fontName,
+				                                vs.styles[STYLE_DEFAULT].sizeZoomed);
 				// If the call-tip window would be out of the client
 				// space, adjust so it displays above the text.
 				PRectangle rcClient = GetClientRectangle();
@@ -441,7 +489,7 @@ long ScintillaBase::WndProc(unsigned int iMessage, unsigned long wParam, long lP
 				}
 				// Now display the window.
 				CreateCallTipWindow(rc);
-				ct.wCallTip.SetPositionRelative(rc, wDraw);
+				ct.wCallTip.SetPositionRelative(rc, wMain);
 				ct.wCallTip.Show();
 			}
 		}
@@ -465,31 +513,37 @@ long ScintillaBase::WndProc(unsigned int iMessage, unsigned long wParam, long lP
 		ct.colourBG = Colour(wParam);
 		InvalidateStyleRedraw();
 		break;
-		
+
 #ifdef SCI_LEXER
 	case SCI_SETLEXER:
+		SetLexer(wParam);
 		lexLanguage = wParam;
 		break;
-		
+
 	case SCI_GETLEXER:
 		return lexLanguage;
-		
+
 	case SCI_COLOURISE:
 		Colourise(wParam, lParam);
 		Redraw();
 		break;
-		
+
 	case SCI_SETPROPERTY:
-		props.Set(reinterpret_cast<const char *>(wParam), 
-			reinterpret_cast<const char *>(lParam));
+		props.Set(reinterpret_cast<const char *>(wParam),
+		          reinterpret_cast<const char *>(lParam));
 		break;
-		
+
 	case SCI_SETKEYWORDS:
 		if (wParam < numWordLists) {
 			keyWordLists[wParam]->Clear();
 			keyWordLists[wParam]->Set(reinterpret_cast<const char *>(lParam));
 		}
 		break;
+
+	case SCI_SETLEXERLANGUAGE:
+		SetLexerLanguage(reinterpret_cast<const char *>(lParam));
+		break;
+
 #endif
 
 	default:
diff --git a/contrib/src/stc/scintilla/src/ScintillaBase.h b/contrib/src/stc/scintilla/src/ScintillaBase.h
index e630ba1aac..d5b1e8ba0c 100644
--- a/contrib/src/stc/scintilla/src/ScintillaBase.h
+++ b/contrib/src/stc/scintilla/src/ScintillaBase.h
@@ -1,17 +1,22 @@
 // Scintilla source code edit control
-// ScintillaBase.h - defines an enhanced subclass of Editor with calltips, autocomplete and context menu
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file ScintillaBase.h
+ ** Defines an enhanced subclass of Editor with calltips, autocomplete and context menu.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef SCINTILLABASE_H
 #define SCINTILLABASE_H
 
+/**
+ */
 class ScintillaBase : public Editor {
 	// Private so ScintillaBase objects can not be copied
 	ScintillaBase(const ScintillaBase &) : Editor() {}
 	ScintillaBase &operator=(const ScintillaBase &) { return *this; }
+
 protected:
-	// Enumeration of commands and child windows
+	/** Enumeration of commands and child windows. */
 	enum {
 		idCallTip=1,
 		idAutoComplete=2,
@@ -30,11 +35,17 @@ protected:
 
 	CallTip ct;
 
+	int listType;			///< 0 is an autocomplete list
+	SString userListSelected;	///< Receives listbox selected string
+	
 #ifdef SCI_LEXER
 	int lexLanguage;
+	LexerModule *lexCurrent;
 	PropSet props;
 	enum {numWordLists=5};
-	WordList *keyWordLists[numWordLists];
+	WordList *keyWordLists[numWordLists+1];
+	void SetLexer(uptr_t wParam);
+	void SetLexerLanguage(const char *languageName);
 	void Colourise(int start, int end);
 #endif
 
@@ -67,7 +78,7 @@ protected:
 	virtual void NotifyStyleToNeeded(int endStyleNeeded);
 public:
 	// Public so scintilla_send_message can use it
-	virtual long WndProc(unsigned int iMessage, unsigned long wParam, long lParam);
+	virtual sptr_t WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam);
 };
 
 #endif
diff --git a/contrib/src/stc/scintilla/src/Style.cxx b/contrib/src/stc/scintilla/src/Style.cxx
index 0a52ed41a3..4a35267910 100644
--- a/contrib/src/stc/scintilla/src/Style.cxx
+++ b/contrib/src/stc/scintilla/src/Style.cxx
@@ -1,6 +1,8 @@
 // Scintilla source code edit control
-// Style.cxx - defines the font and colour style for a class of text
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file Style.cxx
+ ** Defines the font and colour style for a class of text.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include <string.h>
@@ -12,15 +14,15 @@
 
 Style::Style() {
 	aliasOfDefaultFont = true;
-	Clear(Colour(0,0,0), Colour(0xff,0xff,0xff),
-	        Platform::DefaultFontSize(), 0, SC_CHARSET_DEFAULT,
-		false, false, false, false, true);
+	Clear(Colour(0, 0, 0), Colour(0xff, 0xff, 0xff),
+	      Platform::DefaultFontSize(), 0, SC_CHARSET_DEFAULT,
+	      false, false, false, false, caseMixed, true);
 }
-	
+
 Style::Style(const Style &source) {
-	Clear(Colour(0,0,0), Colour(0xff,0xff,0xff),
-	        0, 0, 0,
-		false, false, false, false, true);
+	Clear(Colour(0, 0, 0), Colour(0xff, 0xff, 0xff),
+	      0, 0, 0,
+	      false, false, false, false, caseMixed, true);
 	fore.desired = source.fore.desired;
 	back.desired = source.back.desired;
 	characterSet = source.characterSet;
@@ -29,7 +31,8 @@ Style::Style(const Style &source) {
 	size = source.size;
 	eolFilled = source.eolFilled;
 	underline = source.underline;
-    visible = source.visible;
+	caseForce = source.caseForce;
+	visible = source.visible;
 }
 
 Style::~Style() {
@@ -42,10 +45,10 @@ Style::~Style() {
 
 Style &Style::operator=(const Style &source) {
 	if (this == &source)
-		return *this;
-	Clear(Colour(0,0,0), Colour(0xff,0xff,0xff),
-	        0, 0, SC_CHARSET_DEFAULT,
-		false, false, false, false, true);
+		return * this;
+	Clear(Colour(0, 0, 0), Colour(0xff, 0xff, 0xff),
+	      0, 0, SC_CHARSET_DEFAULT,
+	      false, false, false, false, caseMixed, true);
 	fore.desired = source.fore.desired;
 	back.desired = source.back.desired;
 	characterSet = source.characterSet;
@@ -54,13 +57,15 @@ Style &Style::operator=(const Style &source) {
 	size = source.size;
 	eolFilled = source.eolFilled;
 	underline = source.underline;
-    visible = source.visible;
+	caseForce = source.caseForce;
+	visible = source.visible;
 	return *this;
 }
 
-void Style::Clear(Colour fore_, Colour back_, int size_, 
-	const char *fontName_, int characterSet_,
-	bool bold_, bool italic_, bool eolFilled_, bool underline_, bool visible_) {
+void Style::Clear(Colour fore_, Colour back_, int size_,
+                  const char *fontName_, int characterSet_,
+                  bool bold_, bool italic_, bool eolFilled_, 
+                  bool underline_, ecaseForced caseForce_, bool visible_) {
 	fore.desired = fore_;
 	back.desired = back_;
 	characterSet = characterSet_;
@@ -70,19 +75,35 @@ void Style::Clear(Colour fore_, Colour back_, int size_,
 	fontName = fontName_;
 	eolFilled = eolFilled_;
 	underline = underline_;
-    visible = visible_;
+	caseForce = caseForce_;
+	visible = visible_;
 	if (aliasOfDefaultFont)
 		font.SetID(0);
-	else 
+	else
 		font.Release();
 	aliasOfDefaultFont = false;
 }
 
+void Style::ClearTo(const Style &source) {
+	Clear(
+		source.fore.desired,
+		source.back.desired,
+		source.size,
+		source.fontName,
+		source.characterSet,
+		source.bold,
+		source.italic,
+		source.eolFilled,
+		source.underline,
+		source.caseForce,
+		source.visible);
+}
+
 bool Style::EquivalentFontTo(const Style *other) const {
 	if (bold != other->bold ||
-		italic != other->italic ||
-		size != other->size ||
-		characterSet != other->characterSet)
+	        italic != other->italic ||
+	        size != other->size ||
+	        characterSet != other->characterSet)
 		return false;
 	if (fontName == other->fontName)
 		return true;
@@ -94,17 +115,17 @@ bool Style::EquivalentFontTo(const Style *other) const {
 }
 
 void Style::Realise(Surface &surface, int zoomLevel, Style *defaultStyle) {
-	int sizeZoomed = size + zoomLevel;
+	sizeZoomed = size + zoomLevel;
 	if (sizeZoomed <= 2)	// Hangs if sizeZoomed <= 1
 		sizeZoomed = 2;
 
 	if (aliasOfDefaultFont)
 		font.SetID(0);
-	else 
+	else
 		font.Release();
 	int deviceHeight = surface.DeviceHeightFont(sizeZoomed);
-	aliasOfDefaultFont = defaultStyle && 
-		(EquivalentFontTo(defaultStyle) || !fontName);
+	aliasOfDefaultFont = defaultStyle &&
+	                     (EquivalentFontTo(defaultStyle) || !fontName);
 	if (aliasOfDefaultFont) {
 		font.SetID(defaultStyle->font.GetID());
 	} else if (fontName) {
diff --git a/contrib/src/stc/scintilla/src/Style.h b/contrib/src/stc/scintilla/src/Style.h
index 9a2b4586a3..3600886b35 100644
--- a/contrib/src/stc/scintilla/src/Style.h
+++ b/contrib/src/stc/scintilla/src/Style.h
@@ -1,11 +1,15 @@
 // Scintilla source code edit control
-// Style.h - defines the font and colour style for a class of text
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file Style.h
+ ** Defines the font and colour style for a class of text.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef STYLE_H
 #define STYLE_H
 
+/**
+ */
 class Style {
 public:
 	ColourPair fore;
@@ -18,9 +22,12 @@ public:
 	int characterSet;
 	bool eolFilled;
 	bool underline;
+	enum ecaseForced {caseMixed, caseUpper, caseLower};
+	ecaseForced caseForce;
 	bool visible;
 
 	Font font;
+	int sizeZoomed;
 	unsigned int lineHeight;
 	unsigned int ascent;
 	unsigned int descent;
@@ -33,11 +40,13 @@ public:
 	~Style();
 	Style &operator=(const Style &source);
 	void Clear(Colour fore_, Colour back_,
-           	int size_, 
-		const char *fontName_, int characterSet_,
-		bool bold_, bool italic_, bool eolFilled_, bool underline_, bool visible_);
+	           int size_,
+	           const char *fontName_, int characterSet_,
+	           bool bold_, bool italic_, bool eolFilled_, 
+	           bool underline_, ecaseForced caseForce_, bool visible_);
+	void ClearTo(const Style &source);
 	bool EquivalentFontTo(const Style *other) const;
-	void Realise(Surface &surface, int zoomLevel, Style *defaultStyle=0);
+	void Realise(Surface &surface, int zoomLevel, Style *defaultStyle = 0);
 };
 
 #endif
diff --git a/contrib/src/stc/scintilla/src/UniConversion.cxx b/contrib/src/stc/scintilla/src/UniConversion.cxx
index 9306f307c2..c3f960c62c 100644
--- a/contrib/src/stc/scintilla/src/UniConversion.cxx
+++ b/contrib/src/stc/scintilla/src/UniConversion.cxx
@@ -1,5 +1,8 @@
-// UniConversion.h - functions to handle UFT-8 and UCS-2 strings
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file UniConversion.cxx
+ ** Functions to handle UFT-8 and UCS-2 strings.
+ **/
+// 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>
diff --git a/contrib/src/stc/scintilla/src/UniConversion.h b/contrib/src/stc/scintilla/src/UniConversion.h
index cace497c48..bd1d7754d4 100644
--- a/contrib/src/stc/scintilla/src/UniConversion.h
+++ b/contrib/src/stc/scintilla/src/UniConversion.h
@@ -1,5 +1,8 @@
-// UniConversion.h - functions to handle UFT-8 and UCS-2 strings
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file UniConversion.h
+ ** Functions to handle UFT-8 and UCS-2 strings.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 unsigned int UTF8Length(const wchar_t *uptr, unsigned int tlen);
diff --git a/contrib/src/stc/scintilla/src/ViewStyle.cxx b/contrib/src/stc/scintilla/src/ViewStyle.cxx
index 9b7a8535e9..4db7e2508b 100644
--- a/contrib/src/stc/scintilla/src/ViewStyle.cxx
+++ b/contrib/src/stc/scintilla/src/ViewStyle.cxx
@@ -1,6 +1,8 @@
 // Scintilla source code edit control
-// ViewStyle.cxx - store information on how the document is to be viewed
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file ViewStyle.cxx
+ ** Store information on how the document is to be viewed.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include <string.h>
@@ -13,7 +15,7 @@
 #include "Style.h"
 #include "ViewStyle.h"
 
-MarginStyle::MarginStyle() : 
+MarginStyle::MarginStyle() :
 	symbol(false), width(16), mask(0xffffffff), sensitive(false) {
 }
 
@@ -64,7 +66,7 @@ ViewStyle::ViewStyle(const ViewStyle &source) {
 	for (int ind=0;ind<=INDIC_MAX;ind++) {
 		indicators[ind] = source.indicators[ind];
 	}
-	
+
 	selforeset = source.selforeset;
 	selforeground.desired = source.selforeground.desired;
 	selbackset = source.selbackset;
@@ -73,8 +75,11 @@ ViewStyle::ViewStyle(const ViewStyle &source) {
 	selbar.desired = source.selbar.desired;
 	selbarlight.desired = source.selbarlight.desired;
 	caretcolour.desired = source.caretcolour.desired;
+	showCaretLineBackground = source.showCaretLineBackground;
+	caretLineBackground.desired = source.caretLineBackground.desired;
 	edgecolour.desired = source.edgecolour.desired;
 	edgeState = source.edgeState;
+	caretWidth = source.caretWidth;
 	leftMarginWidth = source.leftMarginWidth;
 	rightMarginWidth = source.rightMarginWidth;
 	for (int i=0;i < margins; i++) {
@@ -87,7 +92,7 @@ ViewStyle::ViewStyle(const ViewStyle &source) {
 	viewWhitespace = source.viewWhitespace;
 	viewIndentationGuides = source.viewIndentationGuides;
 	viewEOL = source.viewEOL;
-	showMarkedLines = source.showMarkedLines;		
+	showMarkedLines = source.showMarkedLines;
 }
 
 ViewStyle::~ViewStyle() {
@@ -96,7 +101,7 @@ ViewStyle::~ViewStyle() {
 void ViewStyle::Init() {
 	fontNames.Clear();
 	ResetDefaultStyle();
-	
+
 	indicators[0].style = INDIC_SQUIGGLE;
 	indicators[0].fore = Colour(0, 0x7f, 0);
 	indicators[1].style = INDIC_TT;
@@ -119,11 +124,13 @@ void ViewStyle::Init() {
 	selbarlight.desired = Platform::ChromeHighlight();
 	styles[STYLE_LINENUMBER].fore.desired = Colour(0, 0, 0);
 	styles[STYLE_LINENUMBER].back.desired = Platform::Chrome();
-	//caretcolour.desired = Colour(0xff, 0, 0);
 	caretcolour.desired = Colour(0, 0, 0);
+	showCaretLineBackground = false;
+	caretLineBackground.desired = Colour(0xff, 0xff, 0);
 	edgecolour.desired = Colour(0xc0, 0xc0, 0xc0);
 	edgeState = EDGE_NONE;
-	
+	caretWidth = 1;
+
 	leftMarginWidth = 1;
 	rightMarginWidth = 1;
 	ms[0].symbol = false;
@@ -172,6 +179,7 @@ void ViewStyle::RefreshColourPalette(Palette &pal, bool want) {
 	pal.WantFind(selbar, want);
 	pal.WantFind(selbarlight, want);
 	pal.WantFind(caretcolour, want);
+	pal.WantFind(caretLineBackground, want);
 	pal.WantFind(edgecolour, want);
 }
 
@@ -190,7 +198,7 @@ void ViewStyle::Refresh(Surface &surface) {
 				maxDescent = styles[i].descent;
 		}
 	}
-	
+
 	lineHeight = maxAscent + maxDescent;
 	aveCharWidth = styles[STYLE_DEFAULT].aveCharWidth;
 	spaceWidth = styles[STYLE_DEFAULT].spaceWidth;
@@ -208,26 +216,16 @@ void ViewStyle::Refresh(Surface &surface) {
 
 void ViewStyle::ResetDefaultStyle() {
 	styles[STYLE_DEFAULT].Clear(Colour(0,0,0), Colour(0xff,0xff,0xff),
-	        Platform::DefaultFontSize(), fontNames.Save(Platform::DefaultFont()), 
+	        Platform::DefaultFontSize(), fontNames.Save(Platform::DefaultFont()),
 		SC_CHARSET_DEFAULT,
-		false, false, false, false, true);
+		false, false, false, false, Style::caseMixed, true);
 }
 
 void ViewStyle::ClearStyles() {
 	// Reset all styles to be like the default style
 	for (unsigned int i=0;i<(sizeof(styles)/sizeof(styles[0]));i++) {
 		if (i != STYLE_DEFAULT) {
-			styles[i].Clear(
-				styles[STYLE_DEFAULT].fore.desired, 
-				styles[STYLE_DEFAULT].back.desired, 
-				styles[STYLE_DEFAULT].size, 
-				styles[STYLE_DEFAULT].fontName, 
-				styles[STYLE_DEFAULT].characterSet, 
-				styles[STYLE_DEFAULT].bold, 
-				styles[STYLE_DEFAULT].italic,
-				styles[STYLE_DEFAULT].eolFilled,
-				styles[STYLE_DEFAULT].underline,
-				styles[STYLE_DEFAULT].visible);
+			styles[i].ClearTo(styles[STYLE_DEFAULT]);
 		}
 	}
 	styles[STYLE_LINENUMBER].back.desired = Platform::Chrome();
diff --git a/contrib/src/stc/scintilla/src/ViewStyle.h b/contrib/src/stc/scintilla/src/ViewStyle.h
index 5b0ab1925f..7528638c59 100644
--- a/contrib/src/stc/scintilla/src/ViewStyle.h
+++ b/contrib/src/stc/scintilla/src/ViewStyle.h
@@ -1,11 +1,15 @@
 // Scintilla source code edit control
-// ViewStyle.h - store information on how the document is to be viewed
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file ViewStyle.h
+ ** Store information on how the document is to be viewed.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef VIEWSTYLE_H
 #define VIEWSTYLE_H
 
+/**
+ */
 class MarginStyle {
 public:
 	bool symbol;
@@ -15,10 +19,13 @@ public:
 	MarginStyle();
 };
 
+/**
+ */
 class FontNames {
 private:
 	char *names[STYLE_MAX + 1];
 	int max;
+
 public:
 	FontNames();
 	~FontNames();
@@ -27,6 +34,9 @@ public:
 };
 
 enum WhiteSpaceVisibility {wsInvisible=0, wsVisibleAlways=1, wsVisibleAfterIndent=2};
+
+/**
+ */
 class ViewStyle {
 public:
 	FontNames fontNames;
@@ -45,12 +55,12 @@ public:
 	ColourPair selbackground2;
 	ColourPair selbar;
 	ColourPair selbarlight;
-	// Margins are ordered: Line Numbers, Selection Margin, Spacing Margin
-	int leftMarginWidth;		// Spacing margin on left of text
-	int rightMarginWidth;	// 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
+	int rightMarginWidth;	///< Spacing margin on left of text
 	bool symbolMargin;
-	int maskInLine;	// Mask for markers to be put into text because there is nowhere for them to go in margin
+	int maskInLine;	///< Mask for markers to be put into text because there is nowhere for them to go in margin
 	MarginStyle ms[margins];
 	int fixedColumnWidth;
 	int zoomLevel;
@@ -59,8 +69,11 @@ public:
 	bool viewEOL;
 	bool showMarkedLines;
 	ColourPair caretcolour;
+	bool showCaretLineBackground;
+	ColourPair caretLineBackground;
 	ColourPair edgecolour;
 	int edgeState;
+	int caretWidth;
 	
 	ViewStyle();
 	ViewStyle(const ViewStyle &source);
diff --git a/contrib/src/stc/scintilla/src/WindowAccessor.cxx b/contrib/src/stc/scintilla/src/WindowAccessor.cxx
index 5f3deac7db..db2f938f30 100644
--- a/contrib/src/stc/scintilla/src/WindowAccessor.cxx
+++ b/contrib/src/stc/scintilla/src/WindowAccessor.cxx
@@ -1,6 +1,8 @@
-// SciTE - Scintilla based Text Editor
-// Accessor.cxx - rapid easy access to contents of a Scintilla
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file WindowAccessor.cxx
+ ** Rapid easy access to contents of a Scintilla.
+ **/
+// 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>
diff --git a/contrib/src/stc/stc.cpp b/contrib/src/stc/stc.cpp
index 6adfd80a84..944df02c53 100644
--- a/contrib/src/stc/stc.cpp
+++ b/contrib/src/stc/stc.cpp
@@ -28,31 +28,37 @@
 
 int wxForceScintillaLexers(void)
 {
+  extern LexerModule lmAda;
+  extern LexerModule lmAVE;
+  extern LexerModule lmConf;
   extern LexerModule lmCPP;
+  extern LexerModule lmEiffel;
   extern LexerModule lmHTML;
-  extern LexerModule lmXML;
-  extern LexerModule lmProps;
-  extern LexerModule lmErrorList;
-  extern LexerModule lmMake;
-  extern LexerModule lmBatch;
+  extern LexerModule lmLISP;
+  extern LexerModule lmLua;
+  extern LexerModule lmBatch;  // In LexOthers.cxx
+  extern LexerModule lmPascal;
   extern LexerModule lmPerl;
   extern LexerModule lmPython;
+  extern LexerModule lmRuby;
   extern LexerModule lmSQL;
   extern LexerModule lmVB;
 
-  if (
-      &lmCPP
-      && &lmHTML
-      && &lmXML
-      && &lmProps
-      && &lmErrorList
-      && &lmMake
-      && &lmBatch
-      && &lmPerl
-      && &lmPython
-      && &lmSQL
-      && &lmVB
-      )
+  if (  &lmAda
+     && &lmAVE
+     && &lmConf
+     && &lmCPP
+     && &lmEiffel
+     && &lmHTML
+     && &lmLISP
+     && &lmLua
+     && &lmBatch
+     && &lmPascal
+     && &lmPerl
+     && &lmPython
+     && &lmRuby
+     && &lmSQL
+     && &lmVB )
     {
       return 1;
     }
@@ -66,21 +72,27 @@ int wxForceScintillaLexers(void)
 
 const wxChar* wxSTCNameStr = "stcwindow";
 
-
 DEFINE_EVENT_TYPE( wxEVT_STC_CHANGE )
 DEFINE_EVENT_TYPE( wxEVT_STC_STYLENEEDED )
 DEFINE_EVENT_TYPE( wxEVT_STC_CHARADDED )
-DEFINE_EVENT_TYPE( wxEVT_STC_UPDATEUI )
 DEFINE_EVENT_TYPE( wxEVT_STC_SAVEPOINTREACHED )
 DEFINE_EVENT_TYPE( wxEVT_STC_SAVEPOINTLEFT )
 DEFINE_EVENT_TYPE( wxEVT_STC_ROMODIFYATTEMPT )
+DEFINE_EVENT_TYPE( wxEVT_STC_KEY )
 DEFINE_EVENT_TYPE( wxEVT_STC_DOUBLECLICK )
+DEFINE_EVENT_TYPE( wxEVT_STC_UPDATEUI )
 DEFINE_EVENT_TYPE( wxEVT_STC_MODIFIED )
-DEFINE_EVENT_TYPE( wxEVT_STC_KEY )
 DEFINE_EVENT_TYPE( wxEVT_STC_MACRORECORD )
 DEFINE_EVENT_TYPE( wxEVT_STC_MARGINCLICK )
 DEFINE_EVENT_TYPE( wxEVT_STC_NEEDSHOWN )
 DEFINE_EVENT_TYPE( wxEVT_STC_POSCHANGED )
+DEFINE_EVENT_TYPE( wxEVT_STC_PAINTED )
+DEFINE_EVENT_TYPE( wxEVT_STC_USERLISTSELECTION )
+DEFINE_EVENT_TYPE( wxEVT_STC_URIDROPPED )
+DEFINE_EVENT_TYPE( wxEVT_STC_DWELLSTART )
+DEFINE_EVENT_TYPE( wxEVT_STC_DWELLEND )
+
+
 
 
 BEGIN_EVENT_TABLE(wxStyledTextCtrl, wxControl)
@@ -94,7 +106,7 @@ BEGIN_EVENT_TABLE(wxStyledTextCtrl, wxControl)
 #endif
     EVT_MOTION                  (wxStyledTextCtrl::OnMouseMove)
     EVT_LEFT_UP                 (wxStyledTextCtrl::OnMouseLeftUp)
-    EVT_RIGHT_UP                (wxStyledTextCtrl::OnMouseRightUp)
+    EVT_CONTEXT_MENU            (wxStyledTextCtrl::OnContextMenu)
     EVT_MOUSEWHEEL              (wxStyledTextCtrl::OnMouseWheel)
     EVT_CHAR                    (wxStyledTextCtrl::OnChar)
     EVT_KEY_DOWN                (wxStyledTextCtrl::OnKeyDown)
@@ -299,6 +311,12 @@ int wxStyledTextCtrl::PositionFromPoint(wxPoint pt) {
                               return SendMsg(2022, pt.x, pt.y);
 }
 
+// Find the position from a point within the window but return
+// INVALID_POSITION if not close to text.
+int wxStyledTextCtrl::PositionFromPointClose(int x, int y) {
+    return SendMsg(2023, x, y);
+}
+
 // Set caret to start of a line and ensure it is visible.
 void wxStyledTextCtrl::GotoLine(int line) {
     SendMsg(2024, line, 0);
@@ -335,9 +353,9 @@ int wxStyledTextCtrl::GetEndStyled() {
     return SendMsg(2028, 0, 0);
 }
 
-// Convert all line endings in the document to use the current mode.
-void wxStyledTextCtrl::ConvertEOLs() {
-    SendMsg(2029, 0, 0);
+// Convert all line endings in the document to one mode.
+void wxStyledTextCtrl::ConvertEOLs(int eolMode) {
+    SendMsg(2029, eolMode, 0);
 }
 
 // Retrieve the current end of line mode - one of CRLF, CR, or LF.
@@ -534,6 +552,11 @@ void wxStyledTextCtrl::StyleSetUnderline(int style, bool underline) {
     SendMsg(2059, style, underline);
 }
 
+// Set a style to be mixed case, or to force upper or lower case.
+void wxStyledTextCtrl::StyleSetCase(int style, int caseForce) {
+    SendMsg(2060, style, caseForce);
+}
+
 // Set the foreground colour of the selection and whether to use this setting.
 void wxStyledTextCtrl::SetSelForeground(bool useSetting, const wxColour& fore) {
     SendMsg(2067, useSetting, wxColourAsLong(fore));
@@ -649,6 +672,27 @@ int wxStyledTextCtrl::GetMaxLineState() {
     return SendMsg(2094, 0, 0);
 }
 
+// Is the background of the line containing the caret in a different colour?
+bool wxStyledTextCtrl::GetCaretLineVisible() {
+    return SendMsg(2095, 0, 0) != 0;
+}
+
+// Display the background of the line containing the caret in a different colour.
+void wxStyledTextCtrl::SetCaretLineVisible(bool show) {
+    SendMsg(2096, show, 0);
+}
+
+// Get the colour of the background of the line containing the caret.
+wxColour wxStyledTextCtrl::GetCaretLineBack() {
+    long c = SendMsg(2097, 0, 0);
+    return wxColourFromLong(c);
+}
+
+// Set the colour of the background of the line containing the caret.
+void wxStyledTextCtrl::SetCaretLineBack(const wxColour& back) {
+    SendMsg(2098, wxColourAsLong(back), 0);
+}
+
 // Display a auto-completion list.
 // The lenEntered parameter indicates how many characters before
 // the caret should be used to provide context.
@@ -734,6 +778,21 @@ bool wxStyledTextCtrl::AutoCompGetIgnoreCase() {
     return SendMsg(2116, 0, 0) != 0;
 }
 
+// Display a list of strings and send notification when user chooses one.
+void wxStyledTextCtrl::UserListShow(int listType, const wxString& itemList) {
+    SendMsg(2117, listType, (long)itemList.c_str());
+}
+
+// Set whether or not autocompletion is hidden automatically when nothing matches
+void wxStyledTextCtrl::AutoCompSetAutoHide(bool autoHide) {
+    SendMsg(2118, autoHide, 0);
+}
+
+// Retrieve whether or not autocompletion is hidden automatically when nothing matches
+bool wxStyledTextCtrl::AutoCompGetAutoHide() {
+    return SendMsg(2119, 0, 0) != 0;
+}
+
 // Set the number of spaces used for one level of indentation.
 void wxStyledTextCtrl::SetIndent(int indentSize) {
     SendMsg(2122, indentSize, 0);
@@ -938,8 +997,8 @@ int wxStyledTextCtrl::GetLineCount() {
 }
 
 // Sets the size in pixels of the left margin.
-void wxStyledTextCtrl::SetMarginLeft(int width) {
-    SendMsg(2155, 0, width);
+void wxStyledTextCtrl::SetMarginLeft(int pixelWidth) {
+    SendMsg(2155, 0, pixelWidth);
 }
 
 // Returns the size in pixels of the left margin.
@@ -948,8 +1007,8 @@ int wxStyledTextCtrl::GetMarginLeft() {
 }
 
 // Sets the size in pixels of the right margin.
-void wxStyledTextCtrl::SetMarginRight(int width) {
-    SendMsg(2157, 0, width);
+void wxStyledTextCtrl::SetMarginRight(int pixelWidth) {
+    SendMsg(2157, 0, pixelWidth);
 }
 
 // Returns the size in pixels of the right margin.
@@ -1105,6 +1164,76 @@ bool wxStyledTextCtrl::GetOvertype() {
     return SendMsg(2187, 0, 0) != 0;
 }
 
+// Set the width of the insert mode caret
+void wxStyledTextCtrl::SetCaretWidth(int pixelWidth) {
+    SendMsg(2188, pixelWidth, 0);
+}
+
+// Returns the width of the insert mode caret
+int wxStyledTextCtrl::GetCaretWidth() {
+    return SendMsg(2189, 0, 0);
+}
+
+// Sets the position that starts the target which is used for updating the
+// document without affecting the scroll position.
+void wxStyledTextCtrl::SetTargetStart(int pos) {
+    SendMsg(2190, pos, 0);
+}
+
+// Get the position that starts the target.
+int wxStyledTextCtrl::GetTargetStart() {
+    return SendMsg(2191, 0, 0);
+}
+
+// Sets the position that ends the target which is used for updating the
+// document without affecting the scroll position.
+void wxStyledTextCtrl::SetTargetEnd(int pos) {
+    SendMsg(2192, pos, 0);
+}
+
+// Get the position that ends the target.
+int wxStyledTextCtrl::GetTargetEnd() {
+    return SendMsg(2193, 0, 0);
+}
+
+// Replace the target text with the argument text.
+// Returns the length of the replacement text.
+
+                       int wxStyledTextCtrl::ReplaceTarget(const wxString& text) {
+                           return SendMsg(2194, text.Len(), (long)text.c_str());
+                       
+}
+
+// Replace the target text with the argument text after \d processing.
+// 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
+// caused by processing the \d patterns.
+
+                       int wxStyledTextCtrl::ReplaceTargetRE(const wxString& text) {
+                           return SendMsg(2195, text.Len(), (long)text.c_str());
+                       
+}
+
+// Search for a counted string in the target and set the target to the found
+// range.
+// Returns length of range or -1 for failure in which case target is not moved.
+
+                       int wxStyledTextCtrl::SearchInTarget(const wxString& text) {
+                           return SendMsg(2197, text.Len(), (long)text.c_str());
+                       
+}
+
+// Set the search flags used by SearchInTarget
+void wxStyledTextCtrl::SetSearchFlags(int flags) {
+    SendMsg(2198, flags, 0);
+}
+
+// Get the search flags used by SearchInTarget
+int wxStyledTextCtrl::GetSearchFlags() {
+    return SendMsg(2199, 0, 0);
+}
+
 // Show a call tip containing a definition near position pos.
 void wxStyledTextCtrl::CallTipShow(int pos, const wxString& definition) {
     SendMsg(2200, pos, (long)definition.c_str());
@@ -1207,6 +1336,47 @@ void wxStyledTextCtrl::SetFoldFlags(int flags) {
     SendMsg(2233, flags, 0);
 }
 
+// Ensure a particular line is visible by expanding any header line hiding it.
+// Use the currently set visibility policy to determine which range to display.
+void wxStyledTextCtrl::EnsureVisibleEnforcePolicy(int line) {
+    SendMsg(2234, line, 0);
+}
+
+// Sets whether a tab pressed when caret is within indentation indents
+void wxStyledTextCtrl::SetTabIndents(bool tabIndents) {
+    SendMsg(2260, tabIndents, 0);
+}
+
+// Does a tab pressed when caret is within indentation indent?
+bool wxStyledTextCtrl::GetTabIndents() {
+    return SendMsg(2261, 0, 0) != 0;
+}
+
+// Sets whether a backspace pressed when caret is within indentation unindents
+void wxStyledTextCtrl::SetBackSpaceUnIndents(bool bsUnIndents) {
+    SendMsg(2262, bsUnIndents, 0);
+}
+
+// Does a backspace pressed when caret is within indentation unindent?
+bool wxStyledTextCtrl::GetBackSpaceUnIndents() {
+    return SendMsg(2263, 0, 0) != 0;
+}
+
+// Sets the time the mouse must sit still to generate a mouse dwell event
+void wxStyledTextCtrl::SetMouseDwellTime(int periodMilliseconds) {
+    SendMsg(2264, periodMilliseconds, 0);
+}
+
+// Retrieve the time the mouse must sit still to generate a mouse dwell event
+int wxStyledTextCtrl::GetMouseDwellTime() {
+    return SendMsg(2265, 0, 0);
+}
+
+// Move the caret inside current view if it's not there already
+void wxStyledTextCtrl::MoveCaretInsideView() {
+    SendMsg(2401, 0, 0);
+}
+
 // How many characters are on a line, not including end of line characters.
 int wxStyledTextCtrl::LineLength(int line) {
     return SendMsg(2350, line, 0);
@@ -1244,7 +1414,7 @@ void* wxStyledTextCtrl::GetDocPointer() {
 
 // Change the document object used.
 void wxStyledTextCtrl::SetDocPointer(void* docPointer) {
-                           SendMsg(2358, (long)docPointer);
+                           SendMsg(2358, 0, (long)docPointer);
 }
 
 // Set which document modification events are sent to the container.
@@ -1291,11 +1461,13 @@ void wxStyledTextCtrl::SearchAnchor() {
 }
 
 // Find some text starting at the search anchor.
+// Does not ensure the selection is visible.
 int wxStyledTextCtrl::SearchNext(int flags, const wxString& text) {
     return SendMsg(2367, flags, (long)text.c_str());
 }
 
 // Find some text starting at the search anchor and moving backwards.
+// Does not ensure the selection is visible.
 int wxStyledTextCtrl::SearchPrev(int flags, const wxString& text) {
     return SendMsg(2368, flags, (long)text.c_str());
 }
@@ -1353,6 +1525,81 @@ int wxStyledTextCtrl::GetModEventMask() {
     return SendMsg(2378, 0, 0);
 }
 
+// Change internal focus flag
+void wxStyledTextCtrl::SetFocus(bool focus) {
+    SendMsg(2380, focus, 0);
+}
+
+// Get internal focus flag
+bool wxStyledTextCtrl::GetFocus() {
+    return SendMsg(2381, 0, 0) != 0;
+}
+
+// Change error status - 0 = OK
+void wxStyledTextCtrl::SetStatus(int statusCode) {
+    SendMsg(2382, statusCode, 0);
+}
+
+// Get error status
+int wxStyledTextCtrl::GetStatus() {
+    return SendMsg(2383, 0, 0);
+}
+
+// Set whether the mouse is captured when its button is pressed
+void wxStyledTextCtrl::SetMouseDownCaptures(bool captures) {
+    SendMsg(2384, captures, 0);
+}
+
+// Get whether mouse gets captured
+bool wxStyledTextCtrl::GetMouseDownCaptures() {
+    return SendMsg(2385, 0, 0) != 0;
+}
+
+// Sets the cursor to one of the SC_CURSOR* values
+void wxStyledTextCtrl::SetCursor(int cursorType) {
+    SendMsg(2386, cursorType, 0);
+}
+
+// Get cursor type
+int wxStyledTextCtrl::GetCursor() {
+    return SendMsg(2387, 0, 0);
+}
+
+// Move to the previous change in capitalistion
+void wxStyledTextCtrl::WordPartLeft() {
+    SendMsg(2390, 0, 0);
+}
+
+// Move to the previous change in capitalistion extending selection to new caret position.
+void wxStyledTextCtrl::WordPartLeftExtend() {
+    SendMsg(2391, 0, 0);
+}
+
+// Move to the change next in capitalistion
+void wxStyledTextCtrl::WordPartRight() {
+    SendMsg(2392, 0, 0);
+}
+
+// Move to the next change in capitalistion extending selection to new caret position.
+void wxStyledTextCtrl::WordPartRightExtend() {
+    SendMsg(2393, 0, 0);
+}
+
+// Set the way the display area is determined when a particular line is to be moved to.
+void wxStyledTextCtrl::SetVisiblePolicy(int visiblePolicy, int visibleSlop) {
+    SendMsg(2394, visiblePolicy, visibleSlop);
+}
+
+// Delete back from the current position to the start of the line
+void wxStyledTextCtrl::DelLineLeft() {
+    SendMsg(2395, 0, 0);
+}
+
+// Delete forwards from the current position to the end of the line
+void wxStyledTextCtrl::DelLineRight() {
+    SendMsg(2396, 0, 0);
+}
+
 // Start notifying the container of all key presses and commands.
 void wxStyledTextCtrl::StartRecord() {
     SendMsg(3001, 0, 0);
@@ -1388,6 +1635,11 @@ void wxStyledTextCtrl::SetKeyWords(int keywordSet, const wxString& keyWords) {
     SendMsg(4005, keywordSet, (long)keyWords.c_str());
 }
 
+// Set the lexing language of the document based on string name.
+void wxStyledTextCtrl::SetLexerLanguage(const wxString& language) {
+    SendMsg(4006, 0, (long)language.c_str());
+}
+
 // END of generated section
 //----------------------------------------------------------------------
 
@@ -1560,8 +1812,9 @@ void wxStyledTextCtrl::OnMouseLeftUp(wxMouseEvent& evt) {
 }
 
 
-void wxStyledTextCtrl::OnMouseRightUp(wxMouseEvent& evt) {
+void wxStyledTextCtrl::OnContextMenu(wxContextMenuEvent& evt) {
     wxPoint pt = evt.GetPosition();
+    ScreenToClient(&pt.x, &pt.y);
     m_swx->DoContextMenu(Point(pt.x, pt.y));
 }
 
@@ -1569,7 +1822,8 @@ void wxStyledTextCtrl::OnMouseRightUp(wxMouseEvent& evt) {
 void wxStyledTextCtrl::OnMouseWheel(wxMouseEvent& evt) {
     m_swx->DoMouseWheel(evt.GetWheelRotation(),
                         evt.GetWheelDelta(),
-                        evt.GetLinesPerAction());
+                        evt.GetLinesPerAction(),
+                        evt.ControlDown());
 }
 
 
@@ -1588,10 +1842,14 @@ void wxStyledTextCtrl::OnChar(wxKeyEvent& evt) {
 
 void wxStyledTextCtrl::OnKeyDown(wxKeyEvent& evt) {
     long key = evt.KeyCode();
-    key = toupper(key);
-    int processed = m_swx->DoKeyDown(key, evt.ShiftDown(),
-                                     evt.ControlDown(), evt.AltDown());
-    if (! processed)
+    //key = toupper(key);  //**** ????
+    bool consumed = FALSE;
+    int processed = m_swx->DoKeyDown(key,
+                                     evt.ShiftDown(),
+                                     evt.ControlDown(),
+                                     evt.AltDown(),
+                                     &consumed);
+    if (!processed && !consumed)
         evt.Skip();
 }
 
@@ -1634,73 +1892,110 @@ void wxStyledTextCtrl::NotifyChange() {
 
 void wxStyledTextCtrl::NotifyParent(SCNotification* _scn) {
     SCNotification& scn = *_scn;
-    int eventType = 0;
+    wxStyledTextEvent evt(0, GetId());
+
+    evt.SetPosition(scn.position);
+    evt.SetKey(scn.ch);
+    evt.SetModifiers(scn.modifiers);
+
     switch (scn.nmhdr.code) {
     case SCN_STYLENEEDED:
-        eventType = wxEVT_STC_STYLENEEDED;
+        evt.SetEventType(wxEVT_STC_STYLENEEDED);
         break;
+
     case SCN_CHARADDED:
-        eventType = wxEVT_STC_CHARADDED;
-        break;
-    case SCN_UPDATEUI:
-        eventType = wxEVT_STC_UPDATEUI;
+        evt.SetEventType(wxEVT_STC_CHARADDED);
         break;
+
     case SCN_SAVEPOINTREACHED:
-        eventType = wxEVT_STC_SAVEPOINTREACHED;
+        evt.SetEventType(wxEVT_STC_SAVEPOINTREACHED);
         break;
+
     case SCN_SAVEPOINTLEFT:
-        eventType = wxEVT_STC_SAVEPOINTLEFT;
+        evt.SetEventType(wxEVT_STC_SAVEPOINTLEFT);
         break;
+
     case SCN_MODIFYATTEMPTRO:
-        eventType = wxEVT_STC_ROMODIFYATTEMPT;
+        evt.SetEventType(wxEVT_STC_ROMODIFYATTEMPT);
         break;
+
+    case SCN_KEY:
+        evt.SetEventType(wxEVT_STC_KEY);
+        break;
+
     case SCN_DOUBLECLICK:
-        eventType = wxEVT_STC_DOUBLECLICK;
+        evt.SetEventType(wxEVT_STC_DOUBLECLICK);
         break;
-    case SCN_MODIFIED:
-        eventType = wxEVT_STC_MODIFIED;
+
+    case SCN_UPDATEUI:
+        evt.SetEventType(wxEVT_STC_UPDATEUI);
         break;
-    case SCN_KEY:
-        eventType = wxEVT_STC_KEY;
+
+    case SCN_MODIFIED:
+        evt.SetEventType(wxEVT_STC_MODIFIED);
+        evt.SetModificationType(scn.modificationType);
+        if (scn.text)
+            evt.SetText(wxString(scn.text, scn.length));
+        evt.SetLength(scn.length);
+        evt.SetLinesAdded(scn.linesAdded);
+        evt.SetLine(scn.line);
+        evt.SetFoldLevelNow(scn.foldLevelNow);
+        evt.SetFoldLevelPrev(scn.foldLevelPrev);
         break;
+
     case SCN_MACRORECORD:
-        eventType = wxEVT_STC_MACRORECORD;
+        evt.SetEventType(wxEVT_STC_MACRORECORD);
+        evt.SetMessage(scn.message);
+        evt.SetWParam(scn.wParam);
+        evt.SetLParam(scn.lParam);
         break;
+
     case SCN_MARGINCLICK:
-        eventType = wxEVT_STC_MARGINCLICK;
+        evt.SetEventType(wxEVT_STC_MARGINCLICK);
+        evt.SetMargin(scn.margin);
         break;
+
     case SCN_NEEDSHOWN:
-        eventType = wxEVT_STC_NEEDSHOWN;
+        evt.SetEventType(wxEVT_STC_NEEDSHOWN);
+        evt.SetLength(scn.length);
         break;
+
     case SCN_POSCHANGED:
-        eventType = wxEVT_STC_POSCHANGED;
+        evt.SetEventType(wxEVT_STC_POSCHANGED);
         break;
-    }
-    if (eventType) {
-        wxStyledTextEvent evt(eventType, GetId());
-        evt.SetPosition(scn.position);
-        evt.SetKey(scn.ch);
-        evt.SetModifiers(scn.modifiers);
-        if (eventType == wxEVT_STC_MODIFIED) {
-            evt.SetModificationType(scn.modificationType);
-            if (scn.text)
-                evt.SetText(wxString(scn.text, scn.length));
-            evt.SetLength(scn.length);
-            evt.SetLinesAdded(scn.linesAdded);
-            evt.SetLine(scn.line);
-            evt.SetFoldLevelNow(scn.foldLevelNow);
-            evt.SetFoldLevelPrev(scn.foldLevelPrev);
-        }
-        if (eventType == wxEVT_STC_MARGINCLICK)
-            evt.SetMargin(scn.margin);
-        if (eventType == wxEVT_STC_MACRORECORD) {
-            evt.SetMessage(scn.message);
-            evt.SetWParam(scn.wParam);
-            evt.SetLParam(scn.lParam);
-        }
 
-        GetEventHandler()->ProcessEvent(evt);
+    case SCN_PAINTED:
+        evt.SetEventType(wxEVT_STC_PAINTED);
+        break;
+
+    case SCN_USERLISTSELECTION:
+        evt.SetEventType(wxEVT_STC_USERLISTSELECTION);
+        evt.SetListType(scn.listType);
+        evt.SetText(scn.text);
+        break;
+
+    case SCN_URIDROPPED:
+        evt.SetEventType(wxEVT_STC_URIDROPPED);
+        evt.SetText(scn.text);
+        break;
+
+    case SCN_DWELLSTART:
+        evt.SetEventType(wxEVT_STC_DWELLSTART);
+        evt.SetX(scn.x);
+        evt.SetY(scn.y);
+        break;
+
+    case SCN_DWELLEND:
+        evt.SetEventType(wxEVT_STC_DWELLEND);
+        evt.SetX(scn.x);
+        evt.SetY(scn.y);
+        break;
+
+    default:
+        return;
     }
+
+    GetEventHandler()->ProcessEvent(evt);
 }
 
 
@@ -1725,8 +2020,9 @@ wxStyledTextEvent::wxStyledTextEvent(wxEventType commandType, int id)
     m_message = 0;
     m_wParam = 0;
     m_lParam = 0;
-
-
+    m_listType = 0;
+    m_x = 0;
+    m_y = 0;
 }
 
 bool wxStyledTextEvent::GetShift() const { return (m_modifiers & SCI_SHIFT) != 0; }
@@ -1754,7 +2050,9 @@ void wxStyledTextEvent::CopyObject(wxObject& obj) const {
     o->m_wParam =        m_wParam;
     o->m_lParam =        m_lParam;
 
-
+    o->m_listType =     m_listType;
+    o->m_x =            m_x;
+    o->m_y =            m_y;
 
 }
 
diff --git a/contrib/src/stc/stc.cpp.in b/contrib/src/stc/stc.cpp.in
index 890c97ab8a..65c88c28fb 100644
--- a/contrib/src/stc/stc.cpp.in
+++ b/contrib/src/stc/stc.cpp.in
@@ -28,31 +28,37 @@
 
 int wxForceScintillaLexers(void)
 {
+  extern LexerModule lmAda;
+  extern LexerModule lmAVE;
+  extern LexerModule lmConf;
   extern LexerModule lmCPP;
+  extern LexerModule lmEiffel;
   extern LexerModule lmHTML;
-  extern LexerModule lmXML;
-  extern LexerModule lmProps;
-  extern LexerModule lmErrorList;
-  extern LexerModule lmMake;
-  extern LexerModule lmBatch;
+  extern LexerModule lmLISP;
+  extern LexerModule lmLua;
+  extern LexerModule lmBatch;  // In LexOthers.cxx
+  extern LexerModule lmPascal;
   extern LexerModule lmPerl;
   extern LexerModule lmPython;
+  extern LexerModule lmRuby;
   extern LexerModule lmSQL;
   extern LexerModule lmVB;
 
-  if (
-      &lmCPP
-      && &lmHTML
-      && &lmXML
-      && &lmProps
-      && &lmErrorList
-      && &lmMake
-      && &lmBatch
-      && &lmPerl
-      && &lmPython
-      && &lmSQL
-      && &lmVB
-      )
+  if (  &lmAda
+     && &lmAVE
+     && &lmConf
+     && &lmCPP
+     && &lmEiffel
+     && &lmHTML
+     && &lmLISP
+     && &lmLua
+     && &lmBatch
+     && &lmPascal
+     && &lmPerl
+     && &lmPython
+     && &lmRuby
+     && &lmSQL
+     && &lmVB )
     {
       return 1;
     }
@@ -66,21 +72,27 @@ int wxForceScintillaLexers(void)
 
 const wxChar* wxSTCNameStr = "stcwindow";
 
-
 DEFINE_EVENT_TYPE( wxEVT_STC_CHANGE )
 DEFINE_EVENT_TYPE( wxEVT_STC_STYLENEEDED )
 DEFINE_EVENT_TYPE( wxEVT_STC_CHARADDED )
-DEFINE_EVENT_TYPE( wxEVT_STC_UPDATEUI )
 DEFINE_EVENT_TYPE( wxEVT_STC_SAVEPOINTREACHED )
 DEFINE_EVENT_TYPE( wxEVT_STC_SAVEPOINTLEFT )
 DEFINE_EVENT_TYPE( wxEVT_STC_ROMODIFYATTEMPT )
+DEFINE_EVENT_TYPE( wxEVT_STC_KEY )
 DEFINE_EVENT_TYPE( wxEVT_STC_DOUBLECLICK )
+DEFINE_EVENT_TYPE( wxEVT_STC_UPDATEUI )
 DEFINE_EVENT_TYPE( wxEVT_STC_MODIFIED )
-DEFINE_EVENT_TYPE( wxEVT_STC_KEY )
 DEFINE_EVENT_TYPE( wxEVT_STC_MACRORECORD )
 DEFINE_EVENT_TYPE( wxEVT_STC_MARGINCLICK )
 DEFINE_EVENT_TYPE( wxEVT_STC_NEEDSHOWN )
 DEFINE_EVENT_TYPE( wxEVT_STC_POSCHANGED )
+DEFINE_EVENT_TYPE( wxEVT_STC_PAINTED )
+DEFINE_EVENT_TYPE( wxEVT_STC_USERLISTSELECTION )
+DEFINE_EVENT_TYPE( wxEVT_STC_URIDROPPED )
+DEFINE_EVENT_TYPE( wxEVT_STC_DWELLSTART )
+DEFINE_EVENT_TYPE( wxEVT_STC_DWELLEND )
+
+
 
 
 BEGIN_EVENT_TABLE(wxStyledTextCtrl, wxControl)
@@ -94,7 +106,7 @@ BEGIN_EVENT_TABLE(wxStyledTextCtrl, wxControl)
 #endif
     EVT_MOTION                  (wxStyledTextCtrl::OnMouseMove)
     EVT_LEFT_UP                 (wxStyledTextCtrl::OnMouseLeftUp)
-    EVT_RIGHT_UP                (wxStyledTextCtrl::OnMouseRightUp)
+    EVT_CONTEXT_MENU            (wxStyledTextCtrl::OnContextMenu)
     EVT_MOUSEWHEEL              (wxStyledTextCtrl::OnMouseWheel)
     EVT_CHAR                    (wxStyledTextCtrl::OnChar)
     EVT_KEY_DOWN                (wxStyledTextCtrl::OnKeyDown)
@@ -350,8 +362,9 @@ void wxStyledTextCtrl::OnMouseLeftUp(wxMouseEvent& evt) {
 }
 
 
-void wxStyledTextCtrl::OnMouseRightUp(wxMouseEvent& evt) {
+void wxStyledTextCtrl::OnContextMenu(wxContextMenuEvent& evt) {
     wxPoint pt = evt.GetPosition();
+    ScreenToClient(&pt.x, &pt.y);
     m_swx->DoContextMenu(Point(pt.x, pt.y));
 }
 
@@ -359,7 +372,8 @@ void wxStyledTextCtrl::OnMouseRightUp(wxMouseEvent& evt) {
 void wxStyledTextCtrl::OnMouseWheel(wxMouseEvent& evt) {
     m_swx->DoMouseWheel(evt.GetWheelRotation(),
                         evt.GetWheelDelta(),
-                        evt.GetLinesPerAction());
+                        evt.GetLinesPerAction(),
+                        evt.ControlDown());
 }
 
 
@@ -378,10 +392,14 @@ void wxStyledTextCtrl::OnChar(wxKeyEvent& evt) {
 
 void wxStyledTextCtrl::OnKeyDown(wxKeyEvent& evt) {
     long key = evt.KeyCode();
-    key = toupper(key);
-    int processed = m_swx->DoKeyDown(key, evt.ShiftDown(),
-                                     evt.ControlDown(), evt.AltDown());
-    if (! processed)
+    //key = toupper(key);  //**** ????
+    bool consumed = FALSE;
+    int processed = m_swx->DoKeyDown(key,
+                                     evt.ShiftDown(),
+                                     evt.ControlDown(),
+                                     evt.AltDown(),
+                                     &consumed);
+    if (!processed && !consumed)
         evt.Skip();
 }
 
@@ -424,73 +442,110 @@ void wxStyledTextCtrl::NotifyChange() {
 
 void wxStyledTextCtrl::NotifyParent(SCNotification* _scn) {
     SCNotification& scn = *_scn;
-    int eventType = 0;
+    wxStyledTextEvent evt(0, GetId());
+
+    evt.SetPosition(scn.position);
+    evt.SetKey(scn.ch);
+    evt.SetModifiers(scn.modifiers);
+
     switch (scn.nmhdr.code) {
     case SCN_STYLENEEDED:
-        eventType = wxEVT_STC_STYLENEEDED;
+        evt.SetEventType(wxEVT_STC_STYLENEEDED);
         break;
+
     case SCN_CHARADDED:
-        eventType = wxEVT_STC_CHARADDED;
-        break;
-    case SCN_UPDATEUI:
-        eventType = wxEVT_STC_UPDATEUI;
+        evt.SetEventType(wxEVT_STC_CHARADDED);
         break;
+
     case SCN_SAVEPOINTREACHED:
-        eventType = wxEVT_STC_SAVEPOINTREACHED;
+        evt.SetEventType(wxEVT_STC_SAVEPOINTREACHED);
         break;
+
     case SCN_SAVEPOINTLEFT:
-        eventType = wxEVT_STC_SAVEPOINTLEFT;
+        evt.SetEventType(wxEVT_STC_SAVEPOINTLEFT);
         break;
+
     case SCN_MODIFYATTEMPTRO:
-        eventType = wxEVT_STC_ROMODIFYATTEMPT;
+        evt.SetEventType(wxEVT_STC_ROMODIFYATTEMPT);
+        break;
+
+    case SCN_KEY:
+        evt.SetEventType(wxEVT_STC_KEY);
         break;
+
     case SCN_DOUBLECLICK:
-        eventType = wxEVT_STC_DOUBLECLICK;
+        evt.SetEventType(wxEVT_STC_DOUBLECLICK);
         break;
-    case SCN_MODIFIED:
-        eventType = wxEVT_STC_MODIFIED;
+
+    case SCN_UPDATEUI:
+        evt.SetEventType(wxEVT_STC_UPDATEUI);
         break;
-    case SCN_KEY:
-        eventType = wxEVT_STC_KEY;
+
+    case SCN_MODIFIED:
+        evt.SetEventType(wxEVT_STC_MODIFIED);
+        evt.SetModificationType(scn.modificationType);
+        if (scn.text)
+            evt.SetText(wxString(scn.text, scn.length));
+        evt.SetLength(scn.length);
+        evt.SetLinesAdded(scn.linesAdded);
+        evt.SetLine(scn.line);
+        evt.SetFoldLevelNow(scn.foldLevelNow);
+        evt.SetFoldLevelPrev(scn.foldLevelPrev);
         break;
+
     case SCN_MACRORECORD:
-        eventType = wxEVT_STC_MACRORECORD;
+        evt.SetEventType(wxEVT_STC_MACRORECORD);
+        evt.SetMessage(scn.message);
+        evt.SetWParam(scn.wParam);
+        evt.SetLParam(scn.lParam);
         break;
+
     case SCN_MARGINCLICK:
-        eventType = wxEVT_STC_MARGINCLICK;
+        evt.SetEventType(wxEVT_STC_MARGINCLICK);
+        evt.SetMargin(scn.margin);
         break;
+
     case SCN_NEEDSHOWN:
-        eventType = wxEVT_STC_NEEDSHOWN;
+        evt.SetEventType(wxEVT_STC_NEEDSHOWN);
+        evt.SetLength(scn.length);
         break;
+
     case SCN_POSCHANGED:
-        eventType = wxEVT_STC_POSCHANGED;
+        evt.SetEventType(wxEVT_STC_POSCHANGED);
+        break;
+
+    case SCN_PAINTED:
+        evt.SetEventType(wxEVT_STC_PAINTED);
+        break;
+
+    case SCN_USERLISTSELECTION:
+        evt.SetEventType(wxEVT_STC_USERLISTSELECTION);
+        evt.SetListType(scn.listType);
+        evt.SetText(scn.text);
         break;
-    }
-    if (eventType) {
-        wxStyledTextEvent evt(eventType, GetId());
-        evt.SetPosition(scn.position);
-        evt.SetKey(scn.ch);
-        evt.SetModifiers(scn.modifiers);
-        if (eventType == wxEVT_STC_MODIFIED) {
-            evt.SetModificationType(scn.modificationType);
-            if (scn.text)
-                evt.SetText(wxString(scn.text, scn.length));
-            evt.SetLength(scn.length);
-            evt.SetLinesAdded(scn.linesAdded);
-            evt.SetLine(scn.line);
-            evt.SetFoldLevelNow(scn.foldLevelNow);
-            evt.SetFoldLevelPrev(scn.foldLevelPrev);
-        }
-        if (eventType == wxEVT_STC_MARGINCLICK)
-            evt.SetMargin(scn.margin);
-        if (eventType == wxEVT_STC_MACRORECORD) {
-            evt.SetMessage(scn.message);
-            evt.SetWParam(scn.wParam);
-            evt.SetLParam(scn.lParam);
-        }
 
-        GetEventHandler()->ProcessEvent(evt);
+    case SCN_URIDROPPED:
+        evt.SetEventType(wxEVT_STC_URIDROPPED);
+        evt.SetText(scn.text);
+        break;
+
+    case SCN_DWELLSTART:
+        evt.SetEventType(wxEVT_STC_DWELLSTART);
+        evt.SetX(scn.x);
+        evt.SetY(scn.y);
+        break;
+
+    case SCN_DWELLEND:
+        evt.SetEventType(wxEVT_STC_DWELLEND);
+        evt.SetX(scn.x);
+        evt.SetY(scn.y);
+        break;
+
+    default:
+        return;
     }
+
+    GetEventHandler()->ProcessEvent(evt);
 }
 
 
@@ -515,8 +570,9 @@ wxStyledTextEvent::wxStyledTextEvent(wxEventType commandType, int id)
     m_message = 0;
     m_wParam = 0;
     m_lParam = 0;
-
-
+    m_listType = 0;
+    m_x = 0;
+    m_y = 0;
 }
 
 bool wxStyledTextEvent::GetShift() const { return (m_modifiers & SCI_SHIFT) != 0; }
@@ -544,7 +600,9 @@ void wxStyledTextEvent::CopyObject(wxObject& obj) const {
     o->m_wParam =        m_wParam;
     o->m_lParam =        m_lParam;
 
-
+    o->m_listType =     m_listType;
+    o->m_x =            m_x;
+    o->m_y =            m_y;
 
 }
 
diff --git a/contrib/src/stc/stc.h.in b/contrib/src/stc/stc.h.in
index bab374459a..a742614327 100644
--- a/contrib/src/stc/stc.h.in
+++ b/contrib/src/stc/stc.h.in
@@ -141,6 +141,10 @@ public:
     // Scroll enough to make the given column visible
     void ScrollToColumn(int column);
 
+
+    // Send a message to Scintilla
+    long SendMsg(int msg, long wp=0, long lp=0);
+
 //----------------------------------------------------------------------
 
 
@@ -153,7 +157,7 @@ private:
     void OnMouseLeftDown(wxMouseEvent& evt);
     void OnMouseMove(wxMouseEvent& evt);
     void OnMouseLeftUp(wxMouseEvent& evt);
-    void OnMouseRightUp(wxMouseEvent& evt);
+    void OnContextMenu(wxContextMenuEvent& evt);
     void OnMouseWheel(wxMouseEvent& evt);
     void OnChar(wxKeyEvent& evt);
     void OnKeyDown(wxKeyEvent& evt);
@@ -169,8 +173,6 @@ private:
     void NotifyChange();
     void NotifyParent(SCNotification* scn);
 
-    long SendMsg(int msg, long wp=0, long lp=0);
-
 private:
     DECLARE_EVENT_TABLE()
     DECLARE_CLASS(wxStyledTextCtrl)
@@ -205,6 +207,9 @@ public:
     void SetMessage(int val)         { m_message = val; }
     void SetWParam(int val)          { m_wParam = val; }
     void SetLParam(int val)          { m_lParam = val; }
+    void SetListType(int val)        { m_listType = val; }
+    void SetX(int val)               { m_x = val; }
+    void SetY(int val)               { m_y = val; }
 
     int  GetPosition() const         { return m_position; }
     int  GetKey()  const             { return m_key; }
@@ -220,6 +225,9 @@ public:
     int  GetMessage() const          { return m_message; }
     int  GetWParam() const           { return m_wParam; }
     int  GetLParam() const           { return m_lParam; }
+    int  GetListType() const         { return m_listType; }
+    int  GetX() const                { return m_x; }
+    int  GetY() const                { return m_y; }
 
     bool GetShift() const;
     bool GetControl() const;
@@ -248,42 +256,56 @@ private:
     int  m_message;             // wxEVT_STC_MACRORECORD
     int  m_wParam;
     int  m_lParam;
+
+    int m_listType;
+    int m_x;
+    int m_y;
 #endif
 };
 
 #ifndef SWIG
 BEGIN_DECLARE_EVENT_TYPES()
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_CHANGE, 1650)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_STYLENEEDED, 1651)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_CHARADDED, 1652)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_UPDATEUI, 1653)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_SAVEPOINTREACHED, 1654)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_SAVEPOINTLEFT, 1655)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_ROMODIFYATTEMPT, 1656)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_DOUBLECLICK, 1657)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_MODIFIED, 1658)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_KEY, 1659)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_MACRORECORD, 1660)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_MARGINCLICK, 1661)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_NEEDSHOWN, 1662)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_POSCHANGED, 1663)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_CHANGE,                  1650)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_STYLENEEDED,             1651)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_CHARADDED,               1652)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_SAVEPOINTREACHED,        1653)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_SAVEPOINTLEFT,           1654)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_ROMODIFYATTEMPT,         1655)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_KEY,                     1656)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_DOUBLECLICK,             1657)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_UPDATEUI,                1658)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_MODIFIED,                1659)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_MACRORECORD,             1660)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_MARGINCLICK,             1661)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_NEEDSHOWN,               1662)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_POSCHANGED,              1663)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_PAINTED,                 1664)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_USERLISTSELECTION,       1665)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_URIDROPPED,              1666)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_DWELLSTART,              1667)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_DWELLEND,                1668)
 END_DECLARE_EVENT_TYPES()
 #else
     enum {
         wxEVT_STC_CHANGE,
         wxEVT_STC_STYLENEEDED,
         wxEVT_STC_CHARADDED,
-        wxEVT_STC_UPDATEUI,
         wxEVT_STC_SAVEPOINTREACHED,
         wxEVT_STC_SAVEPOINTLEFT,
         wxEVT_STC_ROMODIFYATTEMPT,
+        wxEVT_STC_KEY,
         wxEVT_STC_DOUBLECLICK,
+        wxEVT_STC_UPDATEUI,
         wxEVT_STC_MODIFIED,
-        wxEVT_STC_KEY,
         wxEVT_STC_MACRORECORD,
         wxEVT_STC_MARGINCLICK,
         wxEVT_STC_NEEDSHOWN,
-        wxEVT_STC_POSCHANGED
+        wxEVT_STC_POSCHANGED,
+        wxEVT_STC_PAINTED,
+        wxEVT_STC_USERLISTSELECTION,
+        wxEVT_STC_URIDROPPED,
+        wxEVT_STC_DWELLSTART,
+        wxEVT_STC_DWELLEND,
     };
 #endif
 
@@ -292,20 +314,26 @@ END_DECLARE_EVENT_TYPES()
 #ifndef SWIG
 typedef void (wxEvtHandler::*wxStyledTextEventFunction)(wxStyledTextEvent&);
 
-#define EVT_STC_CHANGE(id, fn)           DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_CHANGE, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_STYLENEEDED(id, fn)      DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_STYLENEEDED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_CHARADDED(id, fn)        DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_CHARADDED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_UPDATEUI(id, fn)         DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_UPDATEUI, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_SAVEPOINTREACHED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_SAVEPOINTREACHED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_SAVEPOINTLEFT(id, fn)    DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_SAVEPOINTLEFT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_ROMODIFYATTEMPT(id, fn)  DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_ROMODIFYATTEMPT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_DOUBLECLICK(id, fn)      DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DOUBLECLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_MODIFIED(id, fn)         DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MODIFIED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_KEY(id, fn)              DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_KEY, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_MACRORECORD(id, fn)      DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MACRORECORD, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_MARGINCLICK(id, fn)      DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MARGINCLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_NEEDSHOWN(id, fn)        DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_NEEDSHOWN, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_POSCHANGED(id, fn)       DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_POSCHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_CHANGE(id, fn)                  DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_CHANGE,                id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_STYLENEEDED(id, fn)             DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_STYLENEEDED,           id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_CHARADDED(id, fn)               DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_CHARADDED,             id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_SAVEPOINTREACHED(id, fn)        DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_SAVEPOINTREACHED,      id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_SAVEPOINTLEFT(id, fn)           DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_SAVEPOINTLEFT,         id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_ROMODIFYATTEMPT(id, fn)         DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_ROMODIFYATTEMPT,       id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_KEY(id, fn)                     DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_KEY,                   id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_DOUBLECLICK(id, fn)             DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DOUBLECLICK,           id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_UPDATEUI(id, fn)                DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_UPDATEUI,              id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_MODIFIED(id, fn)                DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MODIFIED,              id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_MACRORECORD(id, fn)             DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MACRORECORD,           id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_MARGINCLICK(id, fn)             DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MARGINCLICK,           id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_NEEDSHOWN(id, fn)               DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_NEEDSHOWN,             id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_POSCHANGED(id, fn)              DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_POSCHANGED,            id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_PAINTED(id, fn)                 DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_PAINTED,               id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_USERLISTSELECTION(id, fn)       DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_USERLISTSELECTION,     id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_URIDROPPED(id, fn)              DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_URIDROPPED,            id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_DWELLSTART(id, fn)              DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DWELLSTART,            id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_DWELLEND(id, fn)                DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DWELLEND,              id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+
 
 #endif
 
diff --git a/include/wx/stc/stc.h b/include/wx/stc/stc.h
index f9b26bdb8a..8dfe9a92f4 100644
--- a/include/wx/stc/stc.h
+++ b/include/wx/stc/stc.h
@@ -57,6 +57,28 @@
 #define wxSTC_MARK_ARROWDOWN 6
 #define wxSTC_MARK_MINUS 7
 #define wxSTC_MARK_PLUS 8
+
+// Shapes used for outlining column
+#define wxSTC_MARK_VLINE 9
+#define wxSTC_MARK_LCORNER 10
+#define wxSTC_MARK_TCORNER 11
+#define wxSTC_MARK_BOXPLUS 12
+#define wxSTC_MARK_BOXPLUSCONNECTED 13
+#define wxSTC_MARK_BOXMINUS 14
+#define wxSTC_MARK_BOXMINUSCONNECTED 15
+#define wxSTC_MARK_LCORNERCURVE 16
+#define wxSTC_MARK_TCORNERCURVE 17
+#define wxSTC_MARK_CIRCLEPLUS 18
+#define wxSTC_MARK_CIRCLEPLUSCONNECTED 19
+#define wxSTC_MARK_CIRCLEMINUS 20
+#define wxSTC_MARK_CIRCLEMINUSCONNECTED 21
+
+// Markers used for outlining column
+#define wxSTC_MARKNUM_FOLDEREND 25
+#define wxSTC_MARKNUM_FOLDEROPENMID 26
+#define wxSTC_MARKNUM_FOLDERMIDTAIL 27
+#define wxSTC_MARKNUM_FOLDERTAIL 28
+#define wxSTC_MARKNUM_FOLDERSUB 29
 #define wxSTC_MARKNUM_FOLDER 30
 #define wxSTC_MARKNUM_FOLDEROPEN 31
 #define wxSTC_MARGIN_SYMBOL 0
@@ -90,6 +112,9 @@
 #define wxSTC_CHARSET_ARABIC 178
 #define wxSTC_CHARSET_VIETNAMESE 163
 #define wxSTC_CHARSET_THAI 222
+#define wxSTC_CASE_MIXED 0
+#define wxSTC_CASE_UPPER 1
+#define wxSTC_CASE_LOWER 2
 #define wxSTC_INDIC_MAX 7
 #define wxSTC_INDIC_PLAIN 0
 #define wxSTC_INDIC_SQUIGGLE 1
@@ -109,12 +134,15 @@
 
 // PrintColourMode - force black text on white background for printing.
 #define wxSTC_PRINT_BLACKONWHITE 2
-#define wxSTC_FIND_DOWN 1
+
+// PrintColourMode - text stays coloured, but all background is forced to be white for printing.
+#define wxSTC_PRINT_COLOURONWHITE 3
+
+// PrintColourMode - only the default-background is forced to be white for printing.
+#define wxSTC_PRINT_COLOURONWHITEDEFAULTBG 4
 #define wxSTC_FIND_WHOLEWORD 2
 #define wxSTC_FIND_MATCHCASE 4
 #define wxSTC_FIND_WORDSTART 0x00100000
-
-// SCFIND_REGEXP is not yet implemented.
 #define wxSTC_FIND_REGEXP 0x00200000
 #define wxSTC_CMD_UNDO 2176
 #define wxSTC_CMD_CUT 2177
@@ -124,6 +152,7 @@
 #define wxSTC_FOLDLEVELWHITEFLAG 0x1000
 #define wxSTC_FOLDLEVELHEADERFLAG 0x2000
 #define wxSTC_FOLDLEVELNUMBERMASK 0x0FFF
+#define wxSTC_TIME_FOREVER 10000000
 #define wxSTC_CMD_LINEDOWN 2300
 #define wxSTC_CMD_LINEDOWNEXTEND 2301
 #define wxSTC_CMD_LINEUP 2302
@@ -173,15 +202,31 @@
 #define wxSTC_EDGE_BACKGROUND 2
 
 // Show caret within N lines of edge when it's scrolled to view
+// If CARET_SLOP not set then centre caret on screen when it's
+// scrolled to view
 #define wxSTC_CARET_SLOP 0x01
 
-// Center caret on screen when it's scrolled to view
+// Value not used
 #define wxSTC_CARET_CENTER 0x02
 
-// OR this with CARET_CENTER to reposition even when visible, or
-// OR this with CARET_SLOP to reposition whenever outside slop border
+// If CARET_SLOP also set then reposition whenever outside slop border
+// If CARET_SLOP not set then recentre even when visible
 #define wxSTC_CARET_STRICT 0x04
 
+// If CARET_XEVEN set then both left and right margins are given equal weight
+// rather than favouring left following behaviour.
+#define wxSTC_CARET_XEVEN 0x08
+
+// If CARET_XJUMPS set then when caret reaches the margin the display jumps
+// enough to leave the caret solidly within the display.
+#define wxSTC_CARET_XJUMPS 0x10
+#define wxSTC_CURSORNORMAL -1
+#define wxSTC_CURSORWAIT 3
+
+// Constants for use with SetVisiblePolicy, similar to SetCaretPolicy
+#define wxSTC_VISIBLE_SLOP 0x01
+#define wxSTC_VISIBLE_STRICT 0x04
+
 // Notifications
 // Type of modification and the action which caused the modification
 // These are defined as a bit mask to make it easy to specify which notifications are wanted.
@@ -241,6 +286,19 @@
 #define wxSTC_LEX_LATEX 14
 #define wxSTC_LEX_LUA 15
 #define wxSTC_LEX_DIFF 16
+#define wxSTC_LEX_CONF 17
+#define wxSTC_LEX_PASCAL 18
+#define wxSTC_LEX_AVE 19
+#define wxSTC_LEX_ADA 20
+#define wxSTC_LEX_LISP 21
+#define wxSTC_LEX_RUBY 22
+#define wxSTC_LEX_EIFFEL 23
+#define wxSTC_LEX_EIFFELKW 24
+#define wxSTC_LEX_TCL 25
+
+// When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
+// value assigned in sequence from SCLEX_AUTOMATIC+1.
+#define wxSTC_LEX_AUTOMATIC 1000
 
 // Lexical states for SCLEX_PYTHON
 #define wxSTC_P_DEFAULT 0
@@ -273,6 +331,9 @@
 #define wxSTC_C_IDENTIFIER 11
 #define wxSTC_C_STRINGEOL 12
 #define wxSTC_C_VERBATIM 13
+#define wxSTC_C_REGEX 14
+#define wxSTC_C_COMMENTLINEDOC 15
+#define wxSTC_C_WORD2 16
 
 // Lexical states for SCLEX_HTML, SCLEX_XML
 #define wxSTC_H_DEFAULT 0
@@ -300,6 +361,12 @@
 // More HTML
 #define wxSTC_H_VALUE 19
 
+// X-Code
+#define wxSTC_H_XCCOMMENT 20
+
+// SGML
+#define wxSTC_H_SGML 21
+
 // Embedded Javascript
 #define wxSTC_HJ_START 40
 #define wxSTC_HJ_DEFAULT 41
@@ -313,6 +380,7 @@
 #define wxSTC_HJ_SINGLESTRING 49
 #define wxSTC_HJ_SYMBOLS 50
 #define wxSTC_HJ_STRINGEOL 51
+#define wxSTC_HJ_REGEX 52
 
 // ASP Javascript
 #define wxSTC_HJA_START 55
@@ -327,6 +395,7 @@
 #define wxSTC_HJA_SINGLESTRING 64
 #define wxSTC_HJA_SYMBOLS 65
 #define wxSTC_HJA_STRINGEOL 66
+#define wxSTC_HJA_REGEX 67
 
 // Embedded VBScript
 #define wxSTC_HB_START 70
@@ -387,11 +456,12 @@
 #define wxSTC_HPHP_VARIABLE 123
 #define wxSTC_HPHP_COMMENT 124
 #define wxSTC_HPHP_COMMENTLINE 125
-#define wxSTC_HPHP_STRINGEOL 126
+#define wxSTC_HPHP_HSTRING_VARIABLE 126
+#define wxSTC_HPHP_OPERATOR 127
 
 // Lexical states for SCLEX_PERL
 #define wxSTC_PL_DEFAULT 0
-#define wxSTC_PL_HERE 1
+#define wxSTC_PL_ERROR 1
 #define wxSTC_PL_COMMENTLINE 2
 #define wxSTC_PL_POD 3
 #define wxSTC_PL_NUMBER 4
@@ -406,12 +476,20 @@
 #define wxSTC_PL_ARRAY 13
 #define wxSTC_PL_HASH 14
 #define wxSTC_PL_SYMBOLTABLE 15
-#define wxSTC_PL_REF 16
 #define wxSTC_PL_REGEX 17
 #define wxSTC_PL_REGSUBST 18
 #define wxSTC_PL_LONGQUOTE 19
 #define wxSTC_PL_BACKTICKS 20
 #define wxSTC_PL_DATASECTION 21
+#define wxSTC_PL_HERE_DELIM 22
+#define wxSTC_PL_HERE_Q 23
+#define wxSTC_PL_HERE_QQ 24
+#define wxSTC_PL_HERE_QX 25
+#define wxSTC_PL_STRING_Q 26
+#define wxSTC_PL_STRING_QQ 27
+#define wxSTC_PL_STRING_QX 28
+#define wxSTC_PL_STRING_QR 29
+#define wxSTC_PL_STRING_QW 30
 
 // Lexical states for SCLEX_LATEX
 #define wxSTC_L_DEFAULT 0
@@ -434,6 +512,8 @@
 #define wxSTC_LUA_OPERATOR 10
 #define wxSTC_LUA_IDENTIFIER 11
 #define wxSTC_LUA_STRINGEOL 12
+
+// Lexical states for SCLEX_ERRORLIST
 #define wxSTC_ERR_DEFAULT 0
 #define wxSTC_ERR_PYTHON 1
 #define wxSTC_ERR_GCC 2
@@ -441,6 +521,88 @@
 #define wxSTC_ERR_CMD 4
 #define wxSTC_ERR_BORLAND 5
 #define wxSTC_ERR_PERL 6
+#define wxSTC_ERR_NET 7
+#define wxSTC_ERR_LUA 8
+#define wxSTC_ERR_DIFF_CHANGED 10
+#define wxSTC_ERR_DIFF_ADDITION 11
+#define wxSTC_ERR_DIFF_DELETION 12
+#define wxSTC_ERR_DIFF_MESSAGE 13
+
+// Lexical states for SCLEX_BATCH
+#define wxSTC_BAT_DEFAULT 0
+#define wxSTC_BAT_COMMENT 1
+#define wxSTC_BAT_WORD 2
+#define wxSTC_BAT_LABEL 3
+#define wxSTC_BAT_HIDE 4
+#define wxSTC_BAT_COMMAND 5
+#define wxSTC_BAT_IDENTIFIER 6
+#define wxSTC_BAT_OPERATOR 7
+
+// Lexical states for SCLEX_MAKEFILE
+#define wxSTC_MAKE_DEFAULT 0
+#define wxSTC_MAKE_COMMENT 1
+#define wxSTC_MAKE_PREPROCESSOR 2
+#define wxSTC_MAKE_IDENTIFIER 3
+#define wxSTC_MAKE_OPERATOR 4
+#define wxSTC_MAKE_TARGET 5
+#define wxSTC_MAKE_IDEOL 9
+
+// Lexical states for the SCLEX_CONF (Apache Configuration Files Lexer)
+#define wxSTC_CONF_DEFAULT 0
+#define wxSTC_CONF_COMMENT 1
+#define wxSTC_CONF_NUMBER 2
+#define wxSTC_CONF_IDENTIFIER 3
+#define wxSTC_CONF_EXTENSION 4
+#define wxSTC_CONF_PARAMETER 5
+#define wxSTC_CONF_STRING 6
+#define wxSTC_CONF_OPERATOR 7
+#define wxSTC_CONF_IP 8
+#define wxSTC_CONF_DIRECTIVE 9
+
+// Avenue
+#define wxSTC_AVE_DEFAULT 0
+#define wxSTC_AVE_COMMENT 1
+#define wxSTC_AVE_NUMBER 2
+#define wxSTC_AVE_WORD 3
+#define wxSTC_AVE_KEYWORD 4
+#define wxSTC_AVE_STATEMENT 5
+#define wxSTC_AVE_STRING 6
+#define wxSTC_AVE_ENUM 7
+#define wxSTC_AVE_STRINGEOL 8
+#define wxSTC_AVE_IDENTIFIER 9
+#define wxSTC_AVE_OPERATOR 10
+
+// Lexical states for SCLEX_ADA
+#define wxSTC_ADA_DEFAULT 0
+#define wxSTC_ADA_COMMENT 1
+#define wxSTC_ADA_NUMBER 2
+#define wxSTC_ADA_WORD 3
+#define wxSTC_ADA_STRING 4
+#define wxSTC_ADA_CHARACTER 5
+#define wxSTC_ADA_OPERATOR 6
+#define wxSTC_ADA_IDENTIFIER 7
+#define wxSTC_ADA_STRINGEOL 8
+
+// Lexical states for SCLEX_LISP
+#define wxSTC_LISP_DEFAULT 0
+#define wxSTC_LISP_COMMENT 1
+#define wxSTC_LISP_NUMBER 2
+#define wxSTC_LISP_KEYWORD 3
+#define wxSTC_LISP_STRING 6
+#define wxSTC_LISP_STRINGEOL 8
+#define wxSTC_LISP_IDENTIFIER 9
+#define wxSTC_LISP_OPERATOR 10
+
+// Lexical states for SCLEX_EIFFEL and SCLEX_EIFFELKW
+#define wxSTC_EIFFEL_DEFAULT 0
+#define wxSTC_EIFFEL_COMMENTLINE 1
+#define wxSTC_EIFFEL_NUMBER 2
+#define wxSTC_EIFFEL_WORD 3
+#define wxSTC_EIFFEL_STRING 4
+#define wxSTC_EIFFEL_CHARACTER 5
+#define wxSTC_EIFFEL_OPERATOR 6
+#define wxSTC_EIFFEL_IDENTIFIER 7
+#define wxSTC_EIFFEL_STRINGEOL 8
 
 // END of generated section
 //----------------------------------------------------------------------
@@ -556,6 +718,10 @@ public:
     // Find the position from a point within the window.
     int PositionFromPoint(wxPoint pt);
 
+    // Find the position from a point within the window but return
+    // INVALID_POSITION if not close to text.
+    int PositionFromPointClose(int x, int y);
+
     // Set caret to start of a line and ensure it is visible.
     void GotoLine(int line);
 
@@ -573,8 +739,8 @@ public:
     // Retrieve the position of the last correctly styled character.
     int GetEndStyled();
 
-    // Convert all line endings in the document to use the current mode.
-    void ConvertEOLs();
+    // Convert all line endings in the document to one mode.
+    void ConvertEOLs(int eolMode);
 
     // Retrieve the current end of line mode - one of CRLF, CR, or LF.
     int GetEOLMode();
@@ -693,6 +859,9 @@ public:
     // Set a style to be underlined or not.
     void StyleSetUnderline(int style, bool underline);
 
+    // Set a style to be mixed case, or to force upper or lower case.
+    void StyleSetCase(int style, int caseForce);
+
     // Set the foreground colour of the selection and whether to use this setting.
     void SetSelForeground(bool useSetting, const wxColour& fore);
 
@@ -763,6 +932,18 @@ public:
     // Retrieve the last line number that has line state.
     int GetMaxLineState();
 
+    // Is the background of the line containing the caret in a different colour?
+    bool GetCaretLineVisible();
+
+    // Display the background of the line containing the caret in a different colour.
+    void SetCaretLineVisible(bool show);
+
+    // Get the colour of the background of the line containing the caret.
+    wxColour GetCaretLineBack();
+
+    // Set the colour of the background of the line containing the caret.
+    void SetCaretLineBack(const wxColour& back);
+
     // Display a auto-completion list.
     // The lenEntered parameter indicates how many characters before
     // the caret should be used to provide context.
@@ -816,6 +997,15 @@ public:
     // Retrieve state of ignore case flag.
     bool AutoCompGetIgnoreCase();
 
+    // Display a list of strings and send notification when user chooses one.
+    void UserListShow(int listType, const wxString& itemList);
+
+    // Set whether or not autocompletion is hidden automatically when nothing matches
+    void AutoCompSetAutoHide(bool autoHide);
+
+    // Retrieve whether or not autocompletion is hidden automatically when nothing matches
+    bool AutoCompGetAutoHide();
+
     // Set the number of spaces used for one level of indentation.
     void SetIndent(int indentSize);
 
@@ -923,13 +1113,13 @@ public:
     int GetLineCount();
 
     // Sets the size in pixels of the left margin.
-    void SetMarginLeft(int width);
+    void SetMarginLeft(int pixelWidth);
 
     // Returns the size in pixels of the left margin.
     int GetMarginLeft();
 
     // Sets the size in pixels of the right margin.
-    void SetMarginRight(int width);
+    void SetMarginRight(int pixelWidth);
 
     // Returns the size in pixels of the right margin.
     int GetMarginRight();
@@ -1006,6 +1196,48 @@ public:
     // Returns true if overtype mode is active otherwise false is returned.
     bool GetOvertype();
 
+    // Set the width of the insert mode caret
+    void SetCaretWidth(int pixelWidth);
+
+    // Returns the width of the insert mode caret
+    int GetCaretWidth();
+
+    // Sets the position that starts the target which is used for updating the
+    // document without affecting the scroll position.
+    void SetTargetStart(int pos);
+
+    // Get the position that starts the target.
+    int GetTargetStart();
+
+    // Sets the position that ends the target which is used for updating the
+    // document without affecting the scroll position.
+    void SetTargetEnd(int pos);
+
+    // Get the position that ends the target.
+    int GetTargetEnd();
+
+    // Replace the target text with the argument text.
+    // Returns the length of the replacement text.
+    int ReplaceTarget(const wxString& text);
+
+    // Replace the target text with the argument text after \d processing.
+    // 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
+    // caused by processing the \d patterns.
+    int ReplaceTargetRE(const wxString& text);
+
+    // Search for a counted string in the target and set the target to the found
+    // range.
+    // Returns length of range or -1 for failure in which case target is not moved.
+    int SearchInTarget(const wxString& text);
+
+    // Set the search flags used by SearchInTarget
+    void SetSearchFlags(int flags);
+
+    // Get the search flags used by SearchInTarget
+    int GetSearchFlags();
+
     // Show a call tip containing a definition near position pos.
     void CallTipShow(int pos, const wxString& definition);
 
@@ -1068,6 +1300,31 @@ public:
     // Set some debugging options for folding
     void SetFoldFlags(int flags);
 
+    // Ensure a particular line is visible by expanding any header line hiding it.
+    // Use the currently set visibility policy to determine which range to display.
+    void EnsureVisibleEnforcePolicy(int line);
+
+    // Sets whether a tab pressed when caret is within indentation indents
+    void SetTabIndents(bool tabIndents);
+
+    // Does a tab pressed when caret is within indentation indent?
+    bool GetTabIndents();
+
+    // Sets whether a backspace pressed when caret is within indentation unindents
+    void SetBackSpaceUnIndents(bool bsUnIndents);
+
+    // Does a backspace pressed when caret is within indentation unindent?
+    bool GetBackSpaceUnIndents();
+
+    // Sets the time the mouse must sit still to generate a mouse dwell event
+    void SetMouseDwellTime(int periodMilliseconds);
+
+    // Retrieve the time the mouse must sit still to generate a mouse dwell event
+    int GetMouseDwellTime();
+
+    // Move the caret inside current view if it's not there already
+    void MoveCaretInsideView();
+
     // How many characters are on a line, not including end of line characters.
     int LineLength(int line);
 
@@ -1119,9 +1376,11 @@ public:
     void SearchAnchor();
 
     // Find some text starting at the search anchor.
+    // Does not ensure the selection is visible.
     int SearchNext(int flags, const wxString& text);
 
     // Find some text starting at the search anchor and moving backwards.
+    // Does not ensure the selection is visible.
     int SearchPrev(int flags, const wxString& text);
 
     // Set the way the line the caret is on is kept visible.
@@ -1157,6 +1416,51 @@ public:
     // Get which document modification events are sent to the container.
     int GetModEventMask();
 
+    // Change internal focus flag
+    void SetFocus(bool focus);
+
+    // Get internal focus flag
+    bool GetFocus();
+
+    // Change error status - 0 = OK
+    void SetStatus(int statusCode);
+
+    // Get error status
+    int GetStatus();
+
+    // Set whether the mouse is captured when its button is pressed
+    void SetMouseDownCaptures(bool captures);
+
+    // Get whether mouse gets captured
+    bool GetMouseDownCaptures();
+
+    // Sets the cursor to one of the SC_CURSOR* values
+    void SetCursor(int cursorType);
+
+    // Get cursor type
+    int GetCursor();
+
+    // Move to the previous change in capitalistion
+    void WordPartLeft();
+
+    // Move to the previous change in capitalistion extending selection to new caret position.
+    void WordPartLeftExtend();
+
+    // Move to the change next in capitalistion
+    void WordPartRight();
+
+    // Move to the next change in capitalistion extending selection to new caret position.
+    void WordPartRightExtend();
+
+    // Set the way the display area is determined when a particular line is to be moved to.
+    void SetVisiblePolicy(int visiblePolicy, int visibleSlop);
+
+    // Delete back from the current position to the start of the line
+    void DelLineLeft();
+
+    // Delete forwards from the current position to the end of the line
+    void DelLineRight();
+
     // Start notifying the container of all key presses and commands.
     void StartRecord();
 
@@ -1178,6 +1482,9 @@ public:
     // Set up the key words used by the lexer.
     void SetKeyWords(int keywordSet, const wxString& keyWords);
 
+    // Set the lexing language of the document based on string name.
+    void SetLexerLanguage(const wxString& language);
+
 // END of generated section
 //----------------------------------------------------------------------
 // Others...
@@ -1243,6 +1550,10 @@ public:
     // Scroll enough to make the given column visible
     void ScrollToColumn(int column);
 
+
+    // Send a message to Scintilla
+    long SendMsg(int msg, long wp=0, long lp=0);
+
 //----------------------------------------------------------------------
 
 
@@ -1255,7 +1566,7 @@ private:
     void OnMouseLeftDown(wxMouseEvent& evt);
     void OnMouseMove(wxMouseEvent& evt);
     void OnMouseLeftUp(wxMouseEvent& evt);
-    void OnMouseRightUp(wxMouseEvent& evt);
+    void OnContextMenu(wxContextMenuEvent& evt);
     void OnMouseWheel(wxMouseEvent& evt);
     void OnChar(wxKeyEvent& evt);
     void OnKeyDown(wxKeyEvent& evt);
@@ -1271,8 +1582,6 @@ private:
     void NotifyChange();
     void NotifyParent(SCNotification* scn);
 
-    long SendMsg(int msg, long wp=0, long lp=0);
-
 private:
     DECLARE_EVENT_TABLE()
     DECLARE_CLASS(wxStyledTextCtrl)
@@ -1307,6 +1616,9 @@ public:
     void SetMessage(int val)         { m_message = val; }
     void SetWParam(int val)          { m_wParam = val; }
     void SetLParam(int val)          { m_lParam = val; }
+    void SetListType(int val)        { m_listType = val; }
+    void SetX(int val)               { m_x = val; }
+    void SetY(int val)               { m_y = val; }
 
     int  GetPosition() const         { return m_position; }
     int  GetKey()  const             { return m_key; }
@@ -1322,6 +1634,9 @@ public:
     int  GetMessage() const          { return m_message; }
     int  GetWParam() const           { return m_wParam; }
     int  GetLParam() const           { return m_lParam; }
+    int  GetListType() const         { return m_listType; }
+    int  GetX() const                { return m_x; }
+    int  GetY() const                { return m_y; }
 
     bool GetShift() const;
     bool GetControl() const;
@@ -1350,42 +1665,56 @@ private:
     int  m_message;             // wxEVT_STC_MACRORECORD
     int  m_wParam;
     int  m_lParam;
+
+    int m_listType;
+    int m_x;
+    int m_y;
 #endif
 };
 
 #ifndef SWIG
 BEGIN_DECLARE_EVENT_TYPES()
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_CHANGE, 1650)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_STYLENEEDED, 1651)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_CHARADDED, 1652)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_UPDATEUI, 1653)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_SAVEPOINTREACHED, 1654)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_SAVEPOINTLEFT, 1655)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_ROMODIFYATTEMPT, 1656)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_DOUBLECLICK, 1657)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_MODIFIED, 1658)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_KEY, 1659)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_MACRORECORD, 1660)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_MARGINCLICK, 1661)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_NEEDSHOWN, 1662)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_POSCHANGED, 1663)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_CHANGE,                  1650)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_STYLENEEDED,             1651)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_CHARADDED,               1652)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_SAVEPOINTREACHED,        1653)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_SAVEPOINTLEFT,           1654)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_ROMODIFYATTEMPT,         1655)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_KEY,                     1656)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_DOUBLECLICK,             1657)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_UPDATEUI,                1658)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_MODIFIED,                1659)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_MACRORECORD,             1660)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_MARGINCLICK,             1661)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_NEEDSHOWN,               1662)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_POSCHANGED,              1663)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_PAINTED,                 1664)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_USERLISTSELECTION,       1665)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_URIDROPPED,              1666)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_DWELLSTART,              1667)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_DWELLEND,                1668)
 END_DECLARE_EVENT_TYPES()
 #else
     enum {
         wxEVT_STC_CHANGE,
         wxEVT_STC_STYLENEEDED,
         wxEVT_STC_CHARADDED,
-        wxEVT_STC_UPDATEUI,
         wxEVT_STC_SAVEPOINTREACHED,
         wxEVT_STC_SAVEPOINTLEFT,
         wxEVT_STC_ROMODIFYATTEMPT,
+        wxEVT_STC_KEY,
         wxEVT_STC_DOUBLECLICK,
+        wxEVT_STC_UPDATEUI,
         wxEVT_STC_MODIFIED,
-        wxEVT_STC_KEY,
         wxEVT_STC_MACRORECORD,
         wxEVT_STC_MARGINCLICK,
         wxEVT_STC_NEEDSHOWN,
-        wxEVT_STC_POSCHANGED
+        wxEVT_STC_POSCHANGED,
+        wxEVT_STC_PAINTED,
+        wxEVT_STC_USERLISTSELECTION,
+        wxEVT_STC_URIDROPPED,
+        wxEVT_STC_DWELLSTART,
+        wxEVT_STC_DWELLEND,
     };
 #endif
 
@@ -1394,20 +1723,26 @@ END_DECLARE_EVENT_TYPES()
 #ifndef SWIG
 typedef void (wxEvtHandler::*wxStyledTextEventFunction)(wxStyledTextEvent&);
 
-#define EVT_STC_CHANGE(id, fn)           DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_CHANGE, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_STYLENEEDED(id, fn)      DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_STYLENEEDED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_CHARADDED(id, fn)        DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_CHARADDED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_UPDATEUI(id, fn)         DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_UPDATEUI, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_SAVEPOINTREACHED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_SAVEPOINTREACHED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_SAVEPOINTLEFT(id, fn)    DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_SAVEPOINTLEFT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_ROMODIFYATTEMPT(id, fn)  DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_ROMODIFYATTEMPT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_DOUBLECLICK(id, fn)      DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DOUBLECLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_MODIFIED(id, fn)         DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MODIFIED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_KEY(id, fn)              DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_KEY, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_MACRORECORD(id, fn)      DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MACRORECORD, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_MARGINCLICK(id, fn)      DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MARGINCLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_NEEDSHOWN(id, fn)        DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_NEEDSHOWN, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_POSCHANGED(id, fn)       DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_POSCHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_CHANGE(id, fn)                  DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_CHANGE,                id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_STYLENEEDED(id, fn)             DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_STYLENEEDED,           id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_CHARADDED(id, fn)               DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_CHARADDED,             id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_SAVEPOINTREACHED(id, fn)        DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_SAVEPOINTREACHED,      id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_SAVEPOINTLEFT(id, fn)           DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_SAVEPOINTLEFT,         id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_ROMODIFYATTEMPT(id, fn)         DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_ROMODIFYATTEMPT,       id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_KEY(id, fn)                     DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_KEY,                   id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_DOUBLECLICK(id, fn)             DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DOUBLECLICK,           id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_UPDATEUI(id, fn)                DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_UPDATEUI,              id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_MODIFIED(id, fn)                DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MODIFIED,              id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_MACRORECORD(id, fn)             DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MACRORECORD,           id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_MARGINCLICK(id, fn)             DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MARGINCLICK,           id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_NEEDSHOWN(id, fn)               DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_NEEDSHOWN,             id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_POSCHANGED(id, fn)              DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_POSCHANGED,            id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_PAINTED(id, fn)                 DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_PAINTED,               id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_USERLISTSELECTION(id, fn)       DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_USERLISTSELECTION,     id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_URIDROPPED(id, fn)              DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_URIDROPPED,            id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_DWELLSTART(id, fn)              DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DWELLSTART,            id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_DWELLEND(id, fn)                DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DWELLEND,              id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+
 
 #endif
 
diff --git a/src/stc/PlatWX.cpp b/src/stc/PlatWX.cpp
index 2b478141af..862d16456d 100644
--- a/src/stc/PlatWX.cpp
+++ b/src/stc/PlatWX.cpp
@@ -112,6 +112,8 @@ Font::~Font() {
 }
 
 void Font::Create(const char *faceName, int characterSet, int size, bool bold, bool italic) {
+    // TODO:  what to do about the characterSet?
+
     Release();
     id = new wxFont(size,
                     wxDEFAULT,
@@ -161,13 +163,11 @@ void Surface::Init() {
     Release();
     hdc = new wxMemoryDC();
     hdcOwned = true;
-    // **** ::SetTextAlign(hdc, TA_BASELINE);
 }
 
 void Surface::Init(SurfaceID hdc_) {
     Release();
     hdc = hdc_;
-    // **** ::SetTextAlign(hdc, TA_BASELINE);
 }
 
 void Surface::InitPixMap(int width, int height, Surface *surface_) {
@@ -176,7 +176,6 @@ void Surface::InitPixMap(int width, int height, Surface *surface_) {
     hdcOwned = true;
     bitmap = new wxBitmap(width, height);
     ((wxMemoryDC*)hdc)->SelectObject(*bitmap);
-    // **** ::SetTextAlign(hdc, TA_BASELINE);
 }
 
 void Surface::PenColour(Colour fore) {
@@ -353,7 +352,7 @@ int Surface::AverageCharWidth(Font &font) {
 }
 
 int Surface::SetPalette(Palette *pal, bool inBackGround) {
-    return 0;  // **** figure out what to do with palettes...
+    return 0;
 }
 
 void Surface::SetClip(PRectangle rc) {
@@ -697,6 +696,36 @@ void Platform::DebugPrintf(const char *format, ...) {
 #endif
 }
 
+
+static bool assertionPopUps = true;
+
+bool Platform::ShowAssertionPopUps(bool assertionPopUps_) {
+	bool ret = assertionPopUps;
+	assertionPopUps = assertionPopUps_;
+	return ret;
+}
+
+void Platform::Assert(const char *c, const char *file, int line) {
+	char buffer[2000];
+	sprintf(buffer, "Assertion [%s] failed at %s %d", c, file, line);
+	if (assertionPopUps) {
+		int idButton = wxMessageBox(buffer, "Assertion failure",
+                                            wxICON_HAND | wxOK);
+//  		if (idButton == IDRETRY) {
+//  			::DebugBreak();
+//  		} else if (idButton == IDIGNORE) {
+//  			// all OK
+//  		} else {
+//  			abort();
+//  		}
+	} else {
+		strcat(buffer, "\r\n");
+		Platform::DebugDisplay(buffer);
+		abort();
+	}
+}
+
+
 int Platform::Clamp(int val, int minVal, int maxVal) {
     if (val > maxVal)
         val = maxVal;
diff --git a/src/stc/ScintillaWX.cpp b/src/stc/ScintillaWX.cpp
index 30a896b903..127c172a90 100644
--- a/src/stc/ScintillaWX.cpp
+++ b/src/stc/ScintillaWX.cpp
@@ -93,7 +93,6 @@ END_EVENT_TABLE()
 ScintillaWX::ScintillaWX(wxStyledTextCtrl* win) {
     capturedMouse = false;
     wMain = win;
-    wDraw = win;
     stc   = win;
     wheelRotation = 0;
     Initialise();
@@ -170,8 +169,8 @@ bool ScintillaWX::HaveMouseCapture() {
 
 void ScintillaWX::ScrollText(int linesToMove) {
     int dy = vs.lineHeight * (linesToMove);
-    // TODO: calculate the rectangle to refreshed...
     wMain.GetID()->ScrollWindow(0, dy);
+    wMain.GetID()->Update();
 }
 
 void ScintillaWX::SetVerticalScrollPos() {
@@ -261,7 +260,7 @@ bool ScintillaWX::CanPaste() {
 }
 
 void ScintillaWX::CreateCallTipWindow(PRectangle) {
-    ct.wCallTip = new wxSTCCallTip(wDraw.GetID(), -1, &ct);
+    ct.wCallTip = new wxSTCCallTip(wMain.GetID(), -1, &ct);
     ct.wDraw = ct.wCallTip;
 }
 
@@ -365,17 +364,27 @@ void ScintillaWX::DoVScroll(int type, int pos) {
 }
 
 
-void ScintillaWX::DoMouseWheel(int rotation, int delta, int linesPerAction) {
+void ScintillaWX::DoMouseWheel(int rotation, int delta, int linesPerAction, int ctrlDown) {
     int topLineNew = topLine;
     int lines;
 
-    wheelRotation += rotation;
-    lines = wheelRotation / delta;
-    wheelRotation -= lines * delta;
-    if (lines != 0) {
-        lines *= linesPerAction;
-        topLineNew -= lines;
-        ScrollTo(topLineNew);
+    if (ctrlDown) {  // Zoom the fonts if Ctrl key down
+        if (rotation < 0) {
+            KeyCommand(SCI_ZOOMIN);
+        }
+        else {
+            KeyCommand(SCI_ZOOMOUT);
+        }
+    }
+    else { // otherwise just scroll the window
+        wheelRotation += rotation;
+        lines = wheelRotation / delta;
+        wheelRotation -= lines * delta;
+        if (lines != 0) {
+            lines *= linesPerAction;
+            topLineNew -= lines;
+            ScrollTo(topLineNew);
+        }
     }
 }
 
@@ -387,11 +396,11 @@ void ScintillaWX::DoSize(int width, int height) {
 }
 
 void ScintillaWX::DoLoseFocus(){
-    DropCaret();
+    SetFocusState(false);
 }
 
 void ScintillaWX::DoGainFocus(){
-    ShowCaretAtCurrentPosition();
+    SetFocusState(true);
 }
 
 void ScintillaWX::DoSysColourChange() {
@@ -418,7 +427,7 @@ void ScintillaWX::DoAddChar(char ch) {
     //    AutoCompleteChanged(ch);
 }
 
-int  ScintillaWX::DoKeyDown(int key, bool shift, bool ctrl, bool alt) {
+int  ScintillaWX::DoKeyDown(int key, bool shift, bool ctrl, bool alt, bool* consumed) {
     switch (key) {
         case WXK_DOWN: key = SCK_DOWN; break;
         case WXK_UP: key = SCK_UP; break;
@@ -442,7 +451,7 @@ int  ScintillaWX::DoKeyDown(int key, bool shift, bool ctrl, bool alt) {
         case WXK_SHIFT: key = 0; break;
     }
 
-    return KeyDown(key, shift, ctrl, alt);
+    return KeyDown(key, shift, ctrl, alt, consumed);
 }
 
 
diff --git a/src/stc/ScintillaWX.h b/src/stc/ScintillaWX.h
index fdd4f98dbd..00528bcd0a 100644
--- a/src/stc/ScintillaWX.h
+++ b/src/stc/ScintillaWX.h
@@ -119,9 +119,9 @@ public:
     void DoButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt);
     void DoButtonUp(Point pt, unsigned int curTime, bool ctrl);
     void DoButtonMove(Point pt);
-    void DoMouseWheel(int rotation, int delta, int linesPerAction);
+    void DoMouseWheel(int rotation, int delta, int linesPerAction, int ctrlDown);
     void DoAddChar(char ch);
-    int  DoKeyDown(int key, bool shift, bool ctrl, bool alt);
+    int  DoKeyDown(int key, bool shift, bool ctrl, bool alt, bool* consumed);
     void DoTick() { Tick(); }
 
     bool DoDropText(long x, long y, const wxString& data);
diff --git a/src/stc/gen_iface.py b/src/stc/gen_iface.py
index eba0f3c586..e198bdc6e0 100644
--- a/src/stc/gen_iface.py
+++ b/src/stc/gen_iface.py
@@ -12,15 +12,15 @@
 #----------------------------------------------------------------------------
 
 
-import sys, string, re
+import sys, string, re, os
 from fileinput import FileInput
 
 
-IFACE         = './scintilla/include/Scintilla.iface'
-H_TEMPLATE    = './stc.h.in'
-CPP_TEMPLATE  = './stc.cpp.in'
-H_DEST        = '../../include/wx/stc/stc.h'
-CPP_DEST      = './stc.cpp'
+IFACE         = os.path.abspath('./scintilla/include/Scintilla.iface')
+H_TEMPLATE    = os.path.abspath('./stc.h.in')
+CPP_TEMPLATE  = os.path.abspath('./stc.cpp.in')
+H_DEST        = os.path.abspath('../../include/wx/stc/stc.h')
+CPP_DEST      = os.path.abspath('./stc.cpp')
 
 
 # Value prefixes to convert
@@ -215,6 +215,9 @@ methodOverrideMap = {
     'AutoCGetChooseSingle' : ('AutoCompGetChooseSingle', 0, 0, 0),
     'AutoCSetIgnoreCase' : ('AutoCompSetIgnoreCase', 0, 0, 0),
     'AutoCGetIgnoreCase' : ('AutoCompGetIgnoreCase', 0, 0, 0),
+    'AutoCSetAutoHide' : ('AutoCompSetAutoHide', 0, 0, 0),
+    'AutoCGetAutoHide' : ('AutoCompGetAutoHide', 0, 0, 0),
+
 
     'SetHScrollBar' : ('SetUseHorizontalScrollBar', 0, 0, 0),
     'GetHScrollBar' : ('GetUseHorizontalScrollBar', 0, 0, 0),
@@ -360,6 +363,38 @@ methodOverrideMap = {
     'CallTipSetBack' : ('CallTipSetBackground', 0, 0, 0),
 
 
+    'ReplaceTarget' : (0,
+                       'int %s(const wxString& text);',
+
+                       '''
+                       int %s(const wxString& text) {
+                           return SendMsg(%s, text.Len(), (long)text.c_str());
+                       ''',
+
+                       0),
+
+    'ReplaceTargetRE' : (0,
+                       'int %s(const wxString& text);',
+
+                       '''
+                       int %s(const wxString& text) {
+                           return SendMsg(%s, text.Len(), (long)text.c_str());
+                       ''',
+
+                       0),
+
+    'SearchInTarget' : (0,
+                       'int %s(const wxString& text);',
+
+                       '''
+                       int %s(const wxString& text) {
+                           return SendMsg(%s, text.Len(), (long)text.c_str());
+                       ''',
+
+                       0),
+
+
+
     # Remove all methods that are key commands since they can be
     # executed with CmdKeyExecute
     'LineDown' : (None, 0, 0, 0),
@@ -417,7 +452,7 @@ methodOverrideMap = {
     'SetDocPointer' : (0,
                        'void %s(void* docPointer);',
                        '''void %s(void* docPointer) {
-                           SendMsg(%s, (long)docPointer);''',
+                           SendMsg(%s, 0, (long)docPointer);''',
                        0),
 
     'CreateDocument' : (0,
@@ -685,4 +720,3 @@ if __name__ == '__main__':
 
 #----------------------------------------------------------------------------
 
-
diff --git a/src/stc/scintilla/README.txt b/src/stc/scintilla/README.txt
index b88d57495c..598da70f58 100644
--- a/src/stc/scintilla/README.txt
+++ b/src/stc/scintilla/README.txt
@@ -3,5 +3,5 @@ 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.
 
-The current version of the Scintilla code is 1.32
+The current version of the Scintilla code is 1.39
 
diff --git a/src/stc/scintilla/include/Accessor.h b/src/stc/scintilla/include/Accessor.h
index b4b7e62ecf..17c9510672 100644
--- a/src/stc/scintilla/include/Accessor.h
+++ b/src/stc/scintilla/include/Accessor.h
@@ -1,6 +1,8 @@
-// SciTE - Scintilla based Text Editor
-// Accessor.h - rapid easy access to contents of a Scintilla
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file Accessor.h
+ ** Rapid easy access to contents of a Scintilla.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 enum { wsSpace = 1, wsTab = 2, wsSpaceTab = 4, wsInconsistent=8};
@@ -9,12 +11,16 @@ class Accessor;
 
 typedef bool (*PFNIsCommentLeader)(Accessor &styler, int pos, int len);
 
-// Interface to data in a Scintilla
+/**
+ * Interface to data in a Scintilla.
+ */
 class Accessor {
 protected:
 	enum {extremePosition=0x7FFFFFFF};
-	// bufferSize is a trade off between time taken to copy the characters and retrieval overhead
-	// slopSize positions the buffer before the desired position in case there is some backtracking
+	/** @a bufferSize is a trade off between time taken to copy the characters
+	 * and retrieval overhead.
+	 * @a slopSize positions the buffer before the desired position
+	 * in case there is some backtracking. */
 	enum {bufferSize=4000, slopSize=bufferSize/8};
 	char buf[bufferSize+1];
 	int startPos;
@@ -23,6 +29,7 @@ protected:
 
 	virtual bool InternalIsLeadByte(char ch)=0;
 	virtual void Fill(int position)=0;
+
 public:
 	Accessor() : startPos(extremePosition), endPos(0), codePage(0) {}
 	virtual ~Accessor() {}
@@ -32,8 +39,8 @@ public:
 		}
 		return buf[position - startPos];
 	}
+	/** Safe version of operator[], returning a defined value for invalid position. */
 	char SafeGetCharAt(int position, char chDefault=' ') {
-		// Safe version of operator[], returning a defined value for invalid position 
 		if (position < startPos || position >= endPos) {
 			Fill(position);
 			if (position < startPos || position >= endPos) {
@@ -57,6 +64,7 @@ public:
 	virtual int GetLineState(int line)=0;
 	virtual int SetLineState(int line, int state)=0;
 	virtual int GetPropertyInt(const char *key, int defaultValue=0)=0;
+	virtual char *GetProperties()=0;
 
 	// Style setting
 	virtual void StartAt(unsigned int start, char chMask=31)=0;
@@ -67,4 +75,3 @@ public:
 	virtual void SetLevel(int line, int level)=0;
 	virtual int IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader = 0)=0;
 };
-
diff --git a/src/stc/scintilla/include/KeyWords.h b/src/stc/scintilla/include/KeyWords.h
index 3159dcc1b4..869b59d267 100644
--- a/src/stc/scintilla/include/KeyWords.h
+++ b/src/stc/scintilla/include/KeyWords.h
@@ -1,32 +1,59 @@
-// SciTE - Scintilla based Text Editor
-// KeyWords.h - colourise for particular languages
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file KeyWords.h
+ ** Colourise for particular languages.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 typedef void (*LexerFunction)(unsigned int startPos, int lengthDoc, int initStyle,
                   WordList *keywordlists[], Accessor &styler);
                   
+/**
+ * A LexerModule is responsible for lexing and folding a particular language.
+ * The class maintains a list of LexerModules which can be searched to find a
+ * module appropriate to a particular language.
+ */
 class LexerModule {
-	static LexerModule *base;
+protected:
 	LexerModule *next;
 	int language;
-	LexerFunction fn;
+	const char *languageName;
+	LexerFunction fnLexer;
+	LexerFunction fnFolder;
+	
+	static LexerModule *base;
+	static int nextLanguage;
+
 public:
-	LexerModule(int language_, LexerFunction fn_);
-	static void Colourise(unsigned int startPos, int lengthDoc, int initStyle,
-                  int language, WordList *keywordlists[], Accessor &styler);
+	LexerModule(int language_, LexerFunction fnLexer_, 
+		const char *languageName_=0, LexerFunction fnFolder_=0);
+	int GetLanguage() { return language; }
+	virtual void Lex(unsigned int startPos, int lengthDoc, int initStyle,
+                  WordList *keywordlists[], Accessor &styler);
+	virtual void Fold(unsigned int startPos, int lengthDoc, int initStyle,
+                  WordList *keywordlists[], Accessor &styler);
+	static LexerModule *Find(int language);
+	static LexerModule *Find(const char *languageName);
 };
 
+/**
+ * Check if a character is a space.
+ * This is ASCII specific but is safe with chars >= 0x80.
+ */
+inline bool isspacechar(unsigned char ch) {
+    return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d));
+}
+
 inline bool iswordchar(char ch) {
-	return isalnum(ch) || ch == '.' || ch == '_';
+	return isascii(ch) && (isalnum(ch) || ch == '.' || ch == '_');
 }
 
 inline bool iswordstart(char ch) {
-	return isalnum(ch) || ch == '_';
+	return isascii(ch) && (isalnum(ch) || ch == '_');
 }
 
 inline bool isoperator(char ch) {
-	if (isalnum(ch))
+	if (isascii(ch) && isalnum(ch))
 		return false;
 	// '.' left out as it is used to make up numbers
 	if (ch == '%' || ch == '^' || ch == '&' || ch == '*' ||
@@ -38,4 +65,3 @@ inline bool isoperator(char ch) {
 		return true;
 	return false;
 }
-
diff --git a/src/stc/scintilla/include/Platform.h b/src/stc/scintilla/include/Platform.h
index de9cf202a1..74de63174f 100644
--- a/src/stc/scintilla/include/Platform.h
+++ b/src/stc/scintilla/include/Platform.h
@@ -1,18 +1,21 @@
 // Scintilla source code edit control
-// Platform.h - interface to platform facilities
-// Also includes some basic utilities
-// Implemented in PlatGTK.cxx for GTK+/Linux, PlatWin.cxx for Windows, and PlatWX.cxx for wxWindows
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file Platform.h
+ ** Interface to platform facilities. Also includes some basic utilities.
+ ** Implemented in PlatGTK.cxx for GTK+/Linux, PlatWin.cxx for Windows, and PlatWX.cxx for wxWindows.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef PLATFORM_H
 #define PLATFORM_H
 
-// PLAT_GTK = GTK+ on Linux, PLAT_WIN = Win32 API on Win32 OS
+// PLAT_GTK = GTK+ on Linux or Win32
+// PLAT_GTK_WIN32 is defined additionally when running PLAT_GTK under Win32
+// PLAT_WIN = Win32 API on Win32 OS
 // PLAT_WX is wxWindows on any supported platform
-// Could also have PLAT_GTKWIN = GTK+ on Win32 OS in future
 
 #define PLAT_GTK 0
+#define PLAT_GTK_WIN32 0
 #define PLAT_WIN 0
 #define PLAT_WX  0
 
@@ -24,6 +27,11 @@
 #undef PLAT_GTK
 #define PLAT_GTK 1
 
+#ifdef _MSC_VER
+#undef PLAT_GTK_WIN32
+#define PLAT_GTK_WIN32 1
+#endif
+
 #else
 #undef PLAT_WIN
 #define PLAT_WIN 1
@@ -34,6 +42,9 @@
 // Include the main header for each platform
 
 #if PLAT_GTK
+#ifdef _MSC_VER
+#pragma warning(disable: 4505 4514 4710 4800)
+#endif
 #include <gtk/gtk.h>
 #include <gdk/gdkkeysyms.h>
 #endif
@@ -42,7 +53,7 @@
 #define _WIN32_WINNT  0x0400 // Otherwise some required stuff gets ifdef'd out
 // Vassili Bourdo: shut up annoying Visual C++ warnings:
 #ifdef _MSC_VER
-#pragma warning(disable: 4800 4244 4309)
+#pragma warning(disable: 4244 4309 4710 4800)
 #endif
 #include <windows.h>
 #include <commctrl.h>
@@ -80,23 +91,28 @@ typedef wxWindow* WindowID;
 typedef wxMenu* MenuID;
 #endif
 
-// Point is exactly the same as the Win32 POINT and GTK+ GdkPoint so can be used interchangeably
-
+/**
+ * A geometric point class.
+ * Point is exactly the same as the Win32 POINT and GTK+ GdkPoint so can be used interchangeably.
+ */
 class Point {
 public:
 	int x;
 	int y;
-	
+
 	Point(int x_=0, int y_=0) : x(x_), y(y_) {
 	}
 
 	// Other automatically defined methods (assignment, copy constructor, destructor) are fine
-	
+
 	static Point FromLong(long lpoint);
 };
 
-// PRectangle is exactly the same as the Win32 RECT so can be used interchangeably
-// PRectangles contain their top and left sides, but not their right and bottom sides
+/**
+ * A geometric rectangle class.
+ * PRectangle is exactly the same as the Win32 RECT so can be used interchangeably.
+ * PRectangles contain their top and left sides, but not their right and bottom sides.
+ */
 class PRectangle {
 public:
 	int left;
@@ -110,6 +126,10 @@ public:
 
 	// Other automatically defined methods (assignment, copy constructor, destructor) are fine
 
+	bool operator==(PRectangle &rc) {
+		return (rc.left == left) && (rc.right == right) &&
+			(rc.top == top) && (rc.bottom == bottom);
+	}
 	bool Contains(Point pt) {
 		return (pt.x >= left) && (pt.x <= right) &&
 			(pt.y >= top) && (pt.y <= bottom);
@@ -131,6 +151,9 @@ wxRect wxRectFromPRectangle(PRectangle prc);
 PRectangle PRectangleFromwxRect(wxRect rc);
 #endif
 
+/**
+ * A colour class.
+ */
 class Colour {
 	ColourID co;
 public:
@@ -141,15 +164,17 @@ public:
 	unsigned int GetRed();
 	unsigned int GetGreen();
 	unsigned int GetBlue();
-	
+
 	friend class Surface;
 	friend class Palette;
 };
 
-// Colour pairs hold a desired colour and the colour that the graphics engine
-// allocates to approximate the desired colour.
-// To make palette management more automatic, ColourPairs could register at 
-// construction time with a palette management object.
+/**
+ * Colour pairs hold a desired colour and the colour that the graphics engine
+ * allocates to approximate the desired colour.
+ * To make palette management more automatic, ColourPairs could register at
+ * construction time with a palette management object.
+ */
 struct ColourPair {
 	Colour desired;
 	Colour allocated;
@@ -162,6 +187,9 @@ struct ColourPair {
 
 class Window;	// Forward declaration for Palette
 
+/**
+ * Colour palette management.
+ */
 class Palette {
 	int used;
 	enum {numEntries = 100};
@@ -176,22 +204,27 @@ class Palette {
 #endif
 public:
 	bool allowRealization;
-	
+
 	Palette();
 	~Palette();
 
 	void Release();
-	
-	// This method either adds a colour to the list of wanted colours (want==true)
-	// or retrieves the allocated colour back to the ColourPair.
-	// This is one method to make it easier to keep the code for wanting and retrieving in sync.
+
+	/**
+	 * This method either adds a colour to the list of wanted colours (want==true)
+	 * or retrieves the allocated colour back to the ColourPair.
+	 * This is one method to make it easier to keep the code for wanting and retrieving in sync.
+	 */
 	void WantFind(ColourPair &cp, bool want);
 
 	void Allocate(Window &w);
-	
+
 	friend class Surface;
 };
 
+/**
+ * Font management.
+ */
 class Font {
 protected:
 	FontID id;
@@ -214,7 +247,9 @@ public:
 	friend class Surface;
 };
 
-// A surface abstracts a place to draw
+/**
+ * A surface abstracts a place to draw.
+ */
 class Surface {
 private:
 	bool unicodeMode;
@@ -256,7 +291,7 @@ private:
 public:
 	Surface();
 	~Surface();
-	
+
 	void Init();
 	void Init(SurfaceID hdc_);
 	void InitPixMap(int width, int height, Surface *surface_);
@@ -287,7 +322,7 @@ public:
 	int ExternalLeading(Font &font_);
 	int Height(Font &font_);
 	int AverageCharWidth(Font &font_);
-	
+
 	int SetPalette(Palette *pal, bool inBackGround);
 	void SetClip(PRectangle rc);
 	void FlushCachedState();
@@ -297,8 +332,10 @@ public:
 	}
 };
 
-// Class to hide the details of window manipulation
-// Does not own the window which will normally have a longer life than this object
+/**
+ * Class to hide the details of window manipulation.
+ * Does not own the window which will normally have a longer life than this object.
+ */
 class Window {
 	friend class ListBox;
 protected:
@@ -333,6 +370,9 @@ public:
 #endif
 };
 
+/**
+ * Listbox management.
+ */
 class ListBox : public Window {
 #if PLAT_GTK
 	WindowID list;
@@ -360,6 +400,9 @@ public:
 	void Sort();
 };
 
+/**
+ * Menu management.
+ */
 class Menu {
 	MenuID id;
 public:
@@ -370,8 +413,10 @@ public:
 	void Show(Point pt, Window &w);
 };
 
-// Platform class used to retrieve system wide parameters such as double click speed
-// and chrome colour. Not a creatable object, more of a module with several functions.
+/**
+ * Platform class used to retrieve system wide parameters such as double click speed
+ * and chrome colour. Not a creatable object, more of a module with several functions.
+ */
 class Platform {
 	// Private so Platform objects can not be copied
 	Platform(const Platform &) {}
@@ -390,7 +435,7 @@ public:
 	static bool IsKeyDown(int key);
 	static long SendScintilla(
 		WindowID w, unsigned int msg, unsigned long wParam=0, long lParam=0);
-	
+
 	// These are utility functions not really tied to a platform
 	static int Minimum(int a, int b);
 	static int Maximum(int a, int b);
@@ -405,7 +450,15 @@ public:
 		return static_cast<short>(x & 0xffff);
 	}
 	static void DebugPrintf(const char *format, ...);
+	static bool ShowAssertionPopUps(bool assertionPopUps_);
+	static void Assert(const char *c, const char *file, int line);
 	static int Clamp(int val, int minVal, int maxVal);
 };
 
+#ifdef  NDEBUG
+#define PLATFORM_ASSERT(c) ((void)0)
+#else
+#define PLATFORM_ASSERT(c) ((c) ? (void)(0) : Platform::Assert(#c, __FILE__, __LINE__))
+#endif
+
 #endif
diff --git a/src/stc/scintilla/include/PosRegExp.h b/src/stc/scintilla/include/PosRegExp.h
deleted file mode 100644
index b915b1ed49..0000000000
--- a/src/stc/scintilla/include/PosRegExp.h
+++ /dev/null
@@ -1,138 +0,0 @@
-#ifndef POSREGEXP_H
-#define POSREGEXP_H
-
-#define MatchesNum 0x10
-
-enum EOps
-{
-  ReBlockOps = 0x1000,
-  ReMul,              // *
-  RePlus,             // +
-  ReQuest,            // ?
-  ReNGMul,            // *?
-  ReNGPlus,           // +?
-  ReNGQuest,          // ??
-  ReRangeN,           // {n,}
-  ReRangeNM,          // {n,m}
-  ReNGRangeN,         // {n,}?
-  ReNGRangeNM,        // {n,m}?
-  ReOr,               // |
-  ReBehind  = 0x1100, // ?#n
-  ReNBehind = 0x1200, // ?~n
-  ReAhead   = 0x1300, // ?=
-  ReNAhead  = 0x1400, // ?!
-
-  ReSymbolOps = 0x2000,
-  ReEmpty,
-  ReSymb,             // a b \W \s ...
-  ReEnum,             // []
-  ReNEnum,            // [^]
-  ReBrackets,         // (...)
-  ReBkTrace = 0x2100, // \yN
-  ReBkBrack = 0x2200 // \N
-};
-
-enum ESymbols
-{
-  ReAnyChr = 0x4000,  // .
-  ReSoL,              // ^
-  ReEoL,              // $
-  ReDigit,            // \d
-  ReNDigit,           // \D
-  ReWordSymb,         // \w
-  ReNWordSymb,        // \W
-  ReWSpace,           // \s
-  ReNWSpace,          // \S
-  ReUCase,            // \u
-  ReNUCase ,          // \l
-  ReWBound,           // \b
-  ReNWBound,          // \B
-  RePreNW,            // \c
-  ReStart,            // \m
-  ReEnd,              // \M
-
-  ReChr    = 0x0      // Char in Lower Byte
-};
-enum ETempSymb
-{
-  ReTemp = 0x7000,
-  ReLBrack, ReRBrack,
-  ReEnumS, ReEnumE, ReNEnumS,
-  ReRangeS, ReRangeE, ReNGRangeE, ReFrToEnum
-};
-
-#define BackSlash '\\'
-
-typedef union SCharData
-{
-  int  IArr[8];
-  char CArr[32];
-  void SetBit(unsigned char Bit);
-  void ClearBit(unsigned char Bit);
-  bool GetBit(unsigned char Bit);
-} *PCharData;
-
-typedef struct SRegInfo
-{
-  SRegInfo();
-  ~SRegInfo();
-
-  EOps   Op;
-  union{
-    SRegInfo *Param;
-    int Symb;
-    PCharData ChrClass;
-  }un;
-  int s,e;
-  SRegInfo *Parent;
-  SRegInfo *Next;
-} *PRegInfo;
-
-typedef struct SMatches
-{
-  int s[MatchesNum];
-  int e[MatchesNum];
-  int CurMatch;
-} *PMatches;
-
-typedef class PosRegExp
-{
-  PRegInfo Info;
-  PMatches BkTrace;
-  bool NoCase,Extend,NoMoves;
-  bool Error;
-  int  *Exprn;
-  int  posParse;
-  int  posEnd,posStart;
-  int  posBkStr;
-  int  FirstChar;
-
-  bool SetExprLow(const char *Expr);
-  bool SetStructs(PRegInfo &Info,int st,int end);
-  void Optimize();
-  bool CheckSymb(int Symb,bool Inc);
-  bool LowParse(PRegInfo Re);
-  bool LowParseRe(PRegInfo &Next);
-  bool LowCheckNext(PRegInfo Re);
-  bool ParseRe(int posStr);
-  bool QuickCheck();
-public:
-  PMatches Matches;
-  int Ok, CurMatch;
-
-  void *param;
-  char (*CharAt)(int pos, void *param);
-
-  PosRegExp();
-  ~PosRegExp();
-
-  bool isok();
-  bool SetNoMoves(bool Moves);
-  bool SetBkTrace(int posStr,PMatches Trace);
-  bool SetExpr(const char *Expr);
-  bool Parse(int posStr, int posStop, PMatches Mtch);
-  bool Parse(int posStr,int posSol, int posEol, PMatches Mtch, int Moves = -1);
-  bool Evaluate(char *Expr, int posStr, PMatches Mtch, char **Res);
-} *PPosRegExp;
-
-#endif /* POSREGEXP_H */
diff --git a/src/stc/scintilla/include/PropSet.h b/src/stc/scintilla/include/PropSet.h
index 025174f8ab..6f6bf410f1 100644
--- a/src/stc/scintilla/include/PropSet.h
+++ b/src/stc/scintilla/include/PropSet.h
@@ -1,188 +1,17 @@
-// SciTE - Scintilla based Text Editor
-// PropSet.h - a java style properties file module
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file PropSet.h
+ ** A Java style properties file module.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef PROPSET_H
 #define PROPSET_H
+#include "SString.h"
 
 bool EqualCaseInsensitive(const char *a, const char *b);
 
-#if PLAT_WIN
-#define strcasecmp  stricmp
-#define strncasecmp strnicmp
-#endif
-
-#ifdef __WXMSW__
-#define strcasecmp  stricmp
-#define strncasecmp strnicmp
-#endif
-
-// Define another string class.
-// While it would be 'better' to use std::string, that doubles the executable size.
-
-inline char *StringDup(const char *s, int len=-1) {
-	if (!s)
-		return 0;
-	if (len == -1)
-		len = strlen(s);
-	char *sNew = new char[len + 1];
-	if (sNew) {
-		strncpy(sNew, s, len);
-		sNew[len] = '\0';
-	}
-	return sNew;
-}
-
-class SString {
-	char *s;
-	int ssize;
-public:
-	typedef const char* const_iterator;
-	typedef int size_type;
-	static size_type npos;
-	const char* begin(void) const {
-		return s;
-	}
-	const char* end(void) const {
-		return &s[ssize];
-	}
-	size_type size(void) const {
-		if (s)
-			return ssize;
-		else
-			return 0;
-	}
-	SString &assign(const char* sother, int size_ = -1) {
-		char *t = s;
-		s = StringDup(sother,size_);
-		ssize = (s) ? strlen(s) : 0;
-		delete []t;
-		return *this;
-	}
-	SString &assign(const SString& sother, int size_ = -1) {
-		return assign(sother.s,size_);
-	}
-	SString &assign(const_iterator ibeg, const_iterator iend) {
-		return assign(ibeg,iend - ibeg);
-	}
-	SString() {
-		s = 0;
-		ssize = 0;
-	}
-	SString(const SString &source) {
-		s = StringDup(source.s);
-		ssize = (s) ? strlen(s) : 0;
-	}
-	SString(const char *s_) {
-		s = StringDup(s_);
-		ssize = (s) ? strlen(s) : 0;
-	}
-	SString(int i) {
-		char number[100];
-		sprintf(number, "%0d", i);
-		s = StringDup(number);
-		ssize = (s) ? strlen(s) : 0;
-	}
-	~SString() {
-		delete []s;
-		s = 0;
-		ssize = 0;
-	}
-	SString &operator=(const SString &source) {
-		if (this != &source) {
-			delete []s;
-			s = StringDup(source.s);
-			ssize = (s) ? strlen(s) : 0;
-		}
-		return *this;
-	}
-	bool operator==(const SString &other) const {
-		if ((s == 0) && (other.s == 0))
-			return true;
-		if ((s == 0) || (other.s == 0))
-			return false;
-		return strcmp(s, other.s) == 0;
-	}
-	bool operator!=(const SString &other) const {
-		return !operator==(other);
-	}
-	bool operator==(const char *sother) const {
-		if ((s == 0) && (sother == 0))
-			return true;
-		if ((s == 0) || (sother == 0))
-			return false;
-		return strcmp(s, sother) == 0;
-	}
-	bool operator!=(const char *sother) const {
-		return !operator==(sother);
-	}
-	const char *c_str() const {
-		if (s)
-			return s;
-		else
-			return "";
-	}
-	int length() const {
-		if (s)
-			return strlen(s);
-		else
-			return 0;
-	}
-	char operator[](int i) const {
-		if (s)
-			return s[i];
-		else
-			return '\0';
-	}
-	SString &operator +=(const char *sother) {
-		return append(sother,-1);
-	}
-	SString &operator +=(const SString &sother) {
-		return append(sother.s,sother.ssize);
-	}
-	SString &operator +=(char ch) {
-		return append(&ch,1);
-	}
-	SString &append(const char* sother, int lenOther) {
-		int len = length();
-		if(lenOther < 0)
-			lenOther = strlen(sother);
-		char *sNew = new char[len + lenOther + 1];
-		if (sNew) {
-			if (s)
-				memcpy(sNew, s, len);
-			strncpy(&sNew[len], sother, lenOther);
-			sNew[len + lenOther] = '\0';
-			delete []s;
-			s = sNew;
-			ssize = (s) ? strlen(s) : 0;
-		}
-		return *this;
-	}
-	int value() const {
-		if (s)
-			return atoi(s);
-		else
-			return 0;
-	}
-	void substitute(char find, char replace) {
-		char *t = s;
-		while (t) {
-			t = strchr(t, find);
-			if (t)
-				*t = replace;
-		}
-	}
-	// I don't think this really belongs here -- Neil
-	void correctPath() {
-#ifdef unix
-		substitute('\\', '/');
-#else
-		substitute('/', '\\');
-#endif
-	}
-};
+bool isprefix(const char *target, const char *prefix);
 
 struct Property {
 	unsigned int hash;
@@ -192,53 +21,66 @@ struct Property {
 	Property() : hash(0), key(0), val(0), next(0) {}
 };
 
+/**
+ */
 class PropSet {
 private:
 	enum { hashRoots=31 };
 	Property *props[hashRoots];
+	Property *enumnext;
+	int enumhash;
 public:
 	PropSet *superPS;
 	PropSet();
 	~PropSet();
-	void Set(const char *key, const char *val);
-	void Set(char *keyval);
+	void Set(const char *key, const char *val, int lenKey=-1, int lenVal=-1);
+	void Set(const char *keyVal);
+	void SetMultiple(const char *s);
 	SString Get(const char *key);
 	SString GetExpanded(const char *key);
-	SString Expand(const char *withvars);
+	SString Expand(const char *withVars);
 	int GetInt(const char *key, int defaultValue=0);
 	SString GetWild(const char *keybase, const char *filename);
 	SString GetNewExpand(const char *keybase, const char *filename);
 	void Clear();
-	void ReadFromMemory(const char *data, int len, const char *directoryForImports=0);
-	void Read(const char *filename, const char *directoryForImports);
+	char *ToString();	// Caller must delete[] the return value
+	bool GetFirst(char **key, char **val);
+	bool GetNext(char **key, char **val);
 };
 
+/**
+ */
 class WordList {
 public:
-	// Each word contains at least one character - a empty word acts as sentinal at the end.
+	// Each word contains at least one character - a empty word acts as sentinel at the end.
 	char **words;
 	char **wordsNoCase;
 	char *list;
 	int len;
-	bool onlyLineEnds;	// Delimited by any white space or only line ends
+	bool onlyLineEnds;	///< Delimited by any white space or only line ends
 	bool sorted;
 	int starts[256];
-	WordList(bool onlyLineEnds_ = false) :
+	WordList(bool onlyLineEnds_ = false) : 
 		words(0), wordsNoCase(0), list(0), len(0), onlyLineEnds(onlyLineEnds_), sorted(false) {}
 	~WordList() { Clear(); }
-	operator bool() { return words ? true : false; }
-	const char *operator[](int ind) { return words[ind]; }
+	operator bool() { return len ? true : false; }
+	char *operator[](int ind) { return words[ind]; }
 	void Clear();
 	void Set(const char *s);
 	char *Allocate(int size);
 	void SetFromAllocated();
 	bool InList(const char *s);
 	const char *GetNearestWord(const char *wordStart, int searchLen = -1, bool ignoreCase = false);
-	char *GetNearestWords(const char *wordStart, int searchLen = -1, bool ignoreCase = false);
+	char *GetNearestWords(const char *wordStart, int searchLen=-1, 
+		bool ignoreCase=false, char otherSeparator='\0');
 };
 
 inline bool nonFuncChar(char ch) {
 	return strchr("\t\n\r !\"#$%&'()*+,-./:;<=>?@[\\]^`{|}~", ch) != NULL;
 }
 
+inline bool IsAlphabetic(unsigned int ch) {
+	return ((ch >= 'A') && (ch <= 'Z')) || ((ch >= 'a') && (ch <= 'z'));
+}
+
 #endif
diff --git a/src/stc/scintilla/include/SString.h b/src/stc/scintilla/include/SString.h
new file mode 100644
index 0000000000..aeb5940502
--- /dev/null
+++ b/src/stc/scintilla/include/SString.h
@@ -0,0 +1,255 @@
+// SciTE - Scintilla based Text Editor
+/** @file SString.h
+ ** A simple string class.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#ifndef SSTRING_H
+#define SSTRING_H
+
+// These functions are implemented because each platform calls them something different
+int CompareCaseInsensitive(const char *a, const char *b);
+int CompareNCaseInsensitive(const char *a, const char *b, int len);
+bool EqualCaseInsensitive(const char *a, const char *b);
+
+// Define another string class.
+// While it would be 'better' to use std::string, that doubles the executable size.
+// An SString may contain embedded nul characters.
+
+/**
+ * Duplicate a C string.
+ * Allocate memory of the given size, or big enough to fit the string if length isn't given;
+ * then copy the given string in the allocated memory.
+ * @return the pointer to the new string
+ */
+inline char *StringDup(
+	const char *s,	///< The string to duplicate
+	int len=-1)		///< The length of memory to allocate. Optional.
+{
+	if (!s)
+		return 0;
+	if (len == -1)
+		len = strlen(s);
+	char *sNew = new char[len + 1];
+	if (sNew) {
+		strncpy(sNew, s, len);
+		sNew[len] = '\0';
+	}
+	return sNew;
+}
+
+/**
+ * @brief A simple string class.
+ * Hold the length of the string for quick operations,
+ * can have a buffer bigger than the string to avoid too many memory allocations and copies.
+ * May have embedded zeroes as a result of @a substitute, but rely too heavily on C string
+ * functions to allow reliable manipulations of these strings.
+ **/
+class SString {
+	char *s;			///< The C string
+	int sSize;	///< The size of the buffer, less 1: ie. the maximum size of the string
+	int sLen;	///< The size of the string in s
+	int sizeGrowth;	///< Minimum growth size when appending strings
+	enum { sizeGrowthDefault = 64 };
+
+public:
+	typedef int size_type;
+
+	SString() : s(0), sSize(0), sLen(0), sizeGrowth(sizeGrowthDefault) {
+	}
+	SString(const SString &source) : sizeGrowth(sizeGrowthDefault) {
+		s = StringDup(source.s);
+		sSize = sLen = (s) ? strlen(s) : 0;
+	}
+	SString(const char *s_) : sizeGrowth(sizeGrowthDefault) {
+		s = StringDup(s_);
+		sSize = sLen = (s) ? strlen(s) : 0;
+	}
+	SString(const char *s_, int first, int last) : sizeGrowth(sizeGrowthDefault) {
+		s = StringDup(s_ + first, last - first);
+		sSize = sLen = (s) ? strlen(s) : 0;
+	}
+	SString(int i) : sizeGrowth(sizeGrowthDefault) {
+		char number[32];
+		sprintf(number, "%0d", i);
+		s = StringDup(number);
+		sSize = sLen = (s) ? strlen(s) : 0;
+	}
+	~SString() {
+		delete []s;
+		s = 0;
+		sSize = 0;
+		sLen = 0;
+	}
+	void clear(void) {
+		if (s) {
+			*s = '\0';
+		}
+		sLen = 0;
+	}
+	/** Size of buffer. */
+	size_type size(void) const {	///<
+		if (s)
+			return sSize;
+		else
+			return 0;
+	}
+	/** Size of string in buffer. */
+	int length() const {
+		return sLen;
+	}
+	SString &assign(const char* sOther, int sSize_ = -1) {
+		if (!sOther) {
+			sSize_ = 0;
+		}
+		if (sSize_ < 0) {
+			sSize_ = strlen(sOther);
+		}
+		if (sSize > 0 && sSize_ <= sSize) {	// Does not allocate new buffer if the current is big enough
+			if (s && sSize_) {
+				strncpy(s, sOther, sSize_);
+			}
+			s[sSize_] = '\0';
+			sLen = sSize_;
+		} else {
+			delete []s;
+			s = StringDup(sOther, sSize_);
+			if (s) {
+				sSize = sSize_;	// Allow buffer bigger than real string, thus providing space to grow
+				sLen = strlen(s);
+			} else {
+				sSize = sLen = 0;
+			}
+		}
+		return *this;
+	}
+	SString &assign(const SString& sOther, int sSize_ = -1) {
+		return assign(sOther.s, sSize_);
+	}
+	SString &operator=(const char *source) {
+		return assign(source);
+	}
+	SString &operator=(const SString &source) {
+		if (this != &source) {
+			assign(source.c_str());
+		}
+		return *this;
+	}
+	bool operator==(const SString &sOther) const {
+		if ((s == 0) && (sOther.s == 0))
+			return true;
+		if ((s == 0) || (sOther.s == 0))
+			return false;
+		return strcmp(s, sOther.s) == 0;
+	}
+	bool operator!=(const SString &sOther) const {
+		return !operator==(sOther);
+	}
+	bool operator==(const char *sOther) const {
+		if ((s == 0) && (sOther == 0))
+			return true;
+		if ((s == 0) || (sOther == 0))
+			return false;
+		return strcmp(s, sOther) == 0;
+	}
+	bool operator!=(const char *sOther) const {
+		return !operator==(sOther);
+	}
+	bool contains(char ch) {
+		if (s && *s)
+			return strchr(s, ch) != 0;
+		else
+			return false;
+	}
+	void setsizegrowth(int sizeGrowth_) {
+		sizeGrowth = sizeGrowth_;
+	}
+	const char *c_str() const {
+		if (s)
+			return s;
+		else
+			return "";
+	}
+	/** Give ownership of buffer to caller which must use delete[] to free buffer. */
+	char *detach() {
+		char *sRet = s;
+		s = 0;
+		sSize = 0;
+		sLen = 0;
+		return sRet;
+	}
+	char operator[](int i) const {
+		if (s && i < sSize)	// Or < sLen? Depends on the use, both are OK
+			return s[i];
+		else
+			return '\0';
+	}
+	SString &append(const char* sOther, int sLenOther=-1, char sep=0) {
+		if (sLenOther < 0)
+			sLenOther = strlen(sOther);
+		int lenSep = 0;
+		if (sLen && sep)	// Only add a separator if not empty
+			lenSep = 1;
+		int lenNew = sLen + sLenOther + lenSep;
+		if (lenNew + 1 < sSize) {
+			// Conservative about growing the buffer: don't do it, unless really needed
+			if (lenSep) {
+				s[sLen] = sep;
+				sLen++;
+			}
+			strncpy(&s[sLen], sOther, sLenOther);
+			s[sLen + sLenOther] = '\0';
+			sLen += sLenOther;
+		} else {
+			// Grow the buffer bigger than really needed, to have room for other appends
+			char *sNew = new char[lenNew + sizeGrowth + 1];
+			if (sNew) {
+				if (s) {
+					memcpy(sNew, s, sLen);
+					delete []s;
+				}
+				s = sNew;
+				sSize = lenNew + sizeGrowth;
+				if (lenSep) {
+					s[sLen] = sep;
+					sLen++;
+				}
+				strncpy(&s[sLen], sOther, sLenOther);
+				sNew[sLen + sLenOther] = '\0';
+				sLen += sLenOther;
+			}
+		}
+		return *this;
+	}
+	SString &operator +=(const char *sOther) {
+		return append(sOther, -1);
+	}
+	SString &operator +=(const SString &sOther) {
+		return append(sOther.s, sOther.sSize);
+	}
+	SString &operator +=(char ch) {
+		return append(&ch, 1);
+	}
+	SString &appendwithseparator(const char* sOther, char sep) {
+		return append(sOther, strlen(sOther), sep);
+	}
+	int value() const {
+		if (s)
+			return atoi(s);
+		else
+			return 0;
+	}
+	void substitute(char find, char replace) {
+		char *t = s;
+		while (t) {
+			t = strchr(t, find);
+			if (t) {
+				*t = replace;
+				t++;
+			}
+		}
+	}
+};
+
+#endif
diff --git a/src/stc/scintilla/include/SciLexer.h b/src/stc/scintilla/include/SciLexer.h
index 69402ab9ab..591bd06aa1 100644
--- a/src/stc/scintilla/include/SciLexer.h
+++ b/src/stc/scintilla/include/SciLexer.h
@@ -1,6 +1,8 @@
 // Scintilla source code edit control
-// SciLexer - interface to the added lexer functions in the SciLexer version of the edit control
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file SciLexer.h
+ ** Interface to the added lexer functions in the SciLexer version of the edit control.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 // Most of this file is automatically generated from the Scintilla.iface interface definition
@@ -29,6 +31,16 @@
 #define SCLEX_LATEX 14
 #define SCLEX_LUA 15
 #define SCLEX_DIFF 16
+#define SCLEX_CONF 17
+#define SCLEX_PASCAL 18
+#define SCLEX_AVE 19
+#define SCLEX_ADA 20
+#define SCLEX_LISP 21
+#define SCLEX_RUBY 22
+#define SCLEX_EIFFEL 23
+#define SCLEX_EIFFELKW 24
+#define SCLEX_TCL 25
+#define SCLEX_AUTOMATIC 1000
 #define SCE_P_DEFAULT 0
 #define SCE_P_COMMENTLINE 1
 #define SCE_P_NUMBER 2
@@ -57,6 +69,9 @@
 #define SCE_C_IDENTIFIER 11
 #define SCE_C_STRINGEOL 12
 #define SCE_C_VERBATIM 13
+#define SCE_C_REGEX 14
+#define SCE_C_COMMENTLINEDOC 15
+#define SCE_C_WORD2 16
 #define SCE_H_DEFAULT 0
 #define SCE_H_TAG 1
 #define SCE_H_TAGUNKNOWN 2
@@ -77,6 +92,8 @@
 #define SCE_H_CDATA 17
 #define SCE_H_QUESTION 18
 #define SCE_H_VALUE 19
+#define SCE_H_XCCOMMENT 20
+#define SCE_H_SGML 21
 #define SCE_HJ_START 40
 #define SCE_HJ_DEFAULT 41
 #define SCE_HJ_COMMENT 42
@@ -89,6 +106,7 @@
 #define SCE_HJ_SINGLESTRING 49
 #define SCE_HJ_SYMBOLS 50
 #define SCE_HJ_STRINGEOL 51
+#define SCE_HJ_REGEX 52
 #define SCE_HJA_START 55
 #define SCE_HJA_DEFAULT 56
 #define SCE_HJA_COMMENT 57
@@ -101,6 +119,7 @@
 #define SCE_HJA_SINGLESTRING 64
 #define SCE_HJA_SYMBOLS 65
 #define SCE_HJA_STRINGEOL 66
+#define SCE_HJA_REGEX 67
 #define SCE_HB_START 70
 #define SCE_HB_DEFAULT 71
 #define SCE_HB_COMMENTLINE 72
@@ -151,9 +170,10 @@
 #define SCE_HPHP_VARIABLE 123
 #define SCE_HPHP_COMMENT 124
 #define SCE_HPHP_COMMENTLINE 125
-#define SCE_HPHP_STRINGEOL 126
+#define SCE_HPHP_HSTRING_VARIABLE 126
+#define SCE_HPHP_OPERATOR 127
 #define SCE_PL_DEFAULT 0
-#define SCE_PL_HERE 1
+#define SCE_PL_ERROR 1
 #define SCE_PL_COMMENTLINE 2
 #define SCE_PL_POD 3
 #define SCE_PL_NUMBER 4
@@ -168,12 +188,20 @@
 #define SCE_PL_ARRAY 13
 #define SCE_PL_HASH 14
 #define SCE_PL_SYMBOLTABLE 15
-#define SCE_PL_REF 16
 #define SCE_PL_REGEX 17
 #define SCE_PL_REGSUBST 18
 #define SCE_PL_LONGQUOTE 19
 #define SCE_PL_BACKTICKS 20
 #define SCE_PL_DATASECTION 21
+#define SCE_PL_HERE_DELIM 22
+#define SCE_PL_HERE_Q 23
+#define SCE_PL_HERE_QQ 24
+#define SCE_PL_HERE_QX 25
+#define SCE_PL_STRING_Q 26
+#define SCE_PL_STRING_QQ 27
+#define SCE_PL_STRING_QX 28
+#define SCE_PL_STRING_QR 29
+#define SCE_PL_STRING_QW 30
 #define SCE_L_DEFAULT 0
 #define SCE_L_COMMAND 1
 #define SCE_L_TAG 2
@@ -199,6 +227,74 @@
 #define SCE_ERR_CMD 4
 #define SCE_ERR_BORLAND 5
 #define SCE_ERR_PERL 6
+#define SCE_ERR_NET 7
+#define SCE_ERR_LUA 8
+#define SCE_ERR_DIFF_CHANGED 10
+#define SCE_ERR_DIFF_ADDITION 11
+#define SCE_ERR_DIFF_DELETION 12
+#define SCE_ERR_DIFF_MESSAGE 13
+#define SCE_BAT_DEFAULT 0
+#define SCE_BAT_COMMENT 1
+#define SCE_BAT_WORD 2
+#define SCE_BAT_LABEL 3
+#define SCE_BAT_HIDE 4
+#define SCE_BAT_COMMAND 5
+#define SCE_BAT_IDENTIFIER 6
+#define SCE_BAT_OPERATOR 7
+#define SCE_MAKE_DEFAULT 0
+#define SCE_MAKE_COMMENT 1
+#define SCE_MAKE_PREPROCESSOR 2
+#define SCE_MAKE_IDENTIFIER 3
+#define SCE_MAKE_OPERATOR 4
+#define SCE_MAKE_TARGET 5
+#define SCE_MAKE_IDEOL 9
+#define SCE_CONF_DEFAULT 0
+#define SCE_CONF_COMMENT 1
+#define SCE_CONF_NUMBER 2
+#define SCE_CONF_IDENTIFIER 3
+#define SCE_CONF_EXTENSION 4
+#define SCE_CONF_PARAMETER 5
+#define SCE_CONF_STRING 6
+#define SCE_CONF_OPERATOR 7
+#define SCE_CONF_IP 8
+#define SCE_CONF_DIRECTIVE 9
+#define SCE_AVE_DEFAULT 0
+#define SCE_AVE_COMMENT 1
+#define SCE_AVE_NUMBER 2
+#define SCE_AVE_WORD 3
+#define SCE_AVE_KEYWORD 4
+#define SCE_AVE_STATEMENT 5
+#define SCE_AVE_STRING 6
+#define SCE_AVE_ENUM 7
+#define SCE_AVE_STRINGEOL 8
+#define SCE_AVE_IDENTIFIER 9
+#define SCE_AVE_OPERATOR 10
+#define SCE_ADA_DEFAULT 0
+#define SCE_ADA_COMMENT 1
+#define SCE_ADA_NUMBER 2
+#define SCE_ADA_WORD 3
+#define SCE_ADA_STRING 4
+#define SCE_ADA_CHARACTER 5
+#define SCE_ADA_OPERATOR 6
+#define SCE_ADA_IDENTIFIER 7
+#define SCE_ADA_STRINGEOL 8
+#define SCE_LISP_DEFAULT 0
+#define SCE_LISP_COMMENT 1
+#define SCE_LISP_NUMBER 2
+#define SCE_LISP_KEYWORD 3
+#define SCE_LISP_STRING 6
+#define SCE_LISP_STRINGEOL 8
+#define SCE_LISP_IDENTIFIER 9
+#define SCE_LISP_OPERATOR 10
+#define SCE_EIFFEL_DEFAULT 0
+#define SCE_EIFFEL_COMMENTLINE 1
+#define SCE_EIFFEL_NUMBER 2
+#define SCE_EIFFEL_WORD 3
+#define SCE_EIFFEL_STRING 4
+#define SCE_EIFFEL_CHARACTER 5
+#define SCE_EIFFEL_OPERATOR 6
+#define SCE_EIFFEL_IDENTIFIER 7
+#define SCE_EIFFEL_STRINGEOL 8
 //--Autogenerated -- end of section automatically generated from Scintilla.iface
 
 #endif
diff --git a/src/stc/scintilla/include/Scintilla.h b/src/stc/scintilla/include/Scintilla.h
index ca81d135bd..0185d3e5be 100644
--- a/src/stc/scintilla/include/Scintilla.h
+++ b/src/stc/scintilla/include/Scintilla.h
@@ -1,6 +1,8 @@
 // Scintilla source code edit control
-// Scintilla.h - interface to the edit control
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file Scintilla.h
+ ** Interface to the edit control.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 // Most of this file is automatically generated from the Scintilla.iface interface definition
@@ -18,7 +20,13 @@ void Scintilla_RegisterClasses(HINSTANCE hInstance);
 #endif
 #endif
 
-typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wParam, long lParam);
+// Here should be placed typedefs for uptr_t, an unsigned integer type large enough to
+// hold a pointer and sptr_t, a signed integer large enough to hold a pointer.
+// May need to be changed for 64 bit platforms.
+typedef unsigned long uptr_t;
+typedef long sptr_t;
+
+typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, sptr_t lParam);
 
 //++Autogenerated -- start of section automatically generated from Scintilla.iface
 #define INVALID_POSITION -1
@@ -50,15 +58,16 @@ typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wPara
 #define SCI_GETVIEWWS 2020
 #define SCI_SETVIEWWS 2021
 #define SCI_POSITIONFROMPOINT 2022
+#define SCI_POSITIONFROMPOINTCLOSE 2023
 #define SCI_GOTOLINE 2024
 #define SCI_GOTOPOS 2025
 #define SCI_SETANCHOR 2026
 #define SCI_GETCURLINE 2027
 #define SCI_GETENDSTYLED 2028
-#define SCI_CONVERTEOLS 2029
 #define SC_EOL_CRLF 0
 #define SC_EOL_CR 1
 #define SC_EOL_LF 2
+#define SCI_CONVERTEOLS 2029
 #define SCI_GETEOLMODE 2030
 #define SCI_SETEOLMODE 2031
 #define SCI_STARTSTYLING 2032
@@ -80,6 +89,24 @@ typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wPara
 #define SC_MARK_ARROWDOWN 6
 #define SC_MARK_MINUS 7
 #define SC_MARK_PLUS 8
+#define SC_MARK_VLINE 9
+#define SC_MARK_LCORNER 10
+#define SC_MARK_TCORNER 11
+#define SC_MARK_BOXPLUS 12
+#define SC_MARK_BOXPLUSCONNECTED 13
+#define SC_MARK_BOXMINUS 14
+#define SC_MARK_BOXMINUSCONNECTED 15
+#define SC_MARK_LCORNERCURVE 16
+#define SC_MARK_TCORNERCURVE 17
+#define SC_MARK_CIRCLEPLUS 18
+#define SC_MARK_CIRCLEPLUSCONNECTED 19
+#define SC_MARK_CIRCLEMINUS 20
+#define SC_MARK_CIRCLEMINUSCONNECTED 21
+#define SC_MARKNUM_FOLDEREND 25
+#define SC_MARKNUM_FOLDEROPENMID 26
+#define SC_MARKNUM_FOLDERMIDTAIL 27
+#define SC_MARKNUM_FOLDERTAIL 28
+#define SC_MARKNUM_FOLDERSUB 29
 #define SC_MARKNUM_FOLDER 30
 #define SC_MARKNUM_FOLDEROPEN 31
 #define SCI_MARKERDEFINE 2040
@@ -137,6 +164,10 @@ typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wPara
 #define SCI_STYLESETEOLFILLED 2057
 #define SCI_STYLERESETDEFAULT 2058
 #define SCI_STYLESETUNDERLINE 2059
+#define SC_CASE_MIXED 0
+#define SC_CASE_UPPER 1
+#define SC_CASE_LOWER 2
+#define SCI_STYLESETCASE 2060
 #define SCI_STYLESETCHARACTERSET 2066
 #define SCI_SETSELFORE 2067
 #define SCI_SETSELBACK 2068
@@ -170,6 +201,10 @@ typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wPara
 #define SCI_SETLINESTATE 2092
 #define SCI_GETLINESTATE 2093
 #define SCI_GETMAXLINESTATE 2094
+#define SCI_GETCARETLINEVISIBLE 2095
+#define SCI_SETCARETLINEVISIBLE 2096
+#define SCI_GETCARETLINEBACK 2097
+#define SCI_SETCARETLINEBACK 2098
 #define SCI_AUTOCSHOW 2100
 #define SCI_AUTOCCANCEL 2101
 #define SCI_AUTOCACTIVE 2102
@@ -186,6 +221,9 @@ typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wPara
 #define SCI_AUTOCGETCHOOSESINGLE 2114
 #define SCI_AUTOCSETIGNORECASE 2115
 #define SCI_AUTOCGETIGNORECASE 2116
+#define SCI_USERLISTSHOW 2117
+#define SCI_AUTOCSETAUTOHIDE 2118
+#define SCI_AUTOCGETAUTOHIDE 2119
 #define SCI_SETINDENT 2122
 #define SCI_GETINDENT 2123
 #define SCI_SETUSETABS 2124
@@ -215,9 +253,10 @@ typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wPara
 #define SC_PRINT_NORMAL 0
 #define SC_PRINT_INVERTLIGHT 1
 #define SC_PRINT_BLACKONWHITE 2
+#define SC_PRINT_COLOURONWHITE 3
+#define SC_PRINT_COLOURONWHITEDEFAULTBG 4
 #define SCI_SETPRINTCOLOURMODE 2148
 #define SCI_GETPRINTCOLOURMODE 2149
-#define SCFIND_DOWN 1
 #define SCFIND_WHOLEWORD 2
 #define SCFIND_MATCHCASE 4
 #define SCFIND_WORDSTART 0x00100000
@@ -260,6 +299,17 @@ typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wPara
 #define SCI_GETDIRECTPOINTER 2185
 #define SCI_SETOVERTYPE 2186
 #define SCI_GETOVERTYPE 2187
+#define SCI_SETCARETWIDTH 2188
+#define SCI_GETCARETWIDTH 2189
+#define SCI_SETTARGETSTART 2190
+#define SCI_GETTARGETSTART 2191
+#define SCI_SETTARGETEND 2192
+#define SCI_GETTARGETEND 2193
+#define SCI_REPLACETARGET 2194
+#define SCI_REPLACETARGETRE 2195
+#define SCI_SEARCHINTARGET 2197
+#define SCI_SETSEARCHFLAGS 2198
+#define SCI_GETSEARCHFLAGS 2199
 #define SCI_CALLTIPSHOW 2200
 #define SCI_CALLTIPCANCEL 2201
 #define SCI_CALLTIPACTIVE 2202
@@ -284,6 +334,14 @@ typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wPara
 #define SCI_TOGGLEFOLD 2231
 #define SCI_ENSUREVISIBLE 2232
 #define SCI_SETFOLDFLAGS 2233
+#define SCI_ENSUREVISIBLEENFORCEPOLICY 2234
+#define SCI_SETTABINDENTS 2260
+#define SCI_GETTABINDENTS 2261
+#define SCI_SETBACKSPACEUNINDENTS 2262
+#define SCI_GETBACKSPACEUNINDENTS 2263
+#define SC_TIME_FOREVER 10000000
+#define SCI_SETMOUSEDWELLTIME 2264
+#define SCI_GETMOUSEDWELLTIME 2265
 #define SCI_LINEDOWN 2300
 #define SCI_LINEDOWNEXTEND 2301
 #define SCI_LINEUP 2302
@@ -328,6 +386,7 @@ typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wPara
 #define SCI_UPPERCASE 2341
 #define SCI_LINESCROLLDOWN 2342
 #define SCI_LINESCROLLUP 2343
+#define SCI_MOVECARETINSIDEVIEW 2401
 #define SCI_LINELENGTH 2350
 #define SCI_BRACEHIGHLIGHT 2351
 #define SCI_BRACEBADLIGHT 2352
@@ -352,6 +411,8 @@ typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wPara
 #define CARET_SLOP 0x01
 #define CARET_CENTER 0x02
 #define CARET_STRICT 0x04
+#define CARET_XEVEN 0x08
+#define CARET_XJUMPS 0x10
 #define SCI_SETCARETPOLICY 2369
 #define SCI_LINESONSCREEN 2370
 #define SCI_USEPOPUP 2371
@@ -362,6 +423,25 @@ typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wPara
 #define SCI_ADDREFDOCUMENT 2376
 #define SCI_RELEASEDOCUMENT 2377
 #define SCI_GETMODEVENTMASK 2378
+#define SCI_SETFOCUS 2380
+#define SCI_GETFOCUS 2381
+#define SCI_SETSTATUS 2382
+#define SCI_GETSTATUS 2383
+#define SCI_SETMOUSEDOWNCAPTURES 2384
+#define SCI_GETMOUSEDOWNCAPTURES 2385
+#define SC_CURSORNORMAL -1
+#define SC_CURSORWAIT 3
+#define SCI_SETCURSOR 2386
+#define SCI_GETCURSOR 2387
+#define SCI_WORDPARTLEFT 2390
+#define SCI_WORDPARTLEFTEXTEND 2391
+#define SCI_WORDPARTRIGHT 2392
+#define SCI_WORDPARTRIGHTEXTEND 2393
+#define VISIBLE_SLOP 0x01
+#define VISIBLE_STRICT 0x04
+#define SCI_SETVISIBLEPOLICY 2394
+#define SCI_DELLINELEFT 2395
+#define SCI_DELLINERIGHT 2396
 #define SCI_GRABFOCUS 2400
 #define SCI_STARTRECORD 3001
 #define SCI_STOPRECORD 3002
@@ -370,6 +450,7 @@ typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wPara
 #define SCI_COLOURISE 4003
 #define SCI_SETPROPERTY 4004
 #define SCI_SETKEYWORDS 4005
+#define SCI_SETLEXERLANGUAGE 4006
 #define SC_MOD_INSERTTEXT 0x1
 #define SC_MOD_DELETETEXT 0x2
 #define SC_MOD_CHANGESTYLE 0x4
@@ -419,6 +500,11 @@ typedef long (*SciFnDirect)(long ptr, unsigned int iMessage, unsigned long wPara
 #define SCN_MARGINCLICK 2010
 #define SCN_NEEDSHOWN 2011
 #define SCN_POSCHANGED 2012
+#define SCN_PAINTED 2013
+#define SCN_USERLISTSELECTION 2014
+#define SCN_URIDROPPED 2015
+#define SCN_DWELLSTART 2016
+#define SCN_DWELLEND 2017
 //--Autogenerated -- end of section automatically generated from Scintilla.iface
 
 // Optional module for macro recording
@@ -437,14 +523,14 @@ struct CharacterRange {
 };
 
 struct TextRange {
-	CharacterRange chrg;
+	struct CharacterRange chrg;
 	char *lpstrText;
 };
 
 struct TextToFind {
-	CharacterRange chrg;
+	struct CharacterRange chrg;
 	char *lpstrText;
-	CharacterRange chrgText;
+	struct CharacterRange chrgText;
 };
 
 #ifdef PLATFORM_H
@@ -463,8 +549,8 @@ struct RangeToFormat {
 #endif
 
 struct NotifyHeader {
-    // hwndFrom is really an environment specifc window handle or pointer
-    // but most clients of Scintilla.h do not have this type visible.
+	// hwndFrom is really an environment specifc window handle or pointer
+	// but most clients of Scintilla.h do not have this type visible.
 	//WindowID hwndFrom;
 	void *hwndFrom; 
 	unsigned int idFrom;
@@ -472,26 +558,35 @@ struct NotifyHeader {
 };
 
 struct SCNotification {
-	NotifyHeader nmhdr;
-	int position;			// SCN_STYLENEEDED, SCN_MODIFIED
-	int ch;					// SCN_CHARADDED, SCN_KEY
-	int modifiers;			// SCN_KEY
-  	int modificationType;	// SCN_MODIFIED
- 	const char *text;		// SCN_MODIFIED
- 	int length;				// SCN_MODIFIED
- 	int linesAdded;	// SCN_MODIFIED
+	struct NotifyHeader nmhdr;
+	int position;	// SCN_STYLENEEDED, SCN_MODIFIED, SCN_DWELLSTART, SCN_DWELLEND
+	int ch;		// SCN_CHARADDED, SCN_KEY
+	int modifiers;	// SCN_KEY
+	int modificationType;	// SCN_MODIFIED
+	const char *text;	// SCN_MODIFIED
+	int length;		// SCN_MODIFIED
+	int linesAdded;	// SCN_MODIFIED
 #ifdef MACRO_SUPPORT
 	int message;	// SCN_MACRORECORD
-	int wParam;	// SCN_MACRORECORD
-	int lParam;	// SCN_MACRORECORD
+	uptr_t wParam;	// SCN_MACRORECORD
+	sptr_t lParam;		// SCN_MACRORECORD
 #endif
-	int line;			// SCN_MODIFIED
+	int line;		// SCN_MODIFIED
 	int foldLevelNow;	// SCN_MODIFIED
 	int foldLevelPrev;	// SCN_MODIFIED
-	int margin;	// SCN_MARGINCLICK
+	int margin;		// SCN_MARGINCLICK
+	int listType;	// SCN_USERLISTSELECTION
+	int x;			// SCN_DWELLSTART, SCN_DWELLEND
+	int y;		// SCN_DWELLSTART, SCN_DWELLEND
 };
 
-#define SC_MASK_FOLDERS ((1<<SC_MARKNUM_FOLDER) | (1<<SC_MARKNUM_FOLDEROPEN))
+#define SC_MASK_FOLDERS ((1<<SC_MARKNUM_FOLDER) | \
+	(1<<SC_MARKNUM_FOLDEROPEN) | \
+	(1<<SC_MARKNUM_FOLDERSUB) | \
+	(1<<SC_MARKNUM_FOLDERTAIL) | \
+	(1<<SC_MARKNUM_FOLDERMIDTAIL) | \
+	(1<<SC_MARKNUM_FOLDEROPENMID) | \
+	(1<<SC_MARKNUM_FOLDEREND))
 
 // Deprecation section listing all API features that are deprecated and will
 // will be removed completely in a future version.
@@ -499,10 +594,6 @@ struct SCNotification {
 
 #ifdef INCLUDE_DEPRECATED_FEATURES
 
-// Deprecated in 1.27
-#define SC_UNDOCOLLECT_NONE 0
-#define SC_UNDOCOLLECT_AUTOSTART 1
-
 #endif
 
 #endif
diff --git a/src/stc/scintilla/include/Scintilla.iface b/src/stc/scintilla/include/Scintilla.iface
index 416063efa5..90360076fa 100644
--- a/src/stc/scintilla/include/Scintilla.iface
+++ b/src/stc/scintilla/include/Scintilla.iface
@@ -134,6 +134,10 @@ set void SetViewWS=2021(int viewWS,)
 # Find the position from a point within the window.
 fun int PositionFromPoint=2022(int x, int y)
 
+# 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)
+
 # Set caret to start of a line and ensure it is visible.
 fun void GotoLine=2024(int line,)
 
@@ -151,13 +155,13 @@ fun int GetCurLine=2027(int length, stringresult text)
 # Retrieve the position of the last correctly styled character.
 get position GetEndStyled=2028(,)
 
-# Convert all line endings in the document to use the current mode.
-fun void ConvertEOLs=2029(,)
-
 val SC_EOL_CRLF=0
 val SC_EOL_CR=1
 val SC_EOL_LF=2
 
+# Convert all line endings in the document to one mode.
+fun void ConvertEOLs=2029(int eolMode,)
+
 # Retrieve the current end of line mode - one of CRLF, CR, or LF.
 get int GetEOLMode=2030(,)
 
@@ -210,6 +214,27 @@ val SC_MARK_ARROWDOWN=6
 val SC_MARK_MINUS=7
 val SC_MARK_PLUS=8
 
+# Shapes used for outlining column
+val SC_MARK_VLINE=9
+val SC_MARK_LCORNER=10
+val SC_MARK_TCORNER=11
+val SC_MARK_BOXPLUS=12
+val SC_MARK_BOXPLUSCONNECTED=13
+val SC_MARK_BOXMINUS=14
+val SC_MARK_BOXMINUSCONNECTED=15
+val SC_MARK_LCORNERCURVE=16
+val SC_MARK_TCORNERCURVE=17
+val SC_MARK_CIRCLEPLUS=18
+val SC_MARK_CIRCLEPLUSCONNECTED=19
+val SC_MARK_CIRCLEMINUS=20
+val SC_MARK_CIRCLEMINUSCONNECTED=21
+
+# Markers used for outlining column
+val SC_MARKNUM_FOLDEREND=25
+val SC_MARKNUM_FOLDEROPENMID=26
+val SC_MARKNUM_FOLDERMIDTAIL=27
+val SC_MARKNUM_FOLDERTAIL=28
+val SC_MARKNUM_FOLDERSUB=29
 val SC_MARKNUM_FOLDER=30
 val SC_MARKNUM_FOLDEROPEN=31
 
@@ -327,6 +352,12 @@ fun void StyleResetDefault=2058(,)
 # Set a style to be underlined or not.
 set void StyleSetUnderline=2059(int style, bool underline)
 
+val SC_CASE_MIXED=0
+val SC_CASE_UPPER=1
+val SC_CASE_LOWER=2
+# Set a style to be mixed case, or to force upper or lower case.
+set void StyleSetCase=2060(int style, int caseForce)
+
 # Set the character set of the font in a style.
 set void StyleSetCharacterSet=2066(int style, int characterSet)
 
@@ -412,6 +443,18 @@ get int GetLineState=2093(int line,)
 # Retrieve the last line number that has line state.
 get int GetMaxLineState=2094(,)
 
+# Is the background of the line containing the caret in a different colour?
+get bool GetCaretLineVisible=2095(,)
+
+# Display the background of the line containing the caret in a different colour.
+set void SetCaretLineVisible=2096(bool show,)
+
+# Get the colour of the background of the line containing the caret.
+get colour GetCaretLineBack=2097(,)
+
+# Set the colour of the background of the line containing the caret.
+set void SetCaretLineBack=2098(colour back,)
+
 # Display a auto-completion list.
 # The lenEntered parameter indicates how many characters before
 # the caret should be used to provide context.
@@ -465,6 +508,15 @@ set void AutoCSetIgnoreCase=2115(bool ignoreCase,)
 # Retrieve state of ignore case flag.
 get bool AutoCGetIgnoreCase=2116(,)
 
+# Display a list of strings and send notification when user chooses one.
+fun void UserListShow=2117(int listType, string itemList)
+
+# Set whether or not autocompletion is hidden automatically when nothing matches
+set void AutoCSetAutoHide=2118(bool autoHide,)
+
+# Retrieve whether or not autocompletion is hidden automatically when nothing matches
+get bool AutoCGetAutoHide=2119(,)
+
 # Set the number of spaces used for one level of indentation.
 set void SetIndent=2122(int indentSize,)
 
@@ -551,6 +603,10 @@ val SC_PRINT_NORMAL=0
 val SC_PRINT_INVERTLIGHT=1
 # PrintColourMode - force black text on white background for printing.
 val SC_PRINT_BLACKONWHITE=2
+# PrintColourMode - text stays coloured, but all background is forced to be white for printing.
+val SC_PRINT_COLOURONWHITE=3
+# PrintColourMode - only the default-background is forced to be white for printing.
+val SC_PRINT_COLOURONWHITEDEFAULTBG=4
 
 # Modify colours when printing for clearer printed text.
 set void SetPrintColourMode=2148(int mode,)
@@ -558,11 +614,9 @@ set void SetPrintColourMode=2148(int mode,)
 # Returns the print colour mode.
 get int GetPrintColourMode=2149(,)
 
-val SCFIND_DOWN=1
 val SCFIND_WHOLEWORD=2
 val SCFIND_MATCHCASE=4
 val SCFIND_WORDSTART=0x00100000
-# SCFIND_REGEXP is not yet implemented.
 val SCFIND_REGEXP=0x00200000
 
 # Find some text in the document.
@@ -582,13 +636,13 @@ fun int GetLine=2153(int line, stringresult text)
 get int GetLineCount=2154(,)
 
 # Sets the size in pixels of the left margin.
-set void SetMarginLeft=2155(, int width)
+set void SetMarginLeft=2155(, int pixelWidth)
 
 # Returns the size in pixels of the left margin.
 get int GetMarginLeft=2156(,)
 
 # Sets the size in pixels of the right margin.
-set void SetMarginRight=2157(, int width)
+set void SetMarginRight=2157(, int pixelWidth)
 
 # Returns the size in pixels of the right margin.
 get int GetMarginRight=2158(,)
@@ -684,6 +738,48 @@ set void SetOvertype=2186(bool overtype,)
 # Returns true if overtype mode is active otherwise false is returned.
 get bool GetOvertype=2187(,)
 
+# Set the width of the insert mode caret
+set void SetCaretWidth=2188(int pixelWidth,)
+
+# Returns the width of the insert mode caret
+get int GetCaretWidth=2189(,)
+
+# Sets the position that starts the target which is used for updating the
+# document without affecting the scroll position.
+set void SetTargetStart=2190(position pos,)
+
+# Get the position that starts the target.
+get position GetTargetStart=2191(,)
+
+# Sets the position that ends the target which is used for updating the
+# document without affecting the scroll position.
+set void SetTargetEnd=2192(position pos,)
+
+# Get the position that ends the target.
+get position GetTargetEnd=2193(,)
+
+# Replace the target text with the argument text.
+# 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.
+# 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
+# caused by processing the \d patterns.
+fun int ReplaceTargetRE=2195(int length, string text)
+
+# Search for a counted string in the target and set the target to the found
+# range.
+# Returns length of range or -1 for failure in which case target is not moved.
+fun int SearchInTarget=2197(int length, string text)
+
+# Set the search flags used by SearchInTarget
+set void SetSearchFlags=2198(int flags,)
+
+# Get the search flags used by SearchInTarget
+get int GetSearchFlags=2199(,)
+
 # Show a call tip containing a definition near position pos.
 fun void CallTipShow=2200(position pos, string definition)
 
@@ -751,6 +847,30 @@ fun void EnsureVisible=2232(int line,)
 # Set some debugging options for folding
 fun void SetFoldFlags=2233(int flags,)
 
+# Ensure a particular line is visible by expanding any header line hiding it.
+# Use the currently set visibility policy to determine which range to display.
+fun void EnsureVisibleEnforcePolicy=2234(int line,)
+
+# Sets whether a tab pressed when caret is within indentation indents
+set void SetTabIndents=2260(bool tabIndents,)
+
+# Does a tab pressed when caret is within indentation indent?
+get bool GetTabIndents=2261(,)
+
+# Sets whether a backspace pressed when caret is within indentation unindents
+set void SetBackSpaceUnIndents=2262(bool bsUnIndents,)
+
+# Does a backspace pressed when caret is within indentation unindent?
+get bool GetBackSpaceUnIndents=2263(,)
+
+val SC_TIME_FOREVER=10000000
+
+# Sets the time the mouse must sit still to generate a mouse dwell event
+set void SetMouseDwellTime=2264(int periodMilliseconds,)
+
+# Retrieve the time the mouse must sit still to generate a mouse dwell event
+get int GetMouseDwellTime=2265(,)
+
 ## Start of key messages
 # Move caret down one line.
 fun void LineDown=2300(,)
@@ -887,6 +1007,9 @@ fun void LineScrollDown=2342(,)
 # Scroll the document up, keeping the caret visible.
 fun void LineScrollUp=2343(,)
 
+# Move the caret inside current view if it's not there already
+fun void MoveCaretInsideView=2401(,)
+
 # How many characters are on a line, not including end of line characters.
 fun int LineLength=2350(int line,)
 
@@ -909,7 +1032,7 @@ set void SetViewEOL=2356(bool visible,)
 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,)
@@ -942,18 +1065,28 @@ set void SetEdgeColour=2365(colour edgeColour,)
 fun void SearchAnchor=2366(,)
 
 # Find some text starting at the search anchor.
+# Does not ensure the selection is visible.
 fun int SearchNext=2367(int flags, string text)
 
 # Find some text starting at the search anchor and moving backwards.
+# Does not ensure the selection is visible.
 fun int SearchPrev=2368(int flags, string text)
 
 # Show caret within N lines of edge when it's scrolled to view
+# If CARET_SLOP not set then centre caret on screen when it's
+# scrolled to view
 val CARET_SLOP=0x01
-# Center caret on screen when it's scrolled to view
+# Value not used
 val CARET_CENTER=0x02
-# OR this with CARET_CENTER to reposition even when visible, or
-# OR this with CARET_SLOP to reposition whenever outside slop border
+# If CARET_SLOP also set then reposition whenever outside slop border
+# If CARET_SLOP not set then recentre even when visible
 val CARET_STRICT=0x04
+# If CARET_XEVEN set then both left and right margins are given equal weight
+# rather than favouring left following behaviour.
+val CARET_XEVEN=0x08
+# If CARET_XJUMPS set then when caret reaches the margin the display jumps
+# enough to leave the caret solidly within the display.
+val CARET_XJUMPS=0x10
 # Set the way the line the caret is on is kept visible.
 fun void SetCaretPolicy=2369(int caretPolicy, int caretSlop)
 
@@ -984,6 +1117,49 @@ fun void ReleaseDocument=2377(, int doc)
 # Get which document modification events are sent to the container.
 get int GetModEventMask=2378(,)
 
+# Change internal focus flag
+set void SetFocus=2380(bool focus,)
+# Get internal focus flag
+get bool GetFocus=2381(,)
+
+# Change error status - 0 = OK
+set void SetStatus=2382(int statusCode,)
+# Get error status
+get int GetStatus=2383(,)
+
+# Set whether the mouse is captured when its button is pressed
+set void SetMouseDownCaptures=2384(bool captures,)
+# Get whether mouse gets captured
+get bool GetMouseDownCaptures=2385(,)
+
+val SC_CURSORNORMAL=-1
+val SC_CURSORWAIT=3
+# Sets the cursor to one of the SC_CURSOR* values
+set void SetCursor=2386(int cursorType,)
+# Get cursor type
+get int GetCursor=2387(,)
+
+# Move to the previous change in capitalistion
+fun void WordPartLeft=2390(,)
+# Move to the previous change in capitalistion extending selection to new caret position.
+fun void WordPartLeftExtend=2391(,)
+# Move to the change next in capitalistion
+fun void WordPartRight=2392(,)
+# Move to the next change in capitalistion extending selection to new caret position.
+fun void WordPartRightExtend=2393(,)
+
+# Constants for use with SetVisiblePolicy, similar to SetCaretPolicy
+val VISIBLE_SLOP=0x01
+val VISIBLE_STRICT=0x04
+# Set the way the display area is determined when a particular line is to be moved to.
+fun void SetVisiblePolicy=2394(int visiblePolicy, int visibleSlop)
+
+# Delete back from the current position to the start of the line
+fun void DelLineLeft=2395(,)
+
+# Delete forwards from the current position to the end of the line
+fun void DelLineRight=2396(,)
+
 # Set the focus to this Scintilla widget.
 # GTK+ Specific
 fun void GrabFocus=2400(,)
@@ -1009,6 +1185,9 @@ set void SetProperty=4004(string key, string value)
 # Set up the key words used by the lexer.
 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)
+
 # Notifications
 # Type of modification and the action which caused the modification
 # These are defined as a bit mask to make it easy to specify which notifications are wanted.
@@ -1077,6 +1256,18 @@ val SCLEX_XCODE=13
 val SCLEX_LATEX=14
 val SCLEX_LUA=15
 val SCLEX_DIFF=16
+val SCLEX_CONF=17
+val SCLEX_PASCAL=18
+val SCLEX_AVE=19
+val SCLEX_ADA=20
+val SCLEX_LISP=21
+val SCLEX_RUBY=22
+val SCLEX_EIFFEL=23
+val SCLEX_EIFFELKW=24
+val SCLEX_TCL=25
+# When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
+# value assigned in sequence from SCLEX_AUTOMATIC+1.
+val SCLEX_AUTOMATIC=1000
 # Lexical states for SCLEX_PYTHON
 val SCE_P_DEFAULT=0
 val SCE_P_COMMENTLINE=1
@@ -1107,6 +1298,9 @@ val SCE_C_OPERATOR=10
 val SCE_C_IDENTIFIER=11
 val SCE_C_STRINGEOL=12
 val SCE_C_VERBATIM=13
+val SCE_C_REGEX=14
+val SCE_C_COMMENTLINEDOC=15
+val SCE_C_WORD2=16
 # Lexical states for SCLEX_HTML, SCLEX_XML
 val SCE_H_DEFAULT=0
 val SCE_H_TAG=1
@@ -1130,6 +1324,10 @@ val SCE_H_CDATA=17
 val SCE_H_QUESTION=18
 # More HTML
 val SCE_H_VALUE=19
+# X-Code
+val SCE_H_XCCOMMENT=20
+# SGML
+val SCE_H_SGML=21
 # Embedded Javascript
 val SCE_HJ_START=40
 val SCE_HJ_DEFAULT=41
@@ -1143,6 +1341,7 @@ val SCE_HJ_DOUBLESTRING=48
 val SCE_HJ_SINGLESTRING=49
 val SCE_HJ_SYMBOLS=50
 val SCE_HJ_STRINGEOL=51
+val SCE_HJ_REGEX=52
 # ASP Javascript
 val SCE_HJA_START=55
 val SCE_HJA_DEFAULT=56
@@ -1156,6 +1355,7 @@ val SCE_HJA_DOUBLESTRING=63
 val SCE_HJA_SINGLESTRING=64
 val SCE_HJA_SYMBOLS=65
 val SCE_HJA_STRINGEOL=66
+val SCE_HJA_REGEX=67
 # Embedded VBScript
 val SCE_HB_START=70
 val SCE_HB_DEFAULT=71
@@ -1211,10 +1411,11 @@ val SCE_HPHP_NUMBER=122
 val SCE_HPHP_VARIABLE=123
 val SCE_HPHP_COMMENT=124
 val SCE_HPHP_COMMENTLINE=125
-val SCE_HPHP_STRINGEOL=126
+val SCE_HPHP_HSTRING_VARIABLE=126
+val SCE_HPHP_OPERATOR=127
 # Lexical states for SCLEX_PERL
 val SCE_PL_DEFAULT=0
-val SCE_PL_HERE=1
+val SCE_PL_ERROR=1
 val SCE_PL_COMMENTLINE=2
 val SCE_PL_POD=3
 val SCE_PL_NUMBER=4
@@ -1229,12 +1430,20 @@ val SCE_PL_SCALAR=12
 val SCE_PL_ARRAY=13
 val SCE_PL_HASH=14
 val SCE_PL_SYMBOLTABLE=15
-val SCE_PL_REF=16
 val SCE_PL_REGEX=17
 val SCE_PL_REGSUBST=18
 val SCE_PL_LONGQUOTE=19
 val SCE_PL_BACKTICKS=20
 val SCE_PL_DATASECTION=21
+val SCE_PL_HERE_DELIM=22
+val SCE_PL_HERE_Q=23
+val SCE_PL_HERE_QQ=24
+val SCE_PL_HERE_QX=25
+val SCE_PL_STRING_Q=26
+val SCE_PL_STRING_QQ=27
+val SCE_PL_STRING_QX=28
+val SCE_PL_STRING_QR=29
+val SCE_PL_STRING_QW=30
 # Lexical states for SCLEX_LATEX
 val SCE_L_DEFAULT=0
 val SCE_L_COMMAND=1
@@ -1255,6 +1464,7 @@ val SCE_LUA_PREPROCESSOR=9
 val SCE_LUA_OPERATOR=10
 val SCE_LUA_IDENTIFIER=11
 val SCE_LUA_STRINGEOL=12
+# Lexical states for SCLEX_ERRORLIST
 val SCE_ERR_DEFAULT=0
 val SCE_ERR_PYTHON=1
 val SCE_ERR_GCC=2
@@ -1262,6 +1472,81 @@ val SCE_ERR_MS=3
 val SCE_ERR_CMD=4
 val SCE_ERR_BORLAND=5
 val SCE_ERR_PERL=6
+val SCE_ERR_NET=7
+val SCE_ERR_LUA=8
+val SCE_ERR_DIFF_CHANGED=10
+val SCE_ERR_DIFF_ADDITION=11
+val SCE_ERR_DIFF_DELETION=12
+val SCE_ERR_DIFF_MESSAGE=13
+# Lexical states for SCLEX_BATCH
+val SCE_BAT_DEFAULT=0
+val SCE_BAT_COMMENT=1
+val SCE_BAT_WORD=2
+val SCE_BAT_LABEL=3
+val SCE_BAT_HIDE=4
+val SCE_BAT_COMMAND=5
+val SCE_BAT_IDENTIFIER=6
+val SCE_BAT_OPERATOR=7
+# Lexical states for SCLEX_MAKEFILE
+val SCE_MAKE_DEFAULT=0
+val SCE_MAKE_COMMENT=1
+val SCE_MAKE_PREPROCESSOR=2
+val SCE_MAKE_IDENTIFIER=3
+val SCE_MAKE_OPERATOR=4
+val SCE_MAKE_TARGET=5
+val SCE_MAKE_IDEOL=9
+# Lexical states for the SCLEX_CONF (Apache Configuration Files Lexer)
+val SCE_CONF_DEFAULT=0
+val SCE_CONF_COMMENT=1
+val SCE_CONF_NUMBER=2
+val SCE_CONF_IDENTIFIER=3
+val SCE_CONF_EXTENSION=4
+val SCE_CONF_PARAMETER=5
+val SCE_CONF_STRING=6
+val SCE_CONF_OPERATOR=7
+val SCE_CONF_IP=8
+val SCE_CONF_DIRECTIVE=9
+# Avenue
+val SCE_AVE_DEFAULT=0
+val SCE_AVE_COMMENT=1
+val SCE_AVE_NUMBER=2
+val SCE_AVE_WORD=3
+val SCE_AVE_KEYWORD=4
+val SCE_AVE_STATEMENT=5
+val SCE_AVE_STRING=6
+val SCE_AVE_ENUM=7
+val SCE_AVE_STRINGEOL=8
+val SCE_AVE_IDENTIFIER=9
+val SCE_AVE_OPERATOR=10
+# Lexical states for SCLEX_ADA
+val SCE_ADA_DEFAULT=0
+val SCE_ADA_COMMENT=1
+val SCE_ADA_NUMBER=2
+val SCE_ADA_WORD=3
+val SCE_ADA_STRING=4
+val SCE_ADA_CHARACTER=5
+val SCE_ADA_OPERATOR=6
+val SCE_ADA_IDENTIFIER=7
+val SCE_ADA_STRINGEOL=8
+# Lexical states for SCLEX_LISP
+val SCE_LISP_DEFAULT=0
+val SCE_LISP_COMMENT=1
+val SCE_LISP_NUMBER=2
+val SCE_LISP_KEYWORD=3
+val SCE_LISP_STRING=6
+val SCE_LISP_STRINGEOL=8
+val SCE_LISP_IDENTIFIER=9
+val SCE_LISP_OPERATOR=10
+# Lexical states for SCLEX_EIFFEL and SCLEX_EIFFELKW
+val SCE_EIFFEL_DEFAULT=0
+val SCE_EIFFEL_COMMENTLINE=1
+val SCE_EIFFEL_NUMBER=2
+val SCE_EIFFEL_WORD=3
+val SCE_EIFFEL_STRING=4
+val SCE_EIFFEL_CHARACTER=5
+val SCE_EIFFEL_OPERATOR=6
+val SCE_EIFFEL_IDENTIFIER=7
+val SCE_EIFFEL_STRINGEOL=8
 
 # Events
 
@@ -1282,9 +1567,16 @@ evt void MacroRecord=2009(int message, int wParam, int lParam)
 evt void MarginClick=2010(int modifiers, int position, int margin)
 evt void NeedShown=2011(int position, int length)
 evt void PosChanged=2012(int position)
+evt void Painted=2013(void)
+evt void UserListSelection=2014(int listType, string text)
+evt void URIDropped=2015(string text)
+evt void DwellStart=2016(int position)
+evt void DwellEnd=2017(int position)
 
 cat Deprecated
 
+val SCFIND_DOWN=1
+
 ################################################
 # From WinDefs.h
 
diff --git a/src/stc/scintilla/include/ScintillaWidget.h b/src/stc/scintilla/include/ScintillaWidget.h
index 980557a2e7..f6c2fc3542 100644
--- a/src/stc/scintilla/include/ScintillaWidget.h
+++ b/src/stc/scintilla/include/ScintillaWidget.h
@@ -1,7 +1,9 @@
 // Scintilla source code edit control
-// ScintillaWidget.h - definition of Scintilla widget for GTK+
-// Only needed by GTK+ code but is harmless on other platforms.
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file ScintillaWidget.h
+ ** Definition of Scintilla widget for GTK+.
+ ** Only needed by GTK+ code but is harmless on other platforms.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef SCINTILLAWIDGET_H
@@ -9,6 +11,17 @@
 
 #if PLAT_GTK
 
+#ifndef SCINTILLA_H
+#ifdef _MSC_VER
+#pragma message(__FILE__ "(1) : warning : Scintilla.h should be included before ScintillaWidget.h")
+#pragma message("This will be required in the next version of Scintilla")
+#else
+#warning Scintilla.h should be included before ScintillaWidget.h
+#warning This will be required in the next version of Scintilla
+#endif
+#include "Scintilla.h"
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -21,7 +34,7 @@ typedef struct _ScintillaObject ScintillaObject;
 typedef struct _ScintillaClass  ScintillaClass;
 
 struct _ScintillaObject {
-	GtkFixed vbox;
+	GtkContainer cont;
 	void *pscin;
 };
 
@@ -35,7 +48,7 @@ struct _ScintillaClass {
 guint		scintilla_get_type	(void);
 GtkWidget*	scintilla_new		(void);
 void		scintilla_set_id	(ScintillaObject *sci,int id);
-long 		scintilla_send_message	(ScintillaObject *sci,int iMessage,int wParam,int lParam);
+sptr_t	scintilla_send_message	(ScintillaObject *sci,unsigned int iMessage, uptr_t wParam, sptr_t lParam);
 
 #ifdef __cplusplus
 }
diff --git a/src/stc/scintilla/include/WinDefs.h b/src/stc/scintilla/include/WinDefs.h
index c56f02d810..b3421c0bcc 100644
--- a/src/stc/scintilla/include/WinDefs.h
+++ b/src/stc/scintilla/include/WinDefs.h
@@ -1,11 +1,23 @@
 // Scintilla source code edit control
-// WinDefs.h - the subset of definitions from Windows needed by Scintilla for GTK+
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file WinDefs.h
+ ** The subset of definitions from Windows needed by Scintilla for GTK+.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef WINDEFS_H
 #define WINDEFS_H
 
+/* Running GTK version on win32 */
+#if PLAT_GTK_WIN32
+#include "Windows.h"
+#include "Richedit.h"
+
+/* Name conflicts */
+#undef DrawText
+#undef FindText
+#else
+
 #define WORD short
 #define WPARAM unsigned long
 #define LPARAM long
@@ -180,4 +192,6 @@ struct FORMATRANGE {
 //#define LOWORD(x) (x & 0xffff)
 //#define HIWORD(x) (x >> 16)
 
+#endif /* !_MSC_VER */
+
 #endif
diff --git a/src/stc/scintilla/include/WindowAccessor.h b/src/stc/scintilla/include/WindowAccessor.h
index 4f41dfc7ff..7fd8e30fd7 100644
--- a/src/stc/scintilla/include/WindowAccessor.h
+++ b/src/stc/scintilla/include/WindowAccessor.h
@@ -1,7 +1,13 @@
-// WindowAccessor.h - implementation of BufferAccess and StylingAccess on a Scintilla rapid easy access to contents of a Scintilla
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file WindowAccessor.h
+ ** Implementation of BufferAccess and StylingAccess on a Scintilla
+ ** rapid easy access to contents of a Scintilla.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
+/**
+ */
 class WindowAccessor : public Accessor {
 	// Private so WindowAccessor objects can not be copied
 	WindowAccessor(const WindowAccessor &source) : Accessor(), props(source.props) {}
@@ -36,6 +42,9 @@ public:
 	int GetPropertyInt(const char *key, int defaultValue=0) { 
 		return props.GetInt(key, defaultValue); 
 	}
+	char *GetProperties() {
+		return props.ToString();
+	}
 
 	void StartAt(unsigned int start, char chMask=31);
 	void SetFlags(char chFlags_, char chWhile_) {chFlags = chFlags_; chWhile = chWhile_; };
diff --git a/src/stc/scintilla/src/AutoComplete.cxx b/src/stc/scintilla/src/AutoComplete.cxx
index 5bc50d1efa..7f7412e43f 100644
--- a/src/stc/scintilla/src/AutoComplete.cxx
+++ b/src/stc/scintilla/src/AutoComplete.cxx
@@ -1,13 +1,17 @@
 // Scintilla source code edit control
-// AutoComplete.cxx - defines the auto completion list box
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file AutoComplete.cxx
+ ** Defines the auto completion list box.
+ **/
+// 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 <stdio.h>
 
 #include "Platform.h"
 
+#include "PropSet.h"
 #include "AutoComplete.h"
 
 AutoComplete::AutoComplete() : 
@@ -17,7 +21,8 @@ AutoComplete::AutoComplete() :
 	chooseSingle(false),
 	posStart(0),
 	startLen(0),
-	cancelAtStartPos(true) {
+	cancelAtStartPos(true),
+	autoHide(true) {
 	stopChars[0] = '\0';
 	fillUpChars[0] = '\0';
 }
@@ -85,7 +90,6 @@ void AutoComplete::SetList(const char *list) {
 		}
 		delete []words;
 	}
-	lb.Sort();
 }
 
 void AutoComplete::Show() {
@@ -113,9 +117,42 @@ void AutoComplete::Move(int delta) {
 }
 
 void AutoComplete::Select(const char *word) {
-	int pos = lb.Find(word);
-	//Platform::DebugPrintf("Autocompleting at <%s> %d\n", wordCurrent, pos);
-	if (pos != -1)
-		lb.Select(pos);
+	int lenWord = strlen(word);
+	int location = -1;
+	const int maxItemLen=1000;
+	char item[maxItemLen];
+	int start = 0; // lower bound of the api array block to search
+	int end = lb.Length() - 1; // upper bound of the api array block to search
+	while ((start <= end) && (location == -1)) { // Binary searching loop
+		int pivot = (start + end) / 2;
+		lb.GetValue(pivot, item, maxItemLen);
+		int cond;
+		if (ignoreCase)
+			cond = CompareNCaseInsensitive(word, item, lenWord);
+		else
+			cond = strncmp(word, item, lenWord);
+		if (!cond) {
+			// Find first match
+			while (pivot > start) {
+				lb.GetValue(pivot-1, item, maxItemLen);
+				if (ignoreCase)
+					cond = CompareNCaseInsensitive(word, item, lenWord);
+				else
+					cond = strncmp(word, item, lenWord);
+				if (0 != cond)
+					break;
+				--pivot;
+			}
+			location = pivot;
+		} else if (cond < 0) {
+			end = pivot - 1;
+		} else if (cond > 0) {
+			start = pivot + 1;
+		}
+	}
+	if (location == -1 && autoHide)
+		Cancel();
+	else
+		lb.Select(location);
 }
 
diff --git a/src/stc/scintilla/src/AutoComplete.h b/src/stc/scintilla/src/AutoComplete.h
index c1789ad7b6..79d4675291 100644
--- a/src/stc/scintilla/src/AutoComplete.h
+++ b/src/stc/scintilla/src/AutoComplete.h
@@ -1,56 +1,62 @@
 // Scintilla source code edit control
-// AutoComplete.h - defines the auto completion list box
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file AutoComplete.h
+ ** Defines the auto completion list box.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef AUTOCOMPLETE_H
 #define AUTOCOMPLETE_H
 
+/**
+ */
 class AutoComplete {
 	bool active;
 	char stopChars[256];
 	char fillUpChars[256];
 	char separator;
+
 public:
 	bool ignoreCase;
 	bool chooseSingle;
 	ListBox lb;
 	int posStart;
 	int startLen;
-	// Should autocompletion be canceled if editor's currentPos <= startPos?
+	/// Should autocompletion be canceled if editor's currentPos <= startPos?
 	bool cancelAtStartPos;
-	
+	bool autoHide;
+
 	AutoComplete();
 	~AutoComplete();
 
-	// Is the auto completion list displayed?	
+	/// Is the auto completion list displayed?
 	bool Active();
-	
-	// Display the auto completion list positioned to be near a character position
+
+	/// Display the auto completion list positioned to be near a character position
 	void Start(Window &parent, int ctrlID, int position, int startLen_);
-	
-	// The stop chars are characters which, when typed, cause the auto completion list to disappear
+
+	/// The stop chars are characters which, when typed, cause the auto completion list to disappear
 	void SetStopChars(const char *stopChars_);
 	bool IsStopChar(char ch);
-	
-	// The fillup chars are characters which, when typed, fill up the selected word
+
+	/// The fillup chars are characters which, when typed, fill up the selected word
 	void SetFillUpChars(const char *fillUpChars_);
 	bool IsFillUpChar(char ch);
 
-	// The separator character is used when interpreting the list in SetList
+	/// The separator character is used when interpreting the list in SetList
 	void SetSeparator(char separator_);
 	char GetSeparator();
-	
-	// The list string contains a sequence of words separated by the separator character
+
+	/// The list string contains a sequence of words separated by the separator character
 	void SetList(const char *list);
-	
+
 	void Show();
 	void Cancel();
-	
-	// Move the current list element by delta, scrolling appropriately
+
+	/// Move the current list element by delta, scrolling appropriately
 	void Move(int delta);
-	
-	// Select a list element that starts with word as the current element
+
+	/// Select a list element that starts with word as the current element
 	void Select(const char *word);
 };
 
diff --git a/src/stc/scintilla/src/CallTip.cxx b/src/stc/scintilla/src/CallTip.cxx
index d22a963645..3422de6969 100644
--- a/src/stc/scintilla/src/CallTip.cxx
+++ b/src/stc/scintilla/src/CallTip.cxx
@@ -1,10 +1,12 @@
 // Scintilla source code edit control
-// CallTip.cxx - code for displaying call tips
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file CallTip.cxx
+ ** Code for displaying call tips.
+ **/
+// 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 <stdlib.h>
+#include <string.h>
 
 #include "Platform.h"
 
@@ -27,6 +29,7 @@ CallTip::CallTip() {
 }
 
 CallTip::~CallTip() {
+	font.Release();
 	wCallTip.Destroy();
 	delete []val;
 	val = 0;
@@ -42,7 +45,7 @@ void CallTip::RefreshColourPalette(Palette &pal, bool want) {
 
 void CallTip::PaintCT(Surface *surfaceWindow) {
 	if (!val)
-		return;
+		return ;
 	PRectangle rcClientPos = wCallTip.GetClientPosition();
 	PRectangle rcClientSize(0, 0, rcClientPos.right - rcClientPos.left,
 	                        rcClientPos.bottom - rcClientPos.top);
@@ -117,7 +120,7 @@ PRectangle CallTip::CallTipStart(int pos, Point pt, const char *defn,
                                  const char *faceName, int size) {
 	Surface surfaceMeasure;
 	surfaceMeasure.Init();
-	int deviceHeight = (size * surfaceMeasure.LogPixelsY()) / 72;
+	int deviceHeight = surfaceMeasure.DeviceHeightFont(size);
 	font.Create(faceName, SC_CHARSET_DEFAULT, deviceHeight, false, false);
 	if (val)
 		delete []val;
@@ -146,10 +149,9 @@ PRectangle CallTip::CallTipStart(int pos, Point pt, const char *defn,
 	int lineHeight = surfaceMeasure.Height(font);
 	// Extra line for border and an empty line at top and bottom
 	int height = lineHeight * numLines - surfaceMeasure.InternalLeading(font) + 2 + 2;
-	return PRectangle(pt.x -5, pt.y + lineHeight + 1, pt.x + width - 5, pt.y + lineHeight + 1 + height);
+	return PRectangle(pt.x -5, pt.y + 1, pt.x + width - 5, pt.y + 1 + height);
 }
 
-
 void CallTip::CallTipCancel() {
 	inCallTipMode = false;
 	if (wCallTip.Created()) {
diff --git a/src/stc/scintilla/src/CallTip.h b/src/stc/scintilla/src/CallTip.h
index cb5bc29032..b38a4840ab 100644
--- a/src/stc/scintilla/src/CallTip.h
+++ b/src/stc/scintilla/src/CallTip.h
@@ -1,11 +1,15 @@
 // Scintilla source code edit control
-// CallTip.h - interface to the call tip control
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file CallTip.h
+ ** Interface to the call tip control.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef CALLTIP_H
 #define CALLTIP_H
 
+/**
+ */
 class CallTip {
 	int startHighlight;
 	int endHighlight;
@@ -14,6 +18,7 @@ class CallTip {
 	// Private so CallTip objects can not be copied
 	CallTip(const CallTip &) {}
 	CallTip &operator=(const CallTip &) { return *this; }
+
 public:
 	Window wCallTip;
 	Window wDraw;
@@ -28,19 +33,19 @@ public:
 	CallTip();
 	~CallTip();
 	
-	// Claim or accept palette entries for the colours required to paint a calltip
+	/// Claim or accept palette entries for the colours required to paint a calltip.
 	void RefreshColourPalette(Palette &pal, bool want);
 	
 	void PaintCT(Surface *surfaceWindow);
 	
-	// Setup the calltip and return a rectangle of the area required
+	/// Setup the calltip and return a rectangle of the area required.
 	PRectangle CallTipStart(int pos, Point pt, const char *defn, 
 		const char *faceName, int size);
 		
 	void CallTipCancel();
 	
-	// Set a range of characters to be displayed in a highlight style.
-	// Commonly used to highlight the current parameter.
+	/// Set a range of characters to be displayed in a highlight style.
+	/// Commonly used to highlight the current parameter.
 	void SetHighlight(int start, int end);
 };
 
diff --git a/src/stc/scintilla/src/CellBuffer.cxx b/src/stc/scintilla/src/CellBuffer.cxx
index befec75fc3..ecb5bc1801 100644
--- a/src/stc/scintilla/src/CellBuffer.cxx
+++ b/src/stc/scintilla/src/CellBuffer.cxx
@@ -1,6 +1,8 @@
 // Scintilla source code edit control
-// CellBuffer.cxx - manages a buffer of cells
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file CellBuffer.cxx
+ ** Manages a buffer of cells.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include <stdio.h>
@@ -416,22 +418,19 @@ UndoHistory::~UndoHistory() {
 }
 
 void UndoHistory::EnsureUndoRoom() {
-	//Platform::DebugPrintf("%% %d action %d %d %d\n", at, position, length, currentAction);
-	if (currentAction >= 2) {
-		// Have to test that there is room for 2 more actions in the array
-		// as two actions may be created by this function
-		if (currentAction >= (lenActions - 2)) {
-			// Run out of undo nodes so extend the array
-			int lenActionsNew = lenActions * 2;
-			Action *actionsNew = new Action[lenActionsNew];
-			if (!actionsNew)
-				return ;
-			for (int act = 0; act <= currentAction; act++)
-				actionsNew[act].Grab(&actions[act]);
-			delete []actions;
-			lenActions = lenActionsNew;
-			actions = actionsNew;
-		}
+	// Have to test that there is room for 2 more actions in the array
+	// as two actions may be created by the calling function
+	if (currentAction >= (lenActions - 2)) {
+		// Run out of undo nodes so extend the array
+		int lenActionsNew = lenActions * 2;
+		Action *actionsNew = new Action[lenActionsNew];
+		if (!actionsNew)
+			return ;
+		for (int act = 0; act <= currentAction; act++)
+			actionsNew[act].Grab(&actions[act]);
+		delete []actions;
+		lenActions = lenActionsNew;
+		actions = actionsNew;
 	}
 }
 
@@ -450,14 +449,27 @@ void UndoHistory::AppendAction(actionType at, int position, char *data, int leng
 				currentAction++;
 			} else if (currentAction == savePoint) {
 				currentAction++;
-			} else if ((at == removeAction) &&
-			           ((position + lengthData * 2) != actPrevious.position)) {
-				// Removals must be at same position to coalesce
-				currentAction++;
 			} else if ((at == insertAction) &&
 			           (position != (actPrevious.position + actPrevious.lenData*2))) {
 				// Insertions must be immediately after to coalesce
 				currentAction++;
+			} else if (!actions[currentAction].mayCoalesce) {
+				// Not allowed to coalesce if this set
+				currentAction++;
+			} else if (at == removeAction) {
+				if ((lengthData == 1) || (lengthData == 2)){
+					if ((position + lengthData * 2) == actPrevious.position) {
+						; // Backspace -> OK
+					} else if (position == actPrevious.position) {
+						; // Delete -> OK
+					} else {
+						// Removals must be at same position to coalesce
+						currentAction++;
+					}
+				} else {
+					// Removals must be of one character to coalesce
+					currentAction++;
+				}
 			} else {
 				//Platform::DebugPrintf("action coalesced\n");
 			}
@@ -582,6 +594,7 @@ CellBuffer::CellBuffer(int initialLength) {
 	part2body = body + gaplen;
 	readOnly = false;
 	collectingUndo = true;
+	growSize = 4000;
 }
 
 CellBuffer::~CellBuffer() {
@@ -612,7 +625,9 @@ void CellBuffer::RoomFor(int insertionLength) {
 	if (gaplen <= insertionLength) {
 		//Platform::DebugPrintf("need room %d %d\n", gaplen, insertionLength);
 		GapTo(length);
-		int newSize = size + insertionLength + 4000;
+		if (growSize * 6 < size)
+			growSize *= 2;
+		int newSize = size + insertionLength + growSize;
 		//Platform::DebugPrintf("moved gap %d\n", newSize);
 		char *newBody = new char[newSize];
 		memcpy(newBody, body, size);
@@ -733,6 +748,8 @@ bool CellBuffer::SetStyleAt(int position, char style, char mask) {
 bool CellBuffer::SetStyleFor(int position, int lengthStyle, char style, char mask) {
 	int bytePos = position * 2 + 1;
 	bool changed = false;
+	PLATFORM_ASSERT(lengthStyle == 0 ||
+		(lengthStyle > 0 && lengthStyle + position < length));
 	while (lengthStyle--) {
 		char curVal = ByteAt(bytePos);
 		if ((curVal & mask) != style) {
@@ -779,7 +796,7 @@ int CellBuffer::LineStart(int line) {
 	if (line < 0)
 		return 0;
 	else if (line > lv.lines)
-		return length;
+		return Length();
 	else
 		return lv.linesData[line].startPosition;
 }
@@ -930,7 +947,6 @@ void CellBuffer::BasicDeleteChars(int position, int deleteLength) {
 			ignoreNL = true; 	// First \n is not real deletion
 		}
 
-
 		char ch = chNext;
 		for (int i = 0; i < deleteLength; i += 2) {
 			chNext = ' ';
@@ -948,7 +964,6 @@ void CellBuffer::BasicDeleteChars(int position, int deleteLength) {
 				ignoreNL = false; 	// Further \n are not real deletions
 			}
 
-
 			ch = chNext;
 		}
 		// May have to fix up end if last deletion causes cr to be next to lf
diff --git a/src/stc/scintilla/src/CellBuffer.h b/src/stc/scintilla/src/CellBuffer.h
index 4a1ecb3989..b5c90f57a5 100644
--- a/src/stc/scintilla/src/CellBuffer.h
+++ b/src/stc/scintilla/src/CellBuffer.h
@@ -1,28 +1,35 @@
 // Scintilla source code edit control
-// CellBuffer.h - manages the text of the document
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file CellBuffer.h
+ ** Manages the text of the document.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef CELLBUFFER_H
 #define CELLBUFFER_H
 
-// This holds the marker identifier and the marker type to display.
-// MarkerHandleNumbers are members of lists.
+/**
+ * This holds the marker identifier and the marker type to display.
+ * MarkerHandleNumbers are members of lists.
+ */
 struct MarkerHandleNumber {
 	int handle;
 	int number;
 	MarkerHandleNumber *next;
 };
 
-// A marker handle set contains any number of MarkerHandleNumbers
+/**
+ * A marker handle set contains any number of MarkerHandleNumbers.
+ */
 class MarkerHandleSet {
 	MarkerHandleNumber *root;
+
 public:
 	MarkerHandleSet();
 	~MarkerHandleSet();
 	int Length();
 	int NumberFromHandle(int handle);
-	int MarkValue();	// Bit set of marker numbers
+	int MarkValue();	///< Bit set of marker numbers.
 	bool Contains(int handle);
 	bool InsertHandle(int handle, int markerNum);
 	void RemoveHandle(int handle);
@@ -30,8 +37,10 @@ public:
 	void CombineWith(MarkerHandleSet *other);
 };
 
-// Each line stores the starting position of the first character of the line in the cell buffer
-// and potentially a marker handle set. Often a line will not have any attached markers.
+/**
+ * Each line stores the starting position of the first character of the line in the cell buffer
+ * and potentially a marker handle set. Often a line will not have any attached markers.
+ */
 struct LineData {
 	int startPosition;
 	MarkerHandleSet *handleSet;
@@ -39,7 +48,9 @@ struct LineData {
 	}
 };
 
-// The line vector contains information about each of the lines in a cell buffer.
+/**
+ * The line vector contains information about each of the lines in a cell buffer.
+ */
 class LineVector {
 public:
 	enum { growSize = 4000 };
@@ -48,22 +59,22 @@ public:
 	int size;
 	int *levels;
 	int sizeLevels;
-	
-	// Handles are allocated sequentially and should never have to be reused as 32 bit ints are very big.
+
+	/// Handles are allocated sequentially and should never have to be reused as 32 bit ints are very big.
 	int handleCurrent;
-	
+
 	LineVector();
 	~LineVector();
 	void Init();
 
 	void Expand(int sizeNew);
 	void ExpandLevels(int sizeNew=-1);
-    void ClearLevels();
+	void ClearLevels();
 	void InsertValue(int pos, int value);
 	void SetValue(int pos, int value);
 	void Remove(int pos);
 	int LineFromPosition(int pos);
-	
+
 	int AddMark(int line, int marker);
 	void MergeMarkers(int pos);
 	void DeleteMark(int line, int markerNum);
@@ -71,9 +82,11 @@ public:
 	int LineFromHandle(int markerHandle);
 };
 
-// Actions are used to store all the information required to perform one undo/redo step.
 enum actionType { insertAction, removeAction, startAction };
 
+/**
+ * Actions are used to store all the information required to perform one undo/redo step.
+ */
 class Action {
 public:
 	actionType at;
@@ -89,6 +102,9 @@ public:
 	void Grab(Action *source);
 };
 
+/**
+ *
+ */
 class UndoHistory {
 	Action *actions;
 	int lenActions;
@@ -98,25 +114,25 @@ class UndoHistory {
 	int savePoint;
 
 	void EnsureUndoRoom();
-	
+
 public:
 	UndoHistory();
 	~UndoHistory();
-	
+
 	void AppendAction(actionType at, int position, char *data, int length);
 
 	void BeginUndoAction();
 	void EndUndoAction();
 	void DropUndoSequence();
 	void DeleteUndoHistory();
-	
-	// The save point is a marker in the undo stack where the container has stated that 
-	// the buffer was saved. Undo and redo can move over the save point.
+
+	/// The save point is a marker in the undo stack where the container has stated that
+	/// the buffer was saved. Undo and redo can move over the save point.
 	void SetSavePoint();
 	bool IsSavePoint() const;
 
-	// To perform an undo, StartUndo is called to retrieve the number of steps, then UndoStep is 
-	// called that many times. Similarly for redo.
+	/// To perform an undo, StartUndo is called to retrieve the number of steps, then UndoStep is
+	/// called that many times. Similarly for redo.
 	bool CanUndo() const;
 	int StartUndo();
 	const Action &GetUndoStep() const;
@@ -127,9 +143,11 @@ public:
 	void CompletedRedoStep();
 };
 
-// Holder for an expandable array of characters that supports undo and line markers
-// Based on article "Data Structures in a Bit-Mapped Text Editor"
-// by Wilfred J. Hansen, Byte January 1987, page 183
+/**
+ * Holder for an expandable array of characters that supports undo and line markers.
+ * Based on article "Data Structures in a Bit-Mapped Text Editor"
+ * by Wilfred J. Hansen, Byte January 1987, page 183.
+ */
 class CellBuffer {
 private:
 	char *body;
@@ -139,6 +157,7 @@ private:
 	int gaplen;
 	char *part2body;
 	bool readOnly;
+	int growSize;
 
 	bool collectingUndo;
 	UndoHistory uh;
@@ -157,12 +176,12 @@ public:
 
 	CellBuffer(int initialLength = 4000);
 	~CellBuffer();
-	
-	// Retrieving positions outside the range of the buffer works and returns 0
+
+	/// Retrieving positions outside the range of the buffer works and returns 0
 	char CharAt(int position);
 	void GetCharRange(char *buffer, int position, int lengthRetrieve);
 	char StyleAt(int position);
-	
+
 	int ByteLength();
 	int Length();
 	int Lines();
@@ -170,23 +189,23 @@ public:
 	int LineFromPosition(int pos) { return lv.LineFromPosition(pos); }
 	const char *InsertString(int position, char *s, int insertLength);
 	void InsertCharStyle(int position, char ch, char style);
-	
-	// Setting styles for positions outside the range of the buffer is safe and has no effect.
-	// True is returned if the style of a character changed.
+
+	/// Setting styles for positions outside the range of the buffer is safe and has no effect.
+	/// @return true if the style of a character is changed.
 	bool SetStyleAt(int position, char style, char mask='\377');
 	bool SetStyleFor(int position, int length, char style, char mask);
-	
+
 	const char *DeleteChars(int position, int deleteLength);
 
 	bool IsReadOnly();
 	void SetReadOnly(bool set);
 
-	// The save point is a marker in the undo stack where the container has stated that 
-	// the buffer was saved. Undo and redo can move over the save point.
+	/// The save point is a marker in the undo stack where the container has stated that
+	/// the buffer was saved. Undo and redo can move over the save point.
 	void SetSavePoint();
 	bool IsSavePoint();
 
-	// Line marker functions
+	/// Line marker functions
 	int AddMark(int line, int markerNum);
 	void DeleteMark(int line, int markerNum);
 	void DeleteMarkFromHandle(int markerHandle);
@@ -194,7 +213,7 @@ public:
 	void DeleteAllMarks(int markerNum);
 	int LineFromHandle(int markerHandle);
  
-	// Without undo
+	/// Actions without undo
 	void BasicInsertString(int position, char *s, int insertLength);
 	void BasicDeleteChars(int position, int deleteLength);
 
@@ -203,9 +222,9 @@ public:
 	void BeginUndoAction();
 	void EndUndoAction();
 	void DeleteUndoHistory();
-	
-	// To perform an undo, StartUndo is called to retrieve the number of steps, then UndoStep is 
-	// called that many times. Similarly for redo.
+
+	/// To perform an undo, StartUndo is called to retrieve the number of steps, then UndoStep is
+	/// called that many times. Similarly for redo.
 	bool CanUndo();
 	int StartUndo();
 	const Action &GetUndoStep() const;
@@ -214,14 +233,14 @@ public:
 	int StartRedo();
 	const Action &GetRedoStep() const;
 	void PerformRedoStep();
-	
+
 	int SetLineState(int line, int state);
 	int GetLineState(int line);
 	int GetMaxLineState();
-		
+
 	int SetLevel(int line, int level);
 	int GetLevel(int line);
-    void ClearLevels();
+	void ClearLevels();
 };
 
 #define CELL_SIZE	2
diff --git a/src/stc/scintilla/src/ContractionState.cxx b/src/stc/scintilla/src/ContractionState.cxx
index 0558b4c365..1f14696650 100644
--- a/src/stc/scintilla/src/ContractionState.cxx
+++ b/src/stc/scintilla/src/ContractionState.cxx
@@ -1,6 +1,8 @@
 // Scintilla source code edit control
-// ContractionState.cxx - manages visibility of lines for folding
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file ContractionState.cxx
+ ** Manages visibility of lines for folding.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include "Platform.h"
diff --git a/src/stc/scintilla/src/ContractionState.h b/src/stc/scintilla/src/ContractionState.h
index 2c344efeea..0d7881c7b2 100644
--- a/src/stc/scintilla/src/ContractionState.h
+++ b/src/stc/scintilla/src/ContractionState.h
@@ -1,15 +1,19 @@
 // Scintilla source code edit control
-// ContractionState.h - manages visibility of lines for folding
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file ContractionState.h
+ ** Manages visibility of lines for folding.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef CONTRACTIONSTATE_H
 #define CONTRACTIONSTATE_H
 
+/**
+ */
 class OneLine {
 public:
-	int displayLine;	// position within set of visible lines
-	int docLine;		// inverse of displayLine
+	int displayLine;	///< Position within set of visible lines
+	int docLine;		///< Inverse of @a displayLine
 	bool visible;
 	bool expanded;
 	
@@ -17,6 +21,8 @@ public:
 	virtual ~OneLine() {}
 };
 
+/**
+ */
 class ContractionState {
 	void Grow(int sizeNew);
 	enum { growSize = 4000 };
@@ -26,6 +32,7 @@ class ContractionState {
 	int size;
 	mutable bool valid;
 	void MakeValid() const;
+
 public:
 	ContractionState();
 	virtual ~ContractionState();
diff --git a/src/stc/scintilla/src/Document.cxx b/src/stc/scintilla/src/Document.cxx
index c883dd253f..10403242b9 100644
--- a/src/stc/scintilla/src/Document.cxx
+++ b/src/stc/scintilla/src/Document.cxx
@@ -1,6 +1,8 @@
 // Scintilla source code edit control
-// Document.cxx - text document that handles notifications, DBCS, styling, words and end of line
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file Document.cxx
+ ** Text document that handles notifications, DBCS, styling, words and end of line.
+ **/
+// 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>
@@ -14,6 +16,12 @@
 #include "SVector.h"
 #include "CellBuffer.h"
 #include "Document.h"
+#include "RESearch.h"
+
+// This is ASCII specific but is safe with chars >= 0x80
+inline bool isspacechar(unsigned char ch) {
+	return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d));
+}
 
 Document::Document() {
 	refCount = 0;
@@ -25,7 +33,6 @@ Document::Document() {
 	dbcsCodePage = 0;
 	stylingBits = 5;
 	stylingBitsMask = 0x1F;
-	stylingPos = 0;
 	stylingMask = 0;
 	for (int ch = 0; ch < 256; ch++) {
 		wordchars[ch] = isalnum(ch) || ch == '_';
@@ -36,8 +43,14 @@ Document::Document() {
 	tabInChars = 8;
 	indentInChars = 0;
 	useTabs = true;
+	tabIndents = true;
+	backspaceUnindents = false;
 	watchers = 0;
 	lenWatchers = 0;
+
+	matchesValid = false;
+	pre = 0;
+	substituted = 0;
 }
 
 Document::~Document() {
@@ -47,6 +60,10 @@ Document::~Document() {
 	delete []watchers;
 	watchers = 0;
 	lenWatchers = 0;
+	delete pre;
+	pre = 0;
+	delete []substituted;
+	substituted = 0;
 }
 
 // Increase reference count and return its previous value.
@@ -68,27 +85,27 @@ void Document::SetSavePoint() {
 	NotifySavePoint(true);
 }
 
-int Document::AddMark(int line, int markerNum) { 
-	int prev = cb.AddMark(line, markerNum); 
+int Document::AddMark(int line, int markerNum) {
+	int prev = cb.AddMark(line, markerNum);
 	DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0);
 	NotifyModified(mh);
 	return prev;
 }
 
-void Document::DeleteMark(int line, int markerNum) { 
-	cb.DeleteMark(line, markerNum); 
+void Document::DeleteMark(int line, int markerNum) {
+	cb.DeleteMark(line, markerNum);
 	DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0);
 	NotifyModified(mh);
 }
 
-void Document::DeleteMarkFromHandle(int markerHandle) { 
-	cb.DeleteMarkFromHandle(markerHandle); 
+void Document::DeleteMarkFromHandle(int markerHandle) {
+	cb.DeleteMarkFromHandle(markerHandle);
 	DocModification mh(SC_MOD_CHANGEMARKER, 0, 0, 0, 0);
 	NotifyModified(mh);
 }
 
-void Document::DeleteAllMarks(int markerNum) { 
-	cb.DeleteAllMarks(markerNum); 
+void Document::DeleteAllMarks(int markerNum) {
+	cb.DeleteAllMarks(markerNum);
 	DocModification mh(SC_MOD_CHANGEMARKER, 0, 0, 0, 0);
 	NotifyModified(mh);
 }
@@ -131,10 +148,11 @@ int Document::VCHomePosition(int position) {
 		return startText;
 }
 
-int Document::SetLevel(int line, int level) { 
-	int prev = cb.SetLevel(line, level); 
+int Document::SetLevel(int line, int level) {
+	int prev = cb.SetLevel(line, level);
 	if (prev != level) {
-		DocModification mh(SC_MOD_CHANGEFOLD, LineStart(line), 0, 0, 0);
+		DocModification mh(SC_MOD_CHANGEFOLD | SC_MOD_CHANGEMARKER,
+		                   LineStart(line), 0, 0, 0);
 		mh.line = line;
 		mh.foldLevelNow = level;
 		mh.foldLevelPrev = prev;
@@ -146,7 +164,7 @@ int Document::SetLevel(int line, int level) {
 static bool IsSubordinate(int levelStart, int levelTry) {
 	if (levelTry & SC_FOLDLEVELWHITEFLAG)
 		return true;
-	else 
+	else
 		return (levelStart & SC_FOLDLEVELNUMBERMASK) < (levelTry & SC_FOLDLEVELNUMBERMASK);
 }
 
@@ -155,16 +173,16 @@ int Document::GetLastChild(int lineParent, int level) {
 		level = GetLevel(lineParent) & SC_FOLDLEVELNUMBERMASK;
 	int maxLine = LinesTotal();
 	int lineMaxSubord = lineParent;
-	while (lineMaxSubord < maxLine-1) {
-		EnsureStyledTo(LineStart(lineMaxSubord+2));
-		if (!IsSubordinate(level, GetLevel(lineMaxSubord+1)))
+	while (lineMaxSubord < maxLine - 1) {
+		EnsureStyledTo(LineStart(lineMaxSubord + 2));
+		if (!IsSubordinate(level, GetLevel(lineMaxSubord + 1)))
 			break;
 		lineMaxSubord++;
 	}
 	if (lineMaxSubord > lineParent) {
-		if (level > (GetLevel(lineMaxSubord+1) & SC_FOLDLEVELNUMBERMASK)) {
-			// Have chewed up some whitespace that belongs to a parent so seek back 
-			if ((lineMaxSubord > lineParent) && (GetLevel(lineMaxSubord) & SC_FOLDLEVELWHITEFLAG)) {
+		if (level > (GetLevel(lineMaxSubord + 1) & SC_FOLDLEVELNUMBERMASK)) {
+			// Have chewed up some whitespace that belongs to a parent so seek back
+			if (GetLevel(lineMaxSubord) & SC_FOLDLEVELWHITEFLAG) {
 				lineMaxSubord--;
 			}
 		}
@@ -174,15 +192,15 @@ int Document::GetLastChild(int lineParent, int level) {
 
 int Document::GetFoldParent(int line) {
 	int level = GetLevel(line);
-	int lineLook = line-1;
+	int lineLook = line - 1;
 	while ((lineLook > 0) && (
-		(!(GetLevel(lineLook) & SC_FOLDLEVELHEADERFLAG)) || 
-		((GetLevel(lineLook) & SC_FOLDLEVELNUMBERMASK) >= level))
-	) {
+	            (!(GetLevel(lineLook) & SC_FOLDLEVELHEADERFLAG)) ||
+	            ((GetLevel(lineLook) & SC_FOLDLEVELNUMBERMASK) >= level))
+	      ) {
 		lineLook--;
 	}
 	if ((GetLevel(lineLook) & SC_FOLDLEVELHEADERFLAG) &&
-		((GetLevel(lineLook) & SC_FOLDLEVELNUMBERMASK) < level)) {
+	        ((GetLevel(lineLook) & SC_FOLDLEVELNUMBERMASK) < level)) {
 		return lineLook;
 	} else {
 		return -1;
@@ -241,12 +259,12 @@ int Document::LenChar(int pos) {
 		if (ch < 0x80)
 			return 1;
 		int len = 2;
-		if (ch >= (0x80+0x40+0x20))
+		if (ch >= (0x80 + 0x40 + 0x20))
 			len = 3;
 		int lengthDoc = Length();
 		if ((pos + len) > lengthDoc)
-			return lengthDoc-pos;
-		else 
+			return lengthDoc -pos;
+		else
 			return len;
 	} else if (IsDBCS(pos)) {
 		return 2;
@@ -292,7 +310,7 @@ int Document::MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd) {
 				// ch is a trail byte
 				if (moveDir > 0)
 					pos++;
-				else 
+				else
 					pos--;
 				ch = static_cast<unsigned char>(cb.CharAt(pos));
 			}
@@ -314,6 +332,7 @@ int Document::MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd) {
 				//Platform::DebugPrintf("DBCS %s\n", atlead ? "D" : "-");
 			}
 
+
 			if (atLeadByte) {
 				// Position is between a lead byte and a trail byte
 				if (moveDir > 0)
@@ -338,9 +357,9 @@ void Document::ModifiedAt(int pos) {
 
 // Unlike Undo, Redo, and InsertStyledString, the pos argument is a cell number not a char number
 void Document::DeleteChars(int pos, int len) {
-    if ((pos + len) > Length())
-        return;
-	if (cb.IsReadOnly() && enteredReadOnlyCount==0) {
+	if ((pos + len) > Length())
+		return ;
+	if (cb.IsReadOnly() && enteredReadOnlyCount == 0) {
 		enteredReadOnlyCount++;
 		NotifyModifyAttempt();
 		enteredReadOnlyCount--;
@@ -349,28 +368,31 @@ void Document::DeleteChars(int pos, int len) {
 		enteredCount++;
 		if (!cb.IsReadOnly()) {
 			NotifyModified(
-                DocModification(
-                    SC_MOD_BEFOREDELETE | SC_PERFORMED_USER, 
-                    pos, len, 
-                    0, 0));
+			    DocModification(
+			        SC_MOD_BEFOREDELETE | SC_PERFORMED_USER,
+			        pos, len,
+			        0, 0));
 			int prevLinesTotal = LinesTotal();
 			bool startSavePoint = cb.IsSavePoint();
-			const char *text = cb.DeleteChars(pos*2, len * 2);
+			const char *text = cb.DeleteChars(pos * 2, len * 2);
 			if (startSavePoint && cb.IsCollectingUndo())
 				NotifySavePoint(!startSavePoint);
-			ModifiedAt(pos);
+			if ((pos < Length()) || (pos == 0))
+				ModifiedAt(pos);
+			else
+				ModifiedAt(pos-1);
 			NotifyModified(
-                DocModification(
-                    SC_MOD_DELETETEXT | SC_PERFORMED_USER, 
-                    pos, len, 
-                    LinesTotal() - prevLinesTotal, text));
+			    DocModification(
+			        SC_MOD_DELETETEXT | SC_PERFORMED_USER,
+			        pos, len,
+			        LinesTotal() - prevLinesTotal, text));
 		}
 		enteredCount--;
 	}
 }
 
 void Document::InsertStyledString(int position, char *s, int insertLength) {
-	if (cb.IsReadOnly() && enteredReadOnlyCount==0) {
+	if (cb.IsReadOnly() && enteredReadOnlyCount == 0) {
 		enteredReadOnlyCount++;
 		NotifyModifyAttempt();
 		enteredReadOnlyCount--;
@@ -379,10 +401,10 @@ void Document::InsertStyledString(int position, char *s, int insertLength) {
 		enteredCount++;
 		if (!cb.IsReadOnly()) {
 			NotifyModified(
-                DocModification(
-                    SC_MOD_BEFOREINSERT | SC_PERFORMED_USER, 
-                    position / 2, insertLength / 2, 
-                    0, 0));
+			    DocModification(
+			        SC_MOD_BEFOREINSERT | SC_PERFORMED_USER,
+			        position / 2, insertLength / 2,
+			        0, 0));
 			int prevLinesTotal = LinesTotal();
 			bool startSavePoint = cb.IsSavePoint();
 			const char *text = cb.InsertString(position, s, insertLength);
@@ -390,10 +412,10 @@ void Document::InsertStyledString(int position, char *s, int insertLength) {
 				NotifySavePoint(!startSavePoint);
 			ModifiedAt(position / 2);
 			NotifyModified(
-                DocModification(
-                    SC_MOD_INSERTTEXT | SC_PERFORMED_USER, 
-                    position / 2, insertLength / 2, 
-                    LinesTotal() - prevLinesTotal, text));
+			    DocModification(
+			        SC_MOD_INSERTTEXT | SC_PERFORMED_USER,
+			        position / 2, insertLength / 2,
+			        LinesTotal() - prevLinesTotal, text));
 		}
 		enteredCount--;
 	}
@@ -406,21 +428,21 @@ int Document::Undo() {
 		bool startSavePoint = cb.IsSavePoint();
 		int steps = cb.StartUndo();
 		//Platform::DebugPrintf("Steps=%d\n", steps);
-		for (int step=0; step<steps; step++) {
+		for (int step = 0; step < steps; step++) {
 			int prevLinesTotal = LinesTotal();
 			const Action &action = cb.GetUndoStep();
 			if (action.at == removeAction) {
-			    NotifyModified(DocModification(
-                    SC_MOD_BEFOREINSERT | SC_PERFORMED_UNDO, action));
-            } else {
-			    NotifyModified(DocModification(
-                    SC_MOD_BEFOREDELETE | SC_PERFORMED_UNDO, action));
-            }
+				NotifyModified(DocModification(
+				                   SC_MOD_BEFOREINSERT | SC_PERFORMED_UNDO, action));
+			} else {
+				NotifyModified(DocModification(
+				                   SC_MOD_BEFOREDELETE | SC_PERFORMED_UNDO, action));
+			}
 			cb.PerformUndoStep();
 			int cellPosition = action.position / 2;
 			ModifiedAt(cellPosition);
 			newPos = cellPosition;
-			
+
 			int modFlags = SC_PERFORMED_UNDO;
 			// With undo, an insertion action becomes a deletion notification
 			if (action.at == removeAction) {
@@ -429,12 +451,12 @@ int Document::Undo() {
 			} else {
 				modFlags |= SC_MOD_DELETETEXT;
 			}
-			if (step == steps-1)
+			if (step == steps - 1)
 				modFlags |= SC_LASTSTEPINUNDOREDO;
-			NotifyModified(DocModification(modFlags, cellPosition, action.lenData, 
-				LinesTotal() - prevLinesTotal, action.data));
+			NotifyModified(DocModification(modFlags, cellPosition, action.lenData,
+			                               LinesTotal() - prevLinesTotal, action.data));
 		}
-	
+
 		bool endSavePoint = cb.IsSavePoint();
 		if (startSavePoint != endSavePoint)
 			NotifySavePoint(endSavePoint);
@@ -449,20 +471,20 @@ int Document::Redo() {
 		enteredCount++;
 		bool startSavePoint = cb.IsSavePoint();
 		int steps = cb.StartRedo();
-		for (int step=0; step<steps; step++) {
+		for (int step = 0; step < steps; step++) {
 			int prevLinesTotal = LinesTotal();
 			const Action &action = cb.GetRedoStep();
 			if (action.at == insertAction) {
-			    NotifyModified(DocModification(
-                    SC_MOD_BEFOREINSERT | SC_PERFORMED_REDO, action));
-            } else {
-			    NotifyModified(DocModification(
-                    SC_MOD_BEFOREDELETE | SC_PERFORMED_REDO, action));
-            }
+				NotifyModified(DocModification(
+				                   SC_MOD_BEFOREINSERT | SC_PERFORMED_REDO, action));
+			} else {
+				NotifyModified(DocModification(
+				                   SC_MOD_BEFOREDELETE | SC_PERFORMED_REDO, action));
+			}
 			cb.PerformRedoStep();
 			ModifiedAt(action.position / 2);
 			newPos = action.position / 2;
-			
+
 			int modFlags = SC_PERFORMED_REDO;
 			if (action.at == insertAction) {
 				newPos += action.lenData;
@@ -470,13 +492,13 @@ int Document::Redo() {
 			} else {
 				modFlags |= SC_MOD_DELETETEXT;
 			}
-			if (step == steps-1)
+			if (step == steps - 1)
 				modFlags |= SC_LASTSTEPINUNDOREDO;
 			NotifyModified(
-                DocModification(modFlags, action.position / 2, action.lenData, 
-				LinesTotal() - prevLinesTotal, action.data));
+			    DocModification(modFlags, action.position / 2, action.lenData,
+			                    LinesTotal() - prevLinesTotal, action.data));
 		}
-	
+
 		bool endSavePoint = cb.IsSavePoint();
 		if (startSavePoint != endSavePoint)
 			NotifySavePoint(endSavePoint);
@@ -526,7 +548,7 @@ int Document::DelCharBack(int pos) {
 		DeleteChars(pos - 2, 2);
 		return pos - 2;
 	} else if (SC_CP_UTF8 == dbcsCodePage) {
-		int startChar = MovePositionOutsideChar(pos-1, -1, false);
+		int startChar = MovePositionOutsideChar(pos - 1, -1, false);
 		DeleteChars(startChar, pos - startChar);
 		return startChar;
 	} else if (IsDBCS(pos - 1)) {
@@ -568,13 +590,13 @@ int Document::GetLineIndentation(int line) {
 	if ((line >= 0) && (line < LinesTotal())) {
 		int lineStart = LineStart(line);
 		int length = Length();
-		for (int i=lineStart;i<length;i++) {
+		for (int i = lineStart;i < length;i++) {
 			char ch = cb.CharAt(i);
 			if (ch == ' ')
 				indent++;
 			else if (ch == '\t')
 				indent = NextTab(indent, tabInChars);
-			else 
+			else
 				return indent;
 		}
 	}
@@ -596,8 +618,8 @@ void Document::SetLineIndentation(int line, int indent) {
 }
 
 int Document::GetLineIndentPosition(int line) {
-    if (line < 0)
-        return 0;
+	if (line < 0)
+		return 0;
 	int pos = LineStart(line);
 	int length = Length();
 	while ((pos < length) && isindentchar(cb.CharAt(pos))) {
@@ -610,7 +632,7 @@ int Document::GetColumn(int pos) {
 	int column = 0;
 	int line = LineFromPosition(pos);
 	if ((line >= 0) && (line < LinesTotal())) {
-		for (int i=LineStart(line);i<pos;i++) {
+		for (int i = LineStart(line);i < pos;i++) {
 			char ch = cb.CharAt(i);
 			if (ch == '\t')
 				column = NextTab(column, tabInChars);
@@ -640,7 +662,7 @@ void Document::ConvertLineEnds(int eolModeSet) {
 	BeginUndoAction();
 	for (int pos = 0; pos < Length(); pos++) {
 		if (cb.CharAt(pos) == '\r') {
-			if (cb.CharAt(pos+1) == '\n') {
+			if (cb.CharAt(pos + 1) == '\n') {
 				if (eolModeSet != SC_EOL_CRLF) {
 					DeleteChars(pos, 2);
 					if (eolModeSet == SC_EOL_CR)
@@ -677,7 +699,7 @@ void Document::ConvertLineEnds(int eolModeSet) {
 }
 
 bool Document::IsWordChar(unsigned char ch) {
-	if ((SC_CP_UTF8 == dbcsCodePage) && (ch >0x80))
+	if ((SC_CP_UTF8 == dbcsCodePage) && (ch > 0x80))
 		return true;
 	return wordchars[ch];
 }
@@ -697,19 +719,19 @@ int Document::NextWordStart(int pos, int delta) {
 	if (delta < 0) {
 		while (pos > 0 && (cb.CharAt(pos - 1) == ' ' || cb.CharAt(pos - 1) == '\t'))
 			pos--;
-		if (isspace(cb.CharAt(pos - 1))) {	// Back up to previous line
-			while (pos > 0 && isspace(cb.CharAt(pos - 1)))
+		if (isspacechar(cb.CharAt(pos - 1))) {	// Back up to previous line
+			while (pos > 0 && isspacechar(cb.CharAt(pos - 1)))
 				pos--;
 		} else {
 			bool startAtWordChar = IsWordChar(cb.CharAt(pos - 1));
-			while (pos > 0 && !isspace(cb.CharAt(pos - 1)) && (startAtWordChar == IsWordChar(cb.CharAt(pos - 1))))
+			while (pos > 0 && !isspacechar(cb.CharAt(pos - 1)) && (startAtWordChar == IsWordChar(cb.CharAt(pos - 1))))
 				pos--;
 		}
 	} else {
 		bool startAtWordChar = IsWordChar(cb.CharAt(pos));
-		while (pos < (Length()) && isspace(cb.CharAt(pos)))
+		while (pos < (Length()) && isspacechar(cb.CharAt(pos)))
 			pos++;
-		while (pos < (Length()) && !isspace(cb.CharAt(pos)) && (startAtWordChar == IsWordChar(cb.CharAt(pos))))
+		while (pos < (Length()) && !isspacechar(cb.CharAt(pos)) && (startAtWordChar == IsWordChar(cb.CharAt(pos))))
 			pos++;
 		while (pos < (Length()) && (cb.CharAt(pos) == ' ' || cb.CharAt(pos) == '\t'))
 			pos++;
@@ -717,6 +739,10 @@ int Document::NextWordStart(int pos, int delta) {
 	return pos;
 }
 
+/**
+ * Check that the character before the given position
+ * is not a word character.
+ */
 bool Document::IsWordStartAt(int pos) {
 	if (pos > 0) {
 		return !IsWordChar(CharAt(pos - 1));
@@ -724,6 +750,10 @@ bool Document::IsWordStartAt(int pos) {
 	return true;
 }
 
+/**
+ * Check that the character after the given position
+ * is not a word character.
+ */
 bool Document::IsWordEndAt(int pos) {
 	if (pos < Length() - 1) {
 		return !IsWordChar(CharAt(pos));
@@ -731,74 +761,233 @@ bool Document::IsWordEndAt(int pos) {
 	return true;
 }
 
+/**
+ * Check that the given range is delimited by
+ * non word characters.
+ */
 bool Document::IsWordAt(int start, int end) {
 	return IsWordStartAt(start) && IsWordEndAt(end);
 }
 
-// Find text in document, supporting both forward and backward
-// searches (just pass minPos > maxPos to do a backward search)
-// Has not been tested with backwards DBCS searches yet.
-long Document::FindText(int minPos, int maxPos, const char *s, 
-	bool caseSensitive, bool word, bool wordStart) {
- 	bool forward = minPos <= maxPos;
-	int increment = forward ? 1 : -1;
-
-	// Range endpoints should not be inside DBCS characters, but just in case, move them.
-	int startPos = MovePositionOutsideChar(minPos, increment, false);
-	int endPos = MovePositionOutsideChar(maxPos, increment, false);
- 	
-	// Compute actual search ranges needed
-	int lengthFind = strlen(s);
- 	int endSearch = endPos;
- 	if (startPos <= endPos) {
- 		endSearch = endPos - lengthFind + 1;
- 	}
-	//Platform::DebugPrintf("Find %d %d %s %d\n", startPos, endPos, ft->lpstrText, lengthFind);
-	char firstChar = s[0];
-	if (!caseSensitive)
-		firstChar = static_cast<char>(toupper(firstChar));
-	int pos = startPos;
-	while (forward ? (pos < endSearch) : (pos >= endSearch)) {
-		char ch = CharAt(pos);
-		if (caseSensitive) {
-			if (ch == firstChar) {
-				bool found = true;
-				for (int posMatch = 1; posMatch < lengthFind && found; posMatch++) {
-					ch = CharAt(pos + posMatch);
-					if (ch != s[posMatch])
-						found = false;
-				}
-				if (found) {
-					if ((!word && !wordStart) ||
-						word && IsWordAt(pos, pos + lengthFind) ||
-						wordStart && IsWordStartAt(pos))
- 						return pos;
-				}
-			}
+// The comparison and case changing functions here assume ASCII
+// or extended ASCII such as the normal Windows code page.
+
+static inline char MakeUpperCase(char ch) {
+	if (ch < 'a' || ch > 'z')
+		return ch;
+	else
+		return static_cast<char>(ch - 'a' + 'A');
+}
+
+static inline char MakeLowerCase(char ch) {
+	if (ch < 'A' || ch > 'Z')
+		return ch;
+	else
+		return static_cast<char>(ch - 'A' + 'a');
+}
+
+// Define a way for the Regular Expression code to access the document
+class DocumentIndexer : public CharacterIndexer {
+	Document *pdoc;
+	int end;
+public:
+DocumentIndexer(Document *pdoc_, int end_) :
+	pdoc(pdoc_), end(end_) {}
+
+	virtual char CharAt(int index) {
+		if (index < 0 || index >= end)
+			return 0;
+		else
+			return pdoc->CharAt(index);
+	}
+};
+
+/**
+ * Find text in document, supporting both forward and backward
+ * searches (just pass minPos > maxPos to do a backward search)
+ * Has not been tested with backwards DBCS searches yet.
+ */
+long Document::FindText(int minPos, int maxPos, const char *s,
+                        bool caseSensitive, bool word, bool wordStart, bool regExp,
+                        int *length) {
+	if (regExp) {
+		if (!pre)
+			pre = new RESearch();
+		if (!pre)
+			return -1;
+
+		int startPos;
+		int endPos;
+
+		if (minPos <= maxPos) {
+			startPos = minPos;
+			endPos = maxPos;
 		} else {
-			if (toupper(ch) == firstChar) {
-				bool found = true;
-				for (int posMatch = 1; posMatch < lengthFind && found; posMatch++) {
-					ch = CharAt(pos + posMatch);
-					if (toupper(ch) != toupper(s[posMatch]))
-						found = false;
+			startPos = maxPos;
+			endPos = minPos;
+		}
+
+		// Range endpoints should not be inside DBCS characters, but just in case, move them.
+		startPos = MovePositionOutsideChar(startPos, 1, false);
+		endPos = MovePositionOutsideChar(endPos, 1, false);
+
+		const char *errmsg = pre->Compile(s, *length, caseSensitive);
+		if (errmsg) {
+			return -1;
+		}
+		// Find a variable in a property file: \$(\([A-Za-z0-9_.]+\))
+		// Replace first '.' with '-' in each property file variable reference:
+		//     Search: \$(\([A-Za-z0-9_-]+\)\.\([A-Za-z0-9_.]+\))
+		//     Replace: $(\1-\2)
+		int lineRangeStart = LineFromPosition(startPos);
+		int lineRangeEnd = LineFromPosition(endPos);
+		if ((startPos >= LineEnd(lineRangeStart)) && (lineRangeStart < lineRangeEnd)) {
+			// the start position is at end of line or between line end characters.
+			lineRangeStart++;
+			startPos = LineStart(lineRangeStart);
+		}
+		int pos = -1;
+		int lenRet = 0;
+		char searchEnd = s[*length - 1];
+		if (*length == 1) {
+			// These produce empty selections so nudge them on if needed
+			if (s[0] == '^') {
+				if (startPos == LineStart(lineRangeStart))
+					startPos++;
+			} else if (s[0] == '$') {
+				if ((startPos == LineEnd(lineRangeStart)) && (lineRangeStart < lineRangeEnd))
+					startPos = LineStart(lineRangeStart + 1);
+			}
+			lineRangeStart = LineFromPosition(startPos);
+			lineRangeEnd = LineFromPosition(endPos);
+		}
+		for (int line = lineRangeStart; line <= lineRangeEnd; line++) {
+			int startOfLine = LineStart(line);
+			int endOfLine = LineEnd(line);
+			if (line == lineRangeStart) {
+				if ((startPos != startOfLine) && (s[0] == '^'))
+					continue;	// Can't match start of line if start position after start of line
+				startOfLine = startPos;
+			}
+			if (line == lineRangeEnd) {
+				if ((endPos != endOfLine) && (searchEnd == '$'))
+					continue;	// Can't match end of line if end position before end of line
+				endOfLine = endPos;
+			}
+			DocumentIndexer di(this, endOfLine);
+			int success = pre->Execute(di, startOfLine, endOfLine);
+			if (success) {
+				pos = pre->bopat[0];
+				lenRet = pre->eopat[0] - pre->bopat[0];
+				break;
+			}
+		}
+		*length = lenRet;
+		return pos;
+
+	} else {
+
+		bool forward = minPos <= maxPos;
+		int increment = forward ? 1 : -1;
+
+		// Range endpoints should not be inside DBCS characters, but just in case, move them.
+		int startPos = MovePositionOutsideChar(minPos, increment, false);
+		int endPos = MovePositionOutsideChar(maxPos, increment, false);
+
+		// Compute actual search ranges needed
+		int lengthFind = *length;
+		if (lengthFind == -1)
+			lengthFind = strlen(s);
+		int endSearch = endPos;
+		if (startPos <= endPos) {
+			endSearch = endPos - lengthFind + 1;
+		}
+		//Platform::DebugPrintf("Find %d %d %s %d\n", startPos, endPos, ft->lpstrText, lengthFind);
+		char firstChar = s[0];
+		if (!caseSensitive)
+			firstChar = static_cast<char>(MakeUpperCase(firstChar));
+		int pos = startPos;
+		while (forward ? (pos < endSearch) : (pos >= endSearch)) {
+			char ch = CharAt(pos);
+			if (caseSensitive) {
+				if (ch == firstChar) {
+					bool found = true;
+					for (int posMatch = 1; posMatch < lengthFind && found; posMatch++) {
+						ch = CharAt(pos + posMatch);
+						if (ch != s[posMatch])
+							found = false;
+					}
+					if (found) {
+						if ((!word && !wordStart) ||
+						        word && IsWordAt(pos, pos + lengthFind) ||
+						        wordStart && IsWordStartAt(pos))
+							return pos;
+					}
 				}
-				if (found) {
-					if (!(word && wordStart) ||
-						word && IsWordAt(pos, pos + lengthFind) ||
-						wordStart && IsWordStartAt(pos))
- 						return pos;
+			} else {
+				if (MakeUpperCase(ch) == firstChar) {
+					bool found = true;
+					for (int posMatch = 1; posMatch < lengthFind && found; posMatch++) {
+						ch = CharAt(pos + posMatch);
+						if (MakeUpperCase(ch) != MakeUpperCase(s[posMatch]))
+							found = false;
+					}
+					if (found) {
+						if ((!word && !wordStart) ||
+						        word && IsWordAt(pos, pos + lengthFind) ||
+						        wordStart && IsWordStartAt(pos))
+							return pos;
+					}
 				}
 			}
-		}
-		pos += increment;
-		if (dbcsCodePage) {
-			// Ensure trying to match from start of character
-			pos = MovePositionOutsideChar(pos, increment, false);
+			pos += increment;
+			if (dbcsCodePage) {
+				// Ensure trying to match from start of character
+				pos = MovePositionOutsideChar(pos, increment, false);
+			}
 		}
 	}
 	//Platform::DebugPrintf("Not found\n");
-	return - 1;
+	return -1;
+}
+
+const char *Document::SubstituteByPosition(const char *text, int *length) {
+	if (!pre)
+		return 0;
+	delete []substituted;
+	substituted = 0;
+	DocumentIndexer di(this, Length());
+	if (!pre->GrabMatches(di))
+		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++;
+		} else {
+			lenResult++;
+		}
+	}
+	substituted = new char[lenResult + 1];
+	if (!substituted)
+		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++;
+		} else {
+			*o++ = text[j];
+		}
+	}
+	*o = '\0';
+	*length = lenResult;
+	return substituted;
 }
 
 int Document::LinesTotal() {
@@ -806,18 +995,18 @@ int Document::LinesTotal() {
 }
 
 void Document::ChangeCase(Range r, bool makeUpperCase) {
-	for (int pos=r.start; pos<r.end; pos++) {
+	for (int pos = r.start; pos < r.end; pos++) {
 		char ch = CharAt(pos);
 		if (dbcsCodePage && IsDBCS(pos)) {
 			pos += LenChar(pos);
 		} else {
 			if (makeUpperCase) {
 				if (islower(ch)) {
-					ChangeChar(pos, static_cast<char>(toupper(ch)));
+					ChangeChar(pos, static_cast<char>(MakeUpperCase(ch)));
 				}
 			} else {
 				if (isupper(ch)) {
-					ChangeChar(pos, static_cast<char>(tolower(ch)));
+					ChangeChar(pos, static_cast<char>(MakeLowerCase(ch)));
 				}
 			}
 		}
@@ -844,28 +1033,27 @@ void Document::SetWordChars(unsigned char *chars) {
 void Document::SetStylingBits(int bits) {
 	stylingBits = bits;
 	stylingBitsMask = 0;
-	for (int bit=0; bit<stylingBits; bit++) {
+	for (int bit = 0; bit < stylingBits; bit++) {
 		stylingBitsMask <<= 1;
 		stylingBitsMask |= 1;
 	}
 }
 
 void Document::StartStyling(int position, char mask) {
-	stylingPos = position;
 	stylingMask = mask;
+	endStyled = position;
 }
 
 void Document::SetStyleFor(int length, char style) {
 	if (enteredCount == 0) {
 		enteredCount++;
 		int prevEndStyled = endStyled;
-		if (cb.SetStyleFor(stylingPos, length, style, stylingMask)) {
-			DocModification mh(SC_MOD_CHANGESTYLE | SC_PERFORMED_USER, 
-				prevEndStyled, length);
+		if (cb.SetStyleFor(endStyled, length, style, stylingMask)) {
+			DocModification mh(SC_MOD_CHANGESTYLE | SC_PERFORMED_USER,
+			                   prevEndStyled, length);
 			NotifyModified(mh);
 		}
-		stylingPos += length;
-		endStyled = stylingPos;
+		endStyled += length;
 		enteredCount--;
 	}
 }
@@ -875,15 +1063,14 @@ void Document::SetStyles(int length, char *styles) {
 		enteredCount++;
 		int prevEndStyled = endStyled;
 		bool didChange = false;
-		for (int iPos = 0; iPos < length; iPos++, stylingPos++) {
-			if (cb.SetStyleAt(stylingPos, styles[iPos], stylingMask)) {
+		for (int iPos = 0; iPos < length; iPos++, endStyled++) {
+			if (cb.SetStyleAt(endStyled, styles[iPos], stylingMask)) {
 				didChange = true;
 			}
 		}
-		endStyled = stylingPos;
 		if (didChange) {
-			DocModification mh(SC_MOD_CHANGESTYLE | SC_PERFORMED_USER, 
-				prevEndStyled, endStyled - prevEndStyled);
+			DocModification mh(SC_MOD_CHANGESTYLE | SC_PERFORMED_USER,
+			                   prevEndStyled, endStyled - prevEndStyled);
 			NotifyModified(mh);
 		}
 		enteredCount--;
@@ -958,3 +1145,85 @@ void Document::NotifyModified(DocModification mh) {
 		watchers[i].watcher->NotifyModified(this, mh, watchers[i].userData);
 	}
 }
+
+bool Document::IsWordPartSeparator(char ch) {
+	return ispunct(ch) && IsWordChar(ch);
+}
+
+int Document::WordPartLeft(int pos) {
+	if (pos > 0) {
+		--pos;
+		char startChar = cb.CharAt(pos);
+		if (IsWordPartSeparator(startChar)) {
+			while (pos > 0 && IsWordPartSeparator(cb.CharAt(pos))) {
+				--pos;
+			}
+		}
+		if (pos > 0) {
+			startChar = cb.CharAt(pos);
+			--pos;
+			if (islower(startChar)) {
+				while (pos > 0 && islower(cb.CharAt(pos)))
+					--pos;
+				if (!isupper(cb.CharAt(pos)) && !islower(cb.CharAt(pos)))
+					++pos;
+			} else if (isupper(startChar)) {
+				while (pos > 0 && isupper(cb.CharAt(pos)))
+					--pos;
+				if (!isupper(cb.CharAt(pos)))
+					++pos;
+			} else if (isdigit(startChar)) {
+				while (pos > 0 && isdigit(cb.CharAt(pos)))
+					--pos;
+				if (!isdigit(cb.CharAt(pos)))
+					++pos;
+			} else if (ispunct(startChar)) {
+				while (pos > 0 && ispunct(cb.CharAt(pos)))
+					--pos;
+				if (!ispunct(cb.CharAt(pos)))
+					++pos;
+			} else if (isspacechar(startChar)) {
+				while (pos > 0 && isspacechar(cb.CharAt(pos)))
+					--pos;
+				if (!isspacechar(cb.CharAt(pos)))
+					++pos;
+			}
+		}
+	}
+	return pos;
+}
+
+int Document::WordPartRight(int pos) {
+	char startChar = cb.CharAt(pos);
+	int length = Length();
+	if (IsWordPartSeparator(startChar)) {
+		while (pos < length && IsWordPartSeparator(cb.CharAt(pos)))
+			++pos;
+		startChar = cb.CharAt(pos);
+	}
+	if (islower(startChar)) {
+		while (pos < length && islower(cb.CharAt(pos)))
+			++pos;
+	} else if (isupper(startChar)) {
+		if (islower(cb.CharAt(pos + 1))) {
+			++pos;
+			while (pos < length && islower(cb.CharAt(pos)))
+				++pos;
+		} else {
+			while (pos < length && isupper(cb.CharAt(pos)))
+				++pos;
+		}
+		if (islower(cb.CharAt(pos)) && isupper(cb.CharAt(pos - 1)))
+			--pos;
+	} else if (isdigit(startChar)) {
+		while (pos < length && isdigit(cb.CharAt(pos)))
+			++pos;
+	} else if (ispunct(startChar)) {
+		while (pos < length && ispunct(cb.CharAt(pos)))
+			++pos;
+	} else if (isspacechar(startChar)) {
+		while (pos < length && isspacechar(cb.CharAt(pos)))
+			++pos;
+	}
+	return pos;
+}
diff --git a/src/stc/scintilla/src/Document.h b/src/stc/scintilla/src/Document.h
index af477dd79b..394c8f94b0 100644
--- a/src/stc/scintilla/src/Document.h
+++ b/src/stc/scintilla/src/Document.h
@@ -1,36 +1,42 @@
 // Scintilla source code edit control
-// Document.h - text document that handles notifications, DBCS, styling, words and end of line
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file Document.h
+ ** Text document that handles notifications, DBCS, styling, words and end of line.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef DOCUMENT_H
 #define DOCUMENT_H
 
-// A Position is a position within a document between two characters or at the beginning or end.
-// Sometimes used as a character index where it identifies the character after the position.
+/**
+ * A Position is a position within a document between two characters or at the beginning or end.
+ * Sometimes used as a character index where it identifies the character after the position.
+ */
 typedef int Position;
 const Position invalidPosition = -1;
 
-// The range class represents a range of text in a document.
-// The two values are not sorted as one end may be more significant than the other
-// as is the case for the selection where the end position is the position of the caret.
-// If either position is invalidPosition then the range is invalid and most operations will fail.
+/**
+ * The range class represents a range of text in a document.
+ * The two values are not sorted as one end may be more significant than the other
+ * as is the case for the selection where the end position is the position of the caret.
+ * If either position is invalidPosition then the range is invalid and most operations will fail.
+ */
 class Range {
 public:
 	Position start;
 	Position end;
-	
+
 	Range(Position pos=0) : 
 		start(pos), end(pos) {
 	};
 	Range(Position start_, Position end_) : 
 		start(start_), end(end_) {
 	};
-	
+
 	bool Valid() const {
 		return (start != invalidPosition) && (end != invalidPosition);
 	}
-	
+
 	bool Contains(Position pos) const {
 		if (start < end) {
 			return (pos >= start && pos <= end);
@@ -38,11 +44,11 @@ public:
 			return (pos <= start && pos >= end);
 		}
 	}
-	
+
 	bool Contains(Range other) const {
 		return Contains(other.start) && Contains(other.end);
 	}
-	
+
 	bool Overlaps(Range other) const {
 		return 
 		Contains(other.start) ||
@@ -54,11 +60,14 @@ public:
 
 class DocWatcher;
 class DocModification;
+class RESearch;
 
+/**
+ */
 class Document {
 
 public:
-	// Used to pair watcher pointer with user data
+	/** Used to pair watcher pointer with user data. */
 	class WatcherWithUserData {
 	public:
 		DocWatcher *watcher;
@@ -68,37 +77,42 @@ public:
 			userData = 0;
 		}
 	};
-	
+
 private:	
 	int refCount;
 	CellBuffer cb;
 	bool wordchars[256];
-	int stylingPos;
 	char stylingMask;
 	int endStyled;
 	int enteredCount;
 	int enteredReadOnlyCount;
-	
+
 	WatcherWithUserData *watchers;
 	int lenWatchers;
-	
+
+	bool matchesValid;
+	RESearch *pre;
+	char *substituted;
+
 public:
 	int stylingBits;
 	int stylingBitsMask;
-	
+
 	int eolMode;
-	// dbcsCodePage can also be SC_CP_UTF8 to enable UTF-8 mode
+	/// Can also be SC_CP_UTF8 to enable UTF-8 mode
 	int dbcsCodePage;
 	int tabInChars;
 	int indentInChars;
 	bool useTabs;
-	
+	bool tabIndents;
+	bool backspaceUnindents;
+
 	Document();
 	virtual ~Document();
-	
+
 	int AddRef();
 	int Release();
- 	
+
 	int LineFromPosition(int pos);
 	int ClampPositionIntoDocument(int pos);
 	bool IsCrLf(int pos);
@@ -165,12 +179,13 @@ public:
 	int NextWordStart(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 caseSensitive, bool word, bool wordStart, bool regExp, int *length);
 	long FindText(int iMessage, unsigned long wParam, long lParam);
+	const char *SubstituteByPosition(const char *text, int *length);
 	int LinesTotal();
-	
+
 	void ChangeCase(Range r, bool makeUpperCase);
-	
+
 	void SetWordChars(unsigned char *chars);
 	void SetStylingBits(int bits);
 	void StartStyling(int position, char mask);
@@ -182,12 +197,16 @@ public:
 	int SetLineState(int line, int state) { return cb.SetLineState(line, state); }
 	int GetLineState(int line) { return cb.GetLineState(line); }
 	int GetMaxLineState() { return cb.GetMaxLineState(); }
-		
+
 	bool AddWatcher(DocWatcher *watcher, void *userData);
 	bool RemoveWatcher(DocWatcher *watcher, void *userData);
 	const WatcherWithUserData *GetWatchers() const { return watchers; }
 	int GetLenWatchers() const { return lenWatchers; }
-	
+
+	bool IsWordPartSeparator(char ch);
+	int WordPartLeft(int pos);
+	int WordPartRight(int pos);
+
 private:
 	bool IsDBCS(int pos);
 	bool IsWordChar(unsigned char ch);
@@ -195,24 +214,26 @@ private:
 	bool IsWordEndAt(int pos);
 	bool IsWordAt(int start, int end);
 	void ModifiedAt(int pos);
-	
+
 	void NotifyModifyAttempt();
 	void NotifySavePoint(bool atSavePoint);
 	void NotifyModified(DocModification mh);
-	
+
 	int IndentSize() { return indentInChars ? indentInChars : tabInChars; }
 };
 
-// To optimise processing of document modifications by DocWatchers, a hint is passed indicating the 
-// scope of the change.
-// If the DocWatcher is a document view then this can be used to optimise screen updating.
+/**
+ * To optimise processing of document modifications by DocWatchers, a hint is passed indicating the
+ * scope of the change.
+ * If the DocWatcher is a document view then this can be used to optimise screen updating.
+ */
 class DocModification {
 public:
   	int modificationType;
 	int position;
  	int length;
- 	int linesAdded;	// Negative if lines deleted
- 	const char *text;	// Only valid for changes to text, not for changes to style
+ 	int linesAdded;	/**< Negative if lines deleted. */
+ 	const char *text;	/**< Only valid for changes to text, not for changes to style. */
  	int line;
 	int foldLevelNow;
 	int foldLevelPrev;
@@ -239,12 +260,14 @@ public:
 		foldLevelPrev(0) {}
 };
 
-// A class that wants to receive notifications from a Document must be derived from DocWatcher 
-// and implement the notification methods. It can then be added to the watcher list with AddWatcher.
+/**
+ * A class that wants to receive notifications from a Document must be derived from DocWatcher
+ * and implement the notification methods. It can then be added to the watcher list with AddWatcher.
+ */
 class DocWatcher {
 public:
 	virtual ~DocWatcher() {}
-	
+
 	virtual void NotifyModifyAttempt(Document *doc, void *userData) = 0;
 	virtual void NotifySavePoint(Document *doc, void *userData, bool atSavePoint) = 0;
 	virtual void NotifyModified(Document *doc, DocModification mh, void *userData) = 0;
diff --git a/src/stc/scintilla/src/DocumentAccessor.cxx b/src/stc/scintilla/src/DocumentAccessor.cxx
index 6828e37c3f..c187f2a442 100644
--- a/src/stc/scintilla/src/DocumentAccessor.cxx
+++ b/src/stc/scintilla/src/DocumentAccessor.cxx
@@ -1,11 +1,13 @@
-// SciTE - Scintilla based Text Editor
-// Accessor.cxx - rapid easy access to contents of a Scintilla
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file DocumentAccessor.cxx
+ ** Rapid easy access to contents of a Scintilla.
+ **/
+// 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 <ctype.h>
 #include <stdio.h>
 
 #include "Platform.h"
@@ -21,12 +23,12 @@
 DocumentAccessor::~DocumentAccessor() {
 }
 
-#if PLAT_WIN 
+#if PLAT_WIN
 bool DocumentAccessor::InternalIsLeadByte(char ch) {
 	if (SC_CP_UTF8 == codePage)
 		// For lexing, all characters >= 0x80 are treated the
 		// same so none is considered a lead byte.
-		return false;	
+		return false;
 	else
 		return IsDBCSLeadByteEx(codePage, ch);
 }
@@ -36,7 +38,7 @@ bool DocumentAccessor::InternalIsLeadByte(char ch) {
 bool DocumentAccessor::InternalIsLeadByte(char) {
 	return false;
 }
-#endif 
+#endif
 
 void DocumentAccessor::Fill(int position) {
 	if (lenDoc == -1)
@@ -70,10 +72,10 @@ int DocumentAccessor::LevelAt(int line) {
 	return pdoc->GetLevel(line);
 }
 
-int DocumentAccessor::Length() { 
-	if (lenDoc == -1) 
+int DocumentAccessor::Length() {
+	if (lenDoc == -1)
 		lenDoc = pdoc->Length();
-	return lenDoc; 
+	return lenDoc;
 }
 
 int DocumentAccessor::GetLineState(int line) {
@@ -132,12 +134,12 @@ void DocumentAccessor::Flush() {
 int DocumentAccessor::IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader) {
 	int end = Length();
 	int spaceFlags = 0;
-	
-	// Determines the indentation level of the current line and also checks for consistent 
+
+	// Determines the indentation level of the current line and also checks for consistent
 	// indentation compared to the previous line.
-	// Indentation is judged consistent when the indentation whitespace of each line lines 
+	// Indentation is judged consistent when the indentation whitespace of each line lines
 	// the same or the indentation of one line is a prefix of the other.
-	
+
 	int pos = LineStart(line);
 	char ch = (*this)[pos];
 	int indent = 0;
@@ -164,11 +166,12 @@ int DocumentAccessor::IndentAmount(int line, int *flags, PFNIsCommentLeader pfnI
 		}
 		ch = (*this)[++pos];
 	}
-	
+
 	*flags = spaceFlags;
 	indent += SC_FOLDLEVELBASE;
 	// if completely empty line or the start of a comment...
-	if (isspace(ch) || (pfnIsCommentLeader && (*pfnIsCommentLeader)(*this, pos, end-pos)) )
+	if ((ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r') || 
+		(pfnIsCommentLeader && (*pfnIsCommentLeader)(*this, pos, end-pos)) )
 		return indent | SC_FOLDLEVELWHITEFLAG;
 	else
 		return indent;
diff --git a/src/stc/scintilla/src/DocumentAccessor.h b/src/stc/scintilla/src/DocumentAccessor.h
index ccc05fee9f..48742a9b40 100644
--- a/src/stc/scintilla/src/DocumentAccessor.h
+++ b/src/stc/scintilla/src/DocumentAccessor.h
@@ -1,16 +1,24 @@
-// DocumentAccessor.h - implementation of BufferAccess and StylingAccess on a Scintilla rapid easy access to contents of a Scintilla
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file DocumentAccessor.h
+ ** Implementation of BufferAccess and StylingAccess on a Scintilla
+ ** rapid easy access to contents of a Scintilla.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 class Document;
 
+/**
+ */
 class DocumentAccessor : public Accessor {
 	// Private so DocumentAccessor objects can not be copied
 	DocumentAccessor(const DocumentAccessor &source) : Accessor(), props(source.props) {}
 	DocumentAccessor &operator=(const DocumentAccessor &) { return *this; }
+
 protected:
 	Document *pdoc;
 	PropSet &props;
+	WindowID id;
 	int lenDoc;
 
 	char styleBuf[bufferSize];
@@ -21,9 +29,10 @@ protected:
 
 	bool InternalIsLeadByte(char ch);
 	void Fill(int position);
+
 public:
-	DocumentAccessor(Document *pdoc_, PropSet &props_) : 
-		Accessor(), pdoc(pdoc_), props(props_), 
+	DocumentAccessor(Document *pdoc_, PropSet &props_, WindowID id_=0) : 
+		Accessor(), pdoc(pdoc_), props(props_), id(id_),
 		lenDoc(-1), validLen(0), chFlags(0), chWhile(0) {
 	}
 	~DocumentAccessor();
@@ -38,6 +47,10 @@ public:
 	int GetPropertyInt(const char *key, int defaultValue=0) { 
 		return props.GetInt(key, defaultValue); 
 	}
+	char *GetProperties() {
+		return props.ToString();
+	}
+	WindowID GetWindow() { return id; }
 
 	void StartAt(unsigned int start, char chMask=31);
 	void SetFlags(char chFlags_, char chWhile_) {chFlags = chFlags_; chWhile = chWhile_; };
diff --git a/src/stc/scintilla/src/Editor.cxx b/src/stc/scintilla/src/Editor.cxx
index 87b579bbc1..5b72ac579d 100644
--- a/src/stc/scintilla/src/Editor.cxx
+++ b/src/stc/scintilla/src/Editor.cxx
@@ -1,6 +1,8 @@
 // Scintilla source code edit control
-// Editor.cxx - main code for the edit control
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file Editor.cxx
+ ** Main code for the edit control.
+ **/
+// 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>
@@ -14,7 +16,7 @@
 
 #if PLAT_WX || PLAT_GTK
 #include "WinDefs.h"
-#endif
+#endif 
 
 #include "ContractionState.h"
 #include "SVector.h"
@@ -28,7 +30,7 @@
 #include "Editor.h"
 
 Caret::Caret() :
-active(true), on(true), period(500) {}
+active(false), on(false), period(500) {}
 
 Timer::Timer() :
 ticking(false), ticksToWait(0), tickerID(0) {}
@@ -40,13 +42,20 @@ Editor::Editor() {
 
 	printMagnification = 0;
 	printColourMode = SC_PRINT_NORMAL;
+	cursorMode = SC_CURSORNORMAL;
 
+	hasFocus = false;
 	hideSelection = false;
 	inOverstrike = false;
+	errorStatus = 0;
+	mouseDownCaptures = true;
 
 	bufferedDraw = true;
 
 	lastClickTime = 0;
+	dwellDelay = SC_TIME_FOREVER;
+	ticksToDwell = SC_TIME_FOREVER;
+	dwelling = false;
 	ptMouseLast.x = 0;
 	ptMouseLast.y = 0;
 	firstExpose = true;
@@ -71,6 +80,9 @@ Editor::Editor() {
 	caretPolicy = CARET_SLOP;
 	caretSlop = 0;
 
+	visiblePolicy = VISIBLE_SLOP;
+	visibleSlop = 0;
+
 	searchAnchor = 0;
 
 	ucWheelScrollLines = 0;
@@ -83,6 +95,10 @@ Editor::Editor() {
 	currentPos = 0;
 	anchor = 0;
 
+	targetStart = 0;
+	targetEnd = 0;
+	searchFlags = 0;
+
 	topLine = 0;
 	posTopLine = 0;
 
@@ -106,7 +122,7 @@ Editor::Editor() {
 
 #ifdef MACRO_SUPPORT
 	recordingMacro = 0;
-#endif
+#endif 
 	foldFlags = 0;
 }
 
@@ -161,7 +177,7 @@ void Editor::RefreshStyleData() {
 }
 
 PRectangle Editor::GetClientRectangle() {
-	return wDraw.GetClientPosition();
+	return wMain.GetClientPosition();
 }
 
 PRectangle Editor::GetTextRectangle() {
@@ -215,15 +231,17 @@ const char *ControlCharacterString(unsigned char ch) {
 	}
 }
 
-Point Editor::LocationFromPosition(unsigned int pos) {
+Point Editor::LocationFromPosition(int pos) {
+	Point pt;
 	RefreshStyleData();
+	if (pos == INVALID_POSITION)
+		return pt;
 	int line = pdoc->LineFromPosition(pos);
 	int lineVisible = cs.DisplayFromDoc(line);
 	//Platform::DebugPrintf("line=%d\n", line);
 	Surface surface;
 	surface.Init();
 	surface.SetUnicodeMode(SC_CP_UTF8 == pdoc->dbcsCodePage);
-	Point pt;
 	pt.y = (lineVisible - topLine) * vs.lineHeight;  	// + half a lineheight?
 	unsigned int posLineStart = pdoc->LineStart(line);
 	LineLayout ll;
@@ -237,7 +255,7 @@ Point Editor::LocationFromPosition(unsigned int pos) {
 	return pt;
 }
 
-int Editor::XFromPosition(unsigned int pos) {
+int Editor::XFromPosition(int pos) {
 	Point pt = LocationFromPosition(pos);
 	return pt.x - vs.fixedColumnWidth + xOffset;
 }
@@ -262,7 +280,6 @@ int Editor::PositionFromLocation(Point pt) {
 		return 0;
 	if (line >= pdoc->LinesTotal())
 		return pdoc->Length();
-	//Platform::DebugPrintf("Position of (%d,%d) line = %d top=%d\n", pt.x, pt.y, line, topLine);
 	Surface surface;
 	surface.Init();
 	surface.SetUnicodeMode(SC_CP_UTF8 == pdoc->dbcsCodePage);
@@ -280,6 +297,42 @@ int Editor::PositionFromLocation(Point pt) {
 	return ll.numCharsInLine + posLineStart;
 }
 
+// Like PositionFromLocation but INVALID_POSITION returned when not near any text.
+int Editor::PositionFromLocationClose(Point pt) {
+	RefreshStyleData();
+	PRectangle rcClient = GetTextRectangle();
+	if (!rcClient.Contains(pt))
+		return INVALID_POSITION;
+	if (pt.x < vs.fixedColumnWidth)
+		return INVALID_POSITION;
+	if (pt.y < 0)
+		return INVALID_POSITION;
+	pt.x = pt.x - vs.fixedColumnWidth + xOffset;
+	int line = cs.DocFromDisplay(pt.y / vs.lineHeight + topLine);
+	if (pt.y < 0) {	// Division rounds towards 0
+		line = cs.DocFromDisplay((pt.y - (vs.lineHeight - 1)) / vs.lineHeight + topLine);
+	}
+	if (line < 0)
+		return INVALID_POSITION;
+	if (line >= pdoc->LinesTotal())
+		return INVALID_POSITION;
+	Surface surface;
+	surface.Init();
+	surface.SetUnicodeMode(SC_CP_UTF8 == pdoc->dbcsCodePage);
+	unsigned int posLineStart = pdoc->LineStart(line);
+
+	LineLayout ll;
+	LayoutLine(line, &surface, vs, ll);
+	for (int i = 0; i < ll.numCharsInLine; i++) {
+		if (pt.x < ((ll.positions[i] + ll.positions[i + 1]) / 2) ||
+		        ll.chars[i] == '\r' || ll.chars[i] == '\n') {
+			return i + posLineStart;
+		}
+	}
+
+	return INVALID_POSITION;
+}
+
 int Editor::PositionFromLineX(int line, int x) {
 	RefreshStyleData();
 	if (line >= pdoc->LinesTotal())
@@ -303,27 +356,27 @@ int Editor::PositionFromLineX(int line, int x) {
 }
 
 void Editor::RedrawRect(PRectangle rc) {
-    //Platform::DebugPrintf("Redraw %d %d - %d %d\n", rc.left, rc.top, rc.right, rc.bottom);
-
-    // Clip the redraw rectangle into the client area
-    PRectangle rcClient = GetClientRectangle();
-    if (rc.top < rcClient.top)
-        rc.top = rcClient.top;
-    if (rc.bottom > rcClient.bottom)
-        rc.bottom = rcClient.bottom;
-    if (rc.left < rcClient.left)
-        rc.left = rcClient.left;
-    if (rc.right > rcClient.right)
-        rc.right = rcClient.right;
+	//Platform::DebugPrintf("Redraw %0d,%0d - %0d,%0d\n", rc.left, rc.top, rc.right, rc.bottom);
 
-    if ((rc.bottom > rc.top) && (rc.right > rc.left)) {
-        wDraw.InvalidateRectangle(rc);
-    }
+	// Clip the redraw rectangle into the client area
+	PRectangle rcClient = GetClientRectangle();
+	if (rc.top < rcClient.top)
+		rc.top = rcClient.top;
+	if (rc.bottom > rcClient.bottom)
+		rc.bottom = rcClient.bottom;
+	if (rc.left < rcClient.left)
+		rc.left = rcClient.left;
+	if (rc.right > rcClient.right)
+		rc.right = rcClient.right;
+
+	if ((rc.bottom > rc.top) && (rc.right > rc.left)) {
+		wMain.InvalidateRectangle(rc);
+	}
 }
 
 void Editor::Redraw() {
 	//Platform::DebugPrintf("Redraw all\n");
-	wDraw.InvalidateAll();
+	wMain.InvalidateAll();
 }
 
 void Editor::RedrawSelMargin() {
@@ -332,7 +385,7 @@ void Editor::RedrawSelMargin() {
 	} else {
 		PRectangle rcSelMargin = GetClientRectangle();
 		rcSelMargin.right = vs.fixedColumnWidth;
-		wDraw.InvalidateRectangle(rcSelMargin);
+		wMain.InvalidateRectangle(rcSelMargin);
 	}
 }
 
@@ -384,7 +437,6 @@ int Editor::SelectionStart(int line) {
 			return -1;
 		} else {
 			int minX = Platform::Minimum(xStartSelect, xEndSelect);
-			//return PositionFromLineX(line, minX + vs.fixedColumnWidth - xOffset);
 			return PositionFromLineX(line, minX);
 		}
 	}
@@ -455,6 +507,7 @@ void Editor::SetSelection(int currentPos_) {
 }
 
 void Editor::SetEmptySelection(int currentPos_) {
+	selType = selStream;
 	SetSelection(currentPos_, currentPos_);
 }
 
@@ -485,6 +538,7 @@ int Editor::MovePositionTo(int newPos, bool extend) {
 	}
 	EnsureCaretVisible();
 	ShowCaretAtCurrentPosition();
+	NotifyMove(newPos);
 	return 0;
 }
 
@@ -541,7 +595,7 @@ void Editor::HorizontalScrollTo(int xPos) {
 	if (xOffset < 0)
 		xOffset = 0;
 	SetHorizontalScrollPos();
-	Redraw();
+	RedrawRect(GetClientRectangle());
 }
 
 void Editor::MoveCaretInsideView() {
@@ -557,9 +611,10 @@ void Editor::MoveCaretInsideView() {
 	}
 }
 
-void Editor::EnsureCaretVisible(bool useMargin) {
-	//Platform::DebugPrintf("EnsureCaretVisible %d\n", xOffset);
+void Editor::EnsureCaretVisible(bool useMargin, bool vert, bool horiz) {
+	//Platform::DebugPrintf("EnsureCaretVisible %d %s\n", xOffset, useMargin ? " margin" : " ");
 	PRectangle rcClient = GetTextRectangle();
+	//int rcClientFullWidth = rcClient.Width();
 	int posCaret = currentPos;
 	if (posDrag >= 0)
 		posCaret = posDrag;
@@ -569,17 +624,26 @@ void Editor::EnsureCaretVisible(bool useMargin) {
 	int lineCaret = cs.DisplayFromDoc(pdoc->LineFromPosition(posCaret));
 	ptBottomCaret.y += vs.lineHeight - 1;
 
-	// Ensure the caret is reasonably visible in context.
+	// Ensure the caret is reasonably visible in context:
+	// xMargin must equal to xCaretMargin, with a minimum of 2 and a maximum of
+	// slightly less than half the width of the text area.
 	int xMargin = Platform::Clamp(xCaretMargin, 2, Platform::Maximum(rcClient.Width() - 10, 4) / 2);
 	if (!useMargin)
 		xMargin = 2;
 
-	// Ensure certain amount of text visible on both sides of caretSo move if caret just on edge
-	rcClient.left = rcClient.left + xMargin;
-	rcClient.right = rcClient.right - xMargin;
+	// If we scroll the display, we use a minimum amount of xMargin.
+	int offsetLeft = rcClient.left + xMargin;
+	int offsetRight = rcClient.right - xMargin;
+	// If we are in XJUMPS mode, then when the margin is reached, the 
+	// offset jumps so that it won't need to move agin for a while.
+	if (!(caretPolicy & CARET_XJUMPS)) {
+		rcClient.left = offsetLeft;
+		rcClient.right = offsetRight;
+	}
 
-	if (!rcClient.Contains(pt) || !rcClient.Contains(ptBottomCaret) || (caretPolicy & CARET_STRICT)) {
-		//Platform::DebugPrintf("EnsureCaretVisible move, (%d,%d) (%d,%d)\n", pt.x, pt.y, rcClient.left, rcClient.right);
+	// Vertical positioning
+	if (vert && (!rcClient.Contains(pt) || !rcClient.Contains(ptBottomCaret) || (caretPolicy & CARET_STRICT))) {
+		//Platform::DebugPrintf("EnsureCaretVisible move, (%d,%d)(%d,%d)\n", pt.x, pt.y, rcClient.left, rcClient.right);
 		// It should be possible to scroll the window to show the caret,
 		// but this fails to remove the caret on GTK+
 		if (caretPolicy & CARET_SLOP) {
@@ -600,12 +664,16 @@ void Editor::EnsureCaretVisible(bool useMargin) {
 				Redraw();
 			}
 		}
+	}
+
+	// Horizontal positioning
+	if (horiz) {
 		int xOffsetNew = xOffset;
 		if (pt.x < rcClient.left) {
-			xOffsetNew = xOffset - (rcClient.left - pt.x);
-		} else if (pt.x >= rcClient.right) {
-			xOffsetNew = xOffset + (pt.x - rcClient.right);
-			int xOffsetEOL = xOffset + (ptEOL.x - rcClient.right) - xMargin + 2;
+			xOffsetNew = xOffset - (offsetLeft - pt.x);
+		} else if ((!(caretPolicy & CARET_XEVEN) && ((xOffset > 0) && useMargin)) || pt.x >= rcClient.right) {
+			xOffsetNew = xOffset + (pt.x - offsetRight);
+			int xOffsetEOL = xOffset + (ptEOL.x - offsetRight) - xMargin + 2;
 			//Platform::DebugPrintf("Margin %d %d\n", xOffsetNew, xOffsetEOL);
 			// Ensure don't scroll out into empty space
 			if (xOffsetNew > xOffsetEOL)
@@ -622,10 +690,10 @@ void Editor::EnsureCaretVisible(bool useMargin) {
 }
 
 void Editor::ShowCaretAtCurrentPosition() {
-	if (!wMain.HasFocus()) {
+	if (!hasFocus) {
 		caret.active = false;
 		caret.on = false;
-		return ;
+		return;
 	}
 	caret.active = true;
 	caret.on = true;
@@ -644,15 +712,21 @@ void Editor::InvalidateCaret() {
 		InvalidateRange(currentPos, currentPos + 1);
 }
 
+int Editor::SubstituteMarkerIfEmpty(int markerCheck, int markerDefault) {
+	if (vs.markers[markerCheck].markType == SC_MARK_EMPTY)
+		return markerDefault;
+	return markerCheck;
+}
+
 void Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) {
 	if (vs.fixedColumnWidth == 0)
-		return ;
+		return;
 
 	PRectangle rcMargin = GetClientRectangle();
 	rcMargin.right = vs.fixedColumnWidth;
 
 	if (!rc.Intersects(rcMargin))
-		return ;
+		return;
 
 	Surface *surface;
 	if (bufferedDraw) {
@@ -691,15 +765,89 @@ void Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) {
 			int line = cs.DocFromDisplay(visibleLine);
 			int yposScreen = 0;
 
+			// Work out whether the top line is whitespace located after a 
+			// lessening of fold level which implies a 'fold tail' but which should not
+			// be displayed until the last of a sequence of whitespace.
+			bool needWhiteClosure = false;	
+			int level = pdoc->GetLevel(line);
+			if (level & SC_FOLDLEVELWHITEFLAG) {
+				int lineBack = line;
+				int levelPrev = level;
+				while ((lineBack > 0) && (levelPrev & SC_FOLDLEVELWHITEFLAG)) {
+					lineBack--;
+					levelPrev = pdoc->GetLevel(lineBack);
+				}
+				if (!(levelPrev & SC_FOLDLEVELHEADERFLAG)) {
+					if ((level & SC_FOLDLEVELNUMBERMASK) < (levelPrev & SC_FOLDLEVELNUMBERMASK))
+						needWhiteClosure = true;
+				}
+			}
+			
+			// Old code does not know about new markers needed to distinguish all cases
+			int folderOpenMid = SubstituteMarkerIfEmpty(SC_MARKNUM_FOLDEROPENMID, 
+				SC_MARKNUM_FOLDEROPEN);
+			int folderEnd = SubstituteMarkerIfEmpty(SC_MARKNUM_FOLDEREND, 
+				SC_MARKNUM_FOLDER);
+			
 			while ((visibleLine < cs.LinesDisplayed()) && yposScreen < rcMargin.bottom) {
+
+				// Decide which fold indicator should be displayed
+				level = pdoc->GetLevel(line);
+				int levelNext = pdoc->GetLevel(line+1);
 				int marks = pdoc->GetMark(line);
-				if (pdoc->GetLevel(line) & SC_FOLDLEVELHEADERFLAG) {
+				int levelNum = level & SC_FOLDLEVELNUMBERMASK;
+				int levelNextNum = levelNext & SC_FOLDLEVELNUMBERMASK;
+				if (level & SC_FOLDLEVELHEADERFLAG) {
 					if (cs.GetExpanded(line)) {
-						marks |= 1 << SC_MARKNUM_FOLDEROPEN;
+						if (levelNum == SC_FOLDLEVELBASE)
+							marks |= 1 << SC_MARKNUM_FOLDEROPEN;
+						else 
+							marks |= 1 << folderOpenMid;
 					} else {
-						marks |= 1 << SC_MARKNUM_FOLDER;
+						if (levelNum == SC_FOLDLEVELBASE)
+							marks |= 1 << SC_MARKNUM_FOLDER;
+						else
+							marks |= 1 << folderEnd;
+					}
+					needWhiteClosure = false;
+				} else if (level & SC_FOLDLEVELWHITEFLAG) {
+					if (needWhiteClosure) {
+						if (levelNext & SC_FOLDLEVELWHITEFLAG) {
+							marks |= 1 << SC_MARKNUM_FOLDERSUB;
+						} else if (levelNum > SC_FOLDLEVELBASE) {
+							marks |= 1 << SC_MARKNUM_FOLDERMIDTAIL;
+							needWhiteClosure = false;
+						} else {
+							marks |= 1 << SC_MARKNUM_FOLDERTAIL;
+							needWhiteClosure = false;
+						}
+					} else if (levelNum > SC_FOLDLEVELBASE) {
+						if (levelNextNum < levelNum) {
+							if (levelNextNum > SC_FOLDLEVELBASE) {
+								marks |= 1 << SC_MARKNUM_FOLDERMIDTAIL;
+							} else {
+								marks |= 1 << SC_MARKNUM_FOLDERTAIL;
+							}
+						} else {
+							marks |= 1 << SC_MARKNUM_FOLDERSUB;
+						}
+					}
+				} else if (levelNum > SC_FOLDLEVELBASE) {
+					if (levelNextNum < levelNum) {
+						needWhiteClosure = false;
+						if (levelNext & SC_FOLDLEVELWHITEFLAG) {
+							marks |= 1 << SC_MARKNUM_FOLDERSUB;
+							needWhiteClosure = true;
+						} else if (levelNextNum > SC_FOLDLEVELBASE) {
+							marks |= 1 << SC_MARKNUM_FOLDERMIDTAIL;
+						} else {
+							marks |= 1 << SC_MARKNUM_FOLDERTAIL;
+						}
+					} else {
+						marks |= 1 << SC_MARKNUM_FOLDERSUB;
 					}
 				}
+
 				marks &= vs.ms[margin].mask;
 				PRectangle rcMarker = rcSelMargin;
 				rcMarker.top = yposScreen;
@@ -726,8 +874,6 @@ void Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) {
 				if (marks) {
 					for (int markBit = 0; (markBit < 32) && marks; markBit++) {
 						if (marks & 1) {
-							rcMarker.top++;
-							rcMarker.bottom--;
 							vs.markers[markBit].Draw(surface, rcMarker);
 						}
 						marks >>= 1;
@@ -763,6 +909,11 @@ void DrawTabArrow(Surface *surface, PRectangle rcTab, int ymid) {
 	surface->LineTo(xhead, ymid + ydiff);
 }
 
+/**
+ * Fill in the LineLayout data for the given line.
+ * Copy the given @a line and its styles from the document into local arrays.
+ * Also determine the x position at which each character starts.
+ */
 void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayout &ll) {
 	int numCharsInLine = 0;
 	int posLineStart = pdoc->LineStart(line);
@@ -771,9 +922,11 @@ void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayou
 	char styleByte = 0;
 	int styleMask = pdoc->stylingBitsMask;
 	ll.xHighlightGuide = 0;
+	// If the line is very long, limit the treatment to a length that should fit in the viewport
 	if (posLineEnd > (posLineStart + LineLayout::maxLineLength)) {
 		posLineEnd = posLineStart + LineLayout::maxLineLength;
 	}
+	// Fill base line layout
 	for (int charInDoc = posLineStart; charInDoc < posLineEnd; charInDoc++) {
 		char chDoc = pdoc->CharAt(charInDoc);
 		styleByte = pdoc->StyleAt(charInDoc);
@@ -781,6 +934,10 @@ void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayou
 			ll.chars[numCharsInLine] = chDoc;
 			ll.styles[numCharsInLine] = static_cast<char>(styleByte & styleMask);
 			ll.indicators[numCharsInLine] = static_cast<char>(styleByte & ~styleMask);
+			if (vstyle.styles[ll.styles[numCharsInLine]].caseForce == Style::caseUpper)
+				ll.chars[numCharsInLine] = static_cast<char>(toupper(chDoc));
+			else if (vstyle.styles[ll.styles[numCharsInLine]].caseForce == Style::caseLower)
+				ll.chars[numCharsInLine] = static_cast<char>(tolower(chDoc));
 			numCharsInLine++;
 		}
 	}
@@ -791,10 +948,11 @@ void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayou
 
 	// Layout the line, determining the position of each character,
 	// with an extra element at the end for the end of the line.
-	int startseg = 0;
-	int startsegx = 0;
+	int startseg = 0;	// Start of the current segment, in char. number
+	int startsegx = 0;	// Start of the current segment, in pixels
 	ll.positions[0] = 0;
 	unsigned int tabWidth = vstyle.spaceWidth * pdoc->tabInChars;
+	bool lastSegItalics = false;
 
 	for (int charInLine = 0; charInLine < numCharsInLine; charInLine++) {
 		if ((ll.styles[charInLine] != ll.styles[charInLine + 1]) ||
@@ -810,14 +968,16 @@ void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayou
 						// +3 For a blank on front and rounded edge each side:
 						ll.positions[charInLine + 1] = surface->WidthText(ctrlCharsFont, ctrlChar, strlen(ctrlChar)) + 3;
 					}
-				} else {
+					lastSegItalics = false;
+				} else {	// Regular character
+					lastSegItalics = vstyle.styles[ll.styles[charInLine]].italic;
 					int lenSeg = charInLine - startseg + 1;
 					if ((lenSeg == 1) && (' ' == ll.chars[startseg])) {
 						// Over half the segments are single characters and of these about half are space characters.
 						ll.positions[charInLine + 1] = vstyle.styles[ll.styles[charInLine]].spaceWidth;
 					} else {
 						surface->MeasureWidths(vstyle.styles[ll.styles[charInLine]].font, ll.chars + startseg,
-						                       charInLine - startseg + 1, ll.positions + startseg + 1);
+						                       lenSeg, ll.positions + startseg + 1);
 					}
 				}
 			} else {    // invisible
@@ -832,6 +992,10 @@ void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayou
 			startseg = charInLine + 1;
 		}
 	}
+	// Small hack to make lines that end with italics not cut off the edge of the last character
+	if ((startseg > 0) && lastSegItalics) {
+		ll.positions[startseg] += 2;
+	}
 	ll.numCharsInLine = numCharsInLine;
 }
 
@@ -845,19 +1009,23 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis
 	// is taken by an individual character - internal leading gives varying results.
 	Font &ctrlCharsFont = vsDraw.styles[STYLE_CONTROLCHAR].font;
 
-	int marks = 0;
-	Colour markBack = Colour(0, 0, 0);
+	bool overrideBackground = false;
+	Colour background = Colour(0, 0, 0);
+	if (caret.active && vsDraw.showCaretLineBackground && ll.containsCaret) {
+		overrideBackground = true;
+		background = vsDraw.caretLineBackground.allocated;
+	}
 	if (vsDraw.maskInLine) {
-		marks = pdoc->GetMark(line) & vsDraw.maskInLine;
+		int marks = pdoc->GetMark(line) & vsDraw.maskInLine;
 		if (marks) {
+			overrideBackground = true;
 			for (int markBit = 0; (markBit < 32) && marks; markBit++) {
 				if (marks & 1) {
-					markBack = vsDraw.markers[markBit].back.allocated;
+					background = vsDraw.markers[markBit].back.allocated;
 				}
 				marks >>= 1;
 			}
 		}
-		marks = pdoc->GetMark(line) & vsDraw.maskInLine;
 	}
 
 	bool inIndentation = true;
@@ -893,8 +1061,8 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis
 				if (vsDraw.selforeset)
 					textFore = vsDraw.selforeground.allocated;
 			} else {
-				if (marks)
-					textBack = markBack;
+				if (overrideBackground)
+					textBack = background;
 				if ((vsDraw.edgeState == EDGE_BACKGROUND) && (i >= ll.edgeColumn) && (ll.chars[i] != '\n') && (ll.chars[i] != '\r'))
 					textBack = vsDraw.edgecolour.allocated;
 			}
@@ -948,7 +1116,8 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis
 				                         rcSegment.top + vsDraw.maxAscent, ctrlChar, strlen(ctrlChar),
 				                         textBack, textFore);
 				// Manage normal display
-			} else {
+			}
+			else {
 				rcSegment.left = ll.positions[startseg] + xStart;
 				rcSegment.right = ll.positions[i + 1] + xStart;
 				// Only try to draw if really visible - enhances performance by not calling environment to
@@ -1032,16 +1201,16 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis
 			surface->FillRectangle(rcSegment, vsDraw.selbackground.allocated);
 		else
 			surface->FillRectangle(rcSegment, vsDraw.selbackground2.allocated);
-	} else if (marks) {
-		surface->FillRectangle(rcSegment, markBack);
+	} else if (overrideBackground) {
+		surface->FillRectangle(rcSegment, background);
 	} else {
 		surface->FillRectangle(rcSegment, vsDraw.styles[ll.styles[ll.numCharsInLine] & styleMask].back.allocated);
 	}
 
 	rcSegment.left = xEol + vsDraw.aveCharWidth + xStart;
 	rcSegment.right = rcLine.right;
-	if (marks) {
-		surface->FillRectangle(rcSegment, markBack);
+	if (overrideBackground) {
+		surface->FillRectangle(rcSegment, background);
 	} else if (vsDraw.styles[ll.styles[ll.numCharsInLine] & styleMask].eolFilled) {
 		surface->FillRectangle(rcSegment, vsDraw.styles[ll.styles[ll.numCharsInLine] & styleMask].back.allocated);
 	} else {
@@ -1110,14 +1279,14 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
 	}
 
 	surfaceWindow->SetPalette(&palette, true);
-	pixmapLine.SetPalette(&palette, !wMain.HasFocus());
+	pixmapLine.SetPalette(&palette, !hasFocus);
 
 	//Platform::DebugPrintf("Paint: (%3d,%3d) ... (%3d,%3d)\n",
 	//	rcArea.left, rcArea.top, rcArea.right, rcArea.bottom);
 
 	int screenLinePaintFirst = rcArea.top / vs.lineHeight;
 	// The area to be painted plus one extra line is styled.
-	// The extra line is to determine when a style change, such as statrting a comment flows on to other lines.
+	// The extra line is to determine when a style change, such as starting a comment flows on to other lines.
 	int lineStyleLast = topLine + (rcArea.bottom - 1) / vs.lineHeight + 1;
 	//Platform::DebugPrintf("Paint lines = %d .. %d\n", topLine + screenLinePaintFirst, lineStyleLast);
 	int endPosPaint = pdoc->Length();
@@ -1150,10 +1319,11 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
 		// Either styling or NotifyUpdateUI noticed that painting is needed
 		// outside the current painting rectangle
 		//Platform::DebugPrintf("Abandoning paint\n");
-		return ;
+		return;
 	}
 	//Platform::DebugPrintf("start display %d, offset = %d\n", pdoc->Length(), xOffset);
 
+	// Do the painting
 	if (rcArea.right > vs.fixedColumnWidth) {
 
 		Surface *surface = surfaceWindow;
@@ -1176,11 +1346,29 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
 		rcTextArea.left = vs.fixedColumnWidth;
 		rcTextArea.right -= vs.rightMarginWidth;
 		surfaceWindow->SetClip(rcTextArea);
+
+		// Loop on visible lines
 		//GTimer *tim=g_timer_new();
 		while (visibleLine < cs.LinesDisplayed() && yposScreen < rcArea.bottom) {
 			//g_timer_start(tim);
 			//Platform::DebugPrintf("Painting line %d\n", line);
 
+			// Copy this line and its styles from the document into local arrays
+			// and determine the x position at which each character starts.
+			LineLayout ll;
+			LayoutLine(line, surface, vs, ll);
+
+			ll.selStart = SelectionStart(line);
+			ll.selEnd = SelectionEnd(line);
+			ll.containsCaret = line == lineCaret;
+			if (hideSelection) {
+				ll.selStart = -1;
+				ll.selEnd = -1;
+				ll.containsCaret = false;
+			}
+			// Need to fix this up so takes account of Unicode and DBCS
+			ll.edgeColumn = theEdge;
+
 			int posLineStart = pdoc->LineStart(line);
 			int posLineEnd = pdoc->LineStart(line + 1);
 			//Platform::DebugPrintf("line %d %d - %d\n", line, posLineStart, posLineEnd);
@@ -1189,11 +1377,6 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
 			rcLine.top = ypos;
 			rcLine.bottom = ypos + vs.lineHeight;
 
-			// Copy this line and its styles from the document into local arrays
-			// and determine the x position at which each character starts.
-			LineLayout ll;
-			LayoutLine(line, surface, vs, ll);
-
 			// Highlight the current braces if any
 			if ((braces[0] >= posLineStart) && (braces[0] < posLineEnd)) {
 				int braceOffset = braces[0] - posLineStart;
@@ -1210,15 +1393,6 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
 				ll.xHighlightGuide = highlightGuideColumn * vs.spaceWidth;
 			}
 
-			ll.selStart = SelectionStart(line);
-			ll.selEnd = SelectionEnd(line);
-			if (hideSelection) {
-				ll.selStart = -1;
-				ll.selEnd = -1;
-			}
-			// Need to fix this up so takes account of Unicode and DBCS
-			ll.edgeColumn = theEdge;
-
 			// Draw the line
 			if (cs.GetVisible(line))
 				DrawLine(surface, vs, line, visibleLine, xStart, rcLine, ll);
@@ -1255,17 +1429,20 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
 					widthOverstrikeCaret = 3;
 				if (((caret.active && caret.on) || (posDrag >= 0)) && xposCaret >= 0) {
 					PRectangle rcCaret = rcLine;
+					int caretWidthOffset = 0;
+					if ((offset > 0) && (vs.caretWidth > 1))
+						caretWidthOffset = 1;	// Move back so overlaps both character cells.
 					if (posDrag >= 0) {
-						rcCaret.left = xposCaret;
-						rcCaret.right = xposCaret + 1;
+						rcCaret.left = xposCaret - caretWidthOffset;
+						rcCaret.right = rcCaret.left + vs.caretWidth;
 					} else {
 						if (inOverstrike) {
 							rcCaret.top = rcCaret.bottom - 2;
 							rcCaret.left = xposCaret + 1;
 							rcCaret.right = rcCaret.left + widthOverstrikeCaret - 1;
 						} else {
-							rcCaret.left = xposCaret;
-							rcCaret.right = xposCaret + 1;
+							rcCaret.left = xposCaret - caretWidthOffset;
+							rcCaret.right = rcCaret.left + vs.caretWidth;
 						}
 					}
 					surface->FillRectangle(rcCaret, vs.caretcolour.allocated);
@@ -1294,6 +1471,10 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
 		}
 		//g_timer_destroy(tim);
 
+		// Right column limit indicator
+
+
+
 		PRectangle rcBeyondEOF = rcClient;
 		rcBeyondEOF.left = vs.fixedColumnWidth;
 		rcBeyondEOF.right = rcBeyondEOF.right;
@@ -1307,6 +1488,7 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
 				surfaceWindow->FillRectangle(rcBeyondEOF, vs.edgecolour.allocated);
 			}
 		}
+		NotifyPainted();
 	}
 }
 
@@ -1360,8 +1542,9 @@ long Editor::FormatRange(bool draw, RangeToFormat *pfr) {
 	// Don't show the selection when printing
 	vsPrint.selbackset = false;
 	vsPrint.selforeset = false;
-	// White background for the line numbers
-	vsPrint.styles[STYLE_LINENUMBER].back.desired = Colour(0xff, 0xff, 0xff);
+	vsPrint.showCaretLineBackground = false;
+
+	// Set colours for printing according to users settings
 	for (int sty = 0;sty <= STYLE_MAX;sty++) {
 		if (printColourMode == SC_PRINT_INVERTLIGHT) {
 			vsPrint.styles[sty].fore.desired = InvertedLight(vsPrint.styles[sty].fore.desired);
@@ -1369,8 +1552,15 @@ long Editor::FormatRange(bool draw, RangeToFormat *pfr) {
 		} else if (printColourMode == SC_PRINT_BLACKONWHITE) {
 			vsPrint.styles[sty].fore.desired = Colour(0, 0, 0);
 			vsPrint.styles[sty].back.desired = Colour(0xff, 0xff, 0xff);
+		} else if (printColourMode == SC_PRINT_COLOURONWHITE) {
+			vsPrint.styles[sty].back.desired = Colour(0xff, 0xff, 0xff);
+		} else if (printColourMode == SC_PRINT_COLOURONWHITEDEFAULTBG) {
+			if (sty <= STYLE_DEFAULT) {
+				vsPrint.styles[sty].back.desired = Colour(0xff, 0xff, 0xff);
+			}
 		}
 	}
+	// White background for the line numbers
 	vsPrint.styles[STYLE_LINENUMBER].back.desired = Colour(0xff, 0xff, 0xff);
 
 	vsPrint.Refresh(*surfaceMeasure);
@@ -1381,7 +1571,7 @@ long Editor::FormatRange(bool draw, RangeToFormat *pfr) {
 	int lineNumberWidth = 0;
 	if (lineNumberIndex >= 0) {
 		lineNumberWidth = surface->WidthText(vsPrint.styles[STYLE_LINENUMBER].font,
-		                                     "9999" lineNumberPrintSpace, 4 + strlen(lineNumberPrintSpace));
+		                                     "99999" lineNumberPrintSpace, 5 + strlen(lineNumberPrintSpace));
 		vsPrint.ms[lineNumberIndex].width = lineNumberWidth;
 	}
 
@@ -1410,6 +1600,22 @@ long Editor::FormatRange(bool draw, RangeToFormat *pfr) {
 
 		while (line <= linePrintLast && ypos < pfr->rc.bottom) {
 
+			// When printing, the hdc and hdcTarget may be the same, so
+			// changing the state of surfaceMeasure may change the underlying
+			// state of surface. Therefore, any cached state is discarded before
+			// using each surface.
+			surfaceMeasure->FlushCachedState();
+
+			// Copy this line and its styles from the document into local arrays
+			// and determine the x position at which each character starts.
+			LineLayout ll;
+			LayoutLine(line, surfaceMeasure, vsPrint, ll);
+			ll.selStart = -1;
+			ll.selEnd = -1;
+			ll.containsCaret = false;
+			// Need to fix this up so takes account of Unicode and DBCS
+			ll.edgeColumn = theEdge;
+
 			PRectangle rcLine;
 			rcLine.left = pfr->rc.left + lineNumberWidth;
 			rcLine.top = ypos;
@@ -1430,21 +1636,6 @@ long Editor::FormatRange(bool draw, RangeToFormat *pfr) {
 				                  vsPrint.styles[STYLE_LINENUMBER].back.allocated);
 			}
 
-			// When printing, the hdc and hdcTarget may be the same, so
-			// changing the state of surfaceMeasure may change the underlying
-			// state of surface. Therefore, any cached state is discarded before
-			// using each surface.
-
-			// Copy this line and its styles from the document into local arrays
-			// and determine the x position at which each character starts.
-			surfaceMeasure->FlushCachedState();
-			LineLayout ll;
-			LayoutLine(line, surfaceMeasure, vsPrint, ll);
-			ll.selStart = -1;
-			ll.selEnd = -1;
-			// Need to fix this up so takes account of Unicode and DBCS
-			ll.edgeColumn = theEdge;
-
 			// Draw the line
 			surface->FlushCachedState();
 			DrawLine(surface, vsPrint, line, line, xStart, rcLine, ll);
@@ -1463,7 +1654,6 @@ long Editor::FormatRange(bool draw, RangeToFormat *pfr) {
 // Empty method is overridden on GTK+ to show / hide scrollbars
 void Editor::ReconfigureScrollBars() {}
 
-
 void Editor::SetScrollBarsTo(PRectangle) {
 	RefreshStyleData();
 
@@ -1483,7 +1673,6 @@ void Editor::SetScrollBarsTo(PRectangle) {
 	//Platform::DebugPrintf("end max = %d page = %d\n", nMax, nPage);
 }
 
-
 void Editor::SetScrollBars() {
 	PRectangle rsClient = GetClientRectangle();
 	SetScrollBarsTo(rsClient);
@@ -1512,7 +1701,38 @@ void Editor::AddCharUTF(char *s, unsigned int len) {
 	// Avoid blinking during rapid typing:
 	ShowCaretAtCurrentPosition();
 	SetLastXChosen();
-	NotifyChar(s[0]);
+
+	int byte = static_cast<unsigned char>(s[0]);
+	if ((byte < 0xC0) || (1 == len)) {
+		// Handles UTF-8 characters between 0x01 and 0x7F and single byte 
+		// characters when not in UTF-8 mode. 
+		// Also treats \0 and naked trail bytes 0x80 to 0xBF as valid
+		// characters representing themselves.
+	} else {
+		// Unroll 1 to 3 byte UTF-8 sequences.  See reference data at:
+		// http://www.cl.cam.ac.uk/~mgk25/unicode.html
+		// http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
+		if (byte < 0xE0) {
+			int byte2 = static_cast<unsigned char>(s[1]);
+			if ((byte2 & 0xC0) == 0x80) {
+				// Two-byte-character lead-byte followed by a trail-byte.
+				byte = (((byte & 0x1F) << 6) | (byte2 & 0x3F));
+			}
+			// A two-byte-character lead-byte not followed by trail-byte
+			// represents itself.
+		} else if (byte < 0xF0) {
+			int byte2 = static_cast<unsigned char>(s[1]);
+			int byte3 = static_cast<unsigned char>(s[2]);
+			if (((byte2 & 0xC0) == 0x80) && ((byte3 & 0xC0) == 0x80)) {
+				// Three-byte-character lead byte followed by two trail bytes.
+				byte = (((byte & 0x0F) << 12) | ((byte2 & 0x3F) << 6) |
+					(byte3 & 0x3F));
+			}
+			// A three-byte-character lead-byte not followed by two trail-bytes
+			// represents itself.
+		}
+	}
+	NotifyChar(byte);
 }
 
 void Editor::ClearSelection() {
@@ -1529,23 +1749,27 @@ void Editor::ClearSelection() {
 			}
 		}
 		SetEmptySelection(startPos);
-		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();
 		}
 	}
 }
 
 void Editor::ClearAll() {
+	pdoc->BeginUndoAction();
 	if (0 != pdoc->Length()) {
 		pdoc->DeleteChars(0, pdoc->Length());
 	}
 	cs.Clear();
+	pdoc->EndUndoAction();
 	anchor = 0;
 	currentPos = 0;
 	SetTopLine(0);
@@ -1560,16 +1784,22 @@ void Editor::ClearDocumentStyle() {
 }
 
 void Editor::Cut() {
-	Copy();
-	ClearSelection();
+	if (!pdoc->IsReadOnly()) {
+		Copy();
+		ClearSelection();
+	}
 }
 
 void Editor::PasteRectangular(int pos, const char *ptr, int len) {
+	if (pdoc->IsReadOnly()) {
+		return;
+	}
 	currentPos = pos;
 	int insertPos = currentPos;
 	int xInsert = XFromPosition(currentPos);
 	int line = pdoc->LineFromPosition(currentPos);
 	bool prevCr = false;
+	pdoc->BeginUndoAction();
 	for (int i = 0; i < len; i++) {
 		if ((ptr[i] == '\r') || (ptr[i] == '\n')) {
 			if ((ptr[i] == '\r') || (!prevCr))
@@ -1580,7 +1810,15 @@ void Editor::PasteRectangular(int pos, const char *ptr, int len) {
 				if (pdoc->eolMode != SC_EOL_CR)
 					pdoc->InsertChar(pdoc->Length(), '\n');
 			}
+			// Pad the end of lines with spaces if required
 			currentPos = PositionFromLineX(line, xInsert);
+			if ((XFromPosition(currentPos) < xInsert) && (i + 1 < len)) {
+				for (int i = 0; i < xInsert - XFromPosition(currentPos); i++) {
+					pdoc->InsertChar(currentPos, ' ');
+					currentPos++;
+				}
+				insertPos = currentPos;
+			}
 			prevCr = ptr[i] == '\r';
 		} else {
 			pdoc->InsertString(currentPos, ptr + i, 1);
@@ -1589,9 +1827,14 @@ void Editor::PasteRectangular(int pos, const char *ptr, int len) {
 			prevCr = false;
 		}
 	}
+	pdoc->EndUndoAction();
 	SetEmptySelection(insertPos);
 }
 
+bool Editor::CanPaste() {
+	return !pdoc->IsReadOnly();
+}
+
 void Editor::Clear() {
 	if (currentPos == anchor) {
 		DelChar();
@@ -1608,7 +1851,7 @@ void Editor::SelectAll() {
 
 void Editor::Undo() {
 	if (pdoc->CanUndo()) {
-        InvalidateCaret();
+		InvalidateCaret();
 		int newPos = pdoc->Undo();
 		SetEmptySelection(newPos);
 		EnsureCaretVisible();
@@ -1631,8 +1874,23 @@ void Editor::DelChar() {
 
 void Editor::DelCharBack() {
 	if (currentPos == anchor) {
-		int newPos = pdoc->DelCharBack(currentPos);
-		SetEmptySelection(newPos);
+		int lineCurrentPos = pdoc->LineFromPosition(currentPos);
+		if (pdoc->GetColumn(currentPos) <= pdoc->GetLineIndentation(lineCurrentPos) &&
+			pdoc->GetColumn(currentPos) > 0 && pdoc->backspaceUnindents) {
+			pdoc->BeginUndoAction();
+			int indentation = pdoc->GetLineIndentation(lineCurrentPos);
+			int indentationStep = (pdoc->indentInChars ? pdoc->indentInChars : pdoc->tabInChars);
+			if (indentation % indentationStep == 0) {
+				pdoc->SetLineIndentation(lineCurrentPos, indentation - indentationStep);
+			} else {
+				pdoc->SetLineIndentation(lineCurrentPos, indentation - (indentation % indentationStep));
+			}
+			SetEmptySelection(pdoc->GetLineIndentPosition(lineCurrentPos));
+			pdoc->EndUndoAction();
+		} else {
+			int newPos = pdoc->DelCharBack(currentPos);
+			SetEmptySelection(newPos);
+		}
 	} else {
 		ClearSelection();
 		SetEmptySelection(currentPos);
@@ -1643,7 +1901,6 @@ void Editor::DelCharBack() {
 
 void Editor::NotifyFocus(bool) {}
 
-
 void Editor::NotifyStyleToNeeded(int endStyleNeeded) {
 	SCNotification scn;
 	scn.nmhdr.code = SCN_STYLENEEDED;
@@ -1655,7 +1912,7 @@ void Editor::NotifyStyleNeeded(Document*, void *, int endStyleNeeded) {
 	NotifyStyleToNeeded(endStyleNeeded);
 }
 
-void Editor::NotifyChar(char ch) {
+void Editor::NotifyChar(int ch) {
 	SCNotification scn;
 	scn.nmhdr.code = SCN_CHARADDED;
 	scn.ch = ch;
@@ -1663,11 +1920,11 @@ void Editor::NotifyChar(char ch) {
 #ifdef MACRO_SUPPORT
 	if (recordingMacro) {
 		char txt[2];
-		txt[0] = ch;
+		txt[0] = static_cast<char>(ch);
 		txt[1] = '\0';
 		NotifyMacroRecord(SCI_REPLACESEL, 0, reinterpret_cast<long>(txt));
 	}
-#endif
+#endif 
 }
 
 void Editor::NotifySavePoint(bool isSavePoint) {
@@ -1698,6 +1955,12 @@ void Editor::NotifyUpdateUI() {
 	NotifyParent(scn);
 }
 
+void Editor::NotifyPainted() {
+	SCNotification scn;
+	scn.nmhdr.code = SCN_PAINTED;
+	NotifyParent(scn);
+}
+
 bool Editor::NotifyMarginClick(Point pt, bool shift, bool ctrl, bool alt) {
 	int marginClicked = -1;
 	int x = 0;
@@ -1728,6 +1991,15 @@ void Editor::NotifyNeedShown(int pos, int len) {
 	NotifyParent(scn);
 }
 
+void Editor::NotifyDwelling(Point pt, bool state) {
+	SCNotification scn;
+	scn.nmhdr.code = state ? SCN_DWELLSTART : SCN_DWELLEND;
+	scn.position = PositionFromLocationClose(pt);
+	scn.x = pt.x;
+	scn.y = pt.y;
+	NotifyParent(scn);
+}
+
 // Notifications from document
 void Editor::NotifyModifyAttempt(Document*, void *) {
 	//Platform::DebugPrintf("** Modify Attempt\n");
@@ -1808,13 +2080,12 @@ void Editor::NotifyModified(Document*, DocModification mh, void *) {
 				// Some lines are hidden so may need shown.
 				// TODO: check if the modified area is hidden.
 				if (mh.modificationType & SC_MOD_BEFOREINSERT) {
-					NotifyNeedShown(mh.position, 0);
+					NotifyNeedShown(mh.position, mh.length);
 				} else if (mh.modificationType & SC_MOD_BEFOREDELETE) {
 					NotifyNeedShown(mh.position, mh.length);
 				}
 			}
 			if (mh.linesAdded != 0) {
-
 				// Update contraction state for inserted and removed lines
 				// lineOfPos should be calculated in context of state before modification, shouldn't it
 				int lineOfPos = pdoc->LineFromPosition(mh.position);
@@ -1859,6 +2130,8 @@ void Editor::NotifyModified(Document*, DocModification mh, void *) {
 			NotifyChange();	// Send EN_CHANGE
 		}
 
+
+
 		SCNotification scn;
 		scn.nmhdr.code = SCN_MODIFIED;
 		scn.position = mh.position;
@@ -1886,6 +2159,10 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long
 	case SCI_COPY:
 	case SCI_PASTE:
 	case SCI_CLEAR:
+	case WM_CUT:
+	case WM_COPY:
+	case WM_PASTE:
+	case WM_CLEAR:
 	case SCI_REPLACESEL:
 	case SCI_ADDTEXT:
 	case SCI_INSERTTEXT:
@@ -1908,6 +2185,10 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long
 	case SCI_WORDLEFTEXTEND:
 	case SCI_WORDRIGHT:
 	case SCI_WORDRIGHTEXTEND:
+	case SCI_WORDPARTLEFT:
+	case SCI_WORDPARTLEFTEXTEND:
+	case SCI_WORDPARTRIGHT:
+	case SCI_WORDPARTRIGHTEXTEND:
 	case SCI_HOME:
 	case SCI_HOMEEXTEND:
 	case SCI_LINEEND:
@@ -1925,12 +2206,13 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long
 	case SCI_DELETEBACK:
 	case SCI_TAB:
 	case SCI_BACKTAB:
-	case SCI_NEWLINE:
 	case SCI_FORMFEED:
 	case SCI_VCHOME:
 	case SCI_VCHOMEEXTEND:
 	case SCI_DELWORDLEFT:
 	case SCI_DELWORDRIGHT:
+	case SCI_DELLINELEFT:
+	case SCI_DELLINERIGHT:
 	case SCI_LINECUT:
 	case SCI_LINEDELETE:
 	case SCI_LINETRANSPOSE:
@@ -1938,11 +2220,12 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long
 	case SCI_UPPERCASE:
 		break;
 
-		// Filter out all others (display changes, etc)
+		// 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);
-
-		return ;
+		return;
 	}
 
 	// Send notification
@@ -1953,7 +2236,7 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long
 	scn.lParam = lParam;
 	NotifyParent(scn);
 }
-#endif
+#endif 
 
 // Force scroll and keep position relative to top of window
 void Editor::PageMove(int direction, bool extend) {
@@ -1995,7 +2278,6 @@ void Editor::ChangeCaseOfSelection(bool makeUpperCase) {
 	pdoc->EndUndoAction();
 }
 
-
 void Editor::LineTranspose() {
 	int line = pdoc->LineFromPosition(currentPos);
 	if (line > 0) {
@@ -2028,7 +2310,6 @@ void Editor::LineTranspose() {
 
 void Editor::CancelModes() {}
 
-
 int Editor::KeyCommand(unsigned int iMessage) {
 	Point pt = LocationFromPosition(currentPos);
 
@@ -2147,7 +2428,7 @@ int Editor::KeyCommand(unsigned int iMessage) {
 		ShowCaretAtCurrentPosition();
 		NotifyUpdateUI();
 		break;
-	case SCI_CANCEL:   	// Cancel any modes - handled in subclass
+	case SCI_CANCEL:          	// Cancel any modes - handled in subclass
 		// Also unselect text
 		CancelModes();
 		break;
@@ -2219,6 +2500,21 @@ int Editor::KeyCommand(unsigned int iMessage) {
 			MovePositionTo(currentPos);
 		}
 		break;
+	case SCI_DELLINELEFT: {
+			int line = pdoc->LineFromPosition(currentPos);
+			int start = pdoc->LineStart(line);
+			pdoc->DeleteChars(start, currentPos - start);
+			MovePositionTo(start);
+			SetLastXChosen();
+		}
+		break;
+	case SCI_DELLINERIGHT: {
+			int line = pdoc->LineFromPosition(currentPos);
+			int end = pdoc->LineEnd(line);
+			pdoc->DeleteChars(currentPos, end - currentPos);
+			MovePositionTo(currentPos);
+		}
+		break;
 	case SCI_LINECUT: {
 			int lineStart = pdoc->LineFromPosition(currentPos);
 			int lineEnd = pdoc->LineFromPosition(anchor);
@@ -2250,6 +2546,22 @@ int Editor::KeyCommand(unsigned int iMessage) {
 	case SCI_UPPERCASE:
 		ChangeCaseOfSelection(true);
 		break;
+	case SCI_WORDPARTLEFT:
+		MovePositionTo(MovePositionSoVisible(pdoc->WordPartLeft(currentPos), -1));
+		SetLastXChosen();
+		break;
+	case SCI_WORDPARTLEFTEXTEND:
+		MovePositionTo(MovePositionSoVisible(pdoc->WordPartLeft(currentPos), -1), true);
+		SetLastXChosen();
+		break;
+	case SCI_WORDPARTRIGHT:
+		MovePositionTo(MovePositionSoVisible(pdoc->WordPartRight(currentPos), 1));
+		SetLastXChosen();
+		break;
+	case SCI_WORDPARTRIGHTEXTEND:
+		MovePositionTo(MovePositionSoVisible(pdoc->WordPartRight(currentPos), 1), true);
+		SetLastXChosen();
+		break;
 	}
 	return 0;
 }
@@ -2258,14 +2570,20 @@ int Editor::KeyDefault(int, int) {
 	return 0;
 }
 
-int Editor::KeyDown(int key, bool shift, bool ctrl, bool alt) {
+int Editor::KeyDown(int key, bool shift, bool ctrl, bool alt, bool *consumed) {
+	DwellEnd(false);
 	int modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) |
 	                (alt ? SCI_ALT : 0);
 	int msg = kmap.Find(key, modifiers);
-	if (msg)
+	if (msg) {
+		if (consumed)
+			*consumed = true;
 		return WndProc(msg, 0, 0);
-	else
+	} else {
+		if (consumed)
+			*consumed = false;
 		return KeyDefault(key, modifiers);
+	}
 }
 
 void Editor::SetWhitespaceVisible(int view) {
@@ -2281,15 +2599,50 @@ void Editor::Indent(bool forwards) {
 	int lineOfAnchor = pdoc->LineFromPosition(anchor);
 	int lineCurrentPos = pdoc->LineFromPosition(currentPos);
 	if (lineOfAnchor == lineCurrentPos) {
-		ClearSelection();
-		if (pdoc->useTabs) {
-			pdoc->InsertChar(currentPos, '\t');
-			SetEmptySelection(currentPos + 1);
+		if (forwards) {
+			ClearSelection();
+			if (pdoc->GetColumn(currentPos) <= pdoc->GetColumn(pdoc->GetLineIndentPosition(lineCurrentPos)) &&
+			        pdoc->tabIndents) {
+				pdoc->BeginUndoAction();
+				int indentation = pdoc->GetLineIndentation(lineCurrentPos);
+				int indentationStep = (pdoc->indentInChars ? pdoc->indentInChars : pdoc->tabInChars);
+				pdoc->SetLineIndentation(lineCurrentPos, indentation + indentationStep);
+				SetEmptySelection(pdoc->GetLineIndentPosition(lineCurrentPos));
+				pdoc->EndUndoAction();
+			} else {
+				if (pdoc->useTabs) {
+					pdoc->InsertChar(currentPos, '\t');
+					SetEmptySelection(currentPos + 1);
+				} else {
+					int numSpaces = (pdoc->tabInChars) -
+					                (pdoc->GetColumn(currentPos) % (pdoc->tabInChars));
+					if (numSpaces < 1)
+						numSpaces = pdoc->tabInChars;
+					for (int i = 0; i < numSpaces; i++) {
+						pdoc->InsertChar(currentPos, ' ');
+					}
+					SetEmptySelection(currentPos + numSpaces);
+				}
+			}
 		} else {
-			for (int i = 0; i < pdoc->tabInChars; i++) {
-				pdoc->InsertChar(currentPos, ' ');
+			if (pdoc->GetColumn(currentPos) <= pdoc->GetLineIndentation(lineCurrentPos) &&
+			        pdoc->tabIndents) {
+				pdoc->BeginUndoAction();
+				int indentation = pdoc->GetLineIndentation(lineCurrentPos);
+				int indentationStep = (pdoc->indentInChars ? pdoc->indentInChars : pdoc->tabInChars);
+				pdoc->SetLineIndentation(lineCurrentPos, indentation - indentationStep);
+				SetEmptySelection(pdoc->GetLineIndentPosition(lineCurrentPos));
+				pdoc->EndUndoAction();
+			} else {
+				int newColumn = ((pdoc->GetColumn(currentPos) - 1) / pdoc->tabInChars) *
+				                pdoc->tabInChars;
+				if (newColumn < 0)
+					newColumn = 0;
+				int newPos = currentPos;
+				while (pdoc->GetColumn(newPos) > newColumn)
+					newPos--;
+				SetEmptySelection(newPos);
 			}
-			SetEmptySelection(currentPos + pdoc->tabInChars);
 		}
 	} else {
 		int anchorPosOnLine = anchor - pdoc->LineStart(lineOfAnchor);
@@ -2316,59 +2669,104 @@ void Editor::Indent(bool forwards) {
 	}
 }
 
-long Editor::FindText(unsigned int iMessage, unsigned long wParam, long lParam) {
+/**
+ * Search of a text in the document, in the given range.
+ * @return The position of the found text, -1 if not found.
+ */
+long Editor::FindText(
+    unsigned int iMessage,    	///< Can be @c EM_FINDTEXT or @c EM_FINDTEXTEX or @c SCI_FINDTEXT.
+    unsigned long wParam,    	///< Search modes : @c SCFIND_MATCHCASE, @c SCFIND_WHOLEWORD,
+    ///< @c SCFIND_WORDSTART or @c SCFIND_REGEXP.
+    long lParam) {			///< @c TextToFind structure: The text to search for in the given range.
+
 	TextToFind *ft = reinterpret_cast<TextToFind *>(lParam);
+	int lengthFound = strlen(ft->lpstrText);
 	int pos = pdoc->FindText(ft->chrg.cpMin, ft->chrg.cpMax, ft->lpstrText,
-	                        wParam & SCFIND_MATCHCASE, wParam & SCFIND_WHOLEWORD,
-				wParam & SCFIND_WORDSTART);
+	                         wParam & SCFIND_MATCHCASE,
+	                         wParam & SCFIND_WHOLEWORD,
+	                         wParam & SCFIND_WORDSTART,
+	                         wParam & SCFIND_REGEXP,
+	                         &lengthFound);
 	if (pos != -1) {
 		if (iMessage != EM_FINDTEXT) {
 			ft->chrgText.cpMin = pos;
-			ft->chrgText.cpMax = pos + strlen(ft->lpstrText);
+			ft->chrgText.cpMax = pos + lengthFound;
 		}
 	}
 	return pos;
 }
 
-// Relocatable search support : Searches relative to current selection
-// point and sets the selection to the found text range with
-// each search.
-
-// Anchor following searches at current selection start:  This allows
-// multiple incremental interactive searches to be macro recorded
-// while still setting the selection to found text so the find/select
-// operation is self-contained.
+/**
+ * Relocatable search support : Searches relative to current selection
+ * point and sets the selection to the found text range with
+ * each search.
+ */
+/**
+ * Anchor following searches at current selection start: This allows
+ * multiple incremental interactive searches to be macro recorded
+ * while still setting the selection to found text so the find/select
+ * operation is self-contained.
+ */
 void Editor::SearchAnchor() {
 	searchAnchor = SelectionStart();
 }
 
-// Find text from current search anchor:  Must call SearchAnchor first.
-// Accepts both SCI_SEARCHNEXT and SCI_SEARCHPREV.
-// wParam contains search modes : ORed FR_MATCHCASE and FR_WHOLEWORD.
-// lParam contains the text to search for.
-long Editor::SearchText(unsigned int iMessage, unsigned long wParam, long lParam) {
+/**
+ * Find text from current search anchor: Must call @c SearchAnchor first.
+ * Used for next text and previous text requests.
+ * @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.
+    unsigned long wParam,    	///< Search modes : @c SCFIND_MATCHCASE, @c SCFIND_WHOLEWORD,
+    ///< @c SCFIND_WORDSTART or @c SCFIND_REGEXP.
+    long lParam) {			///< The text to search for.
+
 	const char *txt = reinterpret_cast<char *>(lParam);
 	int pos;
-
+	int lengthFound = strlen(txt);
 	if (iMessage == SCI_SEARCHNEXT) {
 		pos = pdoc->FindText(searchAnchor, pdoc->Length(), txt,
-			wParam & SCFIND_MATCHCASE,
-			wParam & SCFIND_WHOLEWORD,
-			wParam & SCFIND_WORDSTART);
+		                     wParam & SCFIND_MATCHCASE,
+		                     wParam & SCFIND_WHOLEWORD,
+		                     wParam & SCFIND_WORDSTART,
+		                     wParam & SCFIND_REGEXP,
+		                     &lengthFound);
 	} else {
 		pos = pdoc->FindText(searchAnchor, 0, txt,
-			wParam & SCFIND_MATCHCASE,
-			wParam & SCFIND_WHOLEWORD,
-			wParam & SCFIND_WORDSTART);
+		                     wParam & SCFIND_MATCHCASE,
+		                     wParam & SCFIND_WHOLEWORD,
+		                     wParam & SCFIND_WORDSTART,
+		                     wParam & SCFIND_REGEXP,
+		                     &lengthFound);
 	}
 
 	if (pos != -1) {
-		SetSelection(pos, pos + strlen(txt));
+		SetSelection(pos, pos + lengthFound);
 	}
 
 	return pos;
 }
 
+/**
+ * Search for text in the target range of the document.
+ * @return The position of the found text, -1 if not found.
+ */
+long Editor::SearchInTarget(const char *text, int length) {
+	int lengthFound = length;
+	int pos = pdoc->FindText(targetStart, targetEnd, text,
+	                         searchFlags & SCFIND_MATCHCASE,
+	                         searchFlags & SCFIND_WHOLEWORD,
+	                         searchFlags & SCFIND_WORDSTART,
+	                         searchFlags & SCFIND_REGEXP,
+	                         &lengthFound);
+	if (pos != -1) {
+		targetStart = pos;
+		targetEnd = pos + lengthFound;
+	}
+	return pos;
+}
+
 void Editor::GoToLine(int lineNo) {
 	if (lineNo > pdoc->LinesTotal())
 		lineNo = pdoc->LinesTotal();
@@ -2471,13 +2869,21 @@ void Editor::SetDragPosition(int newPos) {
 	}
 }
 
+void Editor::DisplayCursor(Window::Cursor c) {
+	if (cursorMode == SC_CURSORNORMAL)
+		wMain.SetCursor(c);
+	else
+		wMain.SetCursor(static_cast<Window::Cursor>(cursorMode));
+}
+
 void Editor::StartDrag() {
 	// Always handled by subclasses
 	//SetMouseCapture(true);
-	//wDraw.SetCursor(Window::cursorArrow);
+	//DisplayCursor(Window::cursorArrow);
 }
 
 
+
 void Editor::DropAt(int position, const char *value, bool moving, bool rectangular) {
 	//Platform::DebugPrintf("DropAt %d\n", inDragDrop);
 	if (inDragDrop)
@@ -2598,6 +3004,30 @@ bool Editor::PointInSelMargin(Point pt) {
 	}
 }
 
+void Editor::LineSelection(int lineCurrent_, int lineAnchor_) {
+	if (lineAnchor_ < lineCurrent_) {
+		SetSelection(pdoc->LineStart(lineCurrent_ + 1),
+		             pdoc->LineStart(lineAnchor_));
+	} else if (lineAnchor_ > lineCurrent_) {
+		SetSelection(pdoc->LineStart(lineCurrent_),
+		             pdoc->LineStart(lineAnchor_ + 1));
+	} else { // Same line, select it
+		SetSelection(pdoc->LineStart(lineAnchor_ + 1),
+		             pdoc->LineStart(lineAnchor_));
+	}
+}
+
+void Editor::DwellEnd(bool mouseMoved) {
+	if (mouseMoved)
+		ticksToDwell = dwellDelay;
+	else
+		ticksToDwell = SC_TIME_FOREVER;
+	if (dwelling && (dwellDelay < SC_TIME_FOREVER)) {
+		dwelling = false;
+		NotifyDwelling(ptMouseLast, dwelling);
+	}
+}
+
 void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt) {
 	//Platform::DebugPrintf("Scintilla:ButtonDown %d %d = %d alt=%d\n", curTime, lastClickTime, curTime - lastClickTime, alt);
 	ptMouseLast = pt;
@@ -2607,9 +3037,10 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b
 
 	bool processed = NotifyMarginClick(pt, shift, ctrl, alt);
 	if (processed)
-		return ;
+		return;
 
-	if (shift) {
+	bool inSelMargin = PointInSelMargin(pt);
+	if (shift & !inSelMargin) {
 		SetSelection(newPos);
 	}
 	if (((curTime - lastClickTime) < Platform::DoubleClickTime()) && Close(pt, lastClick)) {
@@ -2650,21 +3081,30 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b
 		if (doubleClick)
 			NotifyDoubleClick(pt, shift);
 	} else {	// Single click
-		if (PointInSelMargin(pt)) {
+		if (inSelMargin) {
+			selType = selStream;
 			if (ctrl) {
 				SelectAll();
 				lastClickTime = curTime;
-				return ;
+				return;
 			}
-			lineAnchor = LineFromLocation(pt);
-			// While experimenting with folding turn off line selection
 			if (!shift) {
+				lineAnchor = LineFromLocation(pt);
 				// Single click in margin: select whole line
-				SetSelection(pdoc->LineStart(lineAnchor + 1), pdoc->LineStart(lineAnchor));
+				LineSelection(lineAnchor, lineAnchor);
+				SetSelection(pdoc->LineStart(lineAnchor + 1),
+				             pdoc->LineStart(lineAnchor));
 			} else {
-				// Single shift+click in margin: select from anchor to beginning of clicked line
-				SetSelection(pdoc->LineStart(lineAnchor), anchor);
+				// Single shift+click in margin: select from line anchor to clicked line
+				if (anchor > currentPos)
+					lineAnchor = pdoc->LineFromPosition(anchor - 1);
+				else
+					lineAnchor = pdoc->LineFromPosition(anchor);
+				int lineStart = LineFromLocation(pt);
+				LineSelection(lineStart, lineAnchor);
+				//lineAnchor = lineStart; // Keep the same anchor for ButtonMove
 			}
+
 			SetDragPosition(invalidPosition);
 			SetMouseCapture(true);
 			selectionType = selLine;
@@ -2678,13 +3118,13 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b
 				CopySelectionIntoDrag();
 				StartDrag();
 			} else {
-				selType = alt ? selRectangle : selStream;
 				xStartSelect = pt.x - vs.fixedColumnWidth + xOffset;
 				xEndSelect = pt.x - vs.fixedColumnWidth + xOffset;
 				SetDragPosition(invalidPosition);
 				SetMouseCapture(true);
 				if (!shift)
 					SetEmptySelection(newPos);
+				selType = alt ? selRectangle : selStream;
 				selectionType = selChar;
 				originalAnchorPos = currentPos;
 			}
@@ -2696,10 +3136,21 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b
 }
 
 void Editor::ButtonMove(Point pt) {
+	if ((ptMouseLast.x != pt.x) || (ptMouseLast.y != pt.y)) {
+		DwellEnd(true);
+	}
+	ptMouseLast = pt;
 	//Platform::DebugPrintf("Move %d %d\n", pt.x, pt.y);
 	if (HaveMouseCapture()) {
+
+		// Slow down autoscrolling/selection
+		autoScrollTimer.ticksToWait -= timer.tickSize;
+		if (autoScrollTimer.ticksToWait > 0)
+			return;
+		autoScrollTimer.ticksToWait = autoScrollDelay;
+
+		// Adjust selection
 		xEndSelect = pt.x - vs.fixedColumnWidth + xOffset;
-		ptMouseLast = pt;
 		int movePos = PositionFromLocation(pt);
 		movePos = MovePositionOutsideChar(movePos, currentPos - movePos);
 		if (posDrag >= 0) {
@@ -2719,29 +3170,35 @@ void Editor::ButtonMove(Point pt) {
 			} else {
 				// Continue selecting by line
 				int lineMove = LineFromLocation(pt);
-				if (lineAnchor < lineMove) {
-					SetSelection(pdoc->LineStart(lineMove + 1),
-					             pdoc->LineStart(lineAnchor));
-				} else {
-					SetSelection(pdoc->LineStart(lineMove),
-					             pdoc->LineStart(lineAnchor + 1));
-				}
+				LineSelection(lineMove, lineAnchor);
 			}
 		}
-		EnsureCaretVisible(false);
+
+		// Autoscroll
+		PRectangle rcClient = GetClientRectangle();
+		if (pt.y > rcClient.bottom) {
+			int lineMove = cs.DisplayFromDoc(LineFromLocation(pt));
+			ScrollTo(lineMove - LinesOnScreen() + 5);
+			Redraw();
+		} else if (pt.y < rcClient.top) {
+			int lineMove = cs.DisplayFromDoc(LineFromLocation(pt));
+			ScrollTo(lineMove - 5);
+			Redraw();
+		}
+		EnsureCaretVisible(false, false, true);
+
 	} else {
 		if (vs.fixedColumnWidth > 0) {	// There is a margin
 			if (PointInSelMargin(pt)) {
-				wDraw.SetCursor(Window::cursorReverseArrow);
-				return ; 	// No need to test for selection
+				DisplayCursor(Window::cursorReverseArrow);
+				return; 	// No need to test for selection
 			}
-
 		}
 		// Display regular (drag) cursor over selection
 		if (PointInSelection(pt))
-			wDraw.SetCursor(Window::cursorArrow);
+			DisplayCursor(Window::cursorArrow);
 		else
-			wDraw.SetCursor(Window::cursorText);
+			DisplayCursor(Window::cursorText);
 	}
 
 }
@@ -2750,9 +3207,9 @@ void Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) {
 	//Platform::DebugPrintf("ButtonUp %d\n", HaveMouseCapture());
 	if (HaveMouseCapture()) {
 		if (PointInSelMargin(pt)) {
-			wDraw.SetCursor(Window::cursorReverseArrow);
+			DisplayCursor(Window::cursorReverseArrow);
 		} else {
-			wDraw.SetCursor(Window::cursorText);
+			DisplayCursor(Window::cursorText);
 		}
 		xEndSelect = pt.x - vs.fixedColumnWidth + xOffset;
 		ptMouseLast = pt;
@@ -2813,6 +3270,26 @@ void Editor::Tick() {
 			InvalidateCaret();
 		}
 	}
+	if ((dwellDelay < SC_TIME_FOREVER) && 
+		(ticksToDwell > 0) &&
+		(!HaveMouseCapture())) {
+		ticksToDwell -= timer.tickSize;
+		if (ticksToDwell <= 0) {
+			dwelling = true;
+			NotifyDwelling(ptMouseLast, dwelling);
+		}
+	}
+}
+
+void Editor::SetFocusState(bool focusState) {
+	hasFocus = focusState;
+	NotifyFocus(hasFocus);
+	if (hasFocus) {
+		ShowCaretAtCurrentPosition();
+		InvalidateCaret();
+	} else {
+		DropCaret();
+	}
 }
 
 static bool IsIn(int a, int minimum, int maximum) {
@@ -2831,7 +3308,7 @@ void Editor::CheckForChangeOutsidePaint(Range r) {
 	if (paintState == painting && !paintingAllText) {
 		//Platform::DebugPrintf("Checking range in paint %d-%d\n", r.start, r.end);
 		if (!r.Valid())
-			return ;
+			return;
 
 		PRectangle rcText = GetTextRectangle();
 		// Determine number of lines displayed including a possible partially displayed last line
@@ -2843,7 +3320,7 @@ void Editor::CheckForChangeOutsidePaint(Range r) {
 		if (!IsOverlap(topLine, bottomLine, lineRangeStart, lineRangeEnd)) {
 			//Platform::DebugPrintf("No overlap (%d-%d) with window(%d-%d)\n",
 			//		lineRangeStart, lineRangeEnd, topLine, bottomLine);
-			return ;
+			return;
 		}
 
 		// Assert rcPaint contained within or equal to rcText
@@ -2855,7 +3332,7 @@ void Editor::CheckForChangeOutsidePaint(Range r) {
 				//Platform::DebugPrintf("Change (%d-%d) in top npv(%d-%d)\n",
 				//	lineRangeStart, lineRangeEnd, topLine, paintTopLine);
 				paintState = paintAbandoned;
-				return ;
+				return;
 			}
 		}
 		if (rcPaint.bottom < rcText.bottom) {
@@ -2866,7 +3343,7 @@ void Editor::CheckForChangeOutsidePaint(Range r) {
 				//Platform::DebugPrintf("Change (%d-%d) in bottom npv(%d-%d)\n",
 				//	lineRangeStart, lineRangeEnd, paintBottomLine, bottomLine);
 				paintState = paintAbandoned;
-				return ;
+				return;
 			}
 		}
 	}
@@ -3005,12 +3482,12 @@ 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.
-void Editor::EnsureLineVisible(int line) {
-	if (!cs.GetVisible(line)) {
-		int lineParent = pdoc->GetFoldParent(line);
+void Editor::EnsureLineVisible(int lineDoc, bool enforcePolicy) {
+	if (!cs.GetVisible(lineDoc)) {
+		int lineParent = pdoc->GetFoldParent(lineDoc);
 		if (lineParent >= 0) {
-			if (line != lineParent)
-				EnsureLineVisible(lineParent);
+			if (lineDoc != lineParent)
+				EnsureLineVisible(lineParent, enforcePolicy);
 			if (!cs.GetExpanded(lineParent)) {
 				cs.SetExpanded(lineParent, 1);
 				Expand(lineParent, true);
@@ -3019,21 +3496,59 @@ void Editor::EnsureLineVisible(int line) {
 		SetScrollBars();
 		Redraw();
 	}
+	if (enforcePolicy) {
+		int lineDisplay = cs.DisplayFromDoc(lineDoc);
+		if (visiblePolicy & VISIBLE_SLOP) {
+			if ((topLine > lineDisplay) || ((visiblePolicy & VISIBLE_STRICT) && (topLine + visibleSlop > lineDisplay))) {
+				SetTopLine(Platform::Clamp(lineDisplay - visibleSlop, 0, MaxScrollPos()));
+				SetVerticalScrollPos();
+				Redraw();
+			} else if ((lineDisplay > topLine + LinesOnScreen() - 1) ||
+					   ((visiblePolicy & VISIBLE_STRICT) && (lineDisplay > topLine + LinesOnScreen() - 1 - visibleSlop))) {
+				SetTopLine(Platform::Clamp(lineDisplay - LinesOnScreen() + 1 + visibleSlop, 0, MaxScrollPos()));
+				SetVerticalScrollPos();
+				Redraw();
+			}
+		} else {
+			if ((topLine > lineDisplay) || (lineDisplay > topLine + LinesOnScreen() - 1) || (visiblePolicy & VISIBLE_STRICT)) {
+				SetTopLine(Platform::Clamp(lineDisplay - LinesOnScreen() / 2 + 1, 0, MaxScrollPos()));
+				SetVerticalScrollPos();
+				Redraw();
+			}
+		}
+	}
+}
+
+int Editor::ReplaceTarget(bool replacePatterns, const char *text, int length) {
+	pdoc->BeginUndoAction();
+	if (length == -1)
+		length = strlen(text);
+	if (replacePatterns) {
+		text = pdoc->SubstituteByPosition(text, &length);
+		if (!text)
+			return 0;
+	}
+	if (targetStart != targetEnd)
+		pdoc->DeleteChars(targetStart, targetEnd - targetStart);
+	targetEnd = targetStart;
+	pdoc->InsertString(targetStart, text, length);
+	targetEnd = targetStart + length;
+	pdoc->EndUndoAction();
+	return length;
 }
 
 static bool ValidMargin(unsigned long wParam) {
 	return wParam < ViewStyle::margins;
 }
 
-
-long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
+sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
 	//Platform::DebugPrintf("S start wnd proc %d %d %d\n",iMessage, wParam, lParam);
 
 	// Optional macro recording hook
 #ifdef MACRO_SUPPORT
 	if (recordingMacro)
 		NotifyMacroRecord(iMessage, wParam, lParam);
-#endif
+#endif 
 
 	switch (iMessage) {
 
@@ -3095,7 +3610,7 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 		SetLastXChosen();
 		break;
 
-		// Edit control mesages
+		// Edit control messages
 
 		// Not supported (no-ops):
 		//		EM_GETWORDBREAKPROC
@@ -3164,31 +3679,37 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 		return topLine;
 
 	case EM_GETLINE: {
-			if (lParam == 0)
+			if (lParam == 0) {
 				return 0;
-			int lineStart = pdoc->LineStart(wParam);
-			int lineEnd = pdoc->LineStart(wParam + 1);
+			}
 			char *ptr = reinterpret_cast<char *>(lParam);
 			short *pBufSize = reinterpret_cast<short *>(lParam);
-			if (*pBufSize < lineEnd - lineStart) {
-				ptr[0] = '\0'; 	// If no characters copied have to put a NUL into buffer
+			short bufSize = *pBufSize;
+			ptr[0] = '\0'; 	// If no characters copied, have to put a NUL into buffer
+			if (static_cast<int>(wParam) > pdoc->LinesTotal()) {
 				return 0;
 			}
+			int lineStart = pdoc->LineStart(wParam);
+			int lineEnd = pdoc->LineStart(wParam + 1);
+			// The first word of the buffer is the size, in TCHARs, of the buffer
 			int iPlace = 0;
-			for (int iChar = lineStart; iChar < lineEnd; iChar++)
+			for (int iChar = lineStart; iChar < lineEnd && iPlace < bufSize; iChar++) {
 				ptr[iPlace++] = pdoc->CharAt(iChar);
+			}
 			return iPlace;
 		}
 
-	case SCI_GETLINE: {
-			if (lParam == 0)
+	case SCI_GETLINE: {	// Simpler than EM_GETLINE, but with risk of overwriting the end of the buffer
+			if (lParam == 0) {
 				return 0;
+			}
 			int lineStart = pdoc->LineStart(wParam);
 			int lineEnd = pdoc->LineStart(wParam + 1);
 			char *ptr = reinterpret_cast<char *>(lParam);
 			int iPlace = 0;
-			for (int iChar = lineStart; iChar < lineEnd; iChar++)
+			for (int iChar = lineStart; iChar < lineEnd; iChar++) {
 				ptr[iPlace++] = pdoc->CharAt(iChar);
+			}
 			return iPlace;
 		}
 
@@ -3268,6 +3789,8 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 					ptr[iChar] = text[iChar];
 				ptr[iChar] = '\0';
 				delete []text;
+			} else {
+				ptr[0] = '\0';
 			}
 			return iChar;
 		}
@@ -3294,7 +3817,7 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 		if (wParam == 0)
 			return 0; 	// Even if there is no text, there is a first line that starts at 0
 		if (static_cast<int>(wParam) > pdoc->LinesTotal())
-			return - 1;
+			return -1;
 		//if (wParam > pdoc->LineFromPosition(pdoc->Length()))	// Useful test, anyway...
 		//	return -1;
 		return pdoc->LineStart(wParam);
@@ -3334,6 +3857,39 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 		}
 		break;
 
+	case SCI_SETTARGETSTART:
+		targetStart = wParam;
+		break;
+
+	case SCI_GETTARGETSTART:
+		return targetStart;
+
+	case SCI_SETTARGETEND:
+		targetEnd = wParam;
+		break;
+
+	case SCI_GETTARGETEND:
+		return targetEnd;
+
+	case SCI_REPLACETARGET:
+		PLATFORM_ASSERT(lParam);
+		return ReplaceTarget(false, reinterpret_cast<char *>(lParam), wParam);
+
+	case SCI_REPLACETARGETRE:
+		PLATFORM_ASSERT(lParam);
+		return ReplaceTarget(true, reinterpret_cast<char *>(lParam), wParam);
+
+	case SCI_SEARCHINTARGET:
+		PLATFORM_ASSERT(lParam);
+		return SearchInTarget(reinterpret_cast<char *>(lParam), wParam);
+
+	case SCI_SETSEARCHFLAGS:
+		searchFlags = wParam;
+		break;
+
+	case SCI_GETSEARCHFLAGS:
+		return searchFlags;
+
 	case EM_LINESCROLL:
 	case SCI_LINESCROLL:
 		ScrollTo(topLine + lParam);
@@ -3355,7 +3911,7 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 
 	case EM_CANPASTE:
 	case SCI_CANPASTE:
-		return 1;
+		return CanPaste();
 
 	case EM_CHARFROMPOS: {
 			if (lParam == 0)
@@ -3419,15 +3975,16 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 		}
 
 
+
 	case EM_SELECTIONTYPE:
 #ifdef SEL_EMPTY
 		if (currentPos == anchor)
 			return SEL_EMPTY;
 		else
 			return SEL_TEXT;
-#else
+#else 
 		return 0;
-#endif
+#endif 
 
 	case EM_HIDESELECTION:
 		hideSelection = wParam;
@@ -3461,7 +4018,7 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 			vs.rightMarginWidth = vs.aveCharWidth / 2;
 		}
 		InvalidateStyleRedraw();
-#endif
+#endif 
 		break;
 
 	case SCI_SETMARGINLEFT:
@@ -3611,7 +4168,6 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 
 	case SCI_SETSAVEPOINT:
 		pdoc->SetSavePoint();
-		NotifySavePoint(true);
 		break;
 
 	case SCI_GETSTYLEDTEXT: {
@@ -3649,6 +4205,9 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 	case SCI_POSITIONFROMPOINT:
 		return PositionFromLocation(Point(wParam, lParam));
 
+	case SCI_POSITIONFROMPOINTCLOSE:
+		return PositionFromLocationClose(Point(wParam, lParam));
+
 	case SCI_GOTOLINE:
 		GoToLine(wParam);
 		break;
@@ -3660,15 +4219,17 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 		break;
 
 	case SCI_GETCURLINE: {
-			if (lParam == 0)
+			if (lParam == 0) {
 				return 0;
+			}
 			int lineCurrentPos = pdoc->LineFromPosition(currentPos);
 			int lineStart = pdoc->LineStart(lineCurrentPos);
 			unsigned int lineEnd = pdoc->LineStart(lineCurrentPos + 1);
 			char *ptr = reinterpret_cast<char *>(lParam);
 			unsigned int iPlace = 0;
-			for (unsigned int iChar = lineStart; iChar < lineEnd && iPlace < wParam; iChar++)
+			for (unsigned int iChar = lineStart; iChar < lineEnd && iPlace < wParam - 1; iChar++) {
 				ptr[iPlace++] = pdoc->CharAt(iChar);
+			}
 			ptr[iPlace] = '\0';
 			return currentPos - lineStart;
 		}
@@ -3691,7 +4252,7 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 		pdoc->SetStyleFor(wParam, static_cast<char>(lParam));
 		break;
 
-	case SCI_SETSTYLINGEX:    // Specify a complete styling buffer
+	case SCI_SETSTYLINGEX:           // Specify a complete styling buffer
 		if (lParam == 0)
 			return 0;
 		pdoc->SetStyles(wParam, reinterpret_cast<char *>(lParam));
@@ -3739,6 +4300,28 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 	case SCI_GETLINEINDENTPOSITION:
 		return pdoc->GetLineIndentPosition(wParam);
 
+	case SCI_SETTABINDENTS:
+		pdoc->tabIndents = wParam;
+		break;
+
+	case SCI_GETTABINDENTS:
+		return pdoc->tabIndents;
+
+	case SCI_SETBACKSPACEUNINDENTS:
+		pdoc->backspaceUnindents = wParam;
+		break;
+
+	case SCI_GETBACKSPACEUNINDENTS:
+		return pdoc->backspaceUnindents;
+
+	case SCI_SETMOUSEDWELLTIME:
+		dwellDelay = wParam;
+		ticksToDwell = dwellDelay;
+		break;
+	
+	case SCI_GETMOUSEDWELLTIME:
+		return dwellDelay;
+	
 	case SCI_GETCOLUMN:
 		return pdoc->GetColumn(wParam);
 
@@ -3946,6 +4529,12 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 			InvalidateStyleRedraw();
 		}
 		break;
+	case SCI_STYLESETCASE:
+		if (wParam <= STYLE_MAX) {
+			vs.styles[wParam].caseForce = static_cast<Style::ecaseForced>(lParam);
+			InvalidateStyleRedraw();
+		}
+		break;
 	case SCI_STYLESETCHARACTERSET:
 		if (wParam <= STYLE_MAX) {
 			vs.styles[wParam].characterSet = lParam;
@@ -3979,6 +4568,19 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 	case SCI_GETMAXLINESTATE:
 		return pdoc->GetMaxLineState();
 
+	case SCI_GETCARETLINEVISIBLE:
+		return vs.showCaretLineBackground;
+	case SCI_SETCARETLINEVISIBLE:
+		vs.showCaretLineBackground = wParam;
+		InvalidateStyleRedraw();
+		break;
+	case SCI_GETCARETLINEBACK:
+		return vs.caretLineBackground.desired.AsLong();
+	case SCI_SETCARETLINEBACK:
+		vs.caretLineBackground.desired = wParam;
+		InvalidateStyleRedraw();
+		break;
+
 		// Folding messages
 
 	case SCI_VISIBLEFROMDOCLINE:
@@ -4037,7 +4639,11 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 		break;
 
 	case SCI_ENSUREVISIBLE:
-		EnsureLineVisible(wParam);
+		EnsureLineVisible(wParam, false);
+		break;
+
+	case SCI_ENSUREVISIBLEENFORCEPOLICY:
+		EnsureLineVisible(wParam, true);
 		break;
 
 	case SCI_SEARCHANCHOR:
@@ -4053,6 +4659,11 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 		caretSlop = lParam;
 		break;
 
+	case SCI_SETVISIBLEPOLICY:
+		visiblePolicy = wParam;
+		visibleSlop = lParam;
+		break;
+
 	case SCI_LINESONSCREEN:
 		return LinesOnScreen();
 
@@ -4080,6 +4691,19 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 	case SCI_GETCARETFORE:
 		return vs.caretcolour.desired.AsLong();
 
+	case SCI_SETCARETWIDTH:
+		if (wParam <= 1)
+			vs.caretWidth = 1;
+		else if (wParam >= 3)
+			vs.caretWidth = 3;
+		else
+			vs.caretWidth = wParam;
+		InvalidateStyleRedraw();
+		break;
+
+	case SCI_GETCARETWIDTH:
+		return vs.caretWidth;
+
 	case SCI_ASSIGNCMDKEY:
 		kmap.AssignCmdKey(Platform::LowShortFromLong(wParam),
 		                  Platform::HighShortFromLong(wParam), lParam);
@@ -4151,6 +4775,8 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 	case SCI_ZOOMOUT:
 	case SCI_DELWORDLEFT:
 	case SCI_DELWORDRIGHT:
+	case SCI_DELLINELEFT:
+	case SCI_DELLINERIGHT:
 	case SCI_LINECUT:
 	case SCI_LINEDELETE:
 	case SCI_LINETRANSPOSE:
@@ -4158,6 +4784,10 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 	case SCI_UPPERCASE:
 	case SCI_LINESCROLLDOWN:
 	case SCI_LINESCROLLUP:
+	case SCI_WORDPARTLEFT:
+	case SCI_WORDPARTLEFTEXTEND:
+	case SCI_WORDPARTRIGHT:
+	case SCI_WORDPARTRIGHTEXTEND:
 		return KeyCommand(iMessage);
 
 	case SCI_BRACEHIGHLIGHT:
@@ -4256,6 +4886,35 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 	case SCI_GETOVERTYPE:
 		return inOverstrike ? TRUE : FALSE;
 
+	case SCI_SETFOCUS:
+		SetFocusState(wParam);
+		break;
+
+	case SCI_GETFOCUS:
+		return hasFocus;
+
+	case SCI_SETSTATUS:
+		errorStatus = wParam;
+		break;
+
+	case SCI_GETSTATUS:
+		return errorStatus;
+
+	case SCI_SETMOUSEDOWNCAPTURES:
+		mouseDownCaptures = wParam;
+		break;
+
+	case SCI_GETMOUSEDOWNCAPTURES:
+		return mouseDownCaptures;
+
+	case SCI_SETCURSOR:
+		cursorMode = wParam;
+		DisplayCursor(Window::cursorText);
+		break;
+
+	case SCI_GETCURSOR:
+		return cursorMode;
+
 #ifdef MACRO_SUPPORT
 	case SCI_STARTRECORD:
 		recordingMacro = 1;
@@ -4264,7 +4923,11 @@ long Editor::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
 	case SCI_STOPRECORD:
 		recordingMacro = 0;
 		return 0;
-#endif
+#endif 
+
+	case SCI_MOVECARETINSIDEVIEW:
+		MoveCaretInsideView();
+		break;
 
 	default:
 		return DefWndProc(iMessage, wParam, lParam);
diff --git a/src/stc/scintilla/src/Editor.h b/src/stc/scintilla/src/Editor.h
index 83967cfd6a..d42f5ad14a 100644
--- a/src/stc/scintilla/src/Editor.h
+++ b/src/stc/scintilla/src/Editor.h
@@ -1,11 +1,15 @@
 // Scintilla source code edit control
-// Editor.h - defines the main editor class
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file Editor.h
+ ** Defines the main editor class.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef EDITOR_H
 #define EDITOR_H
 
+/**
+ */
 class Caret {
 public:
 	bool active;
@@ -15,8 +19,9 @@ public:
 	Caret();
 };
 
+/**
+ */
 class Timer {
-
 public:
 	bool ticking;
 	int ticksToWait;
@@ -26,15 +31,18 @@ public:
 	Timer();
 };
 
+/**
+ */
 class LineLayout {
 public:
-	// Drawing is only performed for maxLineLength characters on each line.
+	/// Drawing is only performed for @a maxLineLength characters on each line.
 	enum {maxLineLength = 4000};
 	int numCharsInLine;
 	int xHighlightGuide;
 	bool highlightColumn;
 	int selStart;
 	int selEnd;
+	bool containsCaret;
 	int edgeColumn;
 	char chars[maxLineLength+1];
 	char styles[maxLineLength+1];
@@ -42,35 +50,40 @@ public:
 	int positions[maxLineLength+1];
 };
 
+/**
+ */
 class Editor : public DocWatcher {
 	// Private so Editor objects can not be copied
 	Editor(const Editor &) : DocWatcher() {}
 	Editor &operator=(const Editor &) { return *this; }
+
 protected:	// ScintillaBase subclass needs access to much of Editor
 
-	// On GTK+, Scintilla is a container widget holding two scroll bars and a drawing area
-	// whereas on Windows there is just one window with both scroll bars turned on.
-	// Therefore, on GTK+ the following are separate windows but only one window on Windows.
-	Window wMain;	// The Scintilla parent window
-	Window wDraw;	// The text drawing area
+	/** On GTK+, Scintilla is a container widget holding two scroll bars
+	 * whereas on Windows there is just one window with both scroll bars turned on. */
+	Window wMain;	///< The Scintilla parent window
 
-	// Style resources may be expensive to allocate so are cached between uses.
-	// When a style attribute is changed, this cache is flushed.
+	/** Style resources may be expensive to allocate so are cached between uses.
+	 * When a style attribute is changed, this cache is flushed. */
 	bool stylesValid;	
 	ViewStyle vs;
 	Palette palette;
 	int printMagnification;
 	int printColourMode;
-	
+	int cursorMode;
+
+	bool hasFocus;
 	bool hideSelection;
 	bool inOverstrike;
-
-	// In bufferedDraw mode, graphics operations are drawn to a pixmap and then copied to 
-	// the screen. This avoids flashing but is about 30% slower.
+	int errorStatus;
+	bool mouseDownCaptures;
+	
+	/** In bufferedDraw mode, graphics operations are drawn to a pixmap and then copied to
+	 * the screen. This avoids flashing but is about 30% slower. */
 	bool bufferedDraw;
 
-	int xOffset;				// Horizontal scrolled amount in pixels
-	int xCaretMargin;	// Ensure this many pixels visible on both sides of caret
+	int xOffset;		///< Horizontal scrolled amount in pixels
+	int xCaretMargin;	///< Ensure this many pixels visible on both sides of caret
 	bool horizontalScrollBarVisible;
 	
 	Surface pixmapLine;
@@ -80,15 +93,20 @@ protected:	// ScintillaBase subclass needs access to much of Editor
 	Surface pixmapIndentGuideHighlight;
 	// Intellimouse support - currently only implemented for Windows
 	unsigned int ucWheelScrollLines;
-	int cWheelDelta; //wheel delta from roll
+	int cWheelDelta; ///< Wheel delta from roll
 
 	KeyMap kmap;
 
 	Caret caret;
 	Timer timer;
+	Timer autoScrollTimer;
+	enum { autoScrollDelay = 200 };
 
 	Point lastClick;
 	unsigned int lastClickTime;
+	int dwellDelay;
+	int ticksToDwell;
+	bool dwelling;
 	enum { selChar, selWord, selLine } selectionType;
 	Point ptMouseLast;
 	bool firstExpose;
@@ -101,6 +119,9 @@ protected:	// ScintillaBase subclass needs access to much of Editor
 	int originalAnchorPos;
 	int currentPos;
 	int anchor;
+	int targetStart;
+	int targetEnd;
+	int searchFlags;
 	int topLine;
 	int posTopLine;
 	
@@ -128,6 +149,9 @@ protected:	// ScintillaBase subclass needs access to much of Editor
 	int caretPolicy;
 	int caretSlop;
 
+	int visiblePolicy;
+	int visibleSlop;
+	
 	int searchAnchor;
 
 	int displayPopupMenu;
@@ -152,15 +176,16 @@ protected:	// ScintillaBase subclass needs access to much of Editor
 	void RefreshStyleData();
 	void DropGraphics();
 
-	PRectangle GetClientRectangle();
+	virtual PRectangle GetClientRectangle();
 	PRectangle GetTextRectangle();
 	
 	int LinesOnScreen();
 	int LinesToScroll();
 	int MaxScrollPos();
-	Point LocationFromPosition(unsigned int pos);
-	int XFromPosition(unsigned int pos);
+	Point LocationFromPosition(int pos);
+	int XFromPosition(int pos);
 	int PositionFromLocation(Point pt);
+	int PositionFromLocationClose(Point pt);
 	int PositionFromLineX(int line, int x);
 	int LineFromLocation(Point pt);
 	void SetTopLine(int topLineNew);
@@ -187,11 +212,12 @@ protected:	// ScintillaBase subclass needs access to much of Editor
 	virtual void ScrollText(int linesToMove);
 	void HorizontalScrollTo(int xPos);
 	void MoveCaretInsideView();
-	void EnsureCaretVisible(bool useMargin=true);
+	void EnsureCaretVisible(bool useMargin=true, bool vert=true, bool horiz=true);
 	void ShowCaretAtCurrentPosition();
 	void DropCaret();
 	void InvalidateCaret();
 
+	int SubstituteMarkerIfEmpty(int markerCheck, int markerDefault);
 	void PaintSelMargin(Surface *surface, PRectangle &rc);
         void LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayout &ll);
 	void DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVisible, int xStart, 
@@ -214,6 +240,7 @@ protected:	// ScintillaBase subclass needs access to much of Editor
 	void Cut();
 	void PasteRectangular(int pos, const char *ptr, int len);
 	virtual void Copy() = 0;
+	virtual bool CanPaste();
 	virtual void Paste() = 0;
 	void Clear();
 	void SelectAll();
@@ -227,14 +254,16 @@ protected:	// ScintillaBase subclass needs access to much of Editor
 	virtual void NotifyFocus(bool focus);
 	virtual void NotifyParent(SCNotification scn) = 0;
 	virtual void NotifyStyleToNeeded(int endStyleNeeded);
-	void NotifyChar(char ch);
+	void NotifyChar(int ch);
 	void NotifyMove(int position);
 	void NotifySavePoint(bool isSavePoint);
 	void NotifyModifyAttempt();
 	virtual void NotifyDoubleClick(Point pt, bool shift);
 	void NotifyUpdateUI();
+	void NotifyPainted();
 	bool NotifyMarginClick(Point pt, bool shift, bool ctrl, bool alt);
 	void NotifyNeedShown(int pos, int len);
+	void NotifyDwelling(Point pt, bool state);
 	
 	void NotifyModifyAttempt(Document *document, void *userData);
 	void NotifySavePoint(Document *document, void *userData, bool atSavePoint);
@@ -253,7 +282,7 @@ protected:	// ScintillaBase subclass needs access to much of Editor
     	virtual void CancelModes();
 	virtual int KeyCommand(unsigned int iMessage);
 	virtual int KeyDefault(int /* key */, int /*modifiers*/);
-	int KeyDown(int key, bool shift, bool ctrl, bool alt);
+	int KeyDown(int key, bool shift, bool ctrl, bool alt, bool *consumed=0);
 
 	int GetWhitespaceVisible();
 	void SetWhitespaceVisible(int view);
@@ -263,6 +292,7 @@ protected:	// ScintillaBase subclass needs access to much of Editor
 	long FindText(unsigned int iMessage, unsigned long wParam, long lParam);
 	void SearchAnchor();
 	long SearchText(unsigned int iMessage, unsigned long wParam, long lParam);
+	long SearchInTarget(const char *text, int length);
 	void GoToLine(int lineNo);
 
 	char *CopyRange(int start, int end);
@@ -270,13 +300,16 @@ protected:	// ScintillaBase subclass needs access to much of Editor
 	char *CopySelectionRange();
 	void CopySelectionIntoDrag();
 	void SetDragPosition(int newPos);
+	void DisplayCursor(Window::Cursor c);
 	virtual void StartDrag();
 	void DropAt(int position, const char *value, bool moving, bool rectangular);
-	// PositionInSelection returns 0 if position in selection, -1 if position before selection, and 1 if after.
-	// Before means either before any line of selection or before selection on its line, with a similar meaning to after
+	/** PositionInSelection returns 0 if position in selection, -1 if position before selection, and 1 if after.
+	 * Before means either before any line of selection or before selection on its line, with a similar meaning to after. */
 	int PositionInSelection(int pos);
 	bool PointInSelection(Point pt);
 	bool PointInSelMargin(Point pt);
+	void LineSelection(int lineCurrent_, int lineAnchor_);
+	void DwellEnd(bool mouseMoved);
 	virtual void ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt);
 	void ButtonMove(Point pt);
 	void ButtonUp(Point pt, unsigned int curTime, bool ctrl);
@@ -285,6 +318,7 @@ protected:	// ScintillaBase subclass needs access to much of Editor
 	virtual void SetTicking(bool on) = 0;
 	virtual void SetMouseCapture(bool on) = 0;
 	virtual bool HaveMouseCapture() = 0;
+	void SetFocusState(bool focusState);
 
 	void CheckForChangeOutsidePaint(Range r);
 	int BraceMatch(int position, int maxReStyle);
@@ -294,13 +328,14 @@ protected:	// ScintillaBase subclass needs access to much of Editor
 	
 	void Expand(int &line, bool doExpand);
 	void ToggleContraction(int line);
-	void EnsureLineVisible(int line);
+	void EnsureLineVisible(int lineDoc, bool enforcePolicy);
+	int ReplaceTarget(bool replacePatterns, const char *text, int length=-1);
 
-	virtual long DefWndProc(unsigned int iMessage, unsigned long wParam, long lParam) = 0;
+	virtual sptr_t DefWndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) = 0;
 	
 public:
 	// Public so scintilla_send_message can use it
-	virtual long WndProc(unsigned int iMessage, unsigned long wParam, long lParam);
+	virtual sptr_t WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam);
 	// Public so scintilla_set_id can use it
 	int ctrlID;	
 };
diff --git a/src/stc/scintilla/src/Indicator.cxx b/src/stc/scintilla/src/Indicator.cxx
index 05bdf66b53..580e9f86da 100644
--- a/src/stc/scintilla/src/Indicator.cxx
+++ b/src/stc/scintilla/src/Indicator.cxx
@@ -1,6 +1,8 @@
 // Scintilla source code edit control
-// Indicator.cxx - defines the style of indicators which are text decorations such as underlining
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file Indicator.cxx
+ ** Defines the style of indicators which are text decorations such as underlining.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include "Platform.h"
diff --git a/src/stc/scintilla/src/Indicator.h b/src/stc/scintilla/src/Indicator.h
index 2472cedc14..a19b46b5e2 100644
--- a/src/stc/scintilla/src/Indicator.h
+++ b/src/stc/scintilla/src/Indicator.h
@@ -1,11 +1,15 @@
 // Scintilla source code edit control
-// Indicator.h - defines the style of indicators which are text decorations such as underlining
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file Indicator.h
+ ** Defines the style of indicators which are text decorations such as underlining.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef INDICATOR_H
 #define INDICATOR_H
 
+/**
+ */
 class Indicator {
 public:
 	int style;
diff --git a/src/stc/scintilla/src/KeyMap.cxx b/src/stc/scintilla/src/KeyMap.cxx
index d2a6660f3c..e1fe8e0322 100644
--- a/src/stc/scintilla/src/KeyMap.cxx
+++ b/src/stc/scintilla/src/KeyMap.cxx
@@ -1,6 +1,8 @@
 // Scintilla source code edit control
-// KeyMap.cxx  - defines a mapping between keystrokes and commands
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file KeyMap.cxx 
+ ** Defines a mapping between keystrokes and commands.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include "Platform.h"
@@ -71,10 +73,14 @@ KeyToCommand KeyMap::MapDefault[] = {
     {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_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_HOME, 		SCI_SHIFT, 	SCI_VCHOMEEXTEND},
     {SCK_HOME, 		SCI_CTRL, 	SCI_DOCUMENTSTART},
@@ -90,6 +96,7 @@ KeyToCommand KeyMap::MapDefault[] = {
     {SCK_DELETE, 	SCI_NORM,	SCI_CLEAR},
     {SCK_DELETE, 	SCI_SHIFT,	SCI_CUT},
     {SCK_DELETE, 	SCI_CTRL,	SCI_DELWORDRIGHT},
+    {SCK_DELETE,	SCI_CSHIFT,	SCI_DELLINERIGHT},
     {SCK_INSERT, 		SCI_NORM,	SCI_EDITTOGGLEOVERTYPE},
     {SCK_INSERT, 		SCI_SHIFT,	SCI_PASTE},
     {SCK_INSERT, 		SCI_CTRL,	SCI_COPY},
@@ -98,6 +105,7 @@ KeyToCommand KeyMap::MapDefault[] = {
     {SCK_BACK,		SCI_SHIFT, 	SCI_DELETEBACK},
     {SCK_BACK,		SCI_CTRL, 	SCI_DELWORDLEFT},
     {SCK_BACK, 		SCI_ALT,	SCI_UNDO},
+    {SCK_BACK,		SCI_CSHIFT,	SCI_DELLINELEFT},    
     {'Z', 			SCI_CTRL,	SCI_UNDO},
     {'Y', 			SCI_CTRL,	SCI_REDO},
     {'X', 			SCI_CTRL,	SCI_CUT},
diff --git a/src/stc/scintilla/src/KeyMap.h b/src/stc/scintilla/src/KeyMap.h
index c843104174..8232b7160b 100644
--- a/src/stc/scintilla/src/KeyMap.h
+++ b/src/stc/scintilla/src/KeyMap.h
@@ -1,6 +1,8 @@
 // Scintilla source code edit control
-// KeyMap.h - defines a mapping between keystrokes and commands
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file KeyMap.h
+ ** Defines a mapping between keystrokes and commands.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef KEYTOCOMMAND_H
@@ -13,6 +15,8 @@
 #define SCI_CSHIFT (SCI_CTRL | SCI_SHIFT)
 #define SCI_ASHIFT (SCI_ALT | SCI_SHIFT)
 
+/**
+ */
 class KeyToCommand {
 public:
 	int key;
@@ -20,11 +24,14 @@ public:
 	unsigned int msg;
 };
 
+/**
+ */
 class KeyMap {
 	KeyToCommand *kmap;
 	int len;
 	int alloc;
 	static KeyToCommand MapDefault[];
+
 public:
 	KeyMap();
 	~KeyMap();
diff --git a/src/stc/scintilla/src/KeyWords.cxx b/src/stc/scintilla/src/KeyWords.cxx
index 113ba222df..0728580fdf 100644
--- a/src/stc/scintilla/src/KeyWords.cxx
+++ b/src/stc/scintilla/src/KeyWords.cxx
@@ -1,13 +1,15 @@
-// SciTE - Scintilla based Text Editor
-// KeyWords.cxx - colourise for particular languages
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file KeyWords.cxx
+ ** Colourise for particular languages.
+ **/
+// 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"
 
@@ -18,28 +20,137 @@
 #include "SciLexer.h"
 
 LexerModule *LexerModule::base = 0;
+int LexerModule::nextLanguage = SCLEX_AUTOMATIC+1;
 
-LexerModule::LexerModule(int language_, LexerFunction fn_) :
-	language(language_), fn(fn_) {
+LexerModule::LexerModule(int language_, LexerFunction fnLexer_,
+	const char *languageName_, LexerFunction fnFolder_) :
+	language(language_), 
+	languageName(languageName_), 
+	fnLexer(fnLexer_), 
+	fnFolder(fnFolder_) {
 	next = base;
 	base = this;
+	if (language == SCLEX_AUTOMATIC) {
+		language = nextLanguage;
+		nextLanguage++;
+	}
 }
 
-void LexerModule::Colourise(unsigned int startPos, int lengthDoc, int initStyle,
-		int language, WordList *keywordlists[], Accessor &styler) {
+LexerModule *LexerModule::Find(int language) {
 	LexerModule *lm = base;
 	while (lm) {
 		if (lm->language == language) {
-			lm->fn(startPos, lengthDoc, initStyle, keywordlists, styler);
-			return;
+			return lm;
 		}
 		lm = lm->next;
 	}
-	// Unknown language
+	return 0;
+}
+
+LexerModule *LexerModule::Find(const char *languageName) {
+	if (languageName) {
+		LexerModule *lm = base;
+		while (lm) {
+			if (lm->languageName && 0 == strcmp(lm->languageName, languageName)) {
+				return lm;
+			}
+			lm = lm->next;
+		}
+	}
+	return 0;
+}
+
+void LexerModule::Lex(unsigned int startPos, int lengthDoc, int initStyle,
+	  WordList *keywordlists[], Accessor &styler) {
+	if (fnLexer)
+		fnLexer(startPos, lengthDoc, initStyle, keywordlists, styler);
+}
+
+void LexerModule::Fold(unsigned int startPos, int lengthDoc, int initStyle,
+	  WordList *keywordlists[], Accessor &styler) {
+	if (fnFolder) {
+		int lineCurrent = styler.GetLine(startPos);
+		// Move back one line in case deletion wrecked current line fold state
+		if (lineCurrent > 0) {
+			lineCurrent--;
+			int newStartPos = styler.LineStart(lineCurrent);
+			lengthDoc += startPos - newStartPos;
+			startPos = newStartPos;
+			initStyle = 0;
+			if (startPos > 0) {
+				initStyle = styler.StyleAt(startPos - 1);
+			}
+		}
+		fnFolder(startPos, lengthDoc, initStyle, keywordlists, styler);
+	}
+}
+
+static void ColouriseNullDoc(unsigned int startPos, int length, int, WordList *[],
+                            Accessor &styler) {
 	// Null language means all style bytes are 0 so just mark the end - no need to fill in.
-	if (lengthDoc > 0) {
-		styler.StartAt(startPos + lengthDoc - 1);
-		styler.StartSegment(startPos + lengthDoc - 1);
-		styler.ColourTo(startPos + lengthDoc - 1, 0);
+	if (length > 0) {
+		styler.StartAt(startPos + length - 1);
+		styler.StartSegment(startPos + length - 1);
+		styler.ColourTo(startPos + length - 1, 0);
 	}
 }
+
+LexerModule lmNull(SCLEX_NULL, ColouriseNullDoc, "null");
+
+#ifdef __vms
+
+// The following code forces a reference to all of the Scintilla lexers.
+// If we don't do something like this, then the linker tends to "optimize"
+// them away. (eric@sourcegear.com)
+
+// Taken from wxWindow's stc.cpp. Walter.
+
+int wxForceScintillaLexers(void) {
+  extern LexerModule lmAda;
+  extern LexerModule lmAVE;
+  extern LexerModule lmConf;
+  extern LexerModule lmDiff;
+  extern LexerModule lmLatex;
+  extern LexerModule lmPascal;
+  extern LexerModule lmCPP;
+  extern LexerModule lmHTML;
+  extern LexerModule lmXML;
+  extern LexerModule lmProps;
+  extern LexerModule lmErrorList;
+  extern LexerModule lmMake;
+  extern LexerModule lmBatch;
+  extern LexerModule lmPerl;
+  extern LexerModule lmPython;
+  extern LexerModule lmSQL;
+  extern LexerModule lmVB;
+  extern LexerModule lmRuby;
+
+  if (
+      &lmAda
+      && &lmAVE
+      && &lmConf
+      && &lmDiff
+      && &lmLatex
+      && &lmPascal
+      && &lmCPP
+      && &lmHTML
+      && &lmXML
+      && &lmProps
+      && &lmErrorList
+      && &lmMake
+      && &lmBatch
+      && &lmPerl
+      && &lmPython
+      && &lmSQL
+      && &lmVB
+      && &lmRuby      
+      )
+    {
+      return 1;
+    }
+  else
+    {
+      return 0;
+    }
+}
+#endif
diff --git a/src/stc/scintilla/src/LexAVE.cxx b/src/stc/scintilla/src/LexAVE.cxx
new file mode 100644
index 0000000000..a7422743fa
--- /dev/null
+++ b/src/stc/scintilla/src/LexAVE.cxx
@@ -0,0 +1,188 @@
+// SciTE - Scintilla based Text Editor
+/** @file LexAVE.cxx
+ ** Lexer for Avenue.
+ **/
+// 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"
+
+static void ColouriseAveDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
+	Accessor &styler) {
+
+	WordList &keywords = *keywordlists[0];
+
+	styler.StartAt(startPos);
+
+	bool fold = styler.GetPropertyInt("fold");
+	int lineCurrent = styler.GetLine(startPos);
+	int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
+	int levelCurrent = levelPrev;
+
+	int state = initStyle;
+	if (state == SCE_AVE_STRINGEOL)	// Does not leak onto next line
+		state = SCE_AVE_DEFAULT;
+	char chNext = styler[startPos];
+	unsigned int lengthDoc = startPos + length;
+	int visibleChars = 0;
+	styler.StartSegment(startPos);
+
+	for (unsigned int i = startPos; i < lengthDoc; i++) {
+		char ch = chNext;
+		chNext = styler.SafeGetCharAt(i + 1);
+		if ((ch == '\r' && chNext != '\n') || (ch == '\n')) {
+			// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)
+			// Avoid triggering two times on Dos/Win
+			// End of line
+			if (state == SCE_AVE_STRINGEOL) {
+				styler.ColourTo(i, state);
+				state = SCE_AVE_DEFAULT;
+			}
+			if (fold) {
+				int lev = levelPrev;
+				if (visibleChars == 0)
+					lev |= SC_FOLDLEVELWHITEFLAG;
+				if ((levelCurrent > levelPrev) && (visibleChars > 0))
+					lev |= SC_FOLDLEVELHEADERFLAG;
+				styler.SetLevel(lineCurrent, lev);
+				lineCurrent++;
+				levelPrev = levelCurrent;
+			}
+			visibleChars = 0;
+		}
+		if (!isspace(ch))
+			visibleChars++;
+		if (styler.IsLeadByte(ch)) {
+			chNext = styler.SafeGetCharAt(i + 2);
+			i += 1;
+			continue;
+		}
+
+		if (state == SCE_AVE_DEFAULT) {
+			if (iswordstart(ch) || (ch == '.') )  {
+				styler.ColourTo(i-1, state);
+				state = SCE_AVE_IDENTIFIER;
+			} else if (ch == '\'') {
+				styler.ColourTo(i-1, state);
+				state = SCE_AVE_COMMENT;
+			} else if (ch == '\"') {
+				styler.ColourTo(i-1, state);
+				state = SCE_AVE_STRING;
+			} else if (ch == '#') {
+				styler.ColourTo(i-1, state);
+				state = SCE_AVE_ENUM;
+			} else if (isoperator(ch) ) {
+				styler.ColourTo(i-1, state);
+				styler.ColourTo(i, SCE_AVE_OPERATOR);
+			}
+		}
+	  	else if (state == SCE_AVE_COMMENT) {
+			if (ch == '\r' || ch == '\n') {
+				styler.ColourTo(i-1, state);
+				state = SCE_AVE_DEFAULT;
+			}
+		}
+	  	else if (state == SCE_AVE_ENUM) {
+			if (isoperator(ch)  || ch == ' ' || ch == '\'' || ch == '\r' || ch == '\n') {
+				styler.ColourTo(i-1, state);
+				state = SCE_AVE_DEFAULT;
+			}
+		}
+		else if (state == SCE_AVE_STRING) {
+			if (ch == '\"') {
+				if (chNext == '\"') {
+					i++;
+					ch = chNext;
+					chNext = styler.SafeGetCharAt(i + 1);
+				} else
+				{
+					styler.ColourTo(i, state);
+					state = SCE_AVE_DEFAULT;
+				}
+			} else if (chNext == '\r' || chNext == '\n') {
+				styler.ColourTo(i-1, SCE_AVE_STRINGEOL);
+				state = SCE_AVE_STRINGEOL;
+			}
+		}
+		if ((state == SCE_AVE_IDENTIFIER)) {
+			if (!iswordchar(ch) || ch == '.' ) {
+				char s[100];
+				unsigned int start = styler.GetStartSegment();
+				unsigned int end = i - 1;
+				for (unsigned int ii = 0; ii < end - start + 1 && ii < 30; ii++) 	{
+					s[ii] = static_cast<char>(tolower(styler[start + ii]));
+					s[ii + 1] = '\0';
+				}
+
+				char chAttr = SCE_AVE_IDENTIFIER;
+
+				if (isdigit(s[0]))
+					chAttr = SCE_AVE_NUMBER;
+				else {
+					if ((strcmp(s, "for") == 0) || (strcmp(s, "if") == 0) || (strcmp(s, "while") == 0))
+					{
+						levelCurrent +=1;
+						chAttr = SCE_AVE_STATEMENT;
+					}
+
+					if (strcmp(s, "end") == 0)
+					{
+						levelCurrent -=1;
+						chAttr = SCE_AVE_STATEMENT;
+					}
+
+					if ( (strcmp(s, "then") == 0) ||  (strcmp(s, "else") == 0)       || (strcmp(s, "break") == 0) ||
+						(strcmp(s, "each") == 0) ||
+						(strcmp(s, "exit") == 0) ||  (strcmp(s, "continue") == 0) || (strcmp(s, "return") == 0) ||
+						(strcmp(s, "by") == 0)   ||  (strcmp(s, "in") == 0)          || (strcmp(s, "elseif") == 0))
+					{
+						chAttr = SCE_AVE_STATEMENT;
+					}
+
+					if ((strcmp(s, "av") == 0) || (strcmp(s, "self") == 0))
+					{
+						chAttr = SCE_AVE_KEYWORD;
+					}
+
+					if (keywords.InList(s))
+					{
+						chAttr = SCE_AVE_WORD;
+					}
+				}
+				styler.ColourTo(end, chAttr);
+				state = SCE_AVE_DEFAULT;
+
+				if (ch == '\'') {
+					state = SCE_AVE_COMMENT;
+				} else if (ch == '\"') {
+					state = SCE_AVE_STRING;
+				} else if (isoperator(ch)) {
+					styler.ColourTo(i, SCE_AVE_OPERATOR);
+				}
+			}
+		}
+
+	}
+	styler.ColourTo(lengthDoc - 1, state);
+
+	// Fill in the real level of the next line, keeping the current flags as they will be filled in later
+	if (fold) {
+		int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
+		styler.SetLevel(lineCurrent, levelPrev | flagsNext);
+
+	}
+}
+
+LexerModule lmAVE(SCLEX_AVE, ColouriseAveDoc, "ave");
diff --git a/src/stc/scintilla/src/LexAda.cxx b/src/stc/scintilla/src/LexAda.cxx
new file mode 100644
index 0000000000..91bf00ede8
--- /dev/null
+++ b/src/stc/scintilla/src/LexAda.cxx
@@ -0,0 +1,198 @@
+// SciTE - Scintilla based Text Editor
+// LexAda.cxx - lexer for Ada95
+// by Tahir Karaca <tahir@bigfoot.de>
+// 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"
+
+inline void classifyWordAda(unsigned int start, unsigned int end,
+	WordList &keywords, Accessor &styler) {
+
+	static const unsigned KEWORD_LEN_MAX = 30;
+
+	char wordLower[KEWORD_LEN_MAX + 1];
+	unsigned i;
+	for(i = 0; ( i < KEWORD_LEN_MAX ) && ( i < end - start + 1 ); i++) {
+		wordLower[i] = static_cast<char>(tolower(styler[start + i]));		
+	}
+	wordLower[i] = '\0';
+		
+//	int levelChange = 0;
+	char chAttr = SCE_ADA_IDENTIFIER;
+	if (keywords.InList(wordLower)) {
+		chAttr = SCE_ADA_WORD;
+
+// Folding doesn't work this way since the semantics of some keywords depends
+// on the current context.
+// E.g. - "cond1 and THEN cond2" <-> "if ... THEN ..."		
+//      - "procedure X IS ... end X;" <-> "procedure X IS new Y;"
+//		if (strcmp(wordLower, "is") == 0 || strcmp(wordLower, "then") == 0)
+//			levelChange=1;
+//		else if (strcmp(wordLower, "end") == 0)
+//			levelChange=-1;
+	}
+	styler.ColourTo(end, chAttr);
+	
+//	return levelChange;
+}
+
+
+inline bool isAdaOperator(char ch) {
+	
+	if (ch == '&' || ch == '\'' || ch == '(' || ch == ')' ||
+	        ch == '*' || ch == '+' || ch == ',' || ch == '-' ||
+	        ch == '.' || ch == '/' || ch == ':' || ch == ';' ||
+	        ch == '<' || ch == '=' || ch == '>')
+		return true;
+	return false;
+}
+
+
+inline void styleTokenBegin(char beginChar, unsigned int pos, int &state,
+	Accessor &styler) {
+		
+	if (isalpha(beginChar)) {
+		styler.ColourTo(pos-1, state);
+		state = SCE_ADA_IDENTIFIER;
+	} else if (isdigit(beginChar)) {
+		styler.ColourTo(pos-1, state);
+		state = SCE_ADA_NUMBER;
+	} else if (beginChar == '-' && styler.SafeGetCharAt(pos + 1) == '-') {
+		styler.ColourTo(pos-1, state);
+		state = SCE_ADA_COMMENT;
+	} else if (beginChar == '\"') {
+		styler.ColourTo(pos-1, state);
+		state = SCE_ADA_STRING;
+	} else if (beginChar == '\'' && styler.SafeGetCharAt(pos + 2) == '\'') {
+		styler.ColourTo(pos-1, state);
+		state = SCE_ADA_CHARACTER;
+	} else if (isAdaOperator(beginChar)) {
+		styler.ColourTo(pos-1, state);
+		styler.ColourTo(pos, SCE_ADA_OPERATOR);
+	}
+}
+
+
+static void ColouriseAdaDoc(unsigned int startPos, int length, int initStyle,
+	WordList *keywordlists[], Accessor &styler) {
+	
+	WordList &keywords = *keywordlists[0];
+	
+	styler.StartAt(startPos);
+	
+//	bool fold = styler.GetPropertyInt("fold");
+//	int lineCurrent = styler.GetLine(startPos);
+//	int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
+//	int levelCurrent = levelPrev;
+
+	int state = initStyle;
+	if (state == SCE_ADA_STRINGEOL)	// Does not leak onto next line
+		state = SCE_ADA_DEFAULT;
+	char chNext = styler[startPos];
+	const unsigned int lengthDoc = startPos + length;
+	//int visibleChars = 0;
+	styler.StartSegment(startPos);
+	for (unsigned int i = startPos; i < lengthDoc; i++) {
+		char ch = chNext;
+		chNext = styler.SafeGetCharAt(i + 1);
+
+		if ((ch == '\r' && chNext != '\n') || (ch == '\n')) {
+			// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)
+			// Avoid triggering two times on Dos/Win
+			if (state == SCE_ADA_STRINGEOL) {
+				styler.ColourTo(i, state);
+				state = SCE_ADA_DEFAULT;
+			}
+//			if (fold) {
+//				int lev = levelPrev;
+//				if (visibleChars == 0)
+//					lev |= SC_FOLDLEVELWHITEFLAG;
+//				if ((levelCurrent > levelPrev) && (visibleChars > 0))
+//					lev |= SC_FOLDLEVELHEADERFLAG;
+//				styler.SetLevel(lineCurrent, lev);
+//				lineCurrent++;
+//				levelPrev = levelCurrent;
+//			}
+			//visibleChars = 0;
+		}
+		//if (!isspacechar(ch))
+		//	visibleChars++;
+
+		if (styler.IsLeadByte(ch)) {
+			chNext = styler.SafeGetCharAt(i + 2);
+			i += 1;
+			continue;
+		}
+
+		if (state == SCE_ADA_DEFAULT) {
+			styleTokenBegin(ch, i, state, styler);
+		} else if (state == SCE_ADA_IDENTIFIER) {
+			if (!iswordchar(ch)) {
+				classifyWordAda(styler.GetStartSegment(),
+								i - 1,
+								keywords,
+								styler);
+				state = SCE_ADA_DEFAULT;
+				styleTokenBegin(ch, i, state, styler);
+			}
+		} else if (state == SCE_ADA_COMMENT) {
+			if (ch == '\r' || ch == '\n') {
+				styler.ColourTo(i-1, state);
+				state = SCE_ADA_DEFAULT;
+			}
+		} else if (state == SCE_ADA_STRING) {
+			if (ch == '"' ) {
+				if( chNext == '"' ) {
+					i++;
+					chNext = styler.SafeGetCharAt(i + 1);
+				} else {					
+					styler.ColourTo(i, state);
+					state = SCE_ADA_DEFAULT;
+				}
+			} else if (chNext == '\r' || chNext == '\n') {
+				styler.ColourTo(i-1, SCE_ADA_STRINGEOL);
+				state = SCE_ADA_STRINGEOL;
+			}
+		} else if (state == SCE_ADA_CHARACTER) {
+			if (ch == '\r' || ch == '\n') {
+				styler.ColourTo(i-1, SCE_ADA_STRINGEOL);
+				state = SCE_ADA_STRINGEOL;
+			} else if (ch == '\'' && styler.SafeGetCharAt(i - 2) == '\'') {
+				styler.ColourTo(i, state);
+				state = SCE_ADA_DEFAULT;
+			}
+		} else if (state == SCE_ADA_NUMBER) {
+			if ( !( isdigit(ch) || ch == '.' || ch == '_' || ch == '#'
+				    || ch == 'A' || ch == 'B' || ch == 'C' || ch == 'D'
+					|| ch == 'E' || ch == 'F'
+					|| ch == 'a' || ch == 'b' || ch == 'c' || ch == 'd'
+					|| ch == 'e' || ch == 'f' ) ) {
+				styler.ColourTo(i-1, SCE_ADA_NUMBER);
+				state = SCE_ADA_DEFAULT;
+				styleTokenBegin(ch, i, state, styler);
+			}
+		}
+
+	}
+	styler.ColourTo(lengthDoc - 1, state);
+
+//	// Fill in the real level of the next line, keeping the current flags as they will be filled in later
+//	if (fold) {
+//		int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
+//		styler.SetLevel(lineCurrent, levelPrev | flagsNext);
+//	}
+}
+
+LexerModule lmAda(SCLEX_ADA, ColouriseAdaDoc, "ada");
diff --git a/src/stc/scintilla/src/LexCPP.cxx b/src/stc/scintilla/src/LexCPP.cxx
index b6358ab332..19aa329baf 100644
--- a/src/stc/scintilla/src/LexCPP.cxx
+++ b/src/stc/scintilla/src/LexCPP.cxx
@@ -1,13 +1,15 @@
-// SciTE - Scintilla based Text Editor
-// LexCPP.cxx - lexer for C++, C, Java, and Javascript
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file LexCPP.cxx
+ ** Lexer for C++, C, Java, and Javascript.
+ **/
+// 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"
 
@@ -17,246 +19,370 @@
 #include "Scintilla.h"
 #include "SciLexer.h"
 
-static bool classifyWordCpp(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {
-	char s[100];
-	for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
+static bool IsOKBeforeRE(int ch) {
+	return (ch == '(') || (ch == '=') || (ch == ',');
+}
+
+static void getRange(unsigned int start,
+		unsigned int end,
+		Accessor &styler,
+		char *s,
+		unsigned int len) {
+	unsigned int i = 0;
+	while ((i < end - start + 1) && (i < len-1)) {
 		s[i] = styler[start + i];
-		s[i + 1] = '\0';
+		i++;
+	}
+	s[i] = '\0';
+}
+
+inline bool IsASpace(int ch) {
+    return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d));
+}
+
+inline bool IsAWordChar(int  ch) {
+	return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
+}
+
+inline bool IsAWordStart(int ch) {
+	return (ch < 0x80) && (isalnum(ch) || ch == '_');
+}
+
+inline bool IsADigit(int ch) {
+	return (ch >= '0') && (ch <= '9');
+}
+
+// All languages handled so far can treat all characters >= 0x80 as one class
+// which just continues the current token or starts an identifier if in default.
+// DBCS treated specially as the second character can be < 0x80 and hence 
+// syntactically significant. UTF-8 avoids this as all trail bytes are >= 0x80
+class ColouriseContext {
+	Accessor &styler;
+	int lengthDoc;
+	int currentPos;
+	ColouriseContext& operator=(const ColouriseContext&) {
+		return *this;
 	}
-	bool wordIsUUID = false;
-	char chAttr = SCE_C_IDENTIFIER;
-	if (isdigit(s[0]) || (s[0] == '.'))
-		chAttr = SCE_C_NUMBER;
-	else {
-		if (keywords.InList(s)) {
-			chAttr = SCE_C_WORD;
-			wordIsUUID = strcmp(s, "uuid") == 0; 
+public:
+	bool atEOL;
+	int state;
+	int chPrev;
+	int ch;
+	int chNext;
+
+	ColouriseContext(unsigned int startPos, int length,
+                        int initStyle, Accessor &styler_) : 
+		styler(styler_),
+		lengthDoc(startPos + length),
+		currentPos(startPos), 
+		atEOL(false),
+		state(initStyle), 
+		chPrev(0),
+		ch(0), 
+		chNext(0) {
+		styler.StartAt(startPos);
+		styler.StartSegment(startPos);
+		int pos = currentPos;
+		ch = static_cast<unsigned char>(styler.SafeGetCharAt(pos));
+		if (styler.IsLeadByte(static_cast<char>(ch))) {
+			pos++;
+			ch = ch << 8;
+			ch |= static_cast<unsigned char>(styler.SafeGetCharAt(pos));
+		}
+		chNext = static_cast<unsigned char>(styler.SafeGetCharAt(pos+1));
+		if (styler.IsLeadByte(static_cast<char>(chNext))) {
+			chNext = chNext << 8;
+			chNext |= static_cast<unsigned char>(styler.SafeGetCharAt(pos+2));
 		}
+		atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
 	}
-	styler.ColourTo(end, chAttr);
-	return wordIsUUID;
-}
+	void Complete() {
+		styler.ColourTo(currentPos - 1, state);
+	}
+	bool More() {
+		return currentPos <= lengthDoc;
+	}
+	void Forward() {
+		// A lot of this is repeated from the constructor - TODO: merge code
+		chPrev = ch;
+		currentPos++;
+		if (ch >= 0x100)
+			currentPos++;
+		ch = chNext;
+		chNext = static_cast<unsigned char>(styler.SafeGetCharAt(currentPos+1));
+		if (styler.IsLeadByte(static_cast<char>(chNext))) {
+			chNext = chNext << 8;
+			chNext |= static_cast<unsigned char>(styler.SafeGetCharAt(currentPos + 2));
+		}
+		// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)
+		// Avoid triggering two times on Dos/Win
+		// End of line
+		atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
+	}
+	void ChangeState(int state_) {
+		state = state_;
+	}
+	void SetState(int state_) {
+		styler.ColourTo(currentPos - 1, state);
+		state = state_;
+	}
+	void ForwardSetState(int state_) {
+		Forward();
+		styler.ColourTo(currentPos - 1, state);
+		state = state_;
+	}
+	void GetCurrent(char *s, int len) {
+		getRange(styler.GetStartSegment(), currentPos - 1, styler, s, len);
+	}
+	int LengthCurrent() {
+		return currentPos - styler.GetStartSegment();
+	}
+	bool Match(char ch0) {
+		return ch == ch0;
+	}
+	bool Match(char ch0, char ch1) {
+		return (ch == ch0) && (chNext == ch1);
+	}
+	bool Match(const char *s) {
+		if (ch != *s)
+			return false;
+		s++;
+		if (chNext != *s)
+			return false;
+		s++;
+		for (int n=2; *s; n++) {
+			if (*s != styler.SafeGetCharAt(currentPos+n))
+				return false;
+			s++;
+		}
+		return true;
+	}
+};
+
+static void ColouriseCppDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
+                            Accessor &styler) {
 
-static void ColouriseCppDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], 
-	Accessor &styler) {
-	
 	WordList &keywords = *keywordlists[0];
-	
-	styler.StartAt(startPos);
-	
-	bool fold = styler.GetPropertyInt("fold");
+	WordList &keywords2 = *keywordlists[1];
+
 	bool stylingWithinPreprocessor = styler.GetPropertyInt("styling.within.preprocessor");
-	int lineCurrent = styler.GetLine(startPos);
-	int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
-	int levelCurrent = levelPrev;
 
-	int state = initStyle;
-	if (state == SCE_C_STRINGEOL)	// Does not leak onto next line
-		state = SCE_C_DEFAULT;
-	char chPrev = ' ';
-	char chNext = styler[startPos];
-	unsigned int lengthDoc = startPos + length;
+	if (initStyle == SCE_C_STRINGEOL)	// Does not leak onto next line
+		initStyle = SCE_C_DEFAULT;
+
+	int chPrevNonWhite = ' ';
 	int visibleChars = 0;
-	styler.StartSegment(startPos);
 	bool lastWordWasUUID = false;
-	for (unsigned int i = startPos; i < lengthDoc; i++) {
-		char ch = chNext;
-		chNext = styler.SafeGetCharAt(i + 1);
 
-		if ((ch == '\r' && chNext != '\n') || (ch == '\n')) {
-			// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)
-			// Avoid triggering two times on Dos/Win
-			// End of line
-			if (state == SCE_C_STRINGEOL) {
-				styler.ColourTo(i, state);
-				state = SCE_C_DEFAULT;
-			}
-			if (fold) {
-				int lev = levelPrev;
-				if (visibleChars == 0)
-					lev |= SC_FOLDLEVELWHITEFLAG;
-				if ((levelCurrent > levelPrev) && (visibleChars > 0))
-					lev |= SC_FOLDLEVELHEADERFLAG;
-				styler.SetLevel(lineCurrent, lev);
-				lineCurrent++;
-				levelPrev = levelCurrent;
-			}
-			visibleChars = 0;
-		}
-		if (!isspace(ch))
-			visibleChars++;
+	ColouriseContext cc(startPos, length, initStyle, styler);
 
-		if (styler.IsLeadByte(ch)) {
-			chNext = styler.SafeGetCharAt(i + 2);
-			chPrev = ' ';
-			i += 1;
-			continue;
-		}
+	for (; cc.More(); cc.Forward()) {
 
-		if (state == SCE_C_DEFAULT) {
-			if (ch == '@' && chNext == '\"') {
-				styler.ColourTo(i-1, state);
-				state = SCE_C_VERBATIM;
-				i++;
-				ch = chNext;
-				chNext = styler.SafeGetCharAt(i + 1);
-			} else if (iswordstart(ch) || (ch == '@')) {
-				styler.ColourTo(i-1, state);
-				if (lastWordWasUUID) {
-					state = SCE_C_UUID;
-					lastWordWasUUID = false;
-				} else {
-					state = SCE_C_IDENTIFIER;
-				}
-			} else if (ch == '/' && chNext == '*') {
-				styler.ColourTo(i-1, state);
-				if (styler.SafeGetCharAt(i + 2) == '*')
-					state = SCE_C_COMMENTDOC;
-				else
-					state = SCE_C_COMMENT;
-			} else if (ch == '/' && chNext == '/') {
-				styler.ColourTo(i-1, state);
-				state = SCE_C_COMMENTLINE;
-			} else if (ch == '\"') {
-				styler.ColourTo(i-1, state);
-				state = SCE_C_STRING;
-			} else if (ch == '\'') {
-				styler.ColourTo(i-1, state);
-				state = SCE_C_CHARACTER;
-			} else if (ch == '#' && visibleChars == 1) {
-				// Preprocessor commands are alone on their line
-				styler.ColourTo(i-1, state);
-				state = SCE_C_PREPROCESSOR;
-				// Skip whitespace between # and preprocessor word
-				do {
-					i++;
-					ch = chNext;
-					chNext = styler.SafeGetCharAt(i + 1);
-				} while (isspace(ch) && (i < lengthDoc));
-			} else if (isoperator(ch)) {
-				styler.ColourTo(i-1, state);
-				styler.ColourTo(i, SCE_C_OPERATOR);
-				if ((ch == '{') || (ch == '}')) {
-					levelCurrent += (ch == '{') ? 1 : -1;
-				}
+		if (cc.state == SCE_C_STRINGEOL) {
+			if (cc.atEOL) {
+				cc.SetState(SCE_C_DEFAULT);
+			}
+		} else if (cc.state == SCE_C_OPERATOR) {
+			cc.SetState(SCE_C_DEFAULT);
+		} else if (cc.state == SCE_C_NUMBER) {
+			if (!IsAWordChar(cc.ch)) {
+				cc.SetState(SCE_C_DEFAULT);
 			}
-		} else if (state == SCE_C_IDENTIFIER) {
-			if (!iswordchar(ch)) {
-				lastWordWasUUID = classifyWordCpp(styler.GetStartSegment(), i - 1, keywords, styler);
-				state = SCE_C_DEFAULT;
-				if (ch == '/' && chNext == '*') {
-					if (styler.SafeGetCharAt(i + 2) == '*')
-						state = SCE_C_COMMENTDOC;
-					else
-						state = SCE_C_COMMENT;
-				} else if (ch == '/' && chNext == '/') {
-					state = SCE_C_COMMENTLINE;
-				} else if (ch == '\"') {
-					state = SCE_C_STRING;
-				} else if (ch == '\'') {
-					state = SCE_C_CHARACTER;
-				} else if (isoperator(ch)) {
-					styler.ColourTo(i, SCE_C_OPERATOR);
-					if ((ch == '{') || (ch == '}')) {
-						levelCurrent += (ch == '{') ? 1 : -1;
-					}
+		} else if (cc.state == SCE_C_IDENTIFIER) {
+			if (!IsAWordChar(cc.ch) || (cc.ch == '.')) {
+				char s[100];
+				cc.GetCurrent(s, sizeof(s));
+				if (keywords.InList(s)) {
+					lastWordWasUUID = strcmp(s, "uuid") == 0;
+					cc.ChangeState(SCE_C_WORD);
+				} else if (keywords2.InList(s)) {
+					cc.ChangeState(SCE_C_WORD2);
 				}
+				cc.SetState(SCE_C_DEFAULT);
 			}
-		} else {
-			if (state == SCE_C_PREPROCESSOR) {
-				if (stylingWithinPreprocessor) {
-					if (isspace(ch)) {
-						styler.ColourTo(i-1, state);
-						state = SCE_C_DEFAULT;
-					}
-				} else {
-					if ((ch == '\r' || ch == '\n') && !(chPrev == '\\' || chPrev == '\r')) {
-						styler.ColourTo(i-1, state);
-						state = SCE_C_DEFAULT;
-					}
+		} if (cc.state == SCE_C_PREPROCESSOR) {
+			if (stylingWithinPreprocessor) {
+				if (IsASpace(cc.ch)) {
+					cc.SetState(SCE_C_DEFAULT);
 				}
-			} else if (state == SCE_C_COMMENT) {
-				if (ch == '/' && chPrev == '*') {
-					if (((i > styler.GetStartSegment() + 2) || (
-						(initStyle == SCE_C_COMMENT) && 
-						(styler.GetStartSegment() == static_cast<unsigned int>(startPos))))) {
-						styler.ColourTo(i, state);
-						state = SCE_C_DEFAULT;
-					}
+			} else {
+				if (cc.atEOL && (cc.chPrev != '\\')) {
+					cc.SetState(SCE_C_DEFAULT);
 				}
-			} else if (state == SCE_C_COMMENTDOC) {
-				if (ch == '/' && chPrev == '*') {
-					if (((i > styler.GetStartSegment() + 2) || (
-						(initStyle == SCE_C_COMMENTDOC) && 
-						(styler.GetStartSegment() == static_cast<unsigned int>(startPos))))) {
-						styler.ColourTo(i, state);
-						state = SCE_C_DEFAULT;
-					}
+			}
+		} else if (cc.state == SCE_C_COMMENT) {
+			if (cc.Match('*', '/')) {
+				cc.Forward();
+				cc.ForwardSetState(SCE_C_DEFAULT);
+			}
+		} else if (cc.state == SCE_C_COMMENTDOC) {
+			if (cc.Match('*', '/')) {
+				cc.Forward();
+				cc.ForwardSetState(SCE_C_DEFAULT);
+			}
+		} else if (cc.state == SCE_C_COMMENTLINE || cc.state == SCE_C_COMMENTLINEDOC) {
+			if (cc.ch == '\r' || cc.ch == '\n') {
+				cc.SetState(SCE_C_DEFAULT);
+			}
+		} else if (cc.state == SCE_C_STRING) {
+			if (cc.ch == '\\') {
+				if (cc.chNext == '\"' || cc.chNext == '\'' || cc.chNext == '\\') {
+					cc.Forward();
 				}
-			} else if (state == SCE_C_COMMENTLINE) {
-				if (ch == '\r' || ch == '\n') {
-					styler.ColourTo(i-1, state);
-					state = SCE_C_DEFAULT;
+			} else if (cc.ch == '\"') {
+				cc.ForwardSetState(SCE_C_DEFAULT);
+			} else if ((cc.atEOL) && (cc.chPrev != '\\')) {
+				cc.ChangeState(SCE_C_STRINGEOL);
+			}
+		} else if (cc.state == SCE_C_CHARACTER) {
+			if ((cc.ch == '\r' || cc.ch == '\n') && (cc.chPrev != '\\')) {
+				cc.ChangeState(SCE_C_STRINGEOL);
+			} else if (cc.ch == '\\') {
+				if (cc.chNext == '\"' || cc.chNext == '\'' || cc.chNext == '\\') {
+					cc.Forward();
 				}
-			} else if (state == SCE_C_STRING) {
-				if (ch == '\\') {
-					if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
-						i++;
-						ch = chNext;
-						chNext = styler.SafeGetCharAt(i + 1);
-					}
-				} else if (ch == '\"') {
-					styler.ColourTo(i, state);
-					state = SCE_C_DEFAULT;
-				} else if (chNext == '\r' || chNext == '\n') {
-					styler.ColourTo(i-1, SCE_C_STRINGEOL);
-					state = SCE_C_STRINGEOL;
+			} else if (cc.ch == '\'') {
+				cc.ForwardSetState(SCE_C_DEFAULT);
+			}
+		} else if (cc.state == SCE_C_REGEX) {
+			if (cc.ch == '\r' || cc.ch == '\n' || cc.ch == '/') {
+				cc.ForwardSetState(SCE_C_DEFAULT);
+			} else if (cc.ch == '\\') {
+				// Gobble up the quoted character
+				if (cc.chNext == '\\' || cc.chNext == '/') {
+					cc.Forward();
 				}
-			} else if (state == SCE_C_CHARACTER) {
-				if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) {
-					styler.ColourTo(i-1, SCE_C_STRINGEOL);
-					state = SCE_C_STRINGEOL;
-				} else if (ch == '\\') {
-					if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
-						i++;
-						ch = chNext;
-						chNext = styler.SafeGetCharAt(i + 1);
-					}
-				} else if (ch == '\'') {
-					styler.ColourTo(i, state);
-					state = SCE_C_DEFAULT;
+			}
+		} else if (cc.state == SCE_C_VERBATIM) {
+			if (cc.ch == '\"') {
+				if (cc.chNext == '\"') {
+					cc.Forward();
+				} else {
+					cc.ForwardSetState(SCE_C_DEFAULT);
 				}
-			} else if (state == SCE_C_VERBATIM) {
-				if (ch == '\"') {
-					if (chNext == '\"') {
-						i++;
-						ch = chNext;
-						chNext = styler.SafeGetCharAt(i + 1);
-					} else {
-						styler.ColourTo(i, state);
-						state = SCE_C_DEFAULT;
-					}
+			}
+		} else if (cc.state == SCE_C_UUID) {
+			if (cc.ch == '\r' || cc.ch == '\n' || cc.ch == ')') {
+				cc.SetState(SCE_C_DEFAULT);
+			}
+		}
+
+		if (cc.state == SCE_C_DEFAULT) {
+			if (cc.Match('@', '\"')) {
+				cc.SetState(SCE_C_VERBATIM);
+				cc.Forward();
+			} else if (IsADigit(cc.ch) || (cc.ch == '.' && IsADigit(cc.chNext))) {
+				if (lastWordWasUUID) {
+					cc.SetState(SCE_C_UUID);
+					lastWordWasUUID = false;
+				} else {
+					cc.SetState(SCE_C_NUMBER);
 				}
-			} else if (state == SCE_C_UUID) {
-				if (ch == '\r' || ch == '\n' || ch == ')') {
-					styler.ColourTo(i-1, state);
-					if (ch == ')')
-						styler.ColourTo(i, SCE_C_OPERATOR);
-					state = SCE_C_DEFAULT;
+			} else if (IsAWordStart(cc.ch) || (cc.ch == '@')) {
+				if (lastWordWasUUID) {
+					cc.SetState(SCE_C_UUID);
+					lastWordWasUUID = false;
+				} else {
+					cc.SetState(SCE_C_IDENTIFIER);
 				}
+			} else if (cc.Match('/', '*')) {
+				if (cc.Match("/**") || cc.Match("/*!"))	// Support of Qt/Doxygen doc. style
+					cc.SetState(SCE_C_COMMENTDOC);
+				else
+					cc.SetState(SCE_C_COMMENT);
+				cc.Forward();	// Eat the * so it isn't used for the end of the comment
+			} else if (cc.Match('/', '/')) {
+				if (cc.Match("///") || cc.Match("//!"))	// Support of Qt/Doxygen doc. style
+					cc.SetState(SCE_C_COMMENTLINEDOC);
+				else
+					cc.SetState(SCE_C_COMMENTLINE);
+			} else if (cc.ch == '/' && IsOKBeforeRE(chPrevNonWhite)) {
+				cc.SetState(SCE_C_REGEX);
+			} else if (cc.ch == '\"') {
+				cc.SetState(SCE_C_STRING);
+			} else if (cc.ch == '\'') {
+				cc.SetState(SCE_C_CHARACTER);
+			} else if (cc.ch == '#' && visibleChars == 0) {
+				// Preprocessor commands are alone on their line
+				cc.SetState(SCE_C_PREPROCESSOR);
+				// Skip whitespace between # and preprocessor word
+				do {
+					cc.Forward();
+				} while (IsASpace(cc.ch) && cc.More());
+			} else if (isoperator(static_cast<char>(cc.ch))) {
+				cc.SetState(SCE_C_OPERATOR);
 			}
 		}
-		chPrev = ch;
+		if (cc.atEOL) {
+			// Reset states to begining of colourise so no surprises 
+			// if different sets of lines lexed.
+			chPrevNonWhite = ' ';
+			visibleChars = 0;
+			lastWordWasUUID = false;
+		}
+		if (!IsASpace(cc.ch)) {
+			chPrevNonWhite = cc.ch;
+			visibleChars++;
+		}
 	}
-	styler.ColourTo(lengthDoc - 1, state);
+	cc.Complete();
+}
 
-	// Fill in the real level of the next line, keeping the current flags as they will be filled in later
-	if (fold) {
-		int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
-		//styler.SetLevel(lineCurrent, levelCurrent | flagsNext);
-		styler.SetLevel(lineCurrent, levelPrev | flagsNext);
-		
+static void FoldCppDoc(unsigned int startPos, int length, int initStyle, WordList *[],
+                            Accessor &styler) {
+	bool foldComment = styler.GetPropertyInt("fold.comment");
+	bool foldCompact = styler.GetPropertyInt("fold.compact", 1);
+	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[startPos];
+	int styleNext = styler.StyleAt(startPos);
+	int style = initStyle;
+	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 (foldComment &&
+			(style == SCE_C_COMMENT || style == SCE_C_COMMENTDOC)) {
+			if (style != stylePrev) {
+				levelCurrent++;
+			} else if ((style != styleNext) && !atEOL) {
+				// Comments don't end at end of line and the next character may be unstyled.
+				levelCurrent--;
+			}
+		}
+		if (style == SCE_C_OPERATOR) {
+			if (ch == '{') {
+				levelCurrent++;
+			} else if (ch == '}') {
+				levelCurrent--;
+			}
+		}
+		if (atEOL) {
+			int lev = levelPrev;
+			if (visibleChars == 0 && foldCompact)
+				lev |= SC_FOLDLEVELWHITEFLAG;
+			if ((levelCurrent > levelPrev) && (visibleChars > 0))
+				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);
 }
 
-LexerModule lmCPP(SCLEX_CPP, ColouriseCppDoc);
+LexerModule lmCPP(SCLEX_CPP, ColouriseCppDoc, "cpp", FoldCppDoc);
+LexerModule lmTCL(SCLEX_TCL, ColouriseCppDoc, "tcl", FoldCppDoc);
diff --git a/src/stc/scintilla/src/LexConf.cxx b/src/stc/scintilla/src/LexConf.cxx
new file mode 100644
index 0000000000..2dbb65c371
--- /dev/null
+++ b/src/stc/scintilla/src/LexConf.cxx
@@ -0,0 +1,177 @@
+// Scintilla source code edit control
+/** @file LexConf.cxx
+ ** Lexer for Apache Configuration Files.
+ **
+ ** First working version contributed by Ahmad Zawawi <zeus_go64@hotmail.com> on October 28, 2000.
+ ** i created this lexer because i needed something pretty when dealing
+ ** when Apache Configuration files...
+ **/
+// 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"
+
+static void ColouriseConfDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler)
+{
+	int state = SCE_CONF_DEFAULT;
+	char chNext = styler[startPos];
+	int lengthDoc = startPos + length;
+	// create a buffer large enough to take the largest chunk...
+	char *buffer = new char[length];
+	int bufferCount = 0;
+
+	// this assumes that we have 2 keyword list in conf.properties
+	WordList &directives = *keywordLists[0];
+	WordList &params = *keywordLists[1];
+
+	// go through all provided text segment
+	// using the hand-written state machine shown below
+	styler.StartAt(startPos);
+	styler.StartSegment(startPos);
+	for (int i = startPos; i < lengthDoc; i++) {
+		char ch = chNext;
+		chNext = styler.SafeGetCharAt(i + 1);
+
+		if (styler.IsLeadByte(ch)) {
+			chNext = styler.SafeGetCharAt(i + 2);
+			i++;
+			continue;
+		}
+		switch(state) {
+			case SCE_CONF_DEFAULT:
+				if( ch == '\n' || ch == '\r' || ch == '\t' || ch == ' ') {
+					// whitespace is simply ignored here...
+					styler.ColourTo(i,SCE_CONF_DEFAULT);
+					break;
+				} else if( ch == '#' ) {
+					// signals the start of a comment...
+					state = SCE_CONF_COMMENT;
+					styler.ColourTo(i,SCE_CONF_COMMENT);
+				} else if( ch == '.' /*|| ch == '/'*/) {
+					// signals the start of a file...
+					state = SCE_CONF_EXTENSION;
+					styler.ColourTo(i,SCE_CONF_EXTENSION);
+				} else if( ch == '"') {
+					state = SCE_CONF_STRING;
+					styler.ColourTo(i,SCE_CONF_STRING);
+				} else if( ispunct(ch) ) {
+					// signals an operator...
+					// no state jump necessary for this
+					// simple case...
+					styler.ColourTo(i,SCE_CONF_OPERATOR);
+				} else if( isalpha(ch) ) {
+					// signals the start of an identifier
+					bufferCount = 0;
+					buffer[bufferCount++] = static_cast<char>(tolower(ch));
+					state = SCE_CONF_IDENTIFIER;
+				} else if( isdigit(ch) ) {
+					// signals the start of a number
+					bufferCount = 0;
+					buffer[bufferCount++] = ch;
+					//styler.ColourTo(i,SCE_CONF_NUMBER);
+					state = SCE_CONF_NUMBER;
+				} else {
+					// style it the default style..
+					styler.ColourTo(i,SCE_CONF_DEFAULT);
+				}
+				break;
+
+			case SCE_CONF_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_CONF_DEFAULT;
+				} else {
+					styler.ColourTo(i,SCE_CONF_COMMENT);
+				}
+				break;
+
+			case SCE_CONF_EXTENSION:
+				// if we find a non-alphanumeric char,
+				// we simply go to default state
+				// else we're still dealing with an extension...
+				if( isalnum(ch) || (ch == '_') ||
+					(ch == '-') || (ch == '$') ||
+					(ch == '/') || (ch == '.') || (ch == '*') )
+				{
+					styler.ColourTo(i,SCE_CONF_EXTENSION);
+				} else {
+					state = SCE_CONF_DEFAULT;
+					chNext = styler[i--];
+				}
+				break;
+
+			case SCE_CONF_STRING:
+				// if we find the end of a string char, we simply go to default state
+				// else we're still dealing with an string...
+				if( (ch == '"' && styler.SafeGetCharAt(i-1)!='\\') || (ch == '\n') || (ch == '\r') ) {
+					state = SCE_CONF_DEFAULT;
+				}
+				styler.ColourTo(i,SCE_CONF_STRING);
+				break;
+
+			case SCE_CONF_IDENTIFIER:
+				// stay  in CONF_IDENTIFIER state until we find a non-alphanumeric
+				if( isalnum(ch) || (ch == '_') || (ch == '-') || (ch == '/') || (ch == '$') || (ch == '.') || (ch == '*')) {
+					buffer[bufferCount++] = static_cast<char>(tolower(ch));
+				} else {
+					state = SCE_CONF_DEFAULT;
+					buffer[bufferCount] = '\0';
+
+					// check if the buffer contains a keyword, and highlight it if it is a keyword...
+					if(directives.InList(buffer)) {
+						styler.ColourTo(i-1,SCE_CONF_DIRECTIVE );
+					} else if(params.InList(buffer)) {
+						styler.ColourTo(i-1,SCE_CONF_PARAMETER );
+					} else if(strchr(buffer,'/') || strchr(buffer,'.')) {
+						styler.ColourTo(i-1,SCE_CONF_EXTENSION);
+					} else {
+						styler.ColourTo(i-1,SCE_CONF_DEFAULT);
+					}
+
+					// push back the faulty character
+					chNext = styler[i--];
+
+				}
+				break;
+
+			case SCE_CONF_NUMBER:
+				// stay  in CONF_NUMBER state until we find a non-numeric
+				if( isdigit(ch) || ch == '.') {
+					buffer[bufferCount++] = ch;
+				} else {
+					state = SCE_CONF_DEFAULT;
+					buffer[bufferCount] = '\0';
+
+					// Colourize here...
+					if( strchr(buffer,'.') ) {
+						// it is an IP address...
+						styler.ColourTo(i-1,SCE_CONF_IP);
+					} else {
+						// normal number
+						styler.ColourTo(i-1,SCE_CONF_NUMBER);
+					}
+
+					// push back a character
+					chNext = styler[i--];
+				}
+				break;
+
+		}
+	}
+}
+
+LexerModule lmConf(SCLEX_CONF, ColouriseConfDoc, "conf");
diff --git a/src/stc/scintilla/src/LexEiffel.cxx b/src/stc/scintilla/src/LexEiffel.cxx
new file mode 100644
index 0000000000..1296fb2450
--- /dev/null
+++ b/src/stc/scintilla/src/LexEiffel.cxx
@@ -0,0 +1,321 @@
+// Scintilla source code edit control
+/** @file LexEiffel.cxx
+ ** Lexer for Eiffel.
+ **/
+// 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 <stdarg.h>
+#include <stdio.h>
+#include <fcntl.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+inline bool isEiffelOperator(unsigned int ch) {
+	// '.' left out as it is used to make up numbers
+	return ch == '*' || ch == '/' || ch == '\\' || ch == '-' || ch == '+' ||
+	        ch == '(' || ch == ')' || ch == '=' ||
+	        ch == '{' || ch == '}' || ch == '~' ||
+	        ch == '[' || ch == ']' || ch == ';' ||
+	        ch == '<' || ch == '>' || ch == ',' ||
+	        ch == '.' || ch == '^' || ch == '%' || ch == ':' || 
+		ch == '!' || ch == '@' || ch == '?';
+}
+
+static void getRangeLowered(unsigned int start,
+		unsigned int end,
+		Accessor &styler,
+		char *s,
+		unsigned int len) {
+	unsigned int i = 0;
+	while ((i < end - start + 1) && (i < len-1)) {
+		s[i] = static_cast<char>(tolower(styler[start + i]));
+		i++;
+	}
+	s[i] = '\0';
+}
+
+inline bool IsASpace(unsigned int ch) {
+    return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d));
+}
+
+inline bool IsAWordChar(unsigned int  ch) {
+	return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
+}
+
+inline bool IsAWordStart(unsigned int ch) {
+	return (ch < 0x80) && (isalnum(ch) || ch == '_');
+}
+
+inline bool IsADigit(unsigned int ch) {
+	return (ch >= '0') && (ch <= '9');
+}
+
+// All languages handled so far can treat all characters >= 0x80 as one class
+// which just continues the current token or starts an identifier if in default.
+// DBCS treated specially as the second character can be < 0x80 and hence 
+// syntactically significant. UTF-8 avoids this as all trail bytes are >= 0x80
+class xColouriseContext {
+	Accessor &styler;
+	int lengthDoc;
+	int currentPos;
+	xColouriseContext& operator=(const xColouriseContext&) {
+		return *this;
+	}
+public:
+	int state;
+	unsigned int chPrev;
+	unsigned int ch;
+	unsigned int chNext;
+
+	xColouriseContext(unsigned int startPos, int length,
+                        int initStyle, Accessor &styler_) : 
+		styler(styler_),
+		lengthDoc(startPos + length),
+		currentPos(startPos), 
+		state(initStyle), 
+		chPrev(0),
+		ch(0), 
+		chNext(0) {
+		styler.StartAt(startPos);
+		styler.StartSegment(startPos);
+		int pos = currentPos;
+		ch = static_cast<unsigned char>(styler.SafeGetCharAt(pos));
+		if (styler.IsLeadByte(static_cast<char>(ch))) {
+			pos++;
+			ch = ch << 8;
+			ch |= static_cast<unsigned char>(styler.SafeGetCharAt(pos));
+		}
+		chNext = static_cast<unsigned char>(styler.SafeGetCharAt(pos+1));
+		if (styler.IsLeadByte(static_cast<char>(chNext))) {
+			chNext = chNext << 8;
+			chNext |= static_cast<unsigned char>(styler.SafeGetCharAt(pos+2));
+		}
+	}
+	void Complete() {
+		styler.ColourTo(currentPos - 1, state);
+	}
+	bool More() {
+		return currentPos <= lengthDoc;
+	}
+	void Forward() {
+		chPrev = ch;
+		currentPos++;
+		if (ch >= 0x100)
+			currentPos++;
+		ch = chNext;
+		chNext = static_cast<unsigned char>(styler.SafeGetCharAt(currentPos+1));
+		if (styler.IsLeadByte(static_cast<char>(chNext))) {
+			chNext = chNext << 8;
+			chNext |= static_cast<unsigned char>(styler.SafeGetCharAt(currentPos + 2));
+		}
+	}
+	void ChangeState(int state_) {
+		state = state_;
+	}
+	void SetState(int state_) {
+		styler.ColourTo(currentPos - 1, state);
+		state = state_;
+	}
+	void GetCurrentLowered(char *s, int len) {
+		getRangeLowered(styler.GetStartSegment(), currentPos - 1, styler, s, len);
+	}
+};
+
+static void ColouriseEiffelDoc(unsigned int startPos,
+                            int length,
+                            int initStyle,
+                            WordList *keywordlists[],
+                            Accessor &styler) {
+
+	WordList &keywords = *keywordlists[0];
+
+	xColouriseContext lc(startPos, length, initStyle, styler);
+
+	for (; lc.More(); lc.Forward()) {
+
+		if (lc.state == SCE_EIFFEL_STRINGEOL) {
+			if (lc.ch != '\r' && lc.ch != '\n') {
+				lc.SetState(SCE_EIFFEL_DEFAULT);
+			}
+		} else if (lc.state == SCE_EIFFEL_OPERATOR) {
+			lc.SetState(SCE_EIFFEL_DEFAULT);
+		} else if (lc.state == SCE_EIFFEL_WORD) {
+			if (!IsAWordChar(lc.ch)) {
+				char s[100];
+				lc.GetCurrentLowered(s, sizeof(s));
+				if (!keywords.InList(s)) {
+					lc.ChangeState(SCE_EIFFEL_IDENTIFIER);
+				}
+				lc.SetState(SCE_EIFFEL_DEFAULT);
+			}
+		} else if (lc.state == SCE_EIFFEL_NUMBER) {
+			if (!IsAWordChar(lc.ch)) {
+				lc.SetState(SCE_EIFFEL_DEFAULT);
+			}
+		} else if (lc.state == SCE_EIFFEL_COMMENTLINE) {
+			if (lc.ch == '\r' || lc.ch == '\n') {
+				lc.SetState(SCE_EIFFEL_DEFAULT);
+			}
+		} else if (lc.state == SCE_EIFFEL_STRING) {
+			if (lc.ch == '%') {
+				lc.Forward();
+			} else if (lc.ch == '\"') {
+				lc.Forward();
+				lc.SetState(SCE_EIFFEL_DEFAULT);
+			}
+		} else if (lc.state == SCE_EIFFEL_CHARACTER) {
+			if (lc.ch == '\r' || lc.ch == '\n') {
+				lc.SetState(SCE_EIFFEL_STRINGEOL);
+			} else if (lc.ch == '%') {
+				lc.Forward();
+			} else if (lc.ch == '\'') {
+				lc.Forward();
+				lc.SetState(SCE_EIFFEL_DEFAULT);
+			}
+		}
+
+		if (lc.state == SCE_EIFFEL_DEFAULT) {
+			if (lc.ch == '-' && lc.chNext == '-') {
+				lc.SetState(SCE_EIFFEL_COMMENTLINE);
+			} else if (lc.ch == '\"') {
+				lc.SetState(SCE_EIFFEL_STRING);
+			} else if (lc.ch == '\'') {
+				lc.SetState(SCE_EIFFEL_CHARACTER);
+			} else if (IsADigit(lc.ch) || (lc.ch == '.')) {
+				lc.SetState(SCE_EIFFEL_NUMBER);
+			} else if (IsAWordStart(lc.ch)) {
+				lc.SetState(SCE_EIFFEL_WORD);
+			} else if (isEiffelOperator(lc.ch)) {
+				lc.SetState(SCE_EIFFEL_OPERATOR);
+			}
+		}
+	}
+	lc.Complete();
+}
+
+static bool IsEiffelComment(Accessor &styler, int pos, int len) {
+	return len>1 && styler[pos]=='-' && styler[pos+1]=='-';
+}
+
+static void FoldEiffelDocIndent(unsigned int startPos, int length, int,
+						   WordList *[], Accessor &styler) {
+	int lengthDoc = startPos + length;
+
+	// Backtrack to previous line in case need to fix its fold status
+	int lineCurrent = styler.GetLine(startPos);
+	if (startPos > 0) {
+		if (lineCurrent > 0) {
+			lineCurrent--;
+			startPos = styler.LineStart(lineCurrent);
+		}
+	}
+	int spaceFlags = 0;
+	int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsEiffelComment);
+	char chNext = styler[startPos];
+	for (int i = startPos; i < lengthDoc; i++) {
+		char ch = chNext;
+		chNext = styler.SafeGetCharAt(i + 1);
+
+		if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc)) {
+			int lev = indentCurrent;
+			int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsEiffelComment);
+			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, IsEiffelComment);
+					if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) {
+						lev |= SC_FOLDLEVELHEADERFLAG;
+					}
+				}
+			}
+			indentCurrent = indentNext;
+			styler.SetLevel(lineCurrent, lev);
+			lineCurrent++;
+		}
+	}
+}
+
+static void FoldEiffelDocKeyWords(unsigned int startPos, int length, int /* initStyle */, WordList *[],
+                       Accessor &styler) {
+	unsigned int lengthDoc = startPos + length;
+	int visibleChars = 0;
+	int lineCurrent = styler.GetLine(startPos);
+	int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
+	int levelCurrent = levelPrev;
+	char chNext = styler[startPos];
+	int stylePrev = 0;
+	int styleNext = styler.StyleAt(startPos);
+	// lastDeferred should be determined by looking back to last keyword in case
+	// the "deferred" is on a line before "class"
+	bool lastDeferred = false;
+	for (unsigned int i = startPos; i < lengthDoc; i++) {
+		char ch = chNext;
+		chNext = styler.SafeGetCharAt(i + 1);
+		int style = styleNext;
+		styleNext = styler.StyleAt(i + 1);
+		bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
+		if ((stylePrev != SCE_EIFFEL_WORD) && (style == SCE_EIFFEL_WORD)) {
+			char s[20];
+			unsigned int j = 0;
+			while ((j < (sizeof(s) - 1)) && (iswordchar(styler[i + j]))) {
+				s[j] = styler[i + j];
+				j++;
+			}
+			s[j] = '\0';
+
+			if (
+				(strcmp(s, "check") == 0) || 
+				(strcmp(s, "debug") == 0) || 
+				(strcmp(s, "deferred") == 0) || 
+				(strcmp(s, "do") == 0) || 
+				(strcmp(s, "from") == 0) ||
+				(strcmp(s, "if") == 0) ||
+				(strcmp(s, "inspect") == 0) || 
+				(strcmp(s, "once") == 0)
+			)
+				levelCurrent++;
+			if (!lastDeferred && (strcmp(s, "class") == 0))
+				levelCurrent++;
+			if (strcmp(s, "end") == 0) 
+				levelCurrent--;
+			lastDeferred = strcmp(s, "deferred") == 0;
+		}
+
+		if (atEOL) {
+			int lev = levelPrev;
+			if (visibleChars == 0)
+				lev |= SC_FOLDLEVELWHITEFLAG;
+			if ((levelCurrent > levelPrev) && (visibleChars > 0))
+				lev |= SC_FOLDLEVELHEADERFLAG;
+			if (lev != styler.LevelAt(lineCurrent)) {
+				styler.SetLevel(lineCurrent, lev);
+			}
+			lineCurrent++;
+			levelPrev = levelCurrent;
+			visibleChars = 0;
+		}
+		if (!isspacechar(ch))
+			visibleChars++;
+		stylePrev = style;
+	}
+	// 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);
+}
+
+LexerModule lmEiffel(SCLEX_EIFFEL, ColouriseEiffelDoc, "eiffel", FoldEiffelDocIndent);
+LexerModule lmEiffelkw(SCLEX_EIFFELKW, ColouriseEiffelDoc, "eiffelkw", FoldEiffelDocKeyWords);
diff --git a/src/stc/scintilla/src/LexHTML.cxx b/src/stc/scintilla/src/LexHTML.cxx
index 7868b47fc8..c28a432795 100644
--- a/src/stc/scintilla/src/LexHTML.cxx
+++ b/src/stc/scintilla/src/LexHTML.cxx
@@ -1,13 +1,15 @@
-// SciTE - Scintilla based Text Editor
-// LexHTML.cxx - lexer for HTML
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file LexHTML.cxx
+ ** Lexer for HTML.
+ **/
+// 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"
 
@@ -32,6 +34,8 @@ static int segIsScriptingIndicator(Accessor &styler, unsigned int start, unsigne
 		s[i + 1] = '\0';
 	}
 	//Platform::DebugPrintf("Scripting indicator [%s]\n", s);
+	if (strstr(s, "src"))	// External script
+		return eScriptNone;
 	if (strstr(s, "vbs"))
 		return eScriptVBS;
 	if (strstr(s, "pyth"))
@@ -63,7 +67,6 @@ static int PrintScriptingIndicatorOffset(Accessor &styler, unsigned int start, u
 	return iResult;
 }
 
-//static int ScriptOfState(int state,int defaultScript)
 static int ScriptOfState(int state) {
 	int scriptLanguage;
 
@@ -71,7 +74,7 @@ static int ScriptOfState(int state) {
 		scriptLanguage = eScriptPython;
 	} else if ((state >= SCE_HB_START) && (state <= SCE_HB_STRINGEOL)) {
 		scriptLanguage = eScriptVBS;
-	} else if ((state >= SCE_HJ_START) && (state <= SCE_HJ_STRINGEOL)) {
+	} else if ((state >= SCE_HJ_START) && (state <= SCE_HJ_REGEX)) {
 		scriptLanguage = eScriptJS;
 	} else if ((state >= SCE_HPHP_DEFAULT) && (state <= SCE_HPHP_COMMENTLINE)) {
 		scriptLanguage = eScriptPHP;
@@ -90,7 +93,7 @@ static int statePrintForState(int state, int inScriptType) {
 		StateToPrint = state + ((inScriptType == eNonHtmlScript) ? 0 : SCE_HA_PYTHON);
 	} else if ((state >= SCE_HB_START) && (state <= SCE_HB_STRINGEOL)) {
 		StateToPrint = state + ((inScriptType == eNonHtmlScript) ? 0 : SCE_HA_VBS);
-	} else if ((state >= SCE_HJ_START) && (state <= SCE_HJ_STRINGEOL)) {
+	} else if ((state >= SCE_HJ_START) && (state <= SCE_HJ_REGEX)) {
 		StateToPrint = state + ((inScriptType == eNonHtmlScript) ? 0 : SCE_HA_JS);
 	} else {
 		StateToPrint = state;
@@ -106,7 +109,7 @@ static int stateForPrintState(int StateToPrint) {
 		state = StateToPrint - SCE_HA_PYTHON;
 	} else if ((StateToPrint >= SCE_HBA_START) && (StateToPrint <= SCE_HBA_STRINGEOL)) {
 		state = StateToPrint - SCE_HA_VBS;
-	} else if ((StateToPrint >= SCE_HJA_START) && (StateToPrint <= SCE_HJA_STRINGEOL)) {
+	} else if ((StateToPrint >= SCE_HJA_START) && (StateToPrint <= SCE_HJA_REGEX)) {
 		state = StateToPrint - SCE_HA_JS;
 	} else {
 		state = StateToPrint;
@@ -117,7 +120,51 @@ static int stateForPrintState(int StateToPrint) {
 
 static inline bool IsNumber(unsigned int start, Accessor &styler) {
 	return isdigit(styler[start]) || (styler[start] == '.') ||
-	                    (styler[start] == '-') || (styler[start] == '#');
+	       (styler[start] == '-') || (styler[start] == '#');
+}
+
+static inline bool isStringState(int state) {
+	bool bResult;
+
+	switch (state) {
+	case SCE_HJ_DOUBLESTRING:
+	case SCE_HJ_SINGLESTRING:
+	case SCE_HJA_DOUBLESTRING:
+	case SCE_HJA_SINGLESTRING:
+	case SCE_HB_STRING:
+	case SCE_HBA_STRING:
+	case SCE_HP_STRING:
+	case SCE_HPA_STRING:
+	case SCE_HPHP_HSTRING:
+	case SCE_HPHP_SIMPLESTRING:
+		bResult = true;
+		break;
+	default :
+		bResult = false;
+		break;
+	}
+	return bResult;
+}
+
+// not really well done, since it's only comments that should lex the %> and <%
+static inline bool isCommentASPState(int state) {
+	bool bResult;
+
+	switch (state) {
+	case SCE_HJ_COMMENT:
+	case SCE_HJ_COMMENTLINE:
+	case SCE_HJ_COMMENTDOC:
+	case SCE_HB_COMMENTLINE:
+	case SCE_HP_COMMENTLINE:
+	case SCE_HPHP_COMMENT:
+	case SCE_HPHP_COMMENTLINE:
+		bResult = true;
+		break;
+	default :
+		bResult = false;
+		break;
+	}
+	return bResult;
 }
 
 static void classifyAttribHTML(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {
@@ -152,27 +199,28 @@ static int classifyTagHTML(unsigned int start, unsigned int end,
 			s[i++] = static_cast<char>(tolower(ch));
 	}
 	s[i] = '\0';
+	bool isScript = false;
 	char chAttr = SCE_H_TAGUNKNOWN;
 	if (s[0] == '!' && s[1] == '-' && s[2] == '-') {	//Comment
 		chAttr = SCE_H_COMMENT;
 	} else if (strcmp(s, "![cdata[") == 0) {	// In lower case because already converted
 		chAttr = SCE_H_CDATA;
+	} else if (s[0] == '!') {
+		chAttr = SCE_H_SGML;
 	} else if (s[0] == '/') {	// Closing tag
 		if (keywords.InList(s + 1))
 			chAttr = SCE_H_TAG;
 	} else {
 		if (keywords.InList(s)) {
 			chAttr = SCE_H_TAG;
-		}
-		if (0 == strcmp(s, "script")) {
-			chAttr = SCE_H_SCRIPT;
+			isScript = 0 == strcmp(s, "script");
 		}
 	}
 	if ((chAttr == SCE_H_TAGUNKNOWN) && !keywords)
 		// No keywords -> all are known
 		chAttr = SCE_H_TAG;
 	styler.ColourTo(end, chAttr);
-	return chAttr;
+	return isScript ? SCE_H_SCRIPT : chAttr;
 }
 
 static void classifyWordHTJS(unsigned int start, unsigned int end,
@@ -295,6 +343,17 @@ static bool isLineEnd(char ch) {
 	return ch == '\r' || ch == '\n';
 }
 
+static bool isOKBeforeRE(char ch) {
+	return (ch == '(') || (ch == '=') || (ch == ',');
+}
+
+static bool isPHPStringState(int state) {
+	return 
+		(state == SCE_HPHP_HSTRING) ||
+		(state == SCE_HPHP_SIMPLESTRING) ||
+		(state == SCE_HPHP_HSTRING_VARIABLE);
+}
+
 static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
                                   Accessor &styler) {
 
@@ -313,8 +372,9 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 
 	// If inside a tag, it may be a script tag, so reread from the start to ensure any language tags are seen
 	if (InTagState(state)) {
-		while ((startPos > 1) && (InTagState(styler.StyleAt(startPos - 1)))) {
+		while ((startPos > 0) && (InTagState(styler.StyleAt(startPos - 1)))) {
 			startPos--;
+            length++;
 		}
 		state = SCE_H_DEFAULT;
 	}
@@ -324,25 +384,36 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 	int lineCurrent = styler.GetLine(startPos);
 	if (lineCurrent > 0)
 		lineState = styler.GetLineState(lineCurrent);
-	int inScriptType = (lineState >> 0) & 0x03; // 2 bits
-	int defaultScript = (lineState >> 4) & 0x0F; // 4 bits
-	int beforePreProc = (lineState >> 8) & 0xFF; // 8 bits
+	int inScriptType  = (lineState >> 0) & 0x03; // 2 bits of scripting type
+	bool tagOpened    = (lineState >> 2) & 0x01; // 1 bit to know if we are in an opened tag
+	bool tagClosing   = (lineState >> 3) & 0x01; // 1 bit to know if we are in a closing tag
+	int defaultScript = (lineState >> 4) & 0x0F; // 4 bits of script name
+	int beforePreProc = (lineState >> 8) & 0xFF; // 8 bits of state
 
-	//	int scriptLanguage = ScriptOfState(state,defaultScript);
 	int scriptLanguage = ScriptOfState(state);
 
 	bool fold = styler.GetPropertyInt("fold");
+	bool foldHTML = styler.GetPropertyInt("fold.html",0);
+	bool foldCompact = styler.GetPropertyInt("fold.compact",1);
+
+	fold = foldHTML && fold;
+
 	int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
 	int levelCurrent = levelPrev;
-	int visibleChars = 0;
+	int visibleChars;
+
+	visibleChars = 0;
 
 	char chPrev = ' ';
 	char ch = ' ';
+	char chPrevNonWhite = ' ';
 	styler.StartSegment(startPos);
 	int lengthDoc = startPos + length;
 	for (int i = startPos; i < lengthDoc; i++) {
 		char chPrev2 = chPrev;
 		chPrev = ch;
+		if (ch != ' ' && ch != '\t')
+			chPrevNonWhite = ch;
 		ch = styler[i];
 		char chNext = styler.SafeGetCharAt(i + 1);
 		char chNext2 = styler.SafeGetCharAt(i + 2);
@@ -354,40 +425,44 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 			continue;
 		}
 
-		if (fold && !isspace(ch))
+		if ((!isspacechar(ch) || !foldCompact) && fold)
 			visibleChars++;
 
+		// decide what is the current state to print (depending of the script tag)
+		StateToPrint = statePrintForState(state, inScriptType);
+
 		// handle script folding
 		if (fold) {
 			switch (scriptLanguage) {
 			case eScriptJS:
 			case eScriptPHP:
 				//not currently supported				case eScriptVBS:
+
 				if ((state != SCE_HPHP_COMMENT) && (state != SCE_HPHP_COMMENTLINE) && (state != SCE_HJ_COMMENT) && (state != SCE_HJ_COMMENTLINE) && (state != SCE_HJ_COMMENTDOC)) {
-				if ((ch == '{') || (ch == '}')) {
-					levelCurrent += (ch == '{') ? 1 : -1;
+					if ((ch == '{') || (ch == '}')) {
+						levelCurrent += (ch == '{') ? 1 : -1;
 					}
 				}
 				break;
 			case eScriptPython:
 				if (state != SCE_HP_COMMENTLINE) {
-				if ((ch == ':') && ((chNext == '\n') || (chNext == '\r' && chNext2 == '\n'))) {
-					levelCurrent++;
-				} else if ((ch == '\n') && !((chNext == '\r') && (chNext2 == '\n')) && (chNext != '\n')) {
-					// check if the number of tabs is lower than the level
-					int Findlevel = (levelCurrent & ~SC_FOLDLEVELBASE) * 8;
-					for (int j = 0;Findlevel > 0;j++) {
-						char chTmp = styler.SafeGetCharAt(i + j + 1);
-						if (chTmp == '\t') {
-							Findlevel -= 8;
-						}	else if (chTmp == ' ') {
-							Findlevel--;
-						}	else break;
-					}
+					if ((ch == ':') && ((chNext == '\n') || (chNext == '\r' && chNext2 == '\n'))) {
+						levelCurrent++;
+					} else if ((ch == '\n') && !((chNext == '\r') && (chNext2 == '\n')) && (chNext != '\n')) {
+						// check if the number of tabs is lower than the level
+						int Findlevel = (levelCurrent & ~SC_FOLDLEVELBASE) * 8;
+						for (int j = 0;Findlevel > 0;j++) {
+							char chTmp = styler.SafeGetCharAt(i + j + 1);
+							if (chTmp == '\t') {
+								Findlevel -= 8;
+							}	else if (chTmp == ' ') {
+								Findlevel--;
+							}	else break;
+						}
 
-					if (Findlevel > 0) {
-						levelCurrent -= Findlevel / 8;
-						if (Findlevel % 8) levelCurrent--;
+						if (Findlevel > 0) {
+							levelCurrent -= Findlevel / 8;
+							if (Findlevel % 8) levelCurrent--;
 						}
 					}
 				}
@@ -395,9 +470,6 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 			}
 		}
 
-		// decide what is the current state to print (depending of the script tag)
-		StateToPrint = statePrintForState(state, inScriptType);
-
 		if ((ch == '\r' && chNext != '\n') || (ch == '\n')) {
 			// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)
 			// Avoid triggering two times on Dos/Win
@@ -408,13 +480,16 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 					lev |= SC_FOLDLEVELWHITEFLAG;
 				if ((levelCurrent > levelPrev) && (visibleChars > 0))
 					lev |= SC_FOLDLEVELHEADERFLAG;
+
 				styler.SetLevel(lineCurrent, lev);
 				visibleChars = 0;
 				levelPrev = levelCurrent;
 			}
 			lineCurrent++;
 			styler.SetLineState(lineCurrent,
-			                    ((inScriptType & 0x03) << 0) |
+			                    ((inScriptType  & 0x03) << 0) |
+								((tagOpened     & 0x01) << 2) |
+								((tagClosing    & 0x01) << 3) |
 			                    ((defaultScript & 0x0F) << 4) |
 			                    ((beforePreProc & 0xFF) << 8));
 		}
@@ -428,7 +503,9 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 			case SCE_H_SINGLESTRING:
 			case SCE_HJ_COMMENT:
 			case SCE_HJ_COMMENTDOC:
-			case SCE_HJ_COMMENTLINE:
+			// SCE_HJ_COMMENTLINE removed as this is a common thing done to hide
+			// the end of script marker from some JS interpreters.
+			//case SCE_HJ_COMMENTLINE:
 			case SCE_HJ_DOUBLESTRING:
 			case SCE_HJ_SINGLESTRING:
 			case SCE_HB_STRING:
@@ -438,19 +515,24 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 				break;
 			default :
 				// maybe we should check here if it's a tag and if it's SCRIPT
-
 				styler.ColourTo(i - 1, StateToPrint);
 				state = SCE_H_TAGUNKNOWN;
 				inScriptType = eHtml;
 				scriptLanguage = eScriptNone;
 				i += 2;
+				// unfold closing script
+				levelCurrent--;
 				continue;
 			}
 		}
 
 		/////////////////////////////////////
 		// handle the start of PHP pre-processor = Non-HTML
-		else if ((ch == '<') && (chNext == '?')) {
+		else if ((state != SCE_H_ASPAT) && 
+				!isPHPStringState(state) && 
+				(state != SCE_HPHP_COMMENT) && 
+				(ch == '<') && 
+				(chNext == '?')) {
 			styler.ColourTo(i - 1, StateToPrint);
 			beforePreProc = state;
 			scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment() + 2, i + 10, eScriptPHP);
@@ -465,11 +547,17 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 				inScriptType = eNonHtmlScriptPreProc;
 			else
 				inScriptType = eNonHtmlPreProc;
+			// fold whole script
+			levelCurrent++;
+			if (scriptLanguage == eScriptXML)
+				levelCurrent--; // no folding of the XML first tag (all XML-like tags in this case)
+			// should be better
+			ch = styler.SafeGetCharAt(i);
 			continue;
 		}
 
 		// handle the start of ASP pre-processor = Non-HTML
-		else if ((ch == '<') && (chNext == '%')) {
+		else if (!isCommentASPState(state) && (ch == '<') && (chNext == '%')) {
 			styler.ColourTo(i - 1, StateToPrint);
 			beforePreProc = state;
 			if (inScriptType == eNonHtmlScript)
@@ -480,25 +568,40 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 			if (chNext2 == '@') {
 				i += 2; // place as if it was the second next char treated
 				state = SCE_H_ASPAT;
+			} else if ((chNext2 == '-') && (styler.SafeGetCharAt(i + 3) == '-')) {
+				styler.ColourTo(i + 3, SCE_H_ASP);
+				state = SCE_H_XCCOMMENT;
+				scriptLanguage = eScriptVBS;
+				continue;
 			} else {
 				if (chNext2 == '=') {
 					i += 2; // place as if it was the second next char treated
-				}
-				else {
+				} else {
 					i++; // place as if it was the next char treated
 				}
 
-
 				state = StateForScript(defaultScript);
 			}
+			scriptLanguage = eScriptVBS;
 			styler.ColourTo(i, SCE_H_ASP);
+			// fold whole script
+			levelCurrent++;
+			// should be better
+			ch = styler.SafeGetCharAt(i);
 			continue;
 		}
 
 		// handle the end of a pre-processor = Non-HTML
-		else if (((inScriptType == eNonHtmlPreProc) || (inScriptType == eNonHtmlScriptPreProc)) && ((ch == '?') || (ch == '%')) && (chNext == '>')) {
+		else if (
+			((inScriptType == eNonHtmlPreProc)
+				|| (inScriptType == eNonHtmlScriptPreProc)) && (
+				((scriptLanguage == eScriptPHP) && (ch == '?') && !isPHPStringState(state) && (state != SCE_HPHP_COMMENT)) || 
+				((scriptLanguage != eScriptNone) && !isStringState(state) &&
+				 (ch == '%'))
+			) && (chNext == '>')) {
 			if (state == SCE_H_ASPAT) {
-				defaultScript = segIsScriptingIndicator(styler, styler.GetStartSegment(), i - 1, defaultScript);
+				defaultScript = segIsScriptingIndicator(styler,
+					styler.GetStartSegment(), i - 1, defaultScript);
 			}
 			// Bounce out of any ASP mode
 			switch (state) {
@@ -514,6 +617,9 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 			case SCE_HPHP_WORD:
 				classifyWordHTPHP(styler.GetStartSegment(), i - 1, keywords5, styler);
 				break;
+			case SCE_H_XCCOMMENT:
+				styler.ColourTo(i - 1, state);
+				break;
 			default :
 				styler.ColourTo(i - 1, StateToPrint);
 				break;
@@ -531,6 +637,8 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 			else
 				inScriptType = eHtml;
 			scriptLanguage = eScriptNone;
+			// unfold all scripting languages
+			levelCurrent--;
 			continue;
 		}
 		/////////////////////////////////////
@@ -538,10 +646,21 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 		switch (state) {
 		case SCE_H_DEFAULT:
 			if (ch == '<') {
+				// in HTML, fold on tag open and unfold on tag close
+				tagOpened = true;
+				if (chNext == '/') {
+					tagClosing = true;
+				} else {
+					tagClosing = false;
+				}
+
 				styler.ColourTo(i - 1, StateToPrint);
-				if (chNext == '!' && chNext2 == '-' && styler.SafeGetCharAt(i + 3) == '-')
+				if (chNext == '!' && chNext2 == '-' && styler.SafeGetCharAt(i + 3) == '-') {
+					// should be better
+					i += 3;
+					levelCurrent++;
 					state = SCE_H_COMMENT;
-				else
+				} else
 					state = SCE_H_TAGUNKNOWN;
 			} else if (ch == '&') {
 				styler.ColourTo(i - 1, SCE_H_DEFAULT);
@@ -550,14 +669,26 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 			break;
 		case SCE_H_COMMENT:
 			if ((ch == '>') && (chPrev == '-') && (chPrev2 == '-')) {
+				// unfold HTML comment
+				levelCurrent--;
 				styler.ColourTo(i, StateToPrint);
 				state = SCE_H_DEFAULT;
+				tagOpened = false;
 			}
 			break;
 		case SCE_H_CDATA:
 			if ((ch == '>') && (chPrev == ']') && (chPrev2 == ']')) {
 				styler.ColourTo(i, StateToPrint);
 				state = SCE_H_DEFAULT;
+				tagOpened = false;
+			}
+			break;
+		case SCE_H_SGML:
+			if (ch == '>') {
+				levelCurrent--;
+				styler.ColourTo(i, StateToPrint);
+				state = SCE_H_DEFAULT;
+				tagOpened = false;
 			}
 			break;
 		case SCE_H_ENTITY:
@@ -571,7 +702,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 			}
 			break;
 		case SCE_H_TAGUNKNOWN:
-			if (!ishtmlwordchar(ch) && ch != '/' && ch != '-' && ch != '[') {
+			if (!ishtmlwordchar(ch) && !((ch == '/') && (chPrev == '<')) && ch != '[') {
 				int eClass = classifyTagHTML(styler.GetStartSegment(), i - 1, keywords, styler);
 				if (eClass == SCE_H_SCRIPT) {
 					inScriptType = eNonHtmlScript;
@@ -579,17 +710,38 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 					eClass = SCE_H_TAG;
 				}
 				if (ch == '>') {
-					styler.ColourTo(i, SCE_H_TAG);
+					styler.ColourTo(i, eClass);
 					if (inScriptType == eNonHtmlScript) {
 						state = StateForScript(scriptLanguage);
 					} else {
 						state = SCE_H_DEFAULT;
 					}
-				} else {
-					if (eClass == SCE_H_CDATA) {
-						state = SCE_H_CDATA;
+					tagOpened = false;
+					if (tagClosing)
+						levelCurrent--;
+					else
+						levelCurrent++;
+					tagClosing = false;
+			    } else if (ch == '/' && chNext == '>') {
+					if (eClass == SCE_H_TAGUNKNOWN) {
+					    styler.ColourTo(i + 1, SCE_H_TAGUNKNOWN);
 					} else {
-						state = SCE_H_OTHER;
+					    styler.ColourTo(i - 1, StateToPrint);
+					    styler.ColourTo(i + 1, SCE_H_TAGEND);
+					}
+				    i++;
+				    ch = chNext;
+				    state = SCE_H_DEFAULT;
+					tagOpened = false;
+				} else {
+					if (eClass != SCE_H_TAGUNKNOWN) {
+						if (eClass == SCE_H_CDATA) {
+							state = SCE_H_CDATA;
+						} else if (eClass == SCE_H_SGML) {
+							state = SCE_H_SGML;
+						} else {
+							state = SCE_H_OTHER;
+						}
 					}
 				}
 			}
@@ -597,7 +749,10 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 		case SCE_H_ATTRIBUTE:
 			if (!ishtmlwordchar(ch) && ch != '/' && ch != '-') {
 				if (inScriptType == eNonHtmlScript) {
+					int scriptLanguagePrev = scriptLanguage;
 					scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment(), i - 1, scriptLanguage);
+					if ((scriptLanguagePrev != scriptLanguage) && (scriptLanguage == eScriptNone))
+						inScriptType = eHtml;
 				}
 				classifyAttribHTML(styler.GetStartSegment(), i - 1, keywords, styler);
 				if (ch == '>') {
@@ -607,6 +762,12 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 					} else {
 						state = SCE_H_DEFAULT;
 					}
+					tagOpened = false;
+					if (tagClosing)
+						levelCurrent--;
+					else
+						levelCurrent++;
+					tagClosing = false;
 				} else if (ch == '=') {
 					styler.ColourTo(i, SCE_H_OTHER);
 					state = SCE_H_VALUE;
@@ -624,6 +785,12 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 				} else {
 					state = SCE_H_DEFAULT;
 				}
+				tagOpened = false;
+				if (tagClosing)
+					levelCurrent--;
+				else
+					levelCurrent++;
+				tagClosing = false;
 			} else if (ch == '\"') {
 				styler.ColourTo(i - 1, StateToPrint);
 				state = SCE_H_DOUBLESTRING;
@@ -639,6 +806,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 				i++;
 				ch = chNext;
 				state = SCE_H_DEFAULT;
+				tagOpened = false;
 			} else if (ch == '?' && chNext == '>') {
 				styler.ColourTo(i - 1, StateToPrint);
 				styler.ColourTo(i + 1, SCE_H_XMLEND);
@@ -688,6 +856,12 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 						} else {
 							state = SCE_H_DEFAULT;
 						}
+						tagOpened = false;
+						if (tagClosing)
+							levelCurrent--;
+						else
+							levelCurrent++;
+						tagClosing = false;
 					} else {
 						state = SCE_H_OTHER;
 					}
@@ -709,6 +883,9 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 			} else if (ch == '/' && chNext == '/') {
 				styler.ColourTo(i - 1, StateToPrint);
 				state = SCE_HJ_COMMENTLINE;
+			} else if (ch == '/' && isOKBeforeRE(chPrevNonWhite)) {
+				styler.ColourTo(i - 1, StateToPrint);
+				state = SCE_HJ_REGEX;
 			} else if (ch == '\"') {
 				styler.ColourTo(i - 1, StateToPrint);
 				state = SCE_HJ_DOUBLESTRING;
@@ -781,8 +958,6 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 			} else if (ch == '\"') {
 				styler.ColourTo(i, statePrintForState(SCE_HJ_DOUBLESTRING, inScriptType));
 				state = SCE_HJ_DEFAULT;
-				i++;
-				ch = chNext;
 			} else if ((inScriptType == eNonHtmlScript) && (ch == '-') && (chNext == '-') && (chNext2 == '>')) {
 				styler.ColourTo(i - 1, StateToPrint);
 				state = SCE_HJ_COMMENTLINE;
@@ -800,8 +975,6 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 			} else if (ch == '\'') {
 				styler.ColourTo(i, statePrintForState(SCE_HJ_SINGLESTRING, inScriptType));
 				state = SCE_HJ_DEFAULT;
-				i++;
-				ch = chNext;
 			} else if ((inScriptType == eNonHtmlScript) && (ch == '-') && (chNext == '-') && (chNext2 == '>')) {
 				styler.ColourTo(i - 1, StateToPrint);
 				state = SCE_HJ_COMMENTLINE;
@@ -820,6 +993,19 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 				state = SCE_HJ_DEFAULT;
 			}
 			break;
+		case SCE_HJ_REGEX:
+			if (ch == '\r' || ch == '\n' || ch == '/') {
+				styler.ColourTo(i, StateToPrint);
+				state = SCE_HJ_DEFAULT;
+			} else if (ch == '\\') {
+				// Gobble up the quoted character
+				if (chNext == '\\' || chNext == '/') {
+					i++;
+					ch = chNext;
+					chNext = styler.SafeGetCharAt(i + 1);
+				}
+			}
+			break;
 		case SCE_HB_DEFAULT:
 		case SCE_HB_START:
 			if (iswordstart(ch)) {
@@ -837,7 +1023,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 				state = SCE_HB_COMMENTLINE;
 			} else if (isoperator(ch)) {
 				styler.ColourTo(i - 1, StateToPrint);
-				styler.ColourTo(i, SCE_HB_DEFAULT);
+				styler.ColourTo(i, statePrintForState(SCE_HB_DEFAULT, inScriptType));
 				state = SCE_HB_DEFAULT;
 			} else if ((ch == ' ') || (ch == '\t')) {
 				if (state == SCE_HB_START) {
@@ -865,8 +1051,6 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 			if (ch == '\"') {
 				styler.ColourTo(i, StateToPrint);
 				state = SCE_HB_DEFAULT;
-				i++;
-				ch = chNext;
 			} else if (ch == '\r' || ch == '\n') {
 				styler.ColourTo(i - 1, StateToPrint);
 				state = SCE_HB_STRINGEOL;
@@ -1023,6 +1207,8 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 					state = SCE_HPHP_SIMPLESTRING;
 				} else if (ch == '$') {
 					state = SCE_HPHP_VARIABLE;
+				} else if (isoperator(ch)) {
+					state = SCE_HPHP_OPERATOR;
 				} else {
 					state = SCE_HPHP_DEFAULT;
 				}
@@ -1031,13 +1217,19 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 		case SCE_HPHP_NUMBER:
 			if (!isdigit(ch)) {
 				styler.ColourTo(i - 1, SCE_HPHP_NUMBER);
-				state = SCE_HPHP_DEFAULT;
+				if (isoperator(ch)) 
+					state =SCE_HPHP_OPERATOR;
+				else 
+					state = SCE_HPHP_DEFAULT;
 			}
 			break;
 		case SCE_HPHP_VARIABLE:
 			if (!iswordstart(ch)) {
 				styler.ColourTo(i - 1, SCE_HPHP_VARIABLE);
-				state = SCE_HPHP_DEFAULT;
+				if (isoperator(ch)) 
+					state =SCE_HPHP_OPERATOR;
+				else 
+					state = SCE_HPHP_DEFAULT;
 			}
 			break;
 		case SCE_HPHP_COMMENT:
@@ -1054,20 +1246,34 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 			break;
 		case SCE_HPHP_HSTRING:
 			if (ch == '\\') {
-        // skip the next char
-					i++;
+				// skip the next char
+				i++;
+			} else if (ch == '$') {
+				styler.ColourTo(i-1, StateToPrint);
+				state = SCE_HPHP_HSTRING_VARIABLE;
 			} else if (ch == '\"') {
 				styler.ColourTo(i, StateToPrint);
 				state = SCE_HPHP_DEFAULT;
 			}
 			break;
 		case SCE_HPHP_SIMPLESTRING:
-			 if (ch == '\'') {
+			if (ch == '\\') {
+				// skip the next char
+				i++;
+			} else if (ch == '\'') {
 				styler.ColourTo(i, StateToPrint);
 				state = SCE_HPHP_DEFAULT;
 			}
 			break;
-		case SCE_HPHP_DEFAULT:
+		case SCE_HPHP_HSTRING_VARIABLE:
+			if (!iswordstart(ch)) {
+				styler.ColourTo(i-1, StateToPrint);
+				i--; // strange but it works
+				state = SCE_HPHP_HSTRING;
+			}
+			break;
+		case SCE_HPHP_OPERATOR:
+  		case SCE_HPHP_DEFAULT:
 			styler.ColourTo(i - 1, StateToPrint);
 			if (isdigit(ch)) {
 				state = SCE_HPHP_NUMBER;
@@ -1087,15 +1293,20 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 				state = SCE_HPHP_SIMPLESTRING;
 			} else if (ch == '$') {
 				state = SCE_HPHP_VARIABLE;
+			} else if (isoperator(ch)) {
+				state = SCE_HPHP_OPERATOR;
+			} else if ((state == SCE_HPHP_OPERATOR) && (isspacechar(ch))) {
+				state = SCE_HPHP_DEFAULT;
 			}
 			break;
 			///////////// end - PHP state handling
 		}
 
-
-
+		// Some of the above terminated their lexeme but since the same character starts
+		// the same class again, only reenter if non empty segment.
+		bool nonEmptySegment = i >= static_cast<int>(styler.GetStartSegment());
 		if (state == SCE_HB_DEFAULT) {    // One of the above succeeded
-			if (ch == '\"') {
+			if ((ch == '\"') && (nonEmptySegment)) {
 				state = SCE_HB_STRING;
 			} else if (ch == '\'') {
 				state = SCE_HB_COMMENTLINE;
@@ -1105,7 +1316,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 				styler.ColourTo(i, SCE_HB_DEFAULT);
 			}
 		} else if (state == SCE_HBA_DEFAULT) {    // One of the above succeeded
-			if (ch == '\"') {
+			if ((ch == '\"') && (nonEmptySegment)) {
 				state = SCE_HBA_STRING;
 			} else if (ch == '\'') {
 				state = SCE_HBA_COMMENTLINE;
@@ -1122,14 +1333,14 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 					state = SCE_HJ_COMMENT;
 			} else if (ch == '/' && chNext == '/') {
 				state = SCE_HJ_COMMENTLINE;
-			} else if (ch == '\"') {
+			} else if ((ch == '\"') && (nonEmptySegment)) {
 				state = SCE_HJ_DOUBLESTRING;
-			} else if (ch == '\'') {
+			} else if ((ch == '\'')  && (nonEmptySegment)) {
 				state = SCE_HJ_SINGLESTRING;
 			} else if (iswordstart(ch)) {
 				state = SCE_HJ_WORD;
 			} else if (isoperator(ch)) {
-				styler.ColourTo(i, SCE_HJ_SYMBOLS);
+				styler.ColourTo(i, statePrintForState(SCE_HJ_SYMBOLS, inScriptType));
 			}
 		}
 	}
@@ -1140,12 +1351,10 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
 	// Fill in the real level of the next line, keeping the current flags as they will be filled in later
 	if (fold) {
 		int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
-		//styler.SetLevel(lineCurrent, levelCurrent | flagsNext);
 		styler.SetLevel(lineCurrent, levelPrev | flagsNext);
-
 	}
 }
 
-LexerModule lmHTML(SCLEX_HTML, ColouriseHyperTextDoc);
-LexerModule lmXML(SCLEX_XML, ColouriseHyperTextDoc);
+LexerModule lmHTML(SCLEX_HTML, ColouriseHyperTextDoc, "hypertext");
+LexerModule lmXML(SCLEX_XML, ColouriseHyperTextDoc, "xml");
 
diff --git a/src/stc/scintilla/src/LexLisp.cxx b/src/stc/scintilla/src/LexLisp.cxx
new file mode 100644
index 0000000000..623ca7cfa0
--- /dev/null
+++ b/src/stc/scintilla/src/LexLisp.cxx
@@ -0,0 +1,195 @@
+// Scintilla source code edit control
+/** @file LexLisp.cxx
+ ** Lexer for Lisp.
+ ** Written by Alexey Yutkin.
+ **/
+// 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"
+
+
+inline bool isLispoperator(char ch) {
+	if (isascii(ch) && isalnum(ch))
+		return false;
+	if (ch == '\'' || ch == '(' || ch == ')' )
+		return true;
+	return false;
+}
+
+inline bool isLispwordstart(char ch) {
+	return isascii(ch) && ch != ';'  && !isspacechar(ch) && !isLispoperator(ch) &&
+		ch != '\n' && ch != '\r' &&  ch != '\"';
+}
+
+
+static void classifyWordLisp(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {
+	PLATFORM_ASSERT(end >= start);
+	char s[100];
+	unsigned int i;
+	bool digit_flag = true;
+	for (i = 0; (i < end - start + 1) && (i < 99); i++) {
+		s[i] = styler[start + i];
+		s[i + 1] = '\0';
+		if (!isdigit(s[i]) && (s[i] != '.')) digit_flag = false;
+	}
+	char chAttr = SCE_LISP_IDENTIFIER;
+
+	if(digit_flag) chAttr = SCE_LISP_NUMBER;
+	else {
+		if (keywords.InList(s)) {
+			chAttr = SCE_LISP_KEYWORD;
+		}
+	}
+	styler.ColourTo(end, chAttr);
+	return;
+}
+
+
+static void ColouriseLispDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
+                            Accessor &styler) {
+
+	WordList &keywords = *keywordlists[0];
+
+	styler.StartAt(startPos);
+
+	int state = initStyle;
+	if (state == SCE_LISP_STRINGEOL)	// Does not leak onto next line
+		state = SCE_LISP_DEFAULT;
+	char chPrev = ' ';
+	char chNext = styler[startPos];
+	unsigned int lengthDoc = startPos + length;
+	styler.StartSegment(startPos);
+	for (unsigned int i = startPos; i < lengthDoc; i++) {
+		char ch = chNext;
+		chNext = styler.SafeGetCharAt(i + 1);
+
+		bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
+		if (atEOL) {
+			// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)
+			// Avoid triggering two times on Dos/Win
+			// End of line
+			if (state == SCE_LISP_STRINGEOL) {
+				styler.ColourTo(i, state);
+				state = SCE_LISP_DEFAULT;
+			}
+		}
+
+		if (styler.IsLeadByte(ch)) {
+			chNext = styler.SafeGetCharAt(i + 2);
+			chPrev = ' ';
+			i += 1;
+			continue;
+		}
+
+		if (state == SCE_LISP_DEFAULT) {
+			if (isLispwordstart(ch)) {
+				styler.ColourTo(i - 1, state);
+				state = SCE_LISP_IDENTIFIER;
+			} 
+			else if (ch == ';') {
+				styler.ColourTo(i - 1, state);
+				state = SCE_LISP_COMMENT;
+			}
+			else if (isLispoperator(ch) || ch=='\'') {
+				styler.ColourTo(i - 1, state);
+				styler.ColourTo(i, SCE_LISP_OPERATOR);
+			}
+			
+			else if (ch == '\"') {
+					state = SCE_LISP_STRING;
+			}
+		} else if (state == SCE_LISP_IDENTIFIER) {
+			if (!isLispwordstart(ch)) {
+				classifyWordLisp(styler.GetStartSegment(), i - 1, keywords, styler);
+				state = SCE_LISP_DEFAULT;
+			} /*else*/ 
+			if (isLispoperator(ch) || ch=='\'') {
+				styler.ColourTo(i - 1, state);
+				styler.ColourTo(i, SCE_LISP_OPERATOR);
+			}
+			
+		} else {
+			if (state == SCE_LISP_COMMENT) {
+				if (atEOL) {
+					styler.ColourTo(i - 1, state);
+					state = SCE_LISP_DEFAULT;
+				}
+			} else if (state == SCE_LISP_STRING) {
+				if (ch == '\\') {
+					if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
+						i++;
+						ch = chNext;
+						chNext = styler.SafeGetCharAt(i + 1);
+					}
+				} else if (ch == '\"') {
+					styler.ColourTo(i, state);
+					state = SCE_LISP_DEFAULT;
+				} else if ((chNext == '\r' || chNext == '\n') && (chPrev != '\\')) {
+					styler.ColourTo(i - 1, SCE_LISP_STRINGEOL);
+					state = SCE_LISP_STRINGEOL;
+				}
+			}
+		}
+
+		chPrev = ch;
+	}
+	styler.ColourTo(lengthDoc - 1, state);
+}
+
+static void FoldLispDoc(unsigned int startPos, int length, int /* initStyle */, WordList *[],
+                            Accessor &styler) {
+	unsigned int lengthDoc = startPos + length;
+	int visibleChars = 0;
+	int lineCurrent = styler.GetLine(startPos);
+	int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
+	int levelCurrent = levelPrev;
+	char chNext = styler[startPos];
+	int styleNext = styler.StyleAt(startPos);
+	for (unsigned int i = startPos; i < lengthDoc; i++) {
+		char ch = chNext;
+		chNext = styler.SafeGetCharAt(i + 1);
+		int style = styleNext;
+		styleNext = styler.StyleAt(i + 1);
+		bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
+		if (style == SCE_LISP_OPERATOR) {
+			if (ch == '(') {
+				levelCurrent++;
+			} else if (ch == ')') {
+				levelCurrent--;
+			}
+		}
+		if (atEOL) {
+			int lev = levelPrev;
+			if (visibleChars == 0)
+				lev |= SC_FOLDLEVELWHITEFLAG;
+			if ((levelCurrent > levelPrev) && (visibleChars > 0))
+				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);
+}
+
+LexerModule lmLISP(SCLEX_LISP, ColouriseLispDoc, "lisp", FoldLispDoc);
diff --git a/src/stc/scintilla/src/LexLua.cxx b/src/stc/scintilla/src/LexLua.cxx
index e6da7668dd..2791d98ada 100644
--- a/src/stc/scintilla/src/LexLua.cxx
+++ b/src/stc/scintilla/src/LexLua.cxx
@@ -1,5 +1,10 @@
-// LexLua.cxx - lexer for Lua language
-// Written by Paul Winwood 
+// Scintilla source code edit control
+/** @file LexLua.cxx
+ ** Lexer for Lua language.
+ **
+ ** Written by Paul Winwood.
+ ** Folder by Alexey Yutkin.
+ **/
 
 #include <stdlib.h>
 #include <string.h>
@@ -16,283 +21,261 @@
 #include "Scintilla.h"
 #include "SciLexer.h"
 
-static void classifyWordLua(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';
-    }
+inline bool isLuaOperator(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 == ';' ||
+	        ch == '<' || ch == '>' || ch == ',' ||
+	        ch == '.' || ch == '^' || ch == '%' || ch == ':')
+		return true;
+	return false;
+}
+
+static void classifyWordLua(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_LUA_IDENTIFIER;
-    
-    if (wordIsNumber)
-        chAttr = SCE_LUA_NUMBER;
-    else
-    {
-        if (keywords.InList(s))
-        {
-            chAttr = SCE_LUA_WORD;
-        }
-    }
-    styler.ColourTo(end, chAttr);
+	char chAttr = SCE_LUA_IDENTIFIER;
+
+	if (wordIsNumber)
+		chAttr = SCE_LUA_NUMBER;
+	else {
+		if (keywords.InList(s)) {
+			chAttr = SCE_LUA_WORD;
+		}
+	}
+	styler.ColourTo(end, chAttr);
 }
 
-static void ColouriseLuaDoc(unsigned int startPos, 
-                            int          length, 
-                            int          initStyle, 
-                            WordList    *keywordlists[],
-                            Accessor    &styler)
-{
+static void ColouriseLuaDoc(unsigned int startPos,
+                            int length,
+                            int initStyle,
+                            WordList *keywordlists[],
+                            Accessor &styler) {
+
+	WordList &keywords = *keywordlists[0];
 
-    WordList &keywords = *keywordlists[0];
+	styler.StartAt(startPos);
+	styler.GetLine(startPos);
 
-    styler.StartAt(startPos);
-    styler.GetLine(startPos);
+	int state = initStyle;
+	char chPrev = ' ';
+	char chNext = styler[startPos];
+	unsigned int lengthDoc = startPos + length;
+	bool firstChar = true;
 
-    int  state = initStyle;
-    char chPrev = ' ';
-    char chNext = styler[startPos];
-    unsigned int lengthDoc = startPos + length;
-    bool firstChar = true;
-    int  literalString = 0;
+	/* Must initialize the literalString level, if we are inside such a string.
+	 * Note: this isn't enough, because literal strings can be nested,
+	 * we should go back to see at what level we are...
+	 */
+	int literalString = (initStyle == SCE_LUA_LITERALSTRING) ? 1 : 0;
 
-    styler.StartSegment(startPos);
-    for (unsigned int i = startPos; i <= lengthDoc; i++)
-    {
-        char ch = chNext;
-        chNext = styler.SafeGetCharAt(i + 1);
+	styler.StartSegment(startPos);
+	for (unsigned int i = startPos; i <= lengthDoc; i++) {
+		char ch = chNext;
+		chNext = styler.SafeGetCharAt(i + 1);
 
-        if (styler.IsLeadByte(ch))
-        {
-            chNext = styler.SafeGetCharAt(i + 2);
-            chPrev = ' ';
-            i += 1;
-            continue;
-        }
+		if (styler.IsLeadByte(ch)) {
+			chNext = styler.SafeGetCharAt(i + 2);
+			chPrev = ' ';
+			i += 1;
+			continue;
+		}
+
+		if (state == SCE_LUA_STRINGEOL) {
+			if (ch != '\r' && ch != '\n') {
+				styler.ColourTo(i - 1, state);
+				state = SCE_LUA_DEFAULT;
+			}
+		}
+
+		if (state == SCE_LUA_LITERALSTRING && ch == '[' && chNext == '[') {
+			literalString++;
+		} else if (state == SCE_LUA_DEFAULT) {
+			if (ch == '-' && chNext == '-') {
+				styler.ColourTo(i - 1, state);
+				state = SCE_LUA_COMMENTLINE;
+			} else if (ch == '[' && chNext == '[') {
+				state = SCE_LUA_LITERALSTRING;
+				literalString = 1;
+			} else if (ch == '\"') {
+				styler.ColourTo(i - 1, state);
+				state = SCE_LUA_STRING;
+			} else if (ch == '\'') {
+				styler.ColourTo(i - 1, state);
+				state = SCE_LUA_CHARACTER;
+			} else if (ch == '$' && firstChar) {
+				styler.ColourTo(i - 1, state);
+				state = SCE_LUA_PREPROCESSOR;
+			} else if (ch == '#' && firstChar)	// Should be only on the first line of the file! Cannot be tested here
+			{
+				styler.ColourTo(i - 1, state);
+				state = SCE_LUA_COMMENTLINE;
+			} else if (isLuaOperator(ch)) {
+				styler.ColourTo(i - 1, state);
+				styler.ColourTo(i, SCE_LUA_OPERATOR);
+			} else if (iswordstart(ch)) {
+				styler.ColourTo(i - 1, state);
+				state = SCE_LUA_WORD;
+			}
+		} else if (state == SCE_LUA_WORD) {
+			if (!iswordchar(ch)) {
+				classifyWordLua(styler.GetStartSegment(), i - 1, keywords, styler);
+				state = SCE_LUA_DEFAULT;
+				if (ch == '[' && chNext == '[') {
+					literalString = 1;
+					state = SCE_LUA_LITERALSTRING;
+				} else if (ch == '-' && chNext == '-') {
+					state = SCE_LUA_COMMENTLINE;
+				} else if (ch == '\"') {
+					state = SCE_LUA_STRING;
+				} else if (ch == '\'') {
+					state = SCE_LUA_CHARACTER;
+				} else if (ch == '$' && firstChar) {
+					state = SCE_LUA_PREPROCESSOR;
+				} else if (isLuaOperator(ch)) {
+					styler.ColourTo(i, SCE_LUA_OPERATOR);
+				}
+			} else if (ch == '.' && chNext == '.') {
+				classifyWordLua(styler.GetStartSegment(), i - 1, keywords, styler);
+				styler.ColourTo(i, SCE_LUA_OPERATOR);
+				state = SCE_LUA_DEFAULT;
+			}
+		} else {
+			if (state == SCE_LUA_LITERALSTRING) {
+				if (ch == ']' && (chPrev == ']') && (--literalString == 0)) {
+					styler.ColourTo(i, state);
+					state = SCE_LUA_DEFAULT;
+				}
+			} else if (state == SCE_LUA_PREPROCESSOR) {
+				if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) {
+					styler.ColourTo(i - 1, state);
+					state = SCE_LUA_DEFAULT;
+				}
+			} else if (state == SCE_LUA_COMMENTLINE) {
+				if (ch == '\r' || ch == '\n') {
+					styler.ColourTo(i - 1, state);
+					state = SCE_LUA_DEFAULT;
+				}
+			} else if (state == SCE_LUA_STRING) {
+				if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) {
+					styler.ColourTo(i - 1, state);
+					state = SCE_LUA_STRINGEOL;
+				} else if (ch == '\\') {
+					if (chNext == '\"' || chNext == '\\') {
+						i++;
+						ch = chNext;
+						chNext = styler.SafeGetCharAt(i + 1);
+					}
+				} else if (ch == '\"') {
+					styler.ColourTo(i, state);
+					state = SCE_LUA_DEFAULT;
+					i++;
+					ch = chNext;
+					chNext = styler.SafeGetCharAt(i + 1);
+				}
+			} else if (state == SCE_LUA_CHARACTER) {
+				if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) {
+					styler.ColourTo(i - 1, state);
+					state = SCE_LUA_STRINGEOL;
+				} else if (ch == '\\') {
+					if (chNext == '\'' || chNext == '\\') {
+						i++;
+						ch = chNext;
+						chNext = styler.SafeGetCharAt(i + 1);
+					}
+				} else if (ch == '\'') {
+					styler.ColourTo(i, state);
+					state = SCE_LUA_DEFAULT;
+					i++;
+					ch = chNext;
+					chNext = styler.SafeGetCharAt(i + 1);
+				}
+			}
+
+			if (state == SCE_LUA_DEFAULT) {
+				if (ch == '-' && chNext == '-') {
+					state = SCE_LUA_COMMENTLINE;
+				} else if (ch == '\"') {
+					state = SCE_LUA_STRING;
+				} else if (ch == '\'') {
+					state = SCE_LUA_CHARACTER;
+				} else if (ch == '$' && firstChar) {
+					state = SCE_LUA_PREPROCESSOR;
+				} else if (iswordstart(ch)) {
+					state = SCE_LUA_WORD;
+				} else if (isLuaOperator(ch)) {
+					styler.ColourTo(i, SCE_LUA_OPERATOR);
+				}
+			}
+		}
+		chPrev = ch;
+		firstChar = (ch == '\r' || ch == '\n');
+	}
+	styler.ColourTo(lengthDoc - 1, state);
+}
 
-        if (state == SCE_LUA_STRINGEOL)
-        {
-            if (ch != '\r' && ch != '\n')
-            {
-                styler.ColourTo(i-1, state);
-                state = SCE_LUA_DEFAULT;
-            }
-        }
+static void FoldLuaDoc(unsigned int startPos, int length, int /* initStyle */, WordList *[],
+                       Accessor &styler) {
+	unsigned int lengthDoc = startPos + length;
+	int visibleChars = 0;
+	int lineCurrent = styler.GetLine(startPos);
+	int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
+	int levelCurrent = levelPrev;
+	char chNext = styler[startPos];
+	int styleNext = styler.StyleAt(startPos);
+	char s[10];
+	for (unsigned int i = startPos; i < lengthDoc; i++) {
+		char ch = chNext;
+		chNext = styler.SafeGetCharAt(i + 1);
+		int style = styleNext;
+		styleNext = styler.StyleAt(i + 1);
+		bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
+		if (style == SCE_LUA_WORD)
+			if ( ch == 'e' || ch == 't' || ch == 'd' || ch == 'f') {
+				for (unsigned int j = 0; j < 8; j++) {
+					if (!iswordchar(styler[i + j])) break;
+					s[j] = styler[i + j];
+					s[j + 1] = '\0';
+				}
 
-        if (state == SCE_LUA_LITERALSTRING && ch == '[' && chNext == '[')
-        {
-            literalString++;
-        }
-        else
-        if (state == SCE_LUA_DEFAULT)
-        {
-            if (ch == '-' && chNext == '-')
-            {
-                styler.ColourTo(i-1, state);
-                state = SCE_LUA_COMMENTLINE;
-            }
-            else
-            if (ch == '[' && chNext == '[')
-            {
-                state = SCE_LUA_LITERALSTRING;
-                literalString = 1;
-            }
-            else
-            if (iswordstart(ch))
-            {
-                styler.ColourTo(i-1, state);
-                state = SCE_LUA_WORD;
-            }
-            else
-            if (ch == '\"')
-            {
-                styler.ColourTo(i-1, state);
-                state = SCE_LUA_STRING;
-            }
-            else
-            if (ch == '\'')
-            {
-                styler.ColourTo(i-1, state);
-                state = SCE_LUA_CHARACTER;
-            }
-            else
-            if (ch == '$' && firstChar)
-            {
-                styler.ColourTo(i-1, state);
-                state = SCE_LUA_PREPROCESSOR;
-            }
-            else
-            if (isoperator(ch))
-            {
-                styler.ColourTo(i-1, state);
-                styler.ColourTo(i, SCE_LUA_OPERATOR);
-            }
-        }
-        else
-        if (state == SCE_LUA_WORD)
-        {
-            if (!iswordchar(ch))
-            {
-                classifyWordLua(styler.GetStartSegment(), i - 1, keywords, styler);
-                state = SCE_LUA_DEFAULT;
-                if (ch == '[' && chNext == '[')
-                {
-                    literalString = 1;
-                    state = SCE_LUA_LITERALSTRING;
-                }
-                else
-                if (ch == '-' && chNext == '-')
-                {
-                    state = SCE_LUA_COMMENTLINE;
-                }
-                else
-                if (ch == '\"')
-                {
-                    state = SCE_LUA_STRING;
-                }
-                else
-                if (ch == '\'')
-                {
-                    state = SCE_LUA_CHARACTER;
-                }
-                else
-                if (ch == '$' && firstChar)
-                {
-                    state = SCE_LUA_PREPROCESSOR;
-                }
-                else
-                if (isoperator(ch))
-                {
-                    styler.ColourTo(i, SCE_LUA_OPERATOR);
-                }
-            }
-        }
-        else
-        {
-            if (state == SCE_LUA_LITERALSTRING)
-            {
-                if (ch == ']' && (chPrev == ']') && (--literalString == 0))
-                {
-                    styler.ColourTo(i, state);
-                    state = SCE_LUA_DEFAULT;
-                }
-            }
-            else
-            if (state == SCE_LUA_PREPROCESSOR)
-            {
-                if ((ch == '\r' || ch == '\n') && (chPrev != '\\'))
-                {
-                    styler.ColourTo(i-1, state);
-                    state = SCE_LUA_DEFAULT;
-                }
-            }
-            else
-            if (state == SCE_LUA_COMMENTLINE)
-            {
-                if (ch == '\r' || ch == '\n')
-                {
-                    styler.ColourTo(i-1, state);
-                    state = SCE_LUA_DEFAULT;
-                }
-            }
-            else
-            if (state == SCE_LUA_STRING)
-            {
-                if ((ch == '\r' || ch == '\n') && (chPrev != '\\'))
-                {
-                    styler.ColourTo(i-1, state);
-                    state = SCE_LUA_STRINGEOL;
-                }
-                else
-                if (ch == '\\')
-                {
-                    if (chNext == '\"' || chNext == '\\')
-                    {
-                        i++;
-                        ch = chNext;
-                        chNext = styler.SafeGetCharAt(i + 1);
-                    }
-                }
-                else
-                if (ch == '\"')
-                {
-                    styler.ColourTo(i, state);
-                    state = SCE_LUA_DEFAULT;
-                    i++;
-                    ch = chNext;
-                    chNext = styler.SafeGetCharAt(i + 1);
-                }
-            }
-            else
-            if (state == SCE_LUA_CHARACTER)
-            {
-                if ((ch == '\r' || ch == '\n') && (chPrev != '\\'))
-                {
-                    styler.ColourTo(i-1, state);
-                    state = SCE_LUA_STRINGEOL;
-                }
-                else
-                if (ch == '\\')
-                {
-                    if (chNext == '\'' || chNext == '\\')
-                    {
-                        i++;
-                        ch = chNext;
-                        chNext = styler.SafeGetCharAt(i + 1);
-                    }
-                }
-                else
-                if (ch == '\'')
-                {
-                    styler.ColourTo(i, state);
-                    state = SCE_LUA_DEFAULT;
-                    i++;
-                    ch = chNext;
-                    chNext = styler.SafeGetCharAt(i + 1);
-                }
-            }
+				if ((strcmp(s, "then") == 0) || (strcmp(s, "do") == 0)
+				        || (strcmp(s, "function") == 0))
+					levelCurrent++;
+				if (strcmp(s, "end") == 0) levelCurrent--;
+			}
 
-            if (state == SCE_LUA_DEFAULT)
-            {    
-                if (ch == '-' && chNext == '-')
-                {
-                    state = SCE_LUA_COMMENTLINE;
-                }
-                else
-                if (ch == '\"')
-                {
-                    state = SCE_LUA_STRING;
-                }
-                else
-                if (ch == '\'')
-                {
-                    state = SCE_LUA_CHARACTER;
-                }
-                else
-                if (ch == '$' && firstChar)
-                {
-                    state = SCE_LUA_PREPROCESSOR;
-                }
-                else
-                if (iswordstart(ch))
-                {
-                    state = SCE_LUA_WORD;
-                }
-                else
-                if (isoperator(ch))
-                {
-                    styler.ColourTo(i, SCE_LUA_OPERATOR);
-                }
-            }
-        }
-        chPrev = ch;
-        firstChar = (ch == '\r' || ch == '\n');
-    }
-    styler.ColourTo(lengthDoc - 1, state);
+		if (atEOL) {
+			int lev = levelPrev;
+			if (visibleChars == 0)
+				lev |= SC_FOLDLEVELWHITEFLAG;
+			if ((levelCurrent > levelPrev) && (visibleChars > 0))
+				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);
 }
 
-LexerModule lmLua(SCLEX_LUA, ColouriseLuaDoc);
+LexerModule lmLua(SCLEX_LUA, ColouriseLuaDoc, "lua", FoldLuaDoc);
diff --git a/src/stc/scintilla/src/LexOthers.cxx b/src/stc/scintilla/src/LexOthers.cxx
index dd86033687..0814d518c3 100644
--- a/src/stc/scintilla/src/LexOthers.cxx
+++ b/src/stc/scintilla/src/LexOthers.cxx
@@ -1,13 +1,16 @@
-// SciTE - Scintilla based Text Editor
-// LexOthers.cxx - lexers for properties files, batch files, make files and error lists
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file LexOthers.cxx
+ ** Lexers for batch files, diff results, properties files, make files and error lists.
+ ** Also lexer for LaTeX documents.
+ **/
+// 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"
 
@@ -17,36 +20,135 @@
 #include "Scintilla.h"
 #include "SciLexer.h"
 
-static void ColouriseBatchLine(char *lineBuffer, int endLine, Accessor &styler) {
-	if (0 == strncmp(lineBuffer, "REM", 3)) {
-		styler.ColourTo(endLine, 1);
-	} else if (0 == strncmp(lineBuffer, "rem", 3)) {
-		styler.ColourTo(endLine, 1);
-	} else if (0 == strncmp(lineBuffer, "SET", 3)) {
-		styler.ColourTo(endLine, 2);
-	} else if (0 == strncmp(lineBuffer, "set", 3)) {
-		styler.ColourTo(endLine, 2);
-	} else if (lineBuffer[0] == ':') {
-		styler.ColourTo(endLine, 3);
+static void ColouriseBatchLine(
+    char *lineBuffer,
+    unsigned int lengthLine,
+    unsigned int startLine,
+    unsigned int endPos,
+    WordList &keywords,
+    Accessor &styler) {
+
+	unsigned int i = 0;
+	unsigned int state = SCE_BAT_DEFAULT;
+
+	while (isspacechar(lineBuffer[i]) && (i < lengthLine)) {	// Skip initial spaces
+		i++;
+	}
+	if (lineBuffer[i] == '@') {	// Hide command (ECHO OFF)
+		styler.ColourTo(startLine + i, SCE_BAT_HIDE);
+		i++;
+		while (isspacechar(lineBuffer[i]) && (i < lengthLine)) {	// Skip next spaces
+			i++;
+		}
+	}
+	if (lineBuffer[i] == ':') {
+		// Label
+		if (lineBuffer[i + 1] == ':') {
+			// :: is a fake label, similar to REM, see http://content.techweb.com/winmag/columns/explorer/2000/21.htm
+			styler.ColourTo(endPos, SCE_BAT_COMMENT);
+		} else {	// Real label
+			styler.ColourTo(endPos, SCE_BAT_LABEL);
+		}
 	} else {
-		styler.ColourTo(endLine, 0);
+		// Check if initial word is a keyword
+		char wordBuffer[21];
+		unsigned int wbl = 0, offset = i;
+		// Copy word in buffer
+		for (; offset < lengthLine && wbl < 20 &&
+		        !isspacechar(lineBuffer[offset]); wbl++, offset++) {
+			wordBuffer[wbl] = static_cast<char>(tolower(lineBuffer[offset]));
+		}
+		wordBuffer[wbl] = '\0';
+		// Check if it is a comment
+		if (CompareCaseInsensitive(wordBuffer, "rem") == 0) {
+			styler.ColourTo(endPos, SCE_BAT_COMMENT);
+			return ;
+		}
+		// Check if it is in the list
+		if (keywords.InList(wordBuffer)) {
+			styler.ColourTo(startLine + offset - 1, SCE_BAT_WORD);	// Regular keyword
+		} else {
+			// Search end of word (can be a long path)
+			while (offset < lengthLine &&
+			        !isspacechar(lineBuffer[offset])) {
+				offset++;
+			}
+			styler.ColourTo(startLine + offset - 1, SCE_BAT_COMMAND);	// External command / program
+		}
+		// Remainder of the line: colourise the variables.
+
+		while (offset < lengthLine) {
+			if (state == SCE_BAT_DEFAULT && lineBuffer[offset] == '%') {
+				styler.ColourTo(startLine + offset - 1, state);
+				if (isdigit(lineBuffer[offset + 1])) {
+					styler.ColourTo(startLine + offset + 1, SCE_BAT_IDENTIFIER);
+					offset += 2;
+				} else if (lineBuffer[offset + 1] == '%' &&
+				           !isspacechar(lineBuffer[offset + 2])) {
+					// Should be safe, as there is CRLF at the end of the line...
+					styler.ColourTo(startLine + offset + 2, SCE_BAT_IDENTIFIER);
+					offset += 3;
+				} else {
+					state = SCE_BAT_IDENTIFIER;
+				}
+			} else if (state == SCE_BAT_IDENTIFIER && lineBuffer[offset] == '%') {
+				styler.ColourTo(startLine + offset, state);
+				state = SCE_BAT_DEFAULT;
+			} else if (state == SCE_BAT_DEFAULT &&
+			           (lineBuffer[offset] == '*' ||
+			            lineBuffer[offset] == '?' ||
+			            lineBuffer[offset] == '=' ||
+			            lineBuffer[offset] == '<' ||
+			            lineBuffer[offset] == '>' ||
+			            lineBuffer[offset] == '|')) {
+				styler.ColourTo(startLine + offset - 1, state);
+				styler.ColourTo(startLine + offset, SCE_BAT_OPERATOR);
+			}
+			offset++;
+		}
+		//		if (endPos > startLine + offset - 1) {
+		styler.ColourTo(endPos, SCE_BAT_DEFAULT);		// Remainder of line, currently not lexed
+		//		}
 	}
+
 }
+// ToDo: (not necessarily at beginning of line) GOTO, [IF] NOT, ERRORLEVEL
+// IF [NO] (test) (command) -- test is EXIST (filename) | (string1)==(string2) | ERRORLEVEL (number)
+// FOR %%(variable) IN (set) DO (command) -- variable is [a-zA-Z] -- eg for %%X in (*.txt) do type %%X
+// ToDo: %n (parameters), %EnvironmentVariable% colourising
+// ToDo: Colourise = > >> < | "
+
+static void ColouriseBatchDoc(
+    unsigned int startPos,
+    int length,
+    int /*initStyle*/,
+    WordList *keywordlists[],
+    Accessor &styler) {
 
-static void ColouriseBatchDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {
 	char lineBuffer[1024];
+	WordList &keywords = *keywordlists[0];
+
 	styler.StartAt(startPos);
 	styler.StartSegment(startPos);
-	unsigned int linePos = 0;
-	for (unsigned int i = startPos; i < startPos + length; i++) {
+	unsigned int linePos = 0, startLine = startPos;
+	for (unsigned int i = startPos; i <= startPos + length; i++) {
 		lineBuffer[linePos++] = styler[i];
-		if (styler[i] == '\r' || styler[i] == '\n' || (linePos >= sizeof(lineBuffer) - 1)) {
-			ColouriseBatchLine(lineBuffer, i, styler);
+		if (styler[i] == '\r' || styler[i] == '\n' || (linePos >=
+		        sizeof(lineBuffer) - 1)) {
+			// End of line (or of line buffer) met, colourise it
+			if (styler[i + 1] == '\n') {
+				lineBuffer[linePos++] = styler[++i];
+			}
+			lineBuffer[linePos] = '\0';
+			ColouriseBatchLine(lineBuffer, linePos, startLine, i, keywords, styler);
 			linePos = 0;
+			startLine = i + 1;
 		}
 	}
-	if (linePos > 0)
-		ColouriseBatchLine(lineBuffer, startPos + length, styler);
+	if (linePos > 0) {
+		ColouriseBatchLine(lineBuffer, linePos, startLine, startPos + length,
+		                   keywords, styler);
+	}
 }
 
 static void ColouriseDiffLine(char *lineBuffer, int endLine, Accessor &styler) {
@@ -89,25 +191,32 @@ static void ColouriseDiffDoc(unsigned int startPos, int length, int, WordList *[
 		ColouriseDiffLine(lineBuffer, startPos + length, styler);
 }
 
-static void ColourisePropsLine(char *lineBuffer, int lengthLine, int startLine, int endPos, Accessor &styler) {
-	int i = 0;
-	while (isspace(lineBuffer[i]) && (i < lengthLine))	// Skip initial spaces
+static void ColourisePropsLine(
+    char *lineBuffer,
+    unsigned int lengthLine,
+    unsigned int startLine,
+    unsigned int endPos,
+    Accessor &styler) {
+
+	unsigned int i = 0;
+	while (isspacechar(lineBuffer[i]) && (i < lengthLine))	// Skip initial spaces
 		i++;
 	if (lineBuffer[i] == '#' || lineBuffer[i] == '!' || lineBuffer[i] == ';') {
 		styler.ColourTo(endPos, 1);
 	} else if (lineBuffer[i] == '[') {
 		styler.ColourTo(endPos, 2);
 	} else if (lineBuffer[i] == '@') {
-		styler.ColourTo(startLine+i, 4);
+		styler.ColourTo(startLine + i, 4);
 		if (lineBuffer[++i] == '=')
-			styler.ColourTo(startLine+i, 3);
+			styler.ColourTo(startLine + i, 3);
 		styler.ColourTo(endPos, 0);
 	} else {
-		while (lineBuffer[i] != '=' && (i < lengthLine))	// Search the '=' character
+		// Search for the '=' character
+		while (lineBuffer[i] != '=' && (i < lengthLine - 1))
 			i++;
 		if (lineBuffer[i] == '=') {
-			styler.ColourTo(startLine+i-1, 0);
-			styler.ColourTo(startLine+i, 3);
+			styler.ColourTo(startLine + i - 1, 0);
+			styler.ColourTo(startLine + i, 3);
 			styler.ColourTo(endPos, 0);
 		} else {
 			styler.ColourTo(endPos, 0);
@@ -119,31 +228,77 @@ static void ColourisePropsDoc(unsigned int startPos, int length, int, WordList *
 	char lineBuffer[1024];
 	styler.StartAt(startPos);
 	styler.StartSegment(startPos);
-	unsigned int linePos = 0;
-	int startLine = startPos;
+	unsigned int linePos = 0, startLine = startPos;
 	for (unsigned int i = startPos; i <= startPos + length; i++) {
 		lineBuffer[linePos++] = styler[i];
-		if ((styler[i] == '\r' && styler.SafeGetCharAt(i+1) != '\n') || 
-			styler[i] == '\n' || 
-			(linePos >= sizeof(lineBuffer) - 1)) {
+		if ((styler[i] == '\r' && styler.SafeGetCharAt(i + 1) != '\n') ||
+		        styler[i] == '\n' ||
+		        (linePos >= sizeof(lineBuffer) - 1)) {
 			lineBuffer[linePos] = '\0';
 			ColourisePropsLine(lineBuffer, linePos, startLine, i, styler);
 			linePos = 0;
-			startLine = i+1;
+			startLine = i + 1;
 		}
 	}
 	if (linePos > 0)
 		ColourisePropsLine(lineBuffer, linePos, startLine, startPos + length, styler);
 }
 
-static void ColouriseMakeLine(char *lineBuffer, int lengthLine, int endPos, Accessor &styler) {
-	int i = 0;
-	while (isspace(lineBuffer[i]) && (i < lengthLine))
+static void ColouriseMakeLine(
+    char *lineBuffer,
+    unsigned int lengthLine,
+    unsigned int startLine,
+    unsigned int endPos,
+    Accessor &styler) {
+
+	unsigned int i = 0;
+        unsigned int lastNonSpace = 0;
+	unsigned int state = SCE_MAKE_DEFAULT;
+	bool bSpecial = false;
+	// Skip initial spaces
+	while (isspacechar(lineBuffer[i]) && (i < lengthLine)) {
 		i++;
-	if (lineBuffer[i] == '#' || lineBuffer[i] == '!') {
-		styler.ColourTo(endPos, 1);
+	}
+	if (lineBuffer[i] == '#') {	// Comment
+		styler.ColourTo(endPos, SCE_MAKE_COMMENT);
+		return;
+	}
+	if (lineBuffer[i] == '!') {	// Special directive
+		styler.ColourTo(endPos, SCE_MAKE_PREPROCESSOR);
+		return;
+	}
+	while (i < lengthLine) {
+		if (lineBuffer[i] == '$' && lineBuffer[i + 1] == '(') {
+			styler.ColourTo(startLine + i - 1, state);
+			state = SCE_MAKE_IDENTIFIER;
+		} else if (state == SCE_MAKE_IDENTIFIER && lineBuffer[i] == ')') {
+			styler.ColourTo(startLine + i, state);
+			state = SCE_MAKE_DEFAULT;
+		}
+		if (!bSpecial) {
+			if (lineBuffer[i] == ':') {
+				styler.ColourTo(startLine + lastNonSpace, SCE_MAKE_TARGET);
+				styler.ColourTo(startLine + i - 1, SCE_MAKE_DEFAULT);
+				styler.ColourTo(startLine + i, SCE_MAKE_OPERATOR);
+				bSpecial = true;	// Only react to the first ':' of the line
+				state = SCE_MAKE_DEFAULT;
+			} else if (lineBuffer[i] == '=') {
+				styler.ColourTo(startLine + lastNonSpace, SCE_MAKE_IDENTIFIER);
+				styler.ColourTo(startLine + i - 1, SCE_MAKE_DEFAULT);
+				styler.ColourTo(startLine + i, SCE_MAKE_OPERATOR);
+				bSpecial = true;	// Only react to the first '=' of the line
+				state = SCE_MAKE_DEFAULT;
+			}
+		}
+		if (!isspacechar(lineBuffer[i])) {
+			lastNonSpace = i;
+		}
+		i++;
+	}
+	if (state == SCE_MAKE_IDENTIFIER) {
+		styler.ColourTo(endPos, SCE_MAKE_IDEOL);	// Error, variable reference not ended
 	} else {
-		styler.ColourTo(endPos, 0);
+		styler.ColourTo(endPos, SCE_MAKE_DEFAULT);
 	}
 }
 
@@ -151,22 +306,38 @@ static void ColouriseMakeDoc(unsigned int startPos, int length, int, WordList *[
 	char lineBuffer[1024];
 	styler.StartAt(startPos);
 	styler.StartSegment(startPos);
-	unsigned int linePos = 0;
+	unsigned int linePos = 0, startLine = startPos;
 	for (unsigned int i = startPos; i <= startPos + length; i++) {
 		lineBuffer[linePos++] = styler[i];
 		if (styler[i] == '\r' || styler[i] == '\n' || (linePos >= sizeof(lineBuffer) - 1)) {
-			ColouriseMakeLine(lineBuffer, linePos, i, styler);
+			lineBuffer[linePos] = '\0';
+			ColouriseMakeLine(lineBuffer, linePos, startLine, i, styler);
 			linePos = 0;
+			startLine = i + 1;
 		}
 	}
-	if (linePos > 0)
-		ColouriseMakeLine(lineBuffer, linePos, startPos + length, styler);
+	if (linePos > 0) {
+		ColouriseMakeLine(lineBuffer, linePos, startLine, startPos + length, styler);
+	}
 }
 
-static void ColouriseErrorListLine(char *lineBuffer, int lengthLine, int endPos, Accessor &styler) {
+static void ColouriseErrorListLine(
+    char *lineBuffer,
+    unsigned int lengthLine,
+    //		unsigned int startLine,
+    unsigned int endPos,
+    Accessor &styler) {
 	if (lineBuffer[0] == '>') {
 		// Command or return status
 		styler.ColourTo(endPos, SCE_ERR_CMD);
+	} else if (lineBuffer[0] == '!') {
+		styler.ColourTo(endPos, SCE_ERR_DIFF_CHANGED);
+	} else if (lineBuffer[0] == '+') {
+		styler.ColourTo(endPos, SCE_ERR_DIFF_ADDITION);
+	} else if (lineBuffer[0] == '-' && lineBuffer[1] == '-' && lineBuffer[2] == '-') {
+		styler.ColourTo(endPos, SCE_ERR_DIFF_MESSAGE);
+	} else if (lineBuffer[0] == '-') {
+		styler.ColourTo(endPos, SCE_ERR_DIFF_DELETION);
 	} else if (strstr(lineBuffer, "File \"") && strstr(lineBuffer, ", line ")) {
 		styler.ColourTo(endPos, SCE_ERR_PYTHON);
 	} else if (0 == strncmp(lineBuffer, "Error ", strlen("Error "))) {
@@ -175,18 +346,28 @@ static void ColouriseErrorListLine(char *lineBuffer, int lengthLine, int endPos,
 	} else if (0 == strncmp(lineBuffer, "Warning ", strlen("Warning "))) {
 		// Borland warning message
 		styler.ColourTo(endPos, SCE_ERR_BORLAND);
-	} else if (strstr(lineBuffer, " at "  ) && 
-		strstr(lineBuffer, " at "  ) < lineBuffer+lengthLine && 
-		strstr(lineBuffer, " line ") && 
-		strstr(lineBuffer, " line ") < lineBuffer+lengthLine) {
+	} else if (strstr(lineBuffer, "at line " ) &&
+	           strstr(lineBuffer, "at line " ) < lineBuffer + lengthLine &&
+	           strstr(lineBuffer, "file ") &&
+	           strstr(lineBuffer, "file ") < lineBuffer + lengthLine) {
+		// Lua error message
+		styler.ColourTo(endPos, SCE_ERR_LUA);
+	} else if (strstr(lineBuffer, " at " ) &&
+	           strstr(lineBuffer, " at " ) < lineBuffer + lengthLine &&
+	           strstr(lineBuffer, " line ") &&
+	           strstr(lineBuffer, " line ") < lineBuffer + lengthLine) {
 		// perl error message
 		styler.ColourTo(endPos, SCE_ERR_PERL);
+	} else if ((memcmp(lineBuffer, "   at ", 6) == 0) &&
+		strstr(lineBuffer, ":line ")) {
+		// A .NET traceback
+		styler.ColourTo(endPos, SCE_ERR_NET);
 	} else {
 		// Look for <filename>:<line>:message
 		// Look for <filename>(line)message
 		// Look for <filename>(line,pos)message
 		int state = 0;
-		for (int i = 0; i < lengthLine; i++) {
+		for (unsigned int i = 0; i < lengthLine; i++) {
 			if (state == 0 && lineBuffer[i] == ':' && isdigit(lineBuffer[i + 1])) {
 				state = 1;
 			} else if (state == 0 && lineBuffer[i] == '(') {
@@ -240,15 +421,13 @@ static void ColouriseErrorListDoc(unsigned int startPos, int length, int, WordLi
 }
 
 static int isSpecial(char s) {
-
 	return (s == '\\') || (s == ',') || (s == ';') || (s == '\'') || (s == ' ') ||
 	       (s == '\"') || (s == '`') || (s == '^') || (s == '~');
 }
 
 static int isTag(int start, Accessor &styler) {
-
 	char s[6];
-	unsigned int i = 0, e=1;
+	unsigned int i = 0, e = 1;
 	while (i < 5 && e) {
 		s[i] = styler[start + i];
 		i++;
@@ -259,7 +438,7 @@ static int isTag(int start, Accessor &styler) {
 }
 
 static void ColouriseLatexDoc(unsigned int startPos, int length, int initStyle,
-			   WordList *[], Accessor &styler) {
+                              WordList *[], Accessor &styler) {
 
 	styler.StartAt(startPos);
 
@@ -277,75 +456,74 @@ static void ColouriseLatexDoc(unsigned int startPos, int length, int initStyle,
 			i++;
 			continue;
 		}
-		switch(state) {
-			case SCE_L_DEFAULT :
-				switch(ch) {
-					case '\\' :
-						styler.ColourTo(i - 1, state);
-						if (isSpecial(styler[i + 1])) {
-							styler.ColourTo(i + 1, SCE_L_COMMAND);
-							i++;
-							chNext = styler.SafeGetCharAt(i + 1);
-						}		
-						else {
-						    if (isTag(i+1, styler))
-							state = SCE_L_TAG;
-						    else
-						    	state = SCE_L_COMMAND;
-						}
-						break;
-					case '$' :
-						styler.ColourTo(i - 1, state);
-						state = SCE_L_MATH;
-						if (chNext == '$') {
-							i++;
-							chNext = styler.SafeGetCharAt(i + 1);
-						}
-						break;
-					case '%' :
-						styler.ColourTo(i - 1, state);
-						state = SCE_L_COMMENT;
-						break;
-				}
-				break;                          
-			case SCE_L_COMMAND :
-				if (chNext == '[' || chNext == '{' || chNext == '}' || 
-				    chNext == ' ' || chNext == '\r' || chNext == '\n') {
-					styler.ColourTo(i, state);
-					state = SCE_L_DEFAULT;
+		switch (state) {
+		case SCE_L_DEFAULT :
+			switch (ch) {
+			case '\\' :
+				styler.ColourTo(i - 1, state);
+				if (isSpecial(styler[i + 1])) {
+					styler.ColourTo(i + 1, SCE_L_COMMAND);
 					i++;
 					chNext = styler.SafeGetCharAt(i + 1);
-				}
-				break;                                  
-			case SCE_L_TAG :
-				if (ch == '}') {
-					styler.ColourTo(i, state);
-					state = SCE_L_DEFAULT;
+				} else {
+					if (isTag(i + 1, styler))
+						state = SCE_L_TAG;
+					else
+						state = SCE_L_COMMAND;
 				}
 				break;
-			case SCE_L_MATH :
-				if (ch == '$') {
-					if (chNext == '$') {
-						i++;
-						chNext = styler.SafeGetCharAt(i + 1);
-					}
-					styler.ColourTo(i, state);
-					state = SCE_L_DEFAULT;
+			case '$' :
+				styler.ColourTo(i - 1, state);
+				state = SCE_L_MATH;
+				if (chNext == '$') {
+					i++;
+					chNext = styler.SafeGetCharAt(i + 1);
 				}
 				break;
-			case SCE_L_COMMENT :
-				if (ch == '\r' || ch == '\n') {
-					styler.ColourTo(i - 1, state);
-					state = SCE_L_DEFAULT;
+			case '%' :
+				styler.ColourTo(i - 1, state);
+				state = SCE_L_COMMENT;
+				break;
+			}
+			break;
+		case SCE_L_COMMAND :
+			if (chNext == '[' || chNext == '{' || chNext == '}' ||
+			        chNext == ' ' || chNext == '\r' || chNext == '\n') {
+				styler.ColourTo(i, state);
+				state = SCE_L_DEFAULT;
+				i++;
+				chNext = styler.SafeGetCharAt(i + 1);
+			}
+			break;
+		case SCE_L_TAG :
+			if (ch == '}') {
+				styler.ColourTo(i, state);
+				state = SCE_L_DEFAULT;
+			}
+			break;
+		case SCE_L_MATH :
+			if (ch == '$') {
+				if (chNext == '$') {
+					i++;
+					chNext = styler.SafeGetCharAt(i + 1);
 				}
-		}               
+				styler.ColourTo(i, state);
+				state = SCE_L_DEFAULT;
+			}
+			break;
+		case SCE_L_COMMENT :
+			if (ch == '\r' || ch == '\n') {
+				styler.ColourTo(i - 1, state);
+				state = SCE_L_DEFAULT;
+			}
+		}
 	}
 	styler.ColourTo(lengthDoc, state);
 }
 
-LexerModule lmBatch(SCLEX_BATCH, ColouriseBatchDoc);
-LexerModule lmDiff(SCLEX_DIFF, ColouriseDiffDoc);
-LexerModule lmProps(SCLEX_PROPERTIES, ColourisePropsDoc);
-LexerModule lmMake(SCLEX_MAKEFILE, ColouriseMakeDoc);
-LexerModule lmErrorList(SCLEX_ERRORLIST, ColouriseErrorListDoc);
-LexerModule lmLatex(SCLEX_LATEX, ColouriseLatexDoc);
+LexerModule lmBatch(SCLEX_BATCH, ColouriseBatchDoc, "batch");
+LexerModule lmDiff(SCLEX_DIFF, ColouriseDiffDoc, "diff");
+LexerModule lmProps(SCLEX_PROPERTIES, ColourisePropsDoc, "props");
+LexerModule lmMake(SCLEX_MAKEFILE, ColouriseMakeDoc, "makefile");
+LexerModule lmErrorList(SCLEX_ERRORLIST, ColouriseErrorListDoc, "errorlist");
+LexerModule lmLatex(SCLEX_LATEX, ColouriseLatexDoc, "latex");
diff --git a/src/stc/scintilla/src/LexPascal.cxx b/src/stc/scintilla/src/LexPascal.cxx
new file mode 100644
index 0000000000..acc38b52de
--- /dev/null
+++ b/src/stc/scintilla/src/LexPascal.cxx
@@ -0,0 +1,222 @@
+// Scintilla source code edit control
+/** @file LexPascal.cxx
+ ** Lexer for Pascal.
+ ** Written by Laurent le Tynevez
+ **/
+
+#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"
+
+
+static int classifyWordPascal(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {
+	char s[100];
+	for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
+		s[i] = static_cast<char>(tolower(styler[start + i]));
+		s[i + 1] = '\0';
+	}
+	int lev= 0;
+	char chAttr = SCE_C_IDENTIFIER;
+	if (isdigit(s[0]) || (s[0] == '.')){
+		chAttr = SCE_C_NUMBER;
+	}
+	else {
+		if (keywords.InList(s)) {
+			chAttr = SCE_C_WORD;
+			if (strcmp(s, "begin") == 0 || strcmp(s, "object") == 0)
+				lev=1;
+			else if (strcmp(s, "end") == 0)
+				lev=-1;
+		}
+	}
+	styler.ColourTo(end, chAttr);
+	return lev;
+}
+
+static void ColourisePascalDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
+	Accessor &styler) {
+	WordList &keywords = *keywordlists[0];
+
+	styler.StartAt(startPos);
+
+	bool fold = styler.GetPropertyInt("fold");
+	int lineCurrent = styler.GetLine(startPos);
+	int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
+	int levelCurrent = levelPrev;
+
+	int state = initStyle;
+	if (state == SCE_C_STRINGEOL)	// Does not leak onto next line
+		state = SCE_C_DEFAULT;
+	char chPrev = ' ';
+	char chNext = styler[startPos];
+	unsigned int lengthDoc = startPos + length;
+	int visibleChars = 0;
+	styler.StartSegment(startPos);
+	for (unsigned int i = startPos; i < lengthDoc; i++) {
+		char ch = chNext;
+		chNext = styler.SafeGetCharAt(i + 1);
+
+		if ((ch == '\r' && chNext != '\n') || (ch == '\n')) {
+			// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)
+			// Avoid triggering two times on Dos/Win
+			// End of line
+			if (state == SCE_C_STRINGEOL) {
+				styler.ColourTo(i, state);
+				state = SCE_C_DEFAULT;
+			}
+			if (fold) {
+				int lev = levelPrev;
+				if (visibleChars == 0)
+					lev |= SC_FOLDLEVELWHITEFLAG;
+				if ((levelCurrent > levelPrev) && (visibleChars > 0))
+					lev |= SC_FOLDLEVELHEADERFLAG;
+				styler.SetLevel(lineCurrent, lev);
+				lineCurrent++;
+				levelPrev = levelCurrent;
+			}
+			visibleChars = 0;
+		}
+		if (!isspacechar(ch))
+			visibleChars++;
+
+		if (styler.IsLeadByte(ch)) {
+			chNext = styler.SafeGetCharAt(i + 2);
+			chPrev = ' ';
+			i += 1;
+			continue;
+		}
+
+		if (state == SCE_C_DEFAULT) {
+			if (iswordstart(ch) || (ch == '@')) {
+				styler.ColourTo(i-1, state);
+				state = SCE_C_IDENTIFIER;
+			} else if (ch == '{' && chNext != '$' && chNext != '&') {
+				styler.ColourTo(i-1, state);
+				state = SCE_C_COMMENT;
+			} else if (ch == '(' && chNext == '*'
+						&& styler.SafeGetCharAt(i + 2) != '$'
+						&& styler.SafeGetCharAt(i + 2) != '&') {
+				styler.ColourTo(i-1, state);
+				state = SCE_C_COMMENTDOC;
+			} else if (ch == '/' && chNext == '/') {
+				styler.ColourTo(i-1, state);
+				state = SCE_C_COMMENTLINE;
+			} else if (ch == '\"') {
+				styler.ColourTo(i-1, state);
+				state = SCE_C_STRING;
+			} else if (ch == '\'') {
+				styler.ColourTo(i-1, state);
+				state = SCE_C_CHARACTER;
+			} else if (ch == '{' && (chNext == '$' || chNext=='&') && visibleChars == 1) {
+				styler.ColourTo(i-1, state);
+				state = SCE_C_PREPROCESSOR;
+			} else if (isoperator(ch)) {
+				styler.ColourTo(i-1, state);
+				styler.ColourTo(i, SCE_C_OPERATOR);
+
+			}
+		} else if (state == SCE_C_IDENTIFIER) {
+			if (!iswordchar(ch)) {
+				int levelChange = classifyWordPascal(styler.GetStartSegment(), i - 1, keywords, styler);
+				state = SCE_C_DEFAULT;
+				chNext = styler.SafeGetCharAt(i + 1);
+				if (ch == '{' && chNext != '$' && chNext != '&') {
+					state = SCE_C_COMMENT;
+				} else if (ch == '(' && chNext == '*'
+						&& styler.SafeGetCharAt(i + 2) != '$'
+						&& styler.SafeGetCharAt(i + 2) != '&') {
+					styler.ColourTo(i-1, state);
+					state = SCE_C_COMMENTDOC;
+				} else if (ch == '/' && chNext == '/') {
+					state = SCE_C_COMMENTLINE;
+				} else if (ch == '\"') {
+					state = SCE_C_STRING;
+				} else if (ch == '\'') {
+					state = SCE_C_CHARACTER;
+				} else if (isoperator(ch)) {
+					styler.ColourTo(i, SCE_C_OPERATOR);
+				}
+				levelCurrent+=levelChange;
+			}
+		} else {
+			if (state == SCE_C_PREPROCESSOR) {
+				if (ch=='}'){
+					styler.ColourTo(i, state);
+					state = SCE_C_DEFAULT;
+				} else {
+					if ((ch == '\r' || ch == '\n') && !(chPrev == '\\' || chPrev == '\r')) {
+						styler.ColourTo(i-1, state);
+						state = SCE_C_DEFAULT;
+					}
+				}
+			} else if (state == SCE_C_COMMENT) {
+				if (ch == '}' ) {
+					styler.ColourTo(i, state);
+					state = SCE_C_DEFAULT;
+				}
+			} else if (state == SCE_C_COMMENTDOC) {
+				if (ch == ')' && chPrev == '*') {
+					if (((i > styler.GetStartSegment() + 2) || (
+						(initStyle == SCE_C_COMMENTDOC) &&
+						(styler.GetStartSegment() == static_cast<unsigned int>(startPos))))) {
+							styler.ColourTo(i, state);
+							state = SCE_C_DEFAULT;
+					}
+				}
+			} else if (state == SCE_C_COMMENTLINE) {
+				if (ch == '\r' || ch == '\n') {
+					styler.ColourTo(i-1, state);
+					state = SCE_C_DEFAULT;
+				}
+			} else if (state == SCE_C_STRING) {
+				if (ch == '\\') {
+					if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
+						i++;
+						ch = chNext;
+						chNext = styler.SafeGetCharAt(i + 1);
+					}
+				} else if (ch == '\"') {
+					styler.ColourTo(i, state);
+					state = SCE_C_DEFAULT;
+				} else if (chNext == '\r' || chNext == '\n') {
+					styler.ColourTo(i-1, SCE_C_STRINGEOL);
+					state = SCE_C_STRINGEOL;
+				}
+			} else if (state == SCE_C_CHARACTER) {
+				if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) {
+					styler.ColourTo(i-1, SCE_C_STRINGEOL);
+					state = SCE_C_STRINGEOL;
+				} else if (ch == '\\') {
+					if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
+						i++;
+						ch = chNext;
+						chNext = styler.SafeGetCharAt(i + 1);
+					}
+				} else if (ch == '\'') {
+					styler.ColourTo(i, state);
+					state = SCE_C_DEFAULT;
+				}
+			}
+		}
+		chPrev = ch;
+	}
+	styler.ColourTo(lengthDoc - 1, state);
+
+	// Fill in the real level of the next line, keeping the current flags as they will be filled in later
+	if (fold) {
+		int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
+		styler.SetLevel(lineCurrent, levelPrev | flagsNext);
+	}
+}
+
+LexerModule lmPascal(SCLEX_PASCAL, ColourisePascalDoc, "pascal");
diff --git a/src/stc/scintilla/src/LexPerl.cxx b/src/stc/scintilla/src/LexPerl.cxx
index a7186fe552..590d05d2a3 100644
--- a/src/stc/scintilla/src/LexPerl.cxx
+++ b/src/stc/scintilla/src/LexPerl.cxx
@@ -1,13 +1,15 @@
-// SciTE - Scintilla based Text Editor
-// LexPerl.cxx - lexer for subset of Perl
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file LexPerl.cxx
+ ** Lexer for subset of Perl.
+ **/
+// 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"
 
@@ -17,7 +19,18 @@
 #include "Scintilla.h"
 #include "SciLexer.h"
 
-inline bool isPerlOperator(char ch) {
+static inline bool isEOLChar(char ch) {
+	return (ch == '\r') || (ch == '\n');
+}
+
+static bool isSingleCharOp(char ch) {
+	char strCharSet[2];
+	strCharSet[0] = ch;
+	strCharSet[1] = '\0';
+	return (NULL != strstr("rwxoRWXOezsfdlpSbctugkTBMAC", strCharSet));
+}
+
+static inline bool isPerlOperator(char ch) {
 	if (isalnum(ch))
 		return false;
 	// '.' left out as it is used to make up numbers
@@ -49,7 +62,7 @@ static int classifyWordPerl(unsigned int start, unsigned int end, WordList &keyw
 	return chAttr;
 }
 
-static bool isEndVar(char ch) {
+static inline bool isEndVar(char ch) {
 	return !isalnum(ch) && ch != '#' && ch != '$' &&
 	       ch != '_' && ch != '\'';
 }
@@ -85,32 +98,86 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 	// Lexer for perl often has to backtrack to start of current style to determine
 	// which characters are being used as quotes, how deeply nested is the
 	// start position and what the termination string is for here documents
-	
+
 	WordList &keywords = *keywordlists[0];
-	
+
+	class HereDocCls {
+	public:
+		int State;		// 0: '<<' encountered
+		// 1: collect the delimiter
+		// 2: here doc text (lines after the 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
+		HereDocCls() {
+			State = 0;
+			DelimiterLength = 0;
+			Delimiter[0] = '\0';
+		}
+	};
+	HereDocCls HereDoc;	// TODO: FIFO for stacked here-docs
+
+	class QuoteCls {
+		public:
+		int  Rep;
+		int  Count;
+		char Up;
+		char Down;
+		QuoteCls() {
+			this->New(1);
+		}
+		void New(int r) {
+			Rep   = r;
+			Count = 0;
+			Up    = '\0';
+			Down  = '\0';
+		}
+		void Open(char u) {
+			Count++;
+			Up    = u;
+			Down  = opposite(Up);
+		}
+	};
+	QuoteCls Quote;
+
 	char sooked[100];
-	int quotes = 0;
-	char quoteDown = 'd';
-	char quoteUp = 'd';
-	int quoteRep = 1;
 	int sookedpos = 0;
 	bool preferRE = true;
 	sooked[sookedpos] = '\0';
 	int state = initStyle;
-	int lengthDoc = startPos + length;
+	unsigned int lengthDoc = startPos + length;
+
 	// If in a long distance lexical state, seek to the beginning  to find quote characters
-	if (state == SCE_PL_HERE || state == SCE_PL_REGEX || 
-		state == SCE_PL_REGSUBST || state == SCE_PL_LONGQUOTE) {
+	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--;
+		}
+		startPos = styler.LineStart(styler.GetLine(startPos));
+		state = styler.StyleAt(startPos - 1);
+	}
+	if ( state == SCE_PL_STRING_Q
+	|| state == SCE_PL_STRING_QQ
+	|| state == SCE_PL_STRING_QX
+	|| state == SCE_PL_STRING_QR
+	|| state == SCE_PL_STRING_QW
+	|| state == SCE_PL_REGEX
+	|| state == SCE_PL_REGSUBST
+	) {
 		while ((startPos > 1) && (styler.StyleAt(startPos - 1) == state)) {
 			startPos--;
 		}
 		state = SCE_PL_DEFAULT;
 	}
+
 	styler.StartAt(startPos);
 	char chPrev = styler.SafeGetCharAt(startPos - 1);
+	if (startPos == 0)
+		chPrev = '\n';
 	char chNext = styler[startPos];
 	styler.StartSegment(startPos);
-	for (int i = startPos; i < lengthDoc; i++) {
+
+	for (unsigned int i = startPos; i < lengthDoc; i++) {
 		char ch = chNext;
 		chNext = styler.SafeGetCharAt(i + 1);
 		char chNext2 = styler.SafeGetCharAt(i + 2);
@@ -121,41 +188,81 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 			i += 1;
 			continue;
 		}
+		if ((chPrev == '\r' && ch == '\n')) {	// skip on DOS/Windows
+			chPrev = ch;
+			continue;
+		}
+
+		if (HereDoc.State == 1 && isEOLChar(ch)) {
+			// Begin of here-doc (the line after the here-doc delimiter):
+			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.
+					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;
+					}
+				}
+			} else {
+				switch (HereDoc.Quote) {
+				case '\\':
+					state = SCE_PL_HERE_Q ;
+					break;
+				default :
+					state = SCE_PL_HERE_QQ;
+				}
+			}
+		}
 
 		if (state == SCE_PL_DEFAULT) {
 			if (iswordstart(ch)) {
 				styler.ColourTo(i - 1, state);
 				if (ch == 's' && !isalnum(chNext)) {
 					state = SCE_PL_REGSUBST;
-					quotes = 0;
-					quoteUp = '\0';
-					quoteDown = '\0';
-					quoteRep = 2;
+					Quote.New(2);
 				} else if (ch == 'm' && !isalnum(chNext)) {
 					state = SCE_PL_REGEX;
-					quotes = 0;
-					quoteUp = '\0';
-					quoteDown = '\0';
-					quoteRep = 1;
+					Quote.New(1);
+				} else if (ch == 'q' && !isalnum(chNext)) {
+					state = SCE_PL_STRING_Q;
+					Quote.New(1);
+				} else if (ch == 'y' && !isalnum(chNext)) {
+					state = SCE_PL_REGSUBST;
+					Quote.New(2);
 				} else if (ch == 't' && chNext == 'r' && !isalnum(chNext2)) {
 					state = SCE_PL_REGSUBST;
-					quotes = 0;
-					quoteUp = '\0';
-					quoteDown = '\0';
-					quoteRep = 2;
+					Quote.New(2);
 					i++;
 					chNext = chNext2;
 				} else if (ch == 'q' && (chNext == 'q' || chNext == 'r' || chNext == 'w' || chNext == 'x') && !isalnum(chNext2)) {
-					state = SCE_PL_LONGQUOTE;
+					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;
+					else if (chNext == 'w') state = SCE_PL_STRING_QW;
 					i++;
 					chNext = chNext2;
-					quotes = 0;
-					quoteUp = '\0';
-					quoteDown = '\0';
-					quoteRep = 1;
+					Quote.New(1);
 				} else {
 					state = SCE_PL_WORD;
 					preferRE = false;
+					if ((!iswordchar(chNext) && chNext != '\'')
+						|| (chNext == '.' && chNext2 == '.')) {
+						// We need that if length of word == 1!
+						// This test is copied from the SCE_PL_WORD handler.
+						classifyWordPerl(styler.GetStartSegment(), i, keywords, styler);
+						state = SCE_PL_DEFAULT;
+					}
 				}
 			} else if (ch == '#') {
 				styler.ColourTo(i - 1, state);
@@ -163,6 +270,8 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 			} else if (ch == '\"') {
 				styler.ColourTo(i - 1, state);
 				state = SCE_PL_STRING;
+				Quote.New(1);
+				Quote.Open(ch);
 			} else if (ch == '\'') {
 				if (chPrev == '&') {
 					// Archaic call
@@ -170,22 +279,24 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 				} else {
 					styler.ColourTo(i - 1, state);
 					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 == '$') {
 				preferRE = false;
 				styler.ColourTo(i - 1, state);
-				if (isalnum(chNext) || chNext == '#' || chNext == '$' || chNext == '_') {
-					state = SCE_PL_SCALAR;
-				} else if (chNext != '{' && chNext != '[') {
+				if ((chNext == '{') || isspacechar(chNext)) {
 					styler.ColourTo(i, SCE_PL_SCALAR);
-					i++;
-					ch = ' ';
-					chNext = ' ';
 				} else {
-					styler.ColourTo(i, SCE_PL_SCALAR);
+					state = SCE_PL_SCALAR;
+					i++;
+					ch = chNext;
+					chNext = chNext2;
 				}
 			} else if (ch == '@') {
 				preferRE = false;
@@ -204,12 +315,10 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 				styler.ColourTo(i - 1, state);
 				if (isalpha(chNext) || chNext == '#' || chNext == '$' || chNext == '_') {
 					state = SCE_PL_HASH;
-				} else if (chNext != '{' && chNext != '[') {
+				} else if (chNext == '{') {
 					styler.ColourTo(i, SCE_PL_HASH);
-					i++;
-					ch = ' ';
 				} else {
-					styler.ColourTo(i, SCE_PL_HASH);
+					styler.ColourTo(i, SCE_PL_OPERATOR);
 				}
 			} else if (ch == '*') {
 				styler.ColourTo(i - 1, state);
@@ -217,25 +326,29 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 			} else if (ch == '/' && preferRE) {
 				styler.ColourTo(i - 1, state);
 				state = SCE_PL_REGEX;
-				quoteUp = '/';
-				quoteDown = '/';
-				quotes = 1;
-				quoteRep = 1;
+				Quote.New(1);
+				Quote.Open(ch);
 			} else if (ch == '<' && chNext == '<') {
 				styler.ColourTo(i - 1, state);
-				state = SCE_PL_HERE;
-				i++;
-				ch = chNext;
-				chNext = chNext2;
-				quotes = 0;
-				sookedpos = 0;
-				sooked[sookedpos] = '\0';
-			} else if (ch == '=' && (chPrev == '\r' || chPrev == '\n') && isalpha(chNext)) {
+				state = SCE_PL_HERE_DELIM;
+				HereDoc.State = 0;
+			} else if (ch == '='
+			           && isalpha(chNext)
+			           && (isEOLChar(chPrev))) {
 				styler.ColourTo(i - 1, state);
 				state = SCE_PL_POD;
-				quotes = 0;
 				sookedpos = 0;
 				sooked[sookedpos] = '\0';
+			} else if (ch == '-'
+			           && isSingleCharOp(chNext)
+			           && !isalnum((chNext2 = styler.SafeGetCharAt(i+2)))) {
+				styler.ColourTo(i - 1, state);
+				styler.ColourTo(i + 1, SCE_PL_WORD);
+				state = SCE_PL_DEFAULT;
+				preferRE = false;
+				i += 2;
+				ch = chNext2;
+				chNext = chNext2 = styler.SafeGetCharAt(i + 1);
 			} else if (isPerlOperator(ch)) {
 				if (ch == ')' || ch == ']')
 					preferRE = false;
@@ -245,7 +358,10 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 				styler.ColourTo(i, SCE_PL_OPERATOR);
 			}
 		} else if (state == SCE_PL_WORD) {
-			if (!iswordchar(ch) && ch != '\'') {	// Archaic Perl has quotes inside names
+			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;
@@ -253,95 +369,106 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 					styler.ColourTo(i, SCE_PL_DATASECTION);
 					state = SCE_PL_DATASECTION;
 				} else {
-					if (classifyWordPerl(styler.GetStartSegment(), i - 1, keywords, styler) == SCE_PL_WORD)
+					if (classifyWordPerl(styler.GetStartSegment(), i, keywords, styler) == SCE_PL_WORD)
 						preferRE = true;
 					state = SCE_PL_DEFAULT;
-					if (ch == '#') {
-						state = SCE_PL_COMMENTLINE;
-					} else if (ch == '\"') {
-						state = SCE_PL_STRING;
-					} else if (ch == '\'') {
-						state = SCE_PL_CHARACTER;
-					} else if (ch == '<' && chNext == '<') {
-						state = SCE_PL_HERE;
-						quotes = 0;
-						sookedpos = 0;
-						sooked[sookedpos] = '\0';
-					} else if (isPerlOperator(ch)) {
-						if (ch == ')' || ch == ']')
-							preferRE = false;
-						else
-							preferRE = true;
-						styler.ColourTo(i, SCE_PL_OPERATOR);
-						state = SCE_PL_DEFAULT;
-					}
+					ch = ' ';
 				}
 			}
 		} else {
 			if (state == SCE_PL_COMMENTLINE) {
-				if (ch == '\r' || ch == '\n') {
+				if (isEOLChar(ch)) {
 					styler.ColourTo(i - 1, state);
 					state = SCE_PL_DEFAULT;
 				}
-			} else if (state == SCE_PL_HERE) {
-				if ((isalnum(ch) || ch == '_') && quotes < 2) {
-					sooked[sookedpos++] = ch;
-					sooked[sookedpos] = '\0';
-					if (quotes == 0)
-						quotes = 1;
-				} else {
-					quotes++;
-				}
-				if ((quotes > 1) && 
-					(chPrev == '\n' || chPrev == '\r') &&
-					isMatch(styler, lengthDoc, i, sooked)) {
-					i += sookedpos;
-					chNext = styler.SafeGetCharAt(i);
-					if (chNext == '\n' || chNext == '\r') {
-						styler.ColourTo(i - 1, SCE_PL_HERE);
-						state = SCE_PL_DEFAULT;
-					}
-					ch = chNext;
-					chNext = styler.SafeGetCharAt(i + 1);
-				}
-			} else if (state == SCE_PL_STRING) {
-				if (ch == '\\') {
-					if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
+			} else if (state == SCE_PL_HERE_DELIM) {
+				//
+				// From perldata.pod:
+				// ------------------
+				// A line-oriented form of quoting is based on the shell ``here-doc''
+				// syntax.
+				// Following a << you specify a string to terminate the quoted material,
+				// and all lines following the current line down to the terminating
+				// string are the value of the item.
+				// The terminating string may be either an identifier (a word),
+				// or some quoted text.
+				// If quoted, the type of quotes you use determines the treatment of
+				// the text, just as in regular quoting.
+				// An unquoted identifier works like double quotes.
+				// 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.)
+				// The terminating string must appear by itself (unquoted and with no
+				// surrounding whitespace) on the terminating line.
+				//
+				if (HereDoc.State == 0) { // '<<' encountered
+					HereDoc.State = 1;
+					HereDoc.Quote = chNext;
+					HereDoc.Quoted = false;
+					HereDoc.DelimiterLength = 0;
+					HereDoc.Delimiter[HereDoc.DelimiterLength] = '\0';
+					if (chNext == '\'' || chNext == '"' || chNext == '`') { // a quoted here-doc delimiter
 						i++;
 						ch = chNext;
-						chNext = styler.SafeGetCharAt(i + 1);
-					}
-				} else if (ch == '\"') {
-					styler.ColourTo(i, state);
-					state = SCE_PL_DEFAULT;
-					i++;
-					ch = chNext;
-					chNext = styler.SafeGetCharAt(i + 1);
-				}
-			} else if (state == SCE_PL_CHARACTER) {
-				if (ch == '\\') {
-					if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
+						chNext = chNext2;
+						HereDoc.Quoted = true;
+					} else if (chNext == '\\') { // ref?
 						i++;
 						ch = chNext;
-						chNext = styler.SafeGetCharAt(i + 1);
+						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 (HereDoc.State == 1) { // collect the delimiter
+					if (HereDoc.Quoted) { // a quoted here-doc delimiter
+						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++;
+								ch = chNext;
+								chNext = chNext2;
+							}
+							HereDoc.Delimiter[HereDoc.DelimiterLength++] = ch;
+							HereDoc.Delimiter[HereDoc.DelimiterLength] = '\0';
+						}
+					} else { // an unquoted here-doc delimiter
+						if (isalnum(ch) || ch == '_') {
+							HereDoc.Delimiter[HereDoc.DelimiterLength++] = ch;
+							HereDoc.Delimiter[HereDoc.DelimiterLength] = '\0';
+						} else {
+							styler.ColourTo(i - 1, state);
+							state = SCE_PL_DEFAULT;
+						}
+					}
+					if (HereDoc.DelimiterLength >= static_cast<int>(sizeof(HereDoc.Delimiter)) - 1) {
+						styler.ColourTo(i - 1, state);
+						state = SCE_PL_ERROR;
 					}
-				} else if (ch == '\'') {
-					styler.ColourTo(i, state);
-					state = SCE_PL_DEFAULT;
-					i++;
-					ch = chNext;
-					chNext = styler.SafeGetCharAt(i + 1);
 				}
-			} else if (state == SCE_PL_BACKTICKS) {
-				if (ch == '`') {
-					styler.ColourTo(i, state);
-					state = SCE_PL_DEFAULT;
-					i++;
+			} 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)) {
+						styler.ColourTo(i - 1, state);
+						state = SCE_PL_DEFAULT;
+						HereDoc.State = 0;
+					}
 					ch = chNext;
 					chNext = styler.SafeGetCharAt(i + 1);
 				}
 			} else if (state == SCE_PL_POD) {
-				if (ch == '=' && (chPrev == '\r' || chPrev == '\n')) {
+				if (ch == '=' && isEOLChar(chPrev)) {
 					if (isMatch(styler, lengthDoc, i, "=cut")) {
 						styler.ColourTo(i - 1 + 4, state);
 						i += 4;
@@ -352,7 +479,12 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 				}
 			} else if (state == SCE_PL_SCALAR) {
 				if (isEndVar(ch)) {
-					styler.ColourTo(i - 1, state);
+					if (i == (styler.GetStartSegment() + 1)) {
+						// Special variable: $(, $_ etc.
+						styler.ColourTo(i, state);
+					} else {
+						styler.ColourTo(i - 1, state);
+					}
 					state = SCE_PL_DEFAULT;
 				}
 			} else if (state == SCE_PL_ARRAY) {
@@ -370,36 +502,36 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 					styler.ColourTo(i - 1, state);
 					state = SCE_PL_DEFAULT;
 				}
-			} else if (state == SCE_PL_REF) {
-				if (isEndVar(ch)) {
-					styler.ColourTo(i - 1, state);
-					state = SCE_PL_DEFAULT;
-				}
-			} else if (state == SCE_PL_REGEX) {
-				if (!quoteUp && !isspace(ch)) {
-					quoteUp = ch;
-					quoteDown = opposite(ch);
-					quotes++;
+			} else if (state == SCE_PL_REGEX
+				|| state == SCE_PL_STRING_QR
+				) {
+				if (!Quote.Up && !isspacechar(ch)) {
+					Quote.Open(ch);
+				} else if (ch == '\\' && Quote.Up != '\\') {
+					// SG: Is it save to skip *every* escaped char?
+					i++;
+					ch = chNext;
+					chNext = styler.SafeGetCharAt(i + 1);
 				} else {
-					if (ch == quoteDown && chPrev != '\\') {
-						quotes--;
-						if (quotes == 0) {
-							quoteRep--;
-							if (quoteUp == quoteDown) {
-								quotes++;
+					if (ch == Quote.Down /*&& chPrev != '\\'*/) {
+						Quote.Count--;
+						if (Quote.Count == 0) {
+							Quote.Rep--;
+							if (Quote.Up == Quote.Down) {
+								Quote.Count++;
 							}
 						}
 						if (!isalpha(chNext)) {
-							if (quoteRep <= 0) {
+							if (Quote.Rep <= 0) {
 								styler.ColourTo(i, state);
 								state = SCE_PL_DEFAULT;
 								ch = ' ';
 							}
 						}
-					} else if (ch == quoteUp && chPrev != '\\') {
-						quotes++;
+					} else if (ch == Quote.Up /*&& chPrev != '\\'*/) {
+						Quote.Count++;
 					} else if (!isalpha(chNext)) {
-						if (quoteRep <= 0) {
+						if (Quote.Rep <= 0) {
 							styler.ColourTo(i, state);
 							state = SCE_PL_DEFAULT;
 							ch = ' ';
@@ -407,12 +539,15 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 					}
 				}
 			} else if (state == SCE_PL_REGSUBST) {
-				if (!quoteUp && !isspace(ch)) {
-					quoteUp = ch;
-					quoteDown = opposite(ch);
-					quotes++;
+				if (!Quote.Up && !isspacechar(ch)) {
+					Quote.Open(ch);
+				} else if (ch == '\\' && Quote.Up != '\\') {
+					// SG: Is it save to skip *every* escaped char?
+					i++;
+					ch = chNext;
+					chNext = styler.SafeGetCharAt(i + 1);
 				} else {
-					if (quotes == 0 && quoteRep == 1) {
+					if (Quote.Count == 0 && Quote.Rep == 1) {
 						/* We matched something like s(...) or tr{...}
 						* and are looking for the next matcher characters,
 						* which could be either bracketed ({...}) or non-bracketed
@@ -420,68 +555,76 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 						*
 						* Number-signs are problematic.  If they occur after
 						* the close of the first part, treat them like
-						* a quoteUp char, even if they actually start comments.
+						* a Quote.Up char, even if they actually start comments.
 						*
 						* If we find an alnum, we end the regsubst, and punt.
 						*
 						* Eric Promislow   ericp@activestate.com  Aug 9,2000
 						*/
-						if (isspace(ch)) {
+						if (isspacechar(ch)) {
 							// Keep going
-						} else if (isalnum(ch)) {
+						}
+						else if (isalnum(ch)) {
 							styler.ColourTo(i, state);
 							state = SCE_PL_DEFAULT;
 							ch = ' ';
 						} else {
-							quoteUp = ch;
-							quoteDown = opposite(ch);
-							quotes++;
+							Quote.Open(ch);
 						}
-					} else if (ch == quoteDown && chPrev != '\\') {
-						quotes--;
-						if (quotes == 0) {
-							quoteRep--;
+					} else if (ch == Quote.Down /*&& chPrev != '\\'*/) {
+						Quote.Count--;
+						if (Quote.Count == 0) {
+							Quote.Rep--;
 						}
 						if (!isalpha(chNext)) {
-							if (quoteRep <= 0) {
+							if (Quote.Rep <= 0) {
 								styler.ColourTo(i, state);
 								state = SCE_PL_DEFAULT;
 								ch = ' ';
 							}
 						}
-						if (quoteUp == quoteDown) {
-							quotes++;
+						if (Quote.Up == Quote.Down) {
+							Quote.Count++;
 						}
-					} else if (ch == quoteUp && chPrev != '\\') {
-						quotes++;
+					} else if (ch == Quote.Up /*&& chPrev != '\\'*/) {
+						Quote.Count++;
 					} else if (!isalpha(chNext)) {
-						if (quoteRep <= 0) {
+						if (Quote.Rep <= 0) {
 							styler.ColourTo(i, state);
 							state = SCE_PL_DEFAULT;
 							ch = ' ';
 						}
 					}
 				}
-			} else if (state == SCE_PL_LONGQUOTE) {
-				if (!quoteDown && !isspace(ch)) {
-					quoteUp = ch;
-					quoteDown = opposite(quoteUp);
-					quotes++;
-				} else if (ch == quoteDown) {
-					quotes--;
-					if (quotes == 0) {
-						quoteRep--;
-						if (quoteRep <= 0) {
+			} else if (state == SCE_PL_STRING_Q
+				|| state == SCE_PL_STRING_QQ
+				|| state == SCE_PL_STRING_QX
+				|| state == SCE_PL_STRING_QW
+				|| state == SCE_PL_STRING
+				|| state == SCE_PL_CHARACTER
+				|| state == SCE_PL_BACKTICKS
+				) {
+				if (!Quote.Down && !isspacechar(ch)) {
+					Quote.Open(ch);
+				} else if (ch == '\\' && Quote.Up != '\\') {
+					i++;
+					ch = chNext;
+					chNext = styler.SafeGetCharAt(i + 1);
+				} else if (ch == Quote.Down) {
+					Quote.Count--;
+					if (Quote.Count == 0) {
+						Quote.Rep--;
+						if (Quote.Rep <= 0) {
 							styler.ColourTo(i, state);
 							state = SCE_PL_DEFAULT;
 							ch = ' ';
 						}
-						if (quoteUp == quoteDown) {
-							quotes++;
+						if (Quote.Up == Quote.Down) {
+							Quote.Count++;
 						}
 					}
-				} else if (ch == quoteUp) {
-					quotes++;
+				} else if (ch == Quote.Up) {
+					Quote.Count++;
 				}
 			}
 
@@ -490,19 +633,30 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle,
 					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 (isoperator(ch)) {
+				} else if (isPerlOperator(ch)) {
+					if (ch == ')' || ch == ']')
+						preferRE = false;
+					else
+						preferRE = true;
 					styler.ColourTo(i, SCE_PL_OPERATOR);
 				}
 			}
 		}
+		if (state == SCE_PL_ERROR) {
+			break;
+		}
 		chPrev = ch;
 	}
 	styler.ColourTo(lengthDoc, state);
 }
 
-LexerModule lmPerl(SCLEX_PERL, ColourisePerlDoc);
+LexerModule lmPerl(SCLEX_PERL, ColourisePerlDoc, "perl");
diff --git a/src/stc/scintilla/src/LexPython.cxx b/src/stc/scintilla/src/LexPython.cxx
index 492d21c7d9..6669694d1d 100644
--- a/src/stc/scintilla/src/LexPython.cxx
+++ b/src/stc/scintilla/src/LexPython.cxx
@@ -1,13 +1,15 @@
-// SciTE - Scintilla based Text Editor
-// LexPython.cxx - lexer for Python
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file LexPython.cxx
+ ** Lexer for Python.
+ **/
+// 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"
 
@@ -17,6 +19,32 @@
 #include "Scintilla.h"
 #include "SciLexer.h"
 
+/* Returns true if the "as" word that begins at start follows an import statement */
+static bool IsImportAs(unsigned int start, Accessor &styler) {
+	unsigned int i;
+	unsigned int j;
+	char s[10];
+
+	/* Find any import before start but after any statement terminator or quote */
+	i = start;
+	while (i > 0) {
+		char ch = styler[i - 1];
+
+		if (ch == '\n' || ch == '\r' || ch == ';' || ch == '\'' || ch == '"' || ch == '`')
+			break;
+		if (ch == 't' && i > 5) {
+			for (j = 0; j < 6; j++)
+				s[j] = styler[(i - 6) + j];
+			s[j] = '\0';
+			if (strcmp(s, "import") == 0)
+				return true;
+		}
+		i--;
+	}
+
+        return false;
+}
+
 static void ClassifyWordPy(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord) {
 	char s[100];
 	bool wordIsNumber = isdigit(styler[start]);
@@ -33,6 +61,8 @@ static void ClassifyWordPy(unsigned int start, unsigned int end, WordList &keywo
 		chAttr = SCE_P_NUMBER;
 	else if (keywords.InList(s))
 		chAttr = SCE_P_WORD;
+	else if (strcmp(s, "as") == 0 && IsImportAs(start, styler))
+		chAttr = SCE_P_WORD;
 	// make sure that dot-qualifiers inside the word are lexed correct
 	else for (unsigned int i = 0; i < end - start + 1; i++) {
 		if (styler[start + i] == '.') {
@@ -48,50 +78,107 @@ static bool IsPyComment(Accessor &styler, int pos, int len) {
 	return len>0 && styler[pos]=='#';
 }
 
-static void ColourisePyDoc(unsigned int startPos, int length, int initStyle, 
+static bool IsPyStringStart(char ch, char chNext, char chNext2) {
+	if (ch == '\'' || ch == '"')
+		return true;
+	if (ch == 'u' || ch == 'U') {
+		if (chNext == '"' || chNext == '\'')
+			return true;
+		if ((chNext == 'r' || chNext == 'R') && (chNext2 == '"' || chNext2 == '\''))
+			return true;
+	}
+	if ((ch == 'r' || ch == 'R') && (chNext == '"' || chNext == '\''))
+		return true;
+
+	return false;
+}
+
+static bool IsPyWordStart(char ch, char chNext, char chNext2) {
+	return (iswordchar(ch) && !IsPyStringStart(ch, chNext, chNext2));
+}
+
+/* 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 GetPyStringState(Accessor &styler, int i, int *nextIndex) {
+	char ch = styler.SafeGetCharAt(i);
+	char chNext = styler.SafeGetCharAt(i + 1);
+
+	// Advance beyond r, u, or ur prefix, but bail if there are any unexpected chars
+	if (ch == 'r' || ch == 'R') {
+		i++;
+		ch = styler.SafeGetCharAt(i);
+		chNext = styler.SafeGetCharAt(i + 1);
+	}
+	else if (ch == 'u' || ch == 'U') {
+		if (chNext == 'r' || chNext == 'R')
+			i += 2;
+		else
+			i += 1;
+		ch = styler.SafeGetCharAt(i);
+		chNext = styler.SafeGetCharAt(i + 1);
+	}
+
+	if (ch != '"' && ch != '\'') {
+		*nextIndex = i + 1;
+		return SCE_P_DEFAULT;
+	}
+
+	if (ch == chNext && ch == styler.SafeGetCharAt(i + 2)) {
+		*nextIndex = i + 3;
+
+		if (ch == '"')
+			return SCE_P_TRIPLEDOUBLE;
+		else
+			return SCE_P_TRIPLE;
+	} else {
+		*nextIndex = i + 1;
+
+		if (ch == '"')
+			return SCE_P_STRING;
+		else
+			return SCE_P_CHARACTER;
+	}
+}
+
+static void ColourisePyDoc(unsigned int startPos, int length, int initStyle,
 						   WordList *keywordlists[], Accessor &styler) {
 
 	int lengthDoc = startPos + length;
 
-	// Backtrack to previous line in case need to fix its fold status or tab whinging
+	// Backtrack to previous line in case need to fix its tab whinging
 	int lineCurrent = styler.GetLine(startPos);
 	if (startPos > 0) {
 		if (lineCurrent > 0) {
-			lineCurrent--;
-			startPos = styler.LineStart(lineCurrent);
+			startPos = styler.LineStart(lineCurrent-1);
 			if (startPos == 0)
 				initStyle = SCE_P_DEFAULT;
-			else 
+			else
 				initStyle = styler.StyleAt(startPos-1);
 		}
 	}
-	
+
 	// Python uses a different mask because bad indentation is marked by oring with 32
 	styler.StartAt(startPos, 127);
-	
+
 	WordList &keywords = *keywordlists[0];
-	
-	bool fold = styler.GetPropertyInt("fold");
+
 	int whingeLevel = styler.GetPropertyInt("tab.timmy.whinge.level");
 	char prevWord[200];
 	prevWord[0] = '\0';
 	if (length == 0)
 		return ;
-	int spaceFlags = 0;
 
 	int state = initStyle & 31;
 
-	int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsPyComment);
-	if ((state == SCE_P_TRIPLE) || (state == SCE_P_TRIPLEDOUBLE)) 
-		indentCurrent |= SC_FOLDLEVELWHITEFLAG;
-
+	int nextIndex = 0;
 	char chPrev = ' ';
 	char chPrev2 = ' ';
 	char chNext = styler[startPos];
 	styler.StartSegment(startPos);
 	bool atStartLine = true;
+	int spaceFlags = 0;
+	styler.IndentAmount(lineCurrent, &spaceFlags, IsPyComment);
 	for (int i = startPos; i < lengthDoc; i++) {
-	
+
 		if (atStartLine) {
 			char chBad = static_cast<char>(64);
 			char chGood = static_cast<char>(0);
@@ -108,40 +195,19 @@ static void ColourisePyDoc(unsigned int startPos, int length, int initStyle,
 			styler.SetFlags(chFlags, static_cast<char>(state));
 			atStartLine = false;
 		}
-		
+
 		char ch = chNext;
 		chNext = styler.SafeGetCharAt(i + 1);
 		char chNext2 = styler.SafeGetCharAt(i + 2);
-		
+
 		if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc)) {
 			if ((state == SCE_P_DEFAULT) || (state == SCE_P_TRIPLE) || (state == SCE_P_TRIPLEDOUBLE)) {
 				// Perform colourisation of white space and triple quoted strings at end of each line to allow
 				// tab marking to work inside white space and triple quoted strings
 				styler.ColourTo(i, state);
 			}
-
-			int lev = indentCurrent;
-			int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsPyComment);
-			if ((state == SCE_P_TRIPLE) || (state == 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, IsPyComment);
-					if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) {
-						lev |= SC_FOLDLEVELHEADERFLAG;
-					}
-				}
-			}
-			indentCurrent = indentNext;
-			if (fold) {
-				styler.SetLevel(lineCurrent, lev);
-			}
 			lineCurrent++;
+			styler.IndentAmount(lineCurrent, &spaceFlags, IsPyComment);
 			atStartLine = true;
 		}
 
@@ -160,33 +226,20 @@ static void ColourisePyDoc(unsigned int startPos, int length, int initStyle,
 			}
 		}
 		if (state == SCE_P_DEFAULT) {
-			if (iswordstart(ch)) {
+			if (IsPyWordStart(ch, chNext, chNext2)) {
 				styler.ColourTo(i - 1, state);
 				state = SCE_P_WORD;
 			} else if (ch == '#') {
 				styler.ColourTo(i - 1, state);
 				state = chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE;
-			} else if (ch == '\"') {
+			} else if (IsPyStringStart(ch, chNext, chNext2)) {
 				styler.ColourTo(i - 1, state);
-				if (chNext == '\"' && chNext2 == '\"') {
-					i += 2;
-					state = SCE_P_TRIPLEDOUBLE;
+				state = GetPyStringState(styler, i, &nextIndex);
+				if (nextIndex != i + 1) {
+					i = nextIndex - 1;
 					ch = ' ';
 					chPrev = ' ';
 					chNext = styler.SafeGetCharAt(i + 1);
-				} else {
-					state = SCE_P_STRING;
-				}
-			} else if (ch == '\'') {
-				styler.ColourTo(i - 1, state);
-				if (chNext == '\'' && chNext2 == '\'') {
-					i += 2;
-					state = SCE_P_TRIPLE;
-					ch = ' ';
-					chPrev = ' ';
-					chNext = styler.SafeGetCharAt(i + 1);
-				} else {
-					state = SCE_P_CHARACTER;
 				}
 			} else if (isoperator(ch)) {
 				styler.ColourTo(i - 1, state);
@@ -198,25 +251,14 @@ static void ColourisePyDoc(unsigned int startPos, int length, int initStyle,
 				state = SCE_P_DEFAULT;
 				if (ch == '#') {
 					state = chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE;
-				} else if (ch == '\"') {
-					if (chNext == '\"' && chNext2 == '\"') {
-						i += 2;
-						state = SCE_P_TRIPLEDOUBLE;
-						ch = ' ';
-						chPrev = ' ';
-						chNext = styler.SafeGetCharAt(i + 1);
-					} else {
-						state = SCE_P_STRING;
-					}
-				} else if (ch == '\'') {
-					if (chNext == '\'' && chNext2 == '\'') {
-						i += 2;
-						state = SCE_P_TRIPLE;
+				} else if (IsPyStringStart(ch, chNext, chNext2)) {
+					styler.ColourTo(i - 1, state);
+					state = GetPyStringState(styler, i, &nextIndex);
+					if (nextIndex != i + 1) {
+						i = nextIndex - 1;
 						ch = ' ';
 						chPrev = ' ';
 						chNext = styler.SafeGetCharAt(i + 1);
-					} else {
-						state = SCE_P_CHARACTER;
 					}
 				} else if (isoperator(ch)) {
 					styler.ColourTo(i, SCE_P_OPERATOR);
@@ -278,4 +320,131 @@ static void ColourisePyDoc(unsigned int startPos, int length, int initStyle,
 	}
 }
 
-LexerModule lmPython(SCLEX_PYTHON, ColourisePyDoc);
+static bool IsCommentLine(int line, Accessor &styler) {
+	int pos = styler.LineStart(line);
+	int eol_pos = styler.LineStart(line+1) - 1;
+	for (int i = pos; i < eol_pos; i++) {
+		char ch = styler[i];
+		if (ch == '#')
+			return true;
+		else if (ch != ' ' && ch != '\t')
+			return false;
+	}
+	return false;
+}
+
+static bool IsQuoteLine(int line, Accessor &styler) {
+	int style = styler.StyleAt(styler.LineStart(line)) & 31;
+	return ((style == SCE_P_TRIPLE) || (style== SCE_P_TRIPLEDOUBLE));
+}
+
+static void FoldPyDoc(unsigned int startPos, int length, int /*initStyle - unused*/,
+					WordList *[], Accessor &styler) {
+	int maxPos = startPos + length;
+	int maxLines = styler.GetLine(maxPos-1);
+						
+	bool foldComment = styler.GetPropertyInt("fold.comment.python");
+	bool foldQuotes = styler.GetPropertyInt("fold.quotes.python");
+
+	// Backtrack to previous non-blank line so we can determine indent level
+	// for any white space lines (needed esp. within triple quoted strings)
+	// 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)) &&
+			(!IsQuoteLine(lineCurrent, styler)))
+			break;
+	}
+	int indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK;
+	
+	startPos = styler.LineStart(lineCurrent);
+	// Set up initial state
+	int prev_state = SCE_P_DEFAULT & 31;
+	if (lineCurrent >= 1)
+		prev_state = styler.StyleAt(startPos-1) & 31;
+	int prevQuote = foldQuotes && ((prev_state == SCE_P_TRIPLE) || (prev_state == SCE_P_TRIPLEDOUBLE));
+	int prevComment = 0;
+	if (lineCurrent >= 1)
+		prevComment = foldComment && IsCommentLine(lineCurrent - 1, styler);
+
+	// Process all characters to end of requested range or end of any triple quote
+	// or comment that hangs over the end of the range
+	while ((lineCurrent <= maxLines) || prevQuote || prevComment) {
+
+		// Gather info
+		int lev = indentCurrent;
+		int lineNext = lineCurrent + 1;
+		int style = styler.StyleAt(styler.LineStart(lineNext)) & 31;
+		int indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);
+		int quote = foldQuotes && ((style == SCE_P_TRIPLE) || (style== SCE_P_TRIPLEDOUBLE));
+		int quote_start = (quote && !prevQuote);
+		int quote_continue = (quote && prevQuote);
+		int comment = foldComment && IsCommentLine(lineCurrent, styler);
+		int comment_start = (comment && !prevComment && 
+			IsCommentLine(lineNext, styler) && (lev > SC_FOLDLEVELBASE));
+		int comment_continue = (comment && prevComment);
+		if ((!quote || !prevQuote) && !comment)
+			indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK;
+		if (quote)
+			indentNext = indentCurrentLevel;
+		if (indentNext & SC_FOLDLEVELWHITEFLAG)
+			indentNext = SC_FOLDLEVELWHITEFLAG | indentCurrentLevel;
+
+		if (quote_start) {
+			// Place fold point at start of triple quoted string
+			lev |= SC_FOLDLEVELHEADERFLAG;
+		} else if (quote_continue || prevQuote) {
+			// Add level to rest of lines in the string
+			lev = lev + 1;
+		} else 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
+		// starting in column 0 which effectively folds them into surrounding code
+		// rather than screwing up folding.  Then set indent level on the lines
+		// we skipped to be same as maximum of current and next indent.  This approach
+		// does a reasonable job of collapsing white space into surrounding code
+		// without getting confused by white space at the start of an indented level.
+		while (!quote &&
+		       ((indentNext & SC_FOLDLEVELWHITEFLAG) || styler[styler.LineStart(lineNext)] == '#') &&
+		       (lineNext < maxLines)) {
+			int level = Platform::Maximum(indentCurrent, indentNext);
+			if (indentNext & SC_FOLDLEVELWHITEFLAG)
+				level = SC_FOLDLEVELWHITEFLAG | indentCurrentLevel;
+			styler.SetLevel(lineNext, level);
+			lineNext++;
+			indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);
+		}
+
+		// Set fold header on non-quote/non-comment line
+		if (!quote && !comment && !(indentCurrent & SC_FOLDLEVELWHITEFLAG) ) {
+			if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK))
+				lev |= SC_FOLDLEVELHEADERFLAG;
+		}
+
+		// Keep track of triple quote and block comment state of previous line
+		prevQuote = quote;
+		prevComment = comment_start || comment_continue;
+
+		// Set fold level for this line and move to next line
+		styler.SetLevel(lineCurrent, lev);
+		indentCurrent = indentNext;
+		lineCurrent = lineNext;
+	}
+
+	// Make sure last line indent level is set too
+	styler.SetLevel(lineCurrent, indentCurrent);
+}
+
+LexerModule lmPython(SCLEX_PYTHON, ColourisePyDoc, "python", FoldPyDoc);
diff --git a/src/stc/scintilla/src/LexRuby.cxx b/src/stc/scintilla/src/LexRuby.cxx
new file mode 100644
index 0000000000..b29eee3bb1
--- /dev/null
+++ b/src/stc/scintilla/src/LexRuby.cxx
@@ -0,0 +1,355 @@
+// Scintilla source code edit control
+/** @file LexRuby.cxx
+ ** Lexer for Ruby.
+ **/
+// Copyright 2001- by Clemens Wyss <wys@helbling.ch>
+// 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"
+
+static void ClassifyWordRb(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord) {
+	char s[100];
+	bool wordIsNumber = isdigit(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_P_IDENTIFIER;
+	if (0 == strcmp(prevWord, "class"))
+		chAttr = SCE_P_CLASSNAME;
+	else if (0 == strcmp(prevWord, "module"))
+		chAttr = SCE_P_CLASSNAME;
+	else if (0 == strcmp(prevWord, "def"))
+		chAttr = SCE_P_DEFNAME;
+	else if (wordIsNumber)
+		chAttr = SCE_P_NUMBER;
+	else if (keywords.InList(s))
+		chAttr = SCE_P_WORD;
+	// make sure that dot-qualifiers inside the word are lexed correct
+	else for (unsigned int i = 0; i < end - start + 1; 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);
+}
+
+static bool IsRbComment(Accessor &styler, int pos, int len) {
+	return len>0 && styler[pos]=='#';
+}
+
+static bool IsRbStringStart(char ch, char chNext, char chNext2) {
+	if (ch == '\'' || ch == '"')
+		return true;
+	if (ch == 'u' || ch == 'U') {
+		if (chNext == '"' || chNext == '\'')
+			return true;
+		if ((chNext == 'r' || chNext == 'R') && (chNext2 == '"' || chNext2 == '\''))
+			return true;
+	}
+	if ((ch == 'r' || ch == 'R') && (chNext == '"' || chNext == '\''))
+		return true;
+
+	return false;
+}
+
+static bool IsRbWordStart(char ch, char chNext, char chNext2) {
+	return (iswordchar(ch) && !IsRbStringStart(ch, chNext, chNext2));
+}
+
+/* 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 GetRbStringState(Accessor &styler, int i, int *nextIndex) {
+	char ch = styler.SafeGetCharAt(i);
+	char chNext = styler.SafeGetCharAt(i + 1);
+
+	// Advance beyond r, u, or ur prefix, but bail if there are any unexpected chars
+	if (ch == 'r' || ch == 'R') {
+		i++;
+		ch = styler.SafeGetCharAt(i);
+		chNext = styler.SafeGetCharAt(i + 1);
+	}
+	else if (ch == 'u' || ch == 'U') {
+		if (chNext == 'r' || chNext == 'R')
+			i += 2;
+		else
+			i += 1;
+		ch = styler.SafeGetCharAt(i);
+		chNext = styler.SafeGetCharAt(i + 1);
+	}
+
+	if (ch != '"' && ch != '\'') {
+		*nextIndex = i + 1;
+		return SCE_P_DEFAULT;
+	}
+
+	if (ch == chNext && ch == styler.SafeGetCharAt(i + 2)) {
+		*nextIndex = i + 3;
+
+		if (ch == '"')
+			return SCE_P_TRIPLEDOUBLE;
+		else
+			return SCE_P_TRIPLE;
+	} else {
+		*nextIndex = i + 1;
+
+		if (ch == '"')
+			return SCE_P_STRING;
+		else
+			return SCE_P_CHARACTER;
+	}
+}
+
+static void ColouriseRbDoc(unsigned int startPos, int length, int initStyle,
+						   WordList *keywordlists[], Accessor &styler) {
+
+	int lengthDoc = startPos + length;
+
+	// Backtrack to previous line in case need to fix its tab whinging
+	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);
+		}
+	}
+
+	// Ruby uses a different mask because bad indentation is marked by oring with 32
+	styler.StartAt(startPos, 127);
+
+	WordList &keywords = *keywordlists[0];
+
+	int whingeLevel = styler.GetPropertyInt("tab.timmy.whinge.level");
+	char prevWord[200];
+	prevWord[0] = '\0';
+	if (length == 0)
+		return ;
+
+	int state = initStyle & 31;
+
+	int nextIndex = 0;
+	char chPrev = ' ';
+	char chPrev2 = ' ';
+	char chNext = styler[startPos];
+	styler.StartSegment(startPos);
+	bool atStartLine = true;
+	int spaceFlags = 0;
+	for (int i = startPos; i < lengthDoc; i++) {
+
+		if (atStartLine) {
+			char chBad = static_cast<char>(64);
+			char chGood = static_cast<char>(0);
+			char chFlags = chGood;
+			if (whingeLevel == 1) {
+				chFlags = (spaceFlags & wsInconsistent) ? chBad : chGood;
+			} else if (whingeLevel == 2) {
+				chFlags = (spaceFlags & wsSpaceTab) ? chBad : chGood;
+			} else if (whingeLevel == 3) {
+				chFlags = (spaceFlags & wsSpace) ? chBad : chGood;
+			} else if (whingeLevel == 4) {
+				chFlags = (spaceFlags & wsTab) ? chBad : chGood;
+			}
+			styler.SetFlags(chFlags, static_cast<char>(state));
+			atStartLine = false;
+		}
+
+		char ch = chNext;
+		chNext = styler.SafeGetCharAt(i + 1);
+		char chNext2 = styler.SafeGetCharAt(i + 2);
+
+		if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc)) {
+			if ((state == SCE_P_DEFAULT) || (state == SCE_P_TRIPLE) || (state == SCE_P_TRIPLEDOUBLE)) {
+				// Perform colourisation of white space and triple quoted strings at end of each line to allow
+				// tab marking to work inside white space and triple quoted strings
+				styler.ColourTo(i, state);
+			}
+			atStartLine = true;
+		}
+
+		if (styler.IsLeadByte(ch)) {
+			chNext = styler.SafeGetCharAt(i + 2);
+			chPrev = ' ';
+			chPrev2 = ' ';
+			i += 1;
+			continue;
+		}
+
+		if (state == SCE_P_STRINGEOL) {
+			if (ch != '\r' && ch != '\n') {
+				styler.ColourTo(i - 1, state);
+				state = SCE_P_DEFAULT;
+			}
+		}
+		if (state == SCE_P_DEFAULT) {
+			if (IsRbWordStart(ch, chNext, chNext2)) {
+				styler.ColourTo(i - 1, state);
+				state = SCE_P_WORD;
+			} else if (ch == '#') {
+				styler.ColourTo(i - 1, state);
+				state = chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE;
+			} 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 (IsRbStringStart(ch, chNext, chNext2)) {
+				styler.ColourTo(i - 1, state);
+				state = GetRbStringState(styler, i, &nextIndex);
+				if (nextIndex != i + 1) {
+					i = nextIndex - 1;
+					ch = ' ';
+					chPrev = ' ';
+					chNext = styler.SafeGetCharAt(i + 1);
+				}
+			} else if (isoperator(ch)) {
+				styler.ColourTo(i - 1, state);
+				styler.ColourTo(i, SCE_P_OPERATOR);
+			} 
+			} else if (state == SCE_P_WORD) {
+			if (!iswordchar(ch)) {
+				ClassifyWordRb(styler.GetStartSegment(), i - 1, keywords, styler, prevWord);
+				state = SCE_P_DEFAULT;
+				if (ch == '#') {
+					state = chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE;
+				} else if (IsRbStringStart(ch, chNext, chNext2)) {
+					styler.ColourTo(i - 1, state);
+					state = GetRbStringState(styler, i, &nextIndex);
+					if (nextIndex != i + 1) {
+						i = nextIndex - 1;
+						ch = ' ';
+						chPrev = ' ';
+						chNext = styler.SafeGetCharAt(i + 1);
+					}
+				} else if (isoperator(ch)) {
+					styler.ColourTo(i, SCE_P_OPERATOR);
+				}
+			}
+		} else {
+			if (state == SCE_P_COMMENTLINE || state == SCE_P_COMMENTBLOCK) {
+				if (ch == '\r' || ch == '\n') {
+					styler.ColourTo(i - 1, state);
+					state = SCE_P_DEFAULT;
+				}
+			} else if (state == SCE_P_STRING) {
+				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 == '\"') {
+					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 == '\'') {
+					styler.ColourTo(i, state);
+					state = SCE_P_DEFAULT;
+				}
+			} else if (state == SCE_P_TRIPLE) {
+				if (ch == '\'' && chPrev == '\'' && chPrev2 == '\'') {
+					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;
+					}
+				}
+			}
+		}
+		chPrev2 = chPrev;
+		chPrev = ch;
+	}
+	if (state == SCE_P_WORD) {
+		ClassifyWordRb(styler.GetStartSegment(), lengthDoc, keywords, styler, prevWord);
+	} else {
+		styler.ColourTo(lengthDoc, state);
+	}
+}
+
+static void FoldRbDoc(unsigned int startPos, int length, int initStyle,
+						   WordList *[], Accessor &styler) {
+	int lengthDoc = startPos + length;
+
+	// Backtrack to previous line in case need to fix its fold status
+	int lineCurrent = styler.GetLine(startPos);
+	if (startPos > 0) {
+		if (lineCurrent > 0) {
+			lineCurrent--;
+			startPos = styler.LineStart(lineCurrent);
+			if (startPos == 0)
+				initStyle = SCE_P_DEFAULT;
+			else
+				initStyle = styler.StyleAt(startPos-1);
+		}
+	}
+	int state = initStyle & 31;
+	int spaceFlags = 0;
+	int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsRbComment);
+	if ((state == SCE_P_TRIPLE) || (state == SCE_P_TRIPLEDOUBLE))
+		indentCurrent |= SC_FOLDLEVELWHITEFLAG;
+	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)) {
+			int lev = indentCurrent;
+			int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsRbComment);
+			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, IsRbComment);
+					if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) {
+						lev |= SC_FOLDLEVELHEADERFLAG;
+					}
+				}
+			}
+			indentCurrent = indentNext;
+			styler.SetLevel(lineCurrent, lev);
+			lineCurrent++;
+		}
+	}
+}
+						   
+LexerModule lmRuby(SCLEX_RUBY, ColouriseRbDoc, "ruby", FoldRbDoc);
diff --git a/src/stc/scintilla/src/LexSQL.cxx b/src/stc/scintilla/src/LexSQL.cxx
index facd0e6b7b..84d7d1c52e 100644
--- a/src/stc/scintilla/src/LexSQL.cxx
+++ b/src/stc/scintilla/src/LexSQL.cxx
@@ -1,13 +1,15 @@
-// SciTE - Scintilla based Text Editor
-// LexSQL.cxx - lexer for SQL
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file LexSQL.cxx
+ ** Lexer for SQL.
+ **/
+// 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"
 
@@ -38,7 +40,7 @@ static void ColouriseSQLDoc(unsigned int startPos, int length,
                             int initStyle, WordList *keywordlists[], Accessor &styler) {
 
 	WordList &keywords = *keywordlists[0];
-	
+
 	styler.StartAt(startPos);
 
 	bool fold = styler.GetPropertyInt("fold");
@@ -153,4 +155,4 @@ static void ColouriseSQLDoc(unsigned int startPos, int length,
 	styler.ColourTo(lengthDoc - 1, state);
 }
 
-LexerModule lmSQL(SCLEX_SQL, ColouriseSQLDoc);
+LexerModule lmSQL(SCLEX_SQL, ColouriseSQLDoc, "sql");
diff --git a/src/stc/scintilla/src/LexVB.cxx b/src/stc/scintilla/src/LexVB.cxx
index 67dfa78427..61e4035b18 100644
--- a/src/stc/scintilla/src/LexVB.cxx
+++ b/src/stc/scintilla/src/LexVB.cxx
@@ -1,13 +1,15 @@
-// SciTE - Scintilla based Text Editor
-// LexVB.cxx - lexer for Visual Basic and VBScript
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file LexVB.cxx
+ ** Lexer for Visual Basic and VBScript.
+ **/
+// 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"
 
@@ -43,11 +45,15 @@ static int classifyWordVB(unsigned int start, unsigned int end, WordList &keywor
 		return SCE_C_DEFAULT;
 }
 
+static bool IsVBComment(Accessor &styler, int pos, int len) {
+	return len>0 && styler[pos]=='\'';
+}
+
 static void ColouriseVBDoc(unsigned int startPos, int length, int initStyle,
                            WordList *keywordlists[], Accessor &styler) {
 
 	WordList &keywords = *keywordlists[0];
-	
+
 	styler.StartAt(startPos);
 
 	int visibleChars = 0;
@@ -73,7 +79,7 @@ static void ColouriseVBDoc(unsigned int startPos, int length, int initStyle,
 			}
 			visibleChars = 0;
 		}
-		if (!isspace(ch))
+		if (!isspacechar(ch))
 			visibleChars++;
 
 		if (state == SCE_C_DEFAULT) {
@@ -136,4 +142,56 @@ static void ColouriseVBDoc(unsigned int startPos, int length, int initStyle,
 	styler.ColourTo(lengthDoc, state);
 }
 
-LexerModule lmVB(SCLEX_VB, ColouriseVBDoc);
+static void FoldVBDoc(unsigned int startPos, int length, int initStyle,
+						   WordList *[], Accessor &styler) {
+	int lengthDoc = startPos + length;
+
+	// Backtrack to previous line in case need to fix its fold status
+	int lineCurrent = styler.GetLine(startPos);
+	if (startPos > 0) {
+		if (lineCurrent > 0) {
+			lineCurrent--;
+			startPos = styler.LineStart(lineCurrent);
+			if (startPos == 0)
+				initStyle = SCE_P_DEFAULT;
+			else
+				initStyle = styler.StyleAt(startPos-1);
+		}
+	}
+	int state = initStyle & 31;
+	int spaceFlags = 0;
+	int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsVBComment);
+	if ((state == SCE_P_TRIPLE) || (state == SCE_P_TRIPLEDOUBLE))
+		indentCurrent |= SC_FOLDLEVELWHITEFLAG;
+	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)) {
+			int lev = indentCurrent;
+			int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsVBComment);
+			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, IsVBComment);
+					if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) {
+						lev |= SC_FOLDLEVELHEADERFLAG;
+					}
+				}
+			}
+			indentCurrent = indentNext;
+			styler.SetLevel(lineCurrent, lev);
+			lineCurrent++;
+		}
+	}
+}
+
+LexerModule lmVB(SCLEX_VB, ColouriseVBDoc, "vb", FoldVBDoc);
diff --git a/src/stc/scintilla/src/LineMarker.cxx b/src/stc/scintilla/src/LineMarker.cxx
index f54978c3fc..dc1468d832 100644
--- a/src/stc/scintilla/src/LineMarker.cxx
+++ b/src/stc/scintilla/src/LineMarker.cxx
@@ -1,6 +1,8 @@
 // Scintilla source code edit control
-// LineMarker.cxx - defines the look of a line marker in the margin 
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file LineMarker.cxx
+ ** Defines the look of a line marker in the margin .
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include "Platform.h"
@@ -8,13 +10,49 @@
 #include "Scintilla.h"
 #include "LineMarker.h"
 
-void LineMarker::Draw(Surface *surface, PRectangle &rc) {
+static void DrawBox(Surface *surface, int centreX, int centreY, int armSize, Colour fore, Colour back) {
+	PRectangle rc;
+	rc.left = centreX - armSize;
+	rc.top = centreY - armSize;
+	rc.right = centreX + armSize + 1;
+	rc.bottom = centreY + armSize + 1;
+	surface->RectangleDraw(rc, back, fore);
+}
+
+static void DrawCircle(Surface *surface, int centreX, int centreY, int armSize, Colour fore, Colour back) {
+	PRectangle rcCircle;
+	rcCircle.left = centreX - armSize;
+	rcCircle.top = centreY - armSize;
+	rcCircle.right = centreX + armSize + 1;
+	rcCircle.bottom = centreY + armSize + 1;
+	surface->Ellipse(rcCircle, back, fore);
+}
+
+static void DrawPlus(Surface *surface, int centreX, int centreY, int armSize, Colour fore) {
+	PRectangle rcV(centreX, centreY - armSize + 2, centreX + 1, centreY + armSize - 2 + 1);
+	surface->FillRectangle(rcV, fore);
+	PRectangle rcH(centreX - armSize + 2, centreY, centreX + armSize - 2 + 1, centreY+1);
+	surface->FillRectangle(rcH, fore);
+}
+
+static void DrawMinus(Surface *surface, int centreX, int centreY, int armSize, Colour fore) {
+	PRectangle rcH(centreX - armSize + 2, centreY, centreX + armSize - 2 + 1, centreY+1);
+	surface->FillRectangle(rcH, fore);
+}
+
+void LineMarker::Draw(Surface *surface, PRectangle &rcWhole) {
+	// Restrict most shapes a bit
+	PRectangle rc = rcWhole;
+	rc.top++;
+	rc.bottom--;
 	int minDim = Platform::Minimum(rc.Width(), rc.Height());
 	minDim--;	// Ensure does not go beyond edge
 	int centreX = (rc.right + rc.left) / 2;
 	int centreY = (rc.bottom + rc.top) / 2;
 	int dimOn2 = minDim / 2;
 	int dimOn4 = minDim / 4;
+	int blobSize = dimOn2-1;
+	int armSize = dimOn2-2;
 	if (rc.Width() > (rc.Height() * 2)) {
 		// Wide column is line number so move to left to try to avoid overlapping number
 		centreX = rc.left + dimOn2 + 1;
@@ -50,7 +88,6 @@ void LineMarker::Draw(Surface *surface, PRectangle &rc) {
                  		fore.allocated, back.allocated);
 
 	} else if (markType == SC_MARK_PLUS) {
-		int armSize = dimOn2-2;
 		Point pts[] = {
     		Point(centreX - armSize, centreY - 1),
     		Point(centreX - 1, centreY - 1),
@@ -69,7 +106,6 @@ void LineMarker::Draw(Surface *surface, PRectangle &rc) {
                  		fore.allocated, back.allocated);
 
 	} else if (markType == SC_MARK_MINUS) {
-		int armSize = dimOn2-2;
 		Point pts[] = {
     		Point(centreX - armSize, centreY - 1),
     		Point(centreX + armSize, centreY -1),
@@ -86,8 +122,114 @@ void LineMarker::Draw(Surface *surface, PRectangle &rc) {
 		rcSmall.right = rc.right - 1;
 		rcSmall.bottom = rc.bottom - 2;
 		surface->RectangleDraw(rcSmall, fore.allocated, back.allocated);
+		
 	} else if (markType == SC_MARK_EMPTY) {
 		// An invisible marker so don't draw anything
+		
+	} else if (markType == SC_MARK_VLINE) {
+		surface->PenColour(back.allocated);
+		surface->MoveTo(centreX, rcWhole.top);
+		surface->LineTo(centreX, rcWhole.bottom);
+		
+	} else if (markType == SC_MARK_LCORNER) {
+		surface->PenColour(back.allocated);
+		surface->MoveTo(centreX, rcWhole.top);
+		surface->LineTo(centreX, rc.top + dimOn2);
+		surface->LineTo(rc.right - 2, rc.top + dimOn2);
+		
+	} else if (markType == SC_MARK_TCORNER) {
+		surface->PenColour(back.allocated);
+		surface->MoveTo(centreX, rcWhole.top);
+		surface->LineTo(centreX, rcWhole.bottom);
+		surface->MoveTo(centreX, rc.top + dimOn2);
+		surface->LineTo(rc.right - 2, rc.top + dimOn2);
+		
+	} else if (markType == SC_MARK_LCORNERCURVE) {
+		surface->PenColour(back.allocated);
+		surface->MoveTo(centreX, rcWhole.top);
+		surface->LineTo(centreX, rc.top + dimOn2-3);
+		surface->LineTo(centreX+3, rc.top + dimOn2);
+		surface->LineTo(rc.right - 1, rc.top + dimOn2);
+		
+	} else if (markType == SC_MARK_TCORNERCURVE) {
+		surface->PenColour(back.allocated);
+		surface->MoveTo(centreX, rcWhole.top);
+		surface->LineTo(centreX, rcWhole.bottom);
+		
+		surface->MoveTo(centreX, rc.top + dimOn2-3);
+		surface->LineTo(centreX+3, rc.top + dimOn2);
+		surface->LineTo(rc.right - 1, rc.top + dimOn2);
+		
+	} else if (markType == SC_MARK_BOXPLUS) {
+		surface->PenColour(back.allocated);
+		DrawBox(surface, centreX, centreY, blobSize, fore.allocated, back.allocated);
+		DrawPlus(surface, centreX, centreY, blobSize, back.allocated);
+		
+	} else if (markType == SC_MARK_BOXPLUSCONNECTED) {
+		surface->PenColour(back.allocated);
+		DrawBox(surface, centreX, centreY, blobSize, fore.allocated, back.allocated);
+		DrawPlus(surface, centreX, centreY, blobSize, back.allocated);
+		
+		surface->MoveTo(centreX, centreY + blobSize);
+		surface->LineTo(centreX, rcWhole.bottom);
+		
+		surface->MoveTo(centreX, rcWhole.top);
+		surface->LineTo(centreX, centreY - blobSize);
+		
+	} else if (markType == SC_MARK_BOXMINUS) {
+		surface->PenColour(back.allocated);
+		DrawBox(surface, centreX, centreY, blobSize, fore.allocated, back.allocated);
+		DrawMinus(surface, centreX, centreY, blobSize, back.allocated);
+		
+		surface->MoveTo(centreX, centreY + blobSize);
+		surface->LineTo(centreX, rcWhole.bottom);
+		
+	} else if (markType == SC_MARK_BOXMINUSCONNECTED) {
+		surface->PenColour(back.allocated);
+		DrawBox(surface, centreX, centreY, blobSize, fore.allocated, back.allocated);
+		DrawMinus(surface, centreX, centreY, blobSize, back.allocated);
+		
+		surface->MoveTo(centreX, centreY + blobSize);
+		surface->LineTo(centreX, rcWhole.bottom);
+		
+		surface->MoveTo(centreX, rcWhole.top);
+		surface->LineTo(centreX, centreY - blobSize);
+		
+	} else if (markType == SC_MARK_CIRCLEPLUS) {
+		DrawCircle(surface, centreX, centreY, blobSize, fore.allocated, back.allocated);
+		surface->PenColour(back.allocated);
+		DrawPlus(surface, centreX, centreY, blobSize, back.allocated);
+		
+	} else if (markType == SC_MARK_CIRCLEPLUSCONNECTED) {
+		DrawCircle(surface, centreX, centreY, blobSize, fore.allocated, back.allocated);
+		surface->PenColour(back.allocated);
+		DrawPlus(surface, centreX, centreY, blobSize, back.allocated);
+		
+		surface->MoveTo(centreX, centreY + blobSize);
+		surface->LineTo(centreX, rcWhole.bottom);
+		
+		surface->MoveTo(centreX, rcWhole.top);
+		surface->LineTo(centreX, centreY - blobSize);
+		
+	} else if (markType == SC_MARK_CIRCLEMINUS) {
+		DrawCircle(surface, centreX, centreY, blobSize, fore.allocated, back.allocated);
+		surface->PenColour(back.allocated);
+		DrawMinus(surface, centreX, centreY, blobSize, back.allocated);
+		
+		surface->MoveTo(centreX, centreY + blobSize);
+		surface->LineTo(centreX, rcWhole.bottom);
+		
+	} else if (markType == SC_MARK_CIRCLEMINUSCONNECTED) {
+		DrawCircle(surface, centreX, centreY, blobSize, fore.allocated, back.allocated);
+		surface->PenColour(back.allocated);
+		DrawMinus(surface, centreX, centreY, blobSize, back.allocated);
+		
+		surface->MoveTo(centreX, centreY + blobSize);
+		surface->LineTo(centreX, rcWhole.bottom);
+		
+		surface->MoveTo(centreX, rcWhole.top);
+		surface->LineTo(centreX, centreY - blobSize);
+		
 	} else { // SC_MARK_SHORTARROW
 		Point pts[] = {
 			Point(centreX, centreY + dimOn2),
diff --git a/src/stc/scintilla/src/LineMarker.h b/src/stc/scintilla/src/LineMarker.h
index f22241bb19..ee0f36c256 100644
--- a/src/stc/scintilla/src/LineMarker.h
+++ b/src/stc/scintilla/src/LineMarker.h
@@ -1,11 +1,15 @@
 // Scintilla source code edit control
-// LineMarker.h - defines the look of a line marker in the margin 
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file LineMarker.h
+ ** Defines the look of a line marker in the margin .
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef LINEMARKER_H
 #define LINEMARKER_H
 
+/**
+ */
 class LineMarker {
 public:
 	int markType;
diff --git a/src/stc/scintilla/src/PosRegExp.cxx b/src/stc/scintilla/src/PosRegExp.cxx
deleted file mode 100644
index ea719b7c28..0000000000
--- a/src/stc/scintilla/src/PosRegExp.cxx
+++ /dev/null
@@ -1,1181 +0,0 @@
-#include <string.h>
-#include <stdio.h>
-#include <ctype.h>
-#include <malloc.h>
-
-#include "PosRegExp.h"
-
-//Up: /[A-Z \x80-\x9f \xf0 ]/x
-//Lo: /[a-z \xa0-\xaf \xe0-\xef \xf1 ]/x
-//Wd: /[\d _ A-Z a-z \xa0-\xaf \xe0-\xf1 \x80-\x9f]/x
-//*   // Dos866
-SCharData UCData  = {0x0, 0x0, 0x7fffffe, 0x0, 0xffffffff, 0x0, 0x0, 0x10000},
-                     LCData  = {0x0, 0x0, 0x0, 0x7fffffe, 0x0, 0xffff, 0x0, 0x2ffff},
-                     WdData  = {0x0, 0x3ff0000, 0x87fffffe, 0x7fffffe, 0xffffffff, 0xffff, 0x0, 0x3ffff},
-                     DigData = {0x0, 0x3ff0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
-/*/   // cp1251
-SCharData UCData  = {0x0, 0x0, 0x7fffffe, 0x0, 0x0, 0x0, 0xffffffff, 0x0},
-          LCData  = {0x0, 0x0, 0x0, 0x7fffffe, 0x0, 0x0, 0x0, 0xffffffff},
-          WdData  = {0x0, 0x3ff0000, 0x87fffffe, 0x7fffffe, 0x0, 0x0, 0xffffffff, 0xffffffff},
-          DigData = {0x0, 0x3ff0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
-//*/
-
-///////////////////////////////////////////////
-
-int GetNumber(int *str,int s,int e) {
-	int r = 1, num = 0;
-	if (e < s) return -1;
-	for(int i = e-1; i >= s; i--) {
-		if (str[i] > '9' || str[i] < '0') return -1;
-		num += (str[i] - 0x30)*r;
-		r *= 10;
-	};
-	return num;
-	/*
-	char tmp[20];
-	double Res;
-	  if (e == s) return -1;
-	  for (int i = s;i < e;i++)
-	    tmp[i-s] = (char)Str[i];
-	  tmp[e-s] = 0;
-	  GetNumber(tmp,&Res);
-	  return (int)Res;
-	*/
-};
-
-bool IsDigit(char Symb) {
-	return DigData.GetBit(Symb);
-};
-bool IsWord(char Symb) {
-	return WdData.GetBit(Symb);
-};
-bool IsUpperCase(char Symb) {
-	return UCData.GetBit(Symb);
-};
-bool IsLowerCase(char Symb) {
-	return LCData.GetBit(Symb);
-};
-char LowCase(char Chr) {
-	if (UCData.GetBit(Chr))
-		return Chr+0x20;
-	return Chr;
-};
-
-///////////////////////////////////////////////
-
-SRegInfo::SRegInfo() {
-	Next = Parent = 0;
-	un.Param = 0;
-	Op = ReEmpty;
-};
-SRegInfo::~SRegInfo() {
-	if (Next) delete Next;
-	if (un.Param)
-		switch(Op) {
-		case ReEnum:
-		case ReNEnum:
-			delete un.ChrClass;
-			break;
-		default:
-			if (Op > ReBlockOps && Op < ReSymbolOps || Op == ReBrackets)
-				delete un.Param;
-			break;
-		};
-};
-
-///////////////////////////////////////////////
-
-void SCharData::SetBit(unsigned char Bit) {
-	int p = Bit/8;
-	CArr[p] |= (1 << Bit%8);
-};
-void SCharData::ClearBit(unsigned char Bit) {
-	int p = Bit/8;
-	CArr[p] &= ~(1 << Bit%8);
-};
-bool SCharData::GetBit(unsigned char Bit) {
-	int p = (unsigned char)Bit/8;
-	return (CArr[p] & (1 << Bit%8))!=0;
-};
-
-/////////////////////////////////////////////////////////////////
-//////////////////////  RegExp Class  ///////////////////////////
-/////////////////////////////////////////////////////////////////
-
-PosRegExp::PosRegExp() {
-	Info = 0;
-	Exprn = 0;
-	NoMoves = false;
-	Error = true;
-	FirstChar = 0;
-	CurMatch = 0;
-};
-PosRegExp::~PosRegExp() {
-	if (Info) delete Info;
-};
-
-bool PosRegExp::SetExpr(const char *Expr) {
-	if (!this) return false;
-	Error = true;
-	CurMatch = 0;
-	if (SetExprLow(Expr)) Error = false;
-	return !Error;
-};
-bool PosRegExp::isok() {
-	return !Error;
-};
-
-
-bool PosRegExp::SetExprLow(const char *Expr) {
-	int Len = strlen(Expr);
-	bool  Ok = false;
-	int i,j,s = 0,pos,tmp;
-	int EnterBr = 0,EnterGr = 0,EnterFg = 0;
-
-	if (Info) delete Info;
-	Info = new SRegInfo;
-	Exprn = new int[Len];
-
-	NoCase = false;
-	Extend = false;
-	if (Expr[0] == '/') s++;
-	else return false;
-
-	for (i = Len; i > 0 && !Ok;i--)
-		if (Expr[i] == '/') {
-			Len = i-s;
-			Ok = true;
-			for (int j = i+1; Expr[j]; j++) {
-				if (Expr[j] == 'i') NoCase = true;
-				if (Expr[j] == 'x') Extend = true;
-			};
-		};
-	if (!Ok) return false;
-
-	////////////////////////////////
-	for (j = 0,pos = 0; j < Len; j++,pos++) {
-		if (Extend && Expr[j+s] == ' ') {
-			pos--;
-			continue;
-		};
-
-		Exprn[pos] = (int)(unsigned char)Expr[j+s];
-
-		if (Expr[j+s] == BackSlash) {
-			switch (Expr[j+s+1]) {
-			case 'd':
-				Exprn[pos] = ReDigit;
-				break;
-			case 'D':
-				Exprn[pos] = ReNDigit;
-				break;
-			case 'w':
-				Exprn[pos] = ReWordSymb;
-				break;
-			case 'W':
-				Exprn[pos] = ReNWordSymb;
-				break;
-			case 's':
-				Exprn[pos] = ReWSpace;
-				break;
-			case 'S':
-				Exprn[pos] = ReNWSpace;
-				break;
-			case 'u':
-				Exprn[pos] = ReUCase;
-				break;
-			case 'l':
-				Exprn[pos] = ReNUCase;
-				break;
-			case 't':
-				Exprn[pos] = '\t';
-				break;
-			case 'n':
-				Exprn[pos] = '\n';
-				break;
-			case 'r':
-				Exprn[pos] = '\r';
-				break;
-			case 'b':
-				Exprn[pos] = ReWBound;
-				break;
-			case 'B':
-				Exprn[pos] = ReNWBound;
-				break;
-			case 'c':
-				Exprn[pos] = RePreNW;
-				break;
-			case 'm':
-				Exprn[pos] = ReStart;
-				break;
-			case 'M':
-				Exprn[pos] = ReEnd;
-				break;
-			case 'x':
-				tmp = toupper(Expr[j+s+2])-0x30;
-				tmp = (tmp>9?tmp-7:tmp)<<4;
-				tmp += (toupper(Expr[j+s+3])-0x30)>9?toupper(Expr[j+s+3])-0x37:(toupper(Expr[j+s+3])-0x30);
-				Exprn[pos] = tmp;
-				j+=2;
-				break;
-			case 'y':
-				tmp = Expr[j+s+2] - 0x30;
-				if (tmp >= 0 && tmp <= 9) {
-					if (tmp == 1) {
-						tmp = 10 + Expr[j+s+3] - 0x30;
-						if (tmp >= 10 && tmp <= 19) j++;
-						else tmp = 1;
-					};
-					Exprn[pos] = ReBkTrace + tmp;
-					j++;
-					break;
-				};
-			default:
-				tmp = Expr[j+s+1] - 0x30;
-				if (tmp >= 0 && tmp <= 9) {
-					if (tmp == 1) {
-						tmp = 10 + Expr[j+s+2] - 0x30;
-						if (tmp >= 10 && tmp <= 19) j++;
-						else tmp = 1;
-					};
-					Exprn[pos] = ReBkBrack + tmp;
-					break;
-				} else
-					Exprn[pos] = Expr[j+s+1];
-				break;
-			};
-			j++;
-			continue;
-		};
-		if (Expr[j+s] == ']') {
-			Exprn[pos] = ReEnumE;
-			if (EnterFg || !EnterGr) return false;
-			EnterGr--;
-		};
-		if (Expr[j+s] == '-' && EnterGr) Exprn[pos] = ReFrToEnum;
-
-		if (EnterGr) continue;
-
-		if (Expr[j+s] == '[' && Expr[j+s+1] == '^') {
-			Exprn[pos] = ReNEnumS;
-			if (EnterFg) return false;
-			EnterGr++;
-			j++;
-			continue;
-		};
-		if (Expr[j+s] == '*' && Expr[j+s+1] == '?') {
-			Exprn[pos] = ReNGMul;
-			j++;
-			continue;
-		};
-		if (Expr[j+s] == '+' && Expr[j+s+1] == '?') {
-			Exprn[pos] = ReNGPlus;
-			j++;
-			continue;
-		};
-		if (Expr[j+s] == '?' && Expr[j+s+1] == '?') {
-			Exprn[pos] = ReNGQuest;
-			j++;
-			continue;
-		};
-		if (Expr[j+s] == '?' && Expr[j+s+1] == '#' &&
-		        Expr[j+s+2]>='0' && Expr[j+s+2]<='9') {
-			Exprn[pos] = ReBehind+Expr[j+s+2]-0x30;
-			j+=2;
-			continue;
-		};
-		if (Expr[j+s] == '?' && Expr[j+s+1] == '~' &&
-		        Expr[j+s+2]>='0' && Expr[j+s+2]<='9') {
-			Exprn[pos] = ReNBehind+Expr[j+s+2]-0x30;
-			j+=2;
-			continue;
-		};
-		if (Expr[j+s] == '?' && Expr[j+s+1] == '=') {
-			Exprn[pos] = ReAhead;
-			j++;
-			continue;
-		};
-		if (Expr[j+s] == '?' && Expr[j+s+1] == '!') {
-			Exprn[pos] = ReNAhead;
-			j++;
-			continue;
-		};
-
-		if (Expr[j+s] == '(') {
-			Exprn[pos] = ReLBrack;
-			if (EnterFg) return false;
-			EnterBr++;
-		};
-		if (Expr[j+s] == ')') {
-			Exprn[pos] = ReRBrack;
-			if (!EnterBr || EnterFg) return false;
-			EnterBr--;
-		};
-		if (Expr[j+s] == '[') {
-			Exprn[pos] = ReEnumS;
-			if (EnterFg) return false;
-			EnterGr++;
-		};
-		if (Expr[j+s] == '{') {
-			Exprn[pos] = ReRangeS;
-			if (EnterFg) return false;
-			EnterFg++;
-		};
-		if (Expr[j+s] == '}' && Expr[j+s+1] == '?') {
-			Exprn[pos] = ReNGRangeE;
-			if (!EnterFg) return false;
-			EnterFg--;
-			j++;
-			continue;
-		};
-		if (Expr[j+s] == '}') {
-			Exprn[pos] = ReRangeE;
-			if (!EnterFg) return false;
-			EnterFg--;
-		};
-
-		if (Expr[j+s] == '^') Exprn[pos] = ReSoL;
-		if (Expr[j+s] == '$') Exprn[pos] = ReEoL;
-		if (Expr[j+s] == '.') Exprn[pos] = ReAnyChr;
-		if (Expr[j+s] == '*') Exprn[pos] = ReMul;
-		if (Expr[j+s] == '+') Exprn[pos] = RePlus;
-		if (Expr[j+s] == '?') Exprn[pos] = ReQuest;
-		if (Expr[j+s] == '|') Exprn[pos] = ReOr;
-	};
-	if (EnterGr || EnterBr || EnterFg) return false;
-
-	Info->Op = ReBrackets;
-	Info->un.Param = new SRegInfo;
-	Info->s = CurMatch++;
-
-	if (!SetStructs(Info->un.Param,0,pos)) return false;
-	Optimize();
-	delete Exprn;
-	return true;
-};
-
-void PosRegExp::Optimize() {
-	PRegInfo Next = Info;
-	FirstChar = 0;
-	while(Next) {
-		if (Next->Op == ReBrackets || Next->Op == RePlus  || Next->Op == ReNGPlus) {
-			Next = Next->un.Param;
-			continue;
-		};
-		if (Next->Op == ReSymb) {
-			if (Next->un.Symb & 0xFF00 &&  Next->un.Symb != ReSoL && Next->un.Symb != ReWBound)
-				break;
-			FirstChar = Next->un.Symb;
-			break;
-		};
-		break;
-	};
-};
-
-bool PosRegExp::SetStructs(PRegInfo &re,int start,int end) {
-	PRegInfo Next,Prev,Prev2;
-	int comma,st,en,ng,i, j,k;
-	int EnterBr;
-	bool Add;
-
-	if (end - start < 0) return false;
-	Next = re;
-	for (i = start; i < end; i++) {
-		Add = false;
-		// Ops
-		if (Exprn[i] > ReBlockOps && Exprn[i] < ReSymbolOps) {
-			Next->un.Param = 0;
-			Next->Op = (EOps)Exprn[i];
-			Add = true;
-		};
-		// {n,m}
-		if (Exprn[i] == ReRangeS) {
-			st = i;
-			en = -1;
-			comma = -1;
-			ng = 0;
-			for (j = i;j < end;j++) {
-				if (Exprn[j] == ReNGRangeE) {
-					en = j;
-					ng = 1;
-					break;
-				};
-				if (Exprn[j] == ReRangeE) {
-					en = j;
-					break;
-				};
-				if ((char)Exprn[j] == ',')
-					comma = j;
-			};
-			if (en == -1) return false;
-			if (comma == -1) comma = en;
-			Next->s = (char)GetNumber(Exprn,st+1,comma);
-			if (comma != en)
-				Next->e = (char)GetNumber(Exprn,comma+1,en);
-			else
-				Next->e = Next->s;
-			Next->un.Param = 0;
-			Next->Op = ng?ReNGRangeNM:ReRangeNM;
-			if (en-comma == 1) {
-				Next->e = -1;
-				Next->Op = ng?ReNGRangeN:ReRangeN;
-			};
-			i=j;
-			Add = true;
-		};
-		// [] [^]
-		if (Exprn[i] == ReEnumS || Exprn[i] == ReNEnumS) {
-			Next->Op = (Exprn[i] == ReEnumS)?ReEnum:ReNEnum;
-			for (j = i+1;j < end;j++) {
-				if (Exprn[j] == ReEnumE)
-					break;
-			};
-			if (j == end) return false;
-			Next->un.ChrClass = new SCharData;
-			memset(Next->un.ChrClass, 0, 32);
-			for (j = i+1;Exprn[j] != ReEnumE;j++) {
-				if (Exprn[j+1] == ReFrToEnum) {
-					for (i = (Exprn[j]&0xFF); i < (Exprn[j+2]&0xFF);i++)
-						Next->un.ChrClass->SetBit(i&0xFF);
-					j++;
-					continue;
-				};
-				switch(Exprn[j]) {
-				case ReDigit:
-					for (k = 0x30;k < 0x40;k++)
-						if (IsDigit((char)k))
-							Next->un.ChrClass->SetBit(k);
-					break;
-				case ReNDigit:
-					for (k = 0x30;k < 0x40;k++)
-						if (!IsDigit((char)k))
-							Next->un.ChrClass->SetBit(k);
-					Next->un.ChrClass->ClearBit(0x0a);
-					Next->un.ChrClass->ClearBit(0x0d);
-					break;
-				case ReWordSymb:
-					for (k = 0;k < 256;k++)
-						if (IsWord((char)k))
-							Next->un.ChrClass->SetBit(k);
-					break;
-				case ReNWordSymb:
-					for (k = 0;k < 256;k++)
-						if (!IsWord((char)k))
-							Next->un.ChrClass->SetBit(k);
-					Next->un.ChrClass->ClearBit(0x0a);
-					Next->un.ChrClass->ClearBit(0x0d);
-					break;
-				case ReWSpace:
-					Next->un.ChrClass->SetBit(0x20);
-					Next->un.ChrClass->SetBit(0x09);
-					break;
-				case ReNWSpace:
-					memset(Next->un.ChrClass->IArr, 0xFF, 32);
-					Next->un.ChrClass->ClearBit(0x20);
-					Next->un.ChrClass->ClearBit(0x09);
-					Next->un.ChrClass->ClearBit(0x0a);
-					Next->un.ChrClass->ClearBit(0x0d);
-					break;
-				default:
-					if (!(Exprn[j]&0xFF00))
-						Next->un.ChrClass->SetBit(Exprn[j]&0xFF);
-					break;
-				};
-			};
-			Add = true;
-			i=j;
-		};
-		// ( ... )
-		if (Exprn[i] == ReLBrack) {
-			EnterBr = 1;
-			for (j = i+1;j < end;j++) {
-				if (Exprn[j] == ReLBrack) EnterBr++;
-				if (Exprn[j] == ReRBrack) EnterBr--;
-				if (!EnterBr) break;
-			};
-			if (EnterBr) return false;
-			Next->Op = ReBrackets;
-			Next->un.Param = new SRegInfo;
-			Next->un.Param->Parent = Next;
-			Next->s = CurMatch++;
-			if (CurMatch > MatchesNum) CurMatch = MatchesNum;
-			if (!SetStructs(Next->un.Param,i+1,j)) return false;
-			Add = true;
-			i=j;
-		};
-		if ((Exprn[i]&0xFF00) == ReBkTrace) {
-			Next->Op = ReBkTrace;
-			Next->un.Symb = Exprn[i]&0xFF;
-			Add = true;
-		};
-		if ((Exprn[i]&0xFF00) == ReBkBrack) {
-			Next->Op = ReBkBrack;
-			Next->un.Symb = Exprn[i]&0xFF;
-			Add = true;
-		};
-		if ((Exprn[i]&0xFF00) == ReBehind) {
-			Next->Op = ReBehind;
-			Next->s = Exprn[i]&0xFF;
-			Add = true;
-		};
-		if ((Exprn[i]&0xFF00) == ReNBehind) {
-			Next->Op = ReNBehind;
-			Next->s = Exprn[i]&0xFF;
-			Add = true;
-		};
-		// Chars
-		if (Exprn[i] >= ReAnyChr && Exprn[i] < ReTemp || Exprn[i] < 0x100) {
-			Next->Op = ReSymb;
-			Next->un.Symb = Exprn[i];
-			Add = true;
-		};
-		// Next
-		if (Add && i != end-1) {
-			Next->Next = new SRegInfo;
-			Next->Next->Parent = Next->Parent;
-			Next = Next->Next;
-		};
-	};
-	Next = re;
-	Prev = Prev2 = 0;
-	while(Next) {
-		if (Next->Op > ReBlockOps && Next->Op < ReSymbolOps) {
-			if (!Prev) return false;
-			if (!Prev2) re = Next;
-			else Prev2->Next = Next;
-			//if (Prev->Op > ReBlockOps && Prev->Op < ReSymbolOps) return false;
-			Prev->Parent = Next;
-			Prev->Next = 0;
-			Next->un.Param = Prev;
-			Prev = Prev2;
-		};
-		Prev2 = Prev;
-		Prev = Next;
-		Next = Next->Next;
-	};
-
-	return true;
-};
-
-/////////////////////////////////////////////////////////////////
-/////////////////////////  Parsing  /////////////////////////////
-/////////////////////////////////////////////////////////////////
-
-bool PosRegExp::CheckSymb(int Symb,bool Inc) {
-	bool Res;
-	char ch;
-	switch(Symb) {
-	case ReAnyChr:
-		if (posParse >= posEnd) return false;
-		ch = CharAt(posParse,param);
-		Res = ch != '\r' && ch != '\n';
-		if (Res && Inc) posParse++;
-		return Res;
-	case ReSoL:
-		if (posStart == posParse)
-			return true;
-		ch = CharAt(posParse-1,param);
-		return ch == '\n' || ch == '\r';
-	case ReEoL:
-		if (posEnd == posParse)
-			return true;
-		ch = CharAt(posParse,param);
-		return ch == '\n' || ch == '\r';
-	case ReDigit:
-		if (posParse >= posEnd) return false;
-		ch = CharAt(posParse,param);
-		Res = (ch >= 0x30 && ch <= 0x39);
-		if (Res && Inc) posParse++;
-		return Res;
-	case ReNDigit:
-		if (posParse >= posEnd) return false;
-		ch = CharAt(posParse,param);
-		Res = !(ch >= 0x30 && ch <= 0x39) && ch != '\r' && ch != '\n';
-		if (Res && Inc) posParse++;
-		return Res;
-	case ReWordSymb:
-		if (posParse >= posEnd) return false;
-		Res = IsWord(CharAt(posParse,param));
-		if (Res && Inc) posParse++;
-		return Res;
-	case ReNWordSymb:
-		if (posParse >= posEnd) return false;
-		ch = CharAt(posParse,param);
-		Res = !IsWord(ch) && ch != '\r' && ch != '\n';
-		if (Res && Inc) posParse++;
-		return Res;
-	case ReWSpace:
-		if (posParse >= posEnd) return false;
-		ch = CharAt(posParse,param);
-		Res = (ch == 0x20 || ch == '\t');
-		if (Res && Inc) posParse++;
-		return Res;
-	case ReNWSpace:
-		if (posParse >= posEnd) return false;
-		ch = CharAt(posParse,param);
-		Res = !(ch == 0x20 || ch == '\t') && ch != '\r' && ch != '\n';
-		if (Res && Inc) posParse++;
-		return Res;
-	case ReUCase:
-		if (posParse >= posEnd) return false;
-		Res = IsUpperCase(CharAt(posParse,param));
-		if (Res && Inc) posParse++;
-		return Res;
-	case ReNUCase:
-		if (posParse >= posEnd) return false;
-		Res = IsLowerCase(CharAt(posParse,param));
-		if (Res && Inc) posParse++;
-		return Res;
-	case ReWBound:
-		if (posParse >= posEnd) return true;
-		ch = CharAt(posParse,param);
-		return IsWord(CharAt(posParse,param)) && (posParse == posStart || !IsWord(CharAt(posParse-1,param)));
-	case ReNWBound:
-		if (posParse >= posEnd) return true;
-		return !IsWord(CharAt(posParse,param)) && IsWord(CharAt(posParse-1,param));
-	case RePreNW:
-		if (posParse >= posEnd) return true;
-		return (posParse == posStart || !IsWord(CharAt(posParse-1,param)));
-	case ReStart:
-		Matches->s[0] = (posParse-posStart);
-		return true;
-	case ReEnd:
-		Matches->e[0] = (posParse-posStart);
-		return true;
-	default:
-		if ((Symb & 0xFF00) || posParse >= posEnd) return false;
-		if (NoCase) {
-			if (LowCase(CharAt(posParse,param)) != LowCase((char)Symb&0xFF)) return false;
-		} else
-			if (CharAt(posParse,param) != (char)(Symb&0xFF)) return false;
-		if (Inc) posParse++;
-		return true;
-	};
-}
-
-bool PosRegExp::LowParseRe(PRegInfo &Next) {
-	PRegInfo OrNext;
-	int i,match,sv;
-	int posStr;
-
-	switch(Next->Op) {
-	case ReSymb:
-		if (!CheckSymb(Next->un.Symb,true)) return false;
-		break;
-	case ReEmpty:
-		break;
-	case ReBkTrace:
-		if (!posBkStr | !BkTrace) return false;
-		sv = Next->un.Symb;
-		posStr = posParse;
-		for (i = BkTrace->s[sv]; i < BkTrace->e[sv]; i++) {
-			if (CharAt(posStr,param) != CharAt(posBkStr+i,param) || posEnd == posStr) return false;
-			posStr++;
-		};
-		posParse = posStr;
-		break;
-	case ReBkBrack:
-		sv = Next->un.Symb;
-		posStr = posParse;
-		if (Matches->s[sv] == -1 || Matches->e[sv] == -1) return false;
-		for (i = Matches->s[sv]; i < Matches->e[sv]; i++) {
-			if (CharAt(posStr,param) != CharAt(posStart+i,param) || posEnd == posStr) return false;
-			posStr++;
-		};
-		posParse = posStr;
-		break;
-	case ReBehind:
-		sv = Next->s;
-		posStr = posParse;
-		posParse -= sv;
-		if (!LowParse(Next->un.Param)) return false;
-		posParse = posStr;
-		break;
-	case ReNBehind:
-		sv = Next->s;
-		posStr = posParse;
-		posParse -= sv;
-		if (LowParse(Next->un.Param)) return false;
-		posParse = posStr;
-		break;
-	case ReAhead:
-		posStr = posParse;
-		if (!LowParse(Next->un.Param)) return false;
-		posParse = posStr;
-		break;
-	case ReNAhead:
-		posStr = posParse;
-		if (LowParse(Next->un.Param)) return false;
-		posParse = posStr;
-		break;
-	case ReEnum:
-		if (posParse >= posEnd) return false;
-		if (!Next->un.ChrClass->GetBit(CharAt(posParse,param))) return false;
-		posParse++;
-		break;
-	case ReNEnum:
-		if (posParse >= posEnd) return false;
-		if (Next->un.ChrClass->GetBit(CharAt(posParse,param))) return false;
-		posParse++;
-		break;
-	case ReBrackets:
-		match = Next->s;
-		sv = posParse-posStart;
-		posStr = posParse;
-		if (LowParse(Next->un.Param)) {
-			if (match || (Matches->s[match] == -1))
-				Matches->s[match] = sv;
-			if (match || (Matches->e[match] == -1))
-				Matches->e[match] = posParse-posStart;
-			return true;
-		};
-		posParse = posStr;
-		return false;
-	case ReMul:
-		posStr = posParse;
-		while (LowParse(Next->un.Param));
-		while(!LowCheckNext(Next) && posStr < posParse) posParse--;
-		break;
-	case ReNGMul:
-		do {
-			if (LowCheckNext(Next)) break;
-		} while (LowParse(Next->un.Param));
-		break;
-	case RePlus:
-		posStr = posParse;
-		match = false;
-		while (LowParse(Next->un.Param))
-			match = true;
-		if (!match) return false;
-		while(!LowCheckNext(Next) && posStr < posParse) posParse--;
-		break;
-	case ReNGPlus:
-		if (!LowParse(Next->un.Param)) return false;
-		do {
-			if (LowCheckNext(Next)) break;
-		} while (LowParse(Next->un.Param));
-		break;
-	case ReQuest:
-		LowParse(Next->un.Param);
-		break;
-	case ReNGQuest:
-		if (LowCheckNext(Next)) break;
-		if (!LowParse(Next->un.Param)) return false;
-		break;
-	case ReOr:
-		OrNext = Next;
-		// posStr = posParse;
-		if (LowParse(Next->un.Param)) {
-			while (OrNext && OrNext->Op == ReOr)
-				OrNext = OrNext->Next;
-			/*if (!LowCheckNext(OrNext)){
-			  posParse = posStr;
-			  OrNext = Next;
-		};*/
-		};
-		Next = OrNext;
-		break;
-	case ReRangeN:
-		posStr = posParse;
-		i = 0;
-		while (LowParse(Next->un.Param)) i++; // ???
-		do {
-			if (i < Next->s) {
-				posParse = posStr;
-				return false;
-			};
-			i--;
-		} while(!LowCheckNext(Next) && posStr < posParse--);
-		break;
-	case ReNGRangeN:
-		posStr = posParse;
-		i = 0;
-		while (LowParse(Next->un.Param)) {
-			i++;
-			if (i >= Next->s && LowCheckNext(Next)) // ???
-				break;
-		};
-		if (i < Next->s) {
-			posParse = posStr;
-			return false;
-		};
-		break;
-	case ReRangeNM:
-		posStr = posParse;
-		i = 0;
-		while (i < Next->s && LowParse(Next->un.Param)) // ???
-			i++;
-		if (i < Next->s) {
-			posParse = posStr;
-			return false;
-		};
-		while (i < Next->e && LowParse(Next->un.Param)) // ???
-			i++;
-
-		while(!LowCheckNext(Next)) {
-			i--;
-			posParse--;
-			if (i < Next->s) {
-				posParse = posStr;
-				return false;
-			};
-		};
-		break;
-	case ReNGRangeNM:
-		posStr = posParse;
-		i = 0;
-		while (i < Next->s && LowParse(Next->un.Param)) // ???
-			i++;
-		if (i < Next->s) {
-			posParse = posStr;
-			return false;
-		};
-		while(!LowCheckNext(Next)) {
-			i++;
-			if (!LowParse(Next->un.Param) || i > Next->e) { // ???
-				posParse = posStr;
-				return false;
-			};
-		};
-		break;
-	};
-	return true;
-};
-
-bool PosRegExp::LowCheckNext(PRegInfo Re) {
-	PRegInfo Next;
-	int tmp = posParse;
-	Next = Re;
-	do {
-		if (Next && Next->Op == ReOr)
-			while (Next && Next->Op == ReOr)
-				Next = Next->Next;
-		if (Next->Next && !LowParse(Next->Next)) {
-			posParse = tmp;
-			Ok = false;
-			return false;
-		};
-		Next = Next->Parent;
-	} while(Next);
-	posParse = tmp;
-	if (Ok != false) Ok = true;
-	return true;
-};
-
-bool PosRegExp::LowParse(PRegInfo Re) {
-	while(Re && posParse <= posEnd) {
-		if (!LowParseRe(Re)) return false;
-		if (Re) Re = Re->Next;
-	};
-	return true;
-};
-
-bool PosRegExp::QuickCheck() {
-	if (!NoMoves || !FirstChar)
-		return true;
-	switch(FirstChar) {
-	case ReSoL:
-		if (posParse != posStart) return false;
-		return true;
-	case ReWBound:
-		return IsWord(CharAt(posParse,param)) && (posParse == posStart || !IsWord(CharAt(posParse-1,param)));
-	default:
-		if (NoCase && LowCase(CharAt(posParse,param)) != LowCase(FirstChar)) return false;
-		if (!NoCase && CharAt(posParse,param) != (char)FirstChar) return false;
-		return true;
-	};
-};
-
-bool PosRegExp::ParseRe(int posStr) {
-	if (Error) return false;
-
-	posParse = posStr;
-	if (!QuickCheck()) return false;
-
-	for (int i = 0; i < MatchesNum; i++)
-		Matches->s[i] = Matches->e[i] = -1;
-	Matches->CurMatch = CurMatch;
-
-	Ok = -1;
-	//try{
-	do {
-		if (!LowParse(Info)) {
-			if (NoMoves) return false;
-		} else
-			return true;
-		posParse = ++posStr;
-	} while(posParse != posEnd+1);
-	return false;
-	//}__except(){
-	//  return true;
-	//};
-}
-;
-
-bool PosRegExp::Parse(int posStr,int posSol, int posEol, PMatches Mtch, int Moves) {
-	if (!this) return false;
-
-	bool s = NoMoves;
-	if (Moves != -1) NoMoves = Moves!=0;
-	posStart = posSol;
-	posEnd   = posEol;
-	Matches = Mtch;
-	bool r = ParseRe(posStr);
-	NoMoves = s;
-	return r;
-};
-
-bool PosRegExp::Parse(int posStr, int posStop, PMatches Mtch) {
-	if (!this) return false;
-	posStart = posStr;
-	posEnd = posStop;
-	Matches = Mtch;
-	return ParseRe(posStr);
-};
-
-bool PosRegExp::SetNoMoves(bool Moves) {
-	NoMoves = Moves;
-	return true;
-};
-
-bool PosRegExp::SetBkTrace(int posStr,PMatches Trace) {
-	BkTrace = Trace;
-	posBkStr = posStr;
-	return true;
-};
-
-#define EVAL_MATCHES 16
-#define EVAL_CHUNKSIZE 256
-
-#define EVAL_LOWERCASE 1
-#define EVAL_UPPERCASE 2
-#define EVAL_LOWERCASE_NEXT 4
-#define EVAL_UPPERCASE_NEXT 8
-
-bool PosRegExp::Evaluate(char *Expr, int posStr, PMatches Mtch, char **Res) {
-	int length,
-	newlength,
-	chunklength,
-	value,
-	size,
-	src,
-	end;
-	unsigned flag;
-	char ch,
-	*dest,
-	*pool;
-
-	size = EVAL_CHUNKSIZE;
-	pool = (char*) malloc (size);
-	dest = pool;
-	length = 0;
-	flag = 0;
-	while (*Expr) {
-		switch (ch = *Expr++) {
-		case '\\':
-			switch (ch = *Expr++) {
-			case 'A':
-			case 'B':
-			case 'C':
-			case 'D':
-			case 'E':
-			case 'F':
-				ch -= ('A' - '0');
-			case '0':
-			case '1':
-			case '2':
-			case '3':
-			case '4':
-			case '5':
-			case '6':
-			case '7':
-			case '8':
-			case '9':
-				value = ch - '0';
-				if (Mtch->s[value] != -1 && value < EVAL_MATCHES) {
-					chunklength = Mtch->e[value] - Mtch->s[value];
-					if (chunklength) {
-						newlength = chunklength + length;
-						if (newlength > size) {
-							do
-								size += EVAL_CHUNKSIZE;
-							while (size < newlength);
-							pool = (char*) realloc (pool, size);
-							dest = pool + length;
-						}
-						length = newlength;
-						src = posStr + Mtch->s[value];
-						end = posStr + Mtch->e[value];
-						if (flag & EVAL_UPPERCASE) {
-							if (flag & EVAL_LOWERCASE_NEXT) {
-								*dest++ = tolower (CharAt(src++,param));
-								flag &= ~EVAL_LOWERCASE_NEXT;
-							}
-							while (src < end)
-								*dest++ = toupper (CharAt(src++,param));
-						} else if (flag & EVAL_LOWERCASE) {
-							if (flag & EVAL_UPPERCASE_NEXT) {
-								*dest++ = toupper (CharAt(src++,param));
-								flag &= ~EVAL_UPPERCASE_NEXT;
-							}
-							while (src < end)
-								*dest++ = tolower (CharAt(src++,param));
-						} else {
-							if (flag & EVAL_LOWERCASE_NEXT) {
-								*dest++ = tolower (CharAt(src++,param));
-								flag &= ~EVAL_LOWERCASE_NEXT;
-							} else if (flag & EVAL_UPPERCASE_NEXT) {
-								*dest++ = toupper (CharAt(src++,param));
-								flag &= ~EVAL_UPPERCASE_NEXT;
-							}
-							while (src < end)
-								*dest++ = CharAt(src++,param);
-						}
-					}
-				} else
-					goto error;
-				continue;
-			case '\0':
-				goto error;
-			case 'r':
-				ch = '\r';
-				break;
-			case 'n':
-				ch = '\n';
-				break;
-			case 'b':
-				ch = '\b';
-				break;
-			case 'a':
-				ch = '\a';
-				break;
-			case 't':
-				ch = '\t';
-				break;
-			case 'U':
-				flag |= EVAL_UPPERCASE;
-				continue;
-			case 'u':
-				flag |= EVAL_UPPERCASE_NEXT;
-				continue;
-			case 'L':
-				flag |= EVAL_LOWERCASE;
-				continue;
-			case 'l':
-				flag |= EVAL_LOWERCASE_NEXT;
-				continue;
-			case 'Q':
-			case 'q':
-				flag &= ~(EVAL_UPPERCASE | EVAL_LOWERCASE);
-				continue;
-			case 'x':
-				{
-					if (!*Expr)
-						goto error;
-					value = toupper (*Expr) - '0';
-					if (value > 9)
-						value = value + '0' - 'A' + 10;
-					if (value > 15)
-						goto error;
-					ch = value << 4;
-					Expr++;
-					if (!*Expr)
-						goto error;
-					value = toupper (*Expr) - '0';
-					if (value > 9)
-						value = value + '0' - 'A' + 10;
-					if (value > 15)
-						goto error;
-					Expr++;
-					ch |= value;
-					break;
-				}
-			case 'd':
-				{
-					if (!*Expr)
-						goto error;
-					value = toupper (*Expr) - '0';
-					if (value > 9)
-						goto error;
-					ch = value * 100;
-					Expr++;
-					if (!*Expr)
-						goto error;
-					value = toupper (*Expr) - '0';
-					if (value > 9)
-						goto error;
-					ch += value * 10;
-					Expr++;
-					if (!*Expr)
-						goto error;
-					value = toupper (*Expr) - '0';
-					if (value > 9)
-						goto error;
-					ch += value;
-					Expr++;
-					break;
-				}
-			case 'o':
-				{
-					if (!*Expr)
-						goto error;
-					value = toupper (*Expr) - '0';
-					if (value > 9)
-						goto error;
-					ch = value << 6;
-					Expr++;
-					if (!*Expr)
-						goto error;
-					value = toupper (*Expr) - '0';
-					if (value > 9)
-						goto error;
-					ch += value << 3;
-					Expr++;
-					if (!*Expr)
-						goto error;
-					value = toupper (*Expr) - '0';
-					if (value > 9)
-						goto error;
-					ch |= value;
-					Expr++;
-					/* break; */
-				}
-				/* default:
-					break; */
-			}
-		default:
-			if (++length > size) {
-				do
-					size += EVAL_CHUNKSIZE;
-				while (size < length);
-				pool = (char*) realloc (pool, size);
-				dest = pool + length - 1;
-			}
-			if (flag & EVAL_LOWERCASE_NEXT) {
-				*dest++ = tolower (ch);
-				flag &= ~EVAL_LOWERCASE_NEXT;
-			} else if (flag & EVAL_UPPERCASE_NEXT) {
-				*dest++ = toupper (ch);
-				flag &= ~EVAL_UPPERCASE_NEXT;
-			} else if (flag & EVAL_UPPERCASE)
-				*dest++ = toupper (ch);
-			else if (flag & EVAL_LOWERCASE)
-				*dest++ = tolower (ch);
-			else
-				*dest++ = ch;
-		}
-	}
-	if (++length > size) {
-		do
-			size += EVAL_CHUNKSIZE;
-		while (size < length);
-		pool = (char*) realloc (pool, size);
-		dest = pool + length - 1;
-	}
-	*dest = '\0';
-	*Res = pool;
-	return true;
-error:
-	free (pool);
-	return false;
-}
diff --git a/src/stc/scintilla/src/PropSet.cxx b/src/stc/scintilla/src/PropSet.cxx
index a58d143164..701b2a82c7 100644
--- a/src/stc/scintilla/src/PropSet.cxx
+++ b/src/stc/scintilla/src/PropSet.cxx
@@ -1,6 +1,8 @@
 // SciTE - Scintilla based Text Editor
-// PropSet.cxx - a java style properties file module
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file PropSet.cxx
+ ** A Java style properties file module.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 // Maintain a dictionary of properties
@@ -14,62 +16,68 @@
 
 #include "PropSet.h"
 
-bool EqualCaseInsensitive(const char *a, const char *b) {
-#if PLAT_GTK
-	return 0 == strcasecmp(a, b);
-#elif PLAT_WIN
-	return 0 == stricmp(a, b);
-#elif PLAT_WX
-	return 0 == wxStricmp(a, b);
-#endif
-}
-
-SString::size_type SString::npos = -1;
-
-inline unsigned int HashString(const char *s) {
-    unsigned int ret = 0;
-    while (*s) {
-        ret <<= 4;
-        ret ^= *s;
-        s++;
-    }
-    return ret;
-}
-
-// Get a line of input. If end of line escaped with '\\' then continue reading.
-static bool GetFullLine(const char *&fpc, int &lenData, char *s, int len) {
-	bool continuation = true;
-	s[0] = '\0';
-	while ((len > 1) && lenData > 0) {
-		char ch = *fpc;
-		fpc++;
-		lenData--;
-		if ((ch == '\r') || (ch == '\n')) {
-			if (!continuation) {
-				if ((lenData > 0) && (ch == '\r') && ((*fpc) == '\n')) {
-					// munch the second half of a crlf
-					fpc++;
-					lenData--;
-				}
-				*s = '\0';
-				return true;
-			}
-		} else if ((ch == '\\') && (lenData > 0) && ((*fpc == '\r') || (*fpc == '\n'))) {
-			continuation = true;
-		} else {
-			continuation = false;
-			*s++ = ch;
-			*s = '\0';
-			len--;
+// The comparison and case changing functions here assume ASCII
+// or extended ASCII such as the normal Windows code page.
+
+static inline char MakeUpperCase(char ch) {
+	if (ch < 'a' || ch > 'z')
+		return ch;
+	else
+		return static_cast<char>(ch - 'a' + 'A');
+}
+
+int CompareCaseInsensitive(const char *a, const char *b) {
+	while (*a && *b) {
+		if (*a != *b) {
+			char upperA = MakeUpperCase(*a);
+			char upperB = MakeUpperCase(*b);
+			if (upperA != upperB)
+				return upperA - upperB;
 		}
+		a++;
+		b++;
 	}
-	return false;
+	// Either *a or *b is nul
+	return *a - *b;
+}
+
+int CompareNCaseInsensitive(const char *a, const char *b, int len) {
+	while (*a && *b && len) {
+		if (*a != *b) {
+			char upperA = MakeUpperCase(*a);
+			char upperB = MakeUpperCase(*b);
+			if (upperA != upperB)
+				return upperA - upperB;
+		}
+		a++;
+		b++;
+		len--;
+	}
+	if (len == 0)
+		return 0;
+	else
+		// Either *a or *b is nul
+		return *a - *b;
+}
+
+bool EqualCaseInsensitive(const char *a, const char *b) {
+	return 0 == CompareCaseInsensitive(a, b);
+}
+
+inline unsigned int HashString(const char *s, int len) {
+	unsigned int ret = 0;
+	while (len--) {
+		ret <<= 4;
+		ret ^= *s;
+		s++;
+	}
+	return ret;
 }
 
 PropSet::PropSet() {
 	superPS = 0;
-    for (int root=0; root < hashRoots; root++)
-        props[root] = 0;
+	for (int root = 0; root < hashRoots; root++)
+		props[root] = 0;
 }
 
 PropSet::~PropSet() {
@@ -77,45 +85,66 @@ PropSet::~PropSet() {
 	Clear();
 }
 
-void PropSet::Set(const char *key, const char *val) {
-    unsigned int hash = HashString(key);
-	for (Property *p=props[hash % hashRoots]; p; p=p->next) {
-		if ((hash == p->hash) && (0 == strcmp(p->key, key))) {
+void PropSet::Set(const char *key, const char *val, int lenKey, int lenVal) {
+	if (!*key)	// Empty keys are not supported
+		return;
+	if (lenKey == -1)
+		lenKey = strlen(key);
+	if (lenVal == -1)
+		lenVal = strlen(val);
+	unsigned int hash = HashString(key, lenKey);
+	for (Property *p = props[hash % hashRoots]; p; p = p->next) {
+		if ((hash == p->hash) && 
+			((strlen(p->key) == static_cast<unsigned int>(lenKey)) && 
+				(0 == strncmp(p->key, key, lenKey)))) {
 			// Replace current value
 			delete [](p->val);
-			p->val = StringDup(val);
-			return;
+			p->val = StringDup(val, lenVal);
+			return ;
 		}
 	}
 	// Not found
-    Property *pNew = new Property;
-    if (pNew) {
-        pNew->hash = HashString(key);
-	    pNew->key = StringDup(key);
-	    pNew->val = StringDup(val);
-	    pNew->next = props[hash % hashRoots];
-        props[hash % hashRoots] = pNew;
-    }
+	Property *pNew = new Property;
+	if (pNew) {
+		pNew->hash = hash;
+		pNew->key = StringDup(key, lenKey);
+		pNew->val = StringDup(val, lenVal);
+		pNew->next = props[hash % hashRoots];
+		props[hash % hashRoots] = pNew;
+	}
 }
 
-void PropSet::Set(char *keyval) {
-    while (isspace(*keyval))
-        keyval++;
-	char *eqat = strchr(keyval, '=');
-	if (eqat) {
-		*eqat = '\0';
-		Set(keyval, eqat + 1);
-		*eqat = '=';
+void PropSet::Set(const char *keyVal) {
+	while (isspace(*keyVal))
+		keyVal++;
+	const char *endVal = keyVal;
+	while (*endVal && (*endVal != '\n'))
+		endVal++;
+	const char *eqAt = strchr(keyVal, '=');
+	if (eqAt) {
+		Set(keyVal, eqAt + 1, eqAt-keyVal, endVal - eqAt - 1);
+	} else if (*keyVal) {	// No '=' so assume '=1'
+		Set(keyVal, "1", endVal-keyVal, 1);
 	}
 }
 
+void PropSet::SetMultiple(const char *s) {
+	const char *eol = strchr(s, '\n');
+	while (eol) {
+		Set(s);
+		s = eol + 1;
+		eol = strchr(s, '\n');
+	}
+	Set(s);
+}
+
 SString PropSet::Get(const char *key) {
-    unsigned int hash = HashString(key);
-	for (Property *p=props[hash % hashRoots]; p; p=p->next) {
+	unsigned int hash = HashString(key, strlen(key));
+	for (Property *p = props[hash % hashRoots]; p; p = p->next) {
 		if ((hash == p->hash) && (0 == strcmp(p->key, key))) {
-            return p->val;
-        }
-    }
+			return p->val;
+		}
+	}
 	if (superPS) {
 		// Failed here, so try in base property set
 		return superPS->Get(key);
@@ -124,19 +153,35 @@ SString PropSet::Get(const char *key) {
 	}
 }
 
+static bool IncludesVar(const char *value, const char *key) {
+	const char *var = strstr(value, "$(");
+	while (var) {
+		if (isprefix(var + 2, key) && (var[2 + strlen(key)] == ')')) {
+			// Found $(key) which would lead to an infinite loop so exit
+			return true;
+		}
+		var = strstr(var + 2, ")");
+		if (var)
+			var = strstr(var + 1, "$(");
+	}
+	return false;
+}
+
 SString PropSet::GetExpanded(const char *key) {
-    SString val = Get(key);
-    return Expand(val.c_str());
+	SString val = Get(key);
+	if (IncludesVar(val.c_str(), key))
+		return val;
+	return Expand(val.c_str());
 }
 
-SString PropSet::Expand(const char *withvars) {
-	char *base = StringDup(withvars);
+SString PropSet::Expand(const char *withVars) {
+	char *base = StringDup(withVars);
 	char *cpvar = strstr(base, "$(");
 	while (cpvar) {
 		char *cpendvar = strchr(cpvar, ')');
 		if (cpendvar) {
 			int lenvar = cpendvar - cpvar - 2;  	// Subtract the $()
-			char *var = StringDup(cpvar+2, lenvar);
+			char *var = StringDup(cpvar + 2, lenvar);
 			SString val = GetExpanded(var);
 			int newlenbase = strlen(base) + val.length() - lenvar;
 			char *newbase = new char[newlenbase];
@@ -155,14 +200,13 @@ SString PropSet::Expand(const char *withvars) {
 }
 
 int PropSet::GetInt(const char *key, int defaultValue) {
-	SString val = Get(key);
+	SString val = GetExpanded(key);
 	if (val.length())
 		return val.value();
-	else
-		return defaultValue;
+	return defaultValue;
 }
 
-inline bool isprefix(const char *target, const char *prefix) {
+bool isprefix(const char *target, const char *prefix) {
 	while (*target && *prefix) {
 		if (*target != *prefix)
 			return false;
@@ -175,69 +219,70 @@ inline bool isprefix(const char *target, const char *prefix) {
 		return true;
 }
 
-bool issuffix(const char *target, const char *suffix) {
+static bool IsSuffixCaseInsensitive(const char *target, const char *suffix) {
 	int lentarget = strlen(target);
 	int lensuffix = strlen(suffix);
 	if (lensuffix > lentarget)
 		return false;
 	for (int i = lensuffix - 1; i >= 0; i--) {
-		if (target[i + lentarget - lensuffix] != suffix[i])
+		if (MakeUpperCase(target[i + lentarget - lensuffix]) !=
+		        MakeUpperCase(suffix[i]))
 			return false;
 	}
 	return true;
 }
 
 SString PropSet::GetWild(const char *keybase, const char *filename) {
-    for (int root=0; root < hashRoots; root++) {
-	    for (Property *p=props[root]; p; p=p->next) {
-		    if (isprefix(p->key, keybase)) {
-			    char *orgkeyfile = p->key + strlen(keybase);
-			    char *keyfile = NULL;
-
-			    if (strstr(orgkeyfile, "$(") == orgkeyfile) {
-				    char *cpendvar = strchr(orgkeyfile, ')');
-				    if (cpendvar) {
-					    *cpendvar = '\0';
-					    SString s = Get(orgkeyfile + 2);
-					    *cpendvar= ')';
-					    keyfile = strdup(s.c_str());
-				    }
-			    }
-			    char *keyptr = keyfile;
-
-			    if (keyfile == NULL)
-				    keyfile = orgkeyfile;
-
-			    for (; ; ) {
-				    char *del = strchr(keyfile, ';');
-				    if (del == NULL)
-					    del = keyfile + strlen(keyfile);
-				    char delchr = *del;
-				    *del = '\0';
-				    if (*keyfile == '*') {
-					    if (issuffix(filename, keyfile + 1)) {
-						    *del = delchr;
-						    free(keyptr);
-						    return p->val;
-					    }
-				    } else if (0 == strcmp(keyfile, filename)) {
-					    *del = delchr;
-					    free(keyptr);
-					    return p->val;
-				    }
-				    if (delchr == '\0')
-					    break;
-				    *del = delchr;
-				    keyfile = del + 1;
-			    }
-			    free(keyptr);
-
-			    if (0 == strcmp(p->key, keybase)) {
-				    return p->val;
-			    }
-		    }
-	    }
-    }
+	for (int root = 0; root < hashRoots; root++) {
+		for (Property *p = props[root]; p; p = p->next) {
+			if (isprefix(p->key, keybase)) {
+				char * orgkeyfile = p->key + strlen(keybase);
+				char *keyfile = NULL;
+
+				if (strstr(orgkeyfile, "$(") == orgkeyfile) {
+					char *cpendvar = strchr(orgkeyfile, ')');
+					if (cpendvar) {
+						*cpendvar = '\0';
+						SString s = GetExpanded(orgkeyfile + 2);
+						*cpendvar = ')';
+						keyfile = StringDup(s.c_str());
+					}
+				}
+				char *keyptr = keyfile;
+
+				if (keyfile == NULL)
+					keyfile = orgkeyfile;
+
+				for (; ; ) {
+					char *del = strchr(keyfile, ';');
+					if (del == NULL)
+						del = keyfile + strlen(keyfile);
+					char delchr = *del;
+					*del = '\0';
+					if (*keyfile == '*') {
+						if (IsSuffixCaseInsensitive(filename, keyfile + 1)) {
+							*del = delchr;
+							delete []keyptr;
+							return p->val;
+						}
+					} else if (0 == strcmp(keyfile, filename)) {
+						*del = delchr;
+						delete []keyptr;
+						return p->val;
+					}
+					if (delchr == '\0')
+						break;
+					*del = delchr;
+					keyfile = del + 1;
+				}
+				delete []keyptr;
+
+				if (0 == strcmp(p->key, keybase)) {
+					return p->val;
+				}
+			}
+		}
+	}
 	if (superPS) {
 		// Failed here, so try in base property set
 		return superPS->GetWild(keybase, filename);
@@ -246,6 +291,8 @@ SString PropSet::GetWild(const char *keybase, const char *filename) {
 	}
 }
 
+// GetNewExpand does not use Expand as it has to use GetWild with the filename for each
+// variable reference found.
 SString PropSet::GetNewExpand(const char *keybase, const char *filename) {
 	char *base = StringDup(GetWild(keybase, filename).c_str());
 	char *cpvar = strstr(base, "$(");
@@ -253,7 +300,7 @@ SString PropSet::GetNewExpand(const char *keybase, const char *filename) {
 		char *cpendvar = strchr(cpvar, ')');
 		if (cpendvar) {
 			int lenvar = cpendvar - cpvar - 2;  	// Subtract the $()
-			char *var = StringDup(cpvar+2, lenvar);
+			char *var = StringDup(cpvar + 2, lenvar);
 			SString val = GetWild(var, filename);
 			int newlenbase = strlen(base) + val.length() - lenvar;
 			char *newbase = new char[newlenbase];
@@ -272,57 +319,92 @@ SString PropSet::GetNewExpand(const char *keybase, const char *filename) {
 }
 
 void PropSet::Clear() {
-    for (int root=0; root < hashRoots; root++) {
-        Property *p=props[root];
-	    while (p) {
-            Property *pNext=p->next;
-		    p->hash = 0;
-		    delete p->key;
-		    p->key = 0;
-		    delete p->val;
-		    p->val = 0;
-            delete p;
-            p = pNext;
-        }
-        props[root] = 0;
-    }
-}
-
-void PropSet::ReadFromMemory(const char *data, int len, const char *directoryForImports) {
-	const char *pd = data;
-	char linebuf[60000];
-	bool ifIsTrue = true;
-	while (len > 0) {
-		GetFullLine(pd, len, linebuf, sizeof(linebuf));
-		if (isalpha(linebuf[0]))    // If clause ends with first non-indented line
-			ifIsTrue = true;
-		if (isprefix(linebuf, "if ")) {
-			const char *expr = linebuf + strlen("if") + 1;
-			ifIsTrue = GetInt(expr);
-		} else if (isprefix(linebuf, "import ") && directoryForImports) {
-			char importPath[1024];
-			strcpy(importPath, directoryForImports);
-			strcat(importPath, linebuf + strlen("import") + 1);
-			strcat(importPath, ".properties");
-            		Read(importPath,directoryForImports);
-		} else if (isalpha(linebuf[0])) {
-			Set(linebuf);
-		} else if (isspace(linebuf[0]) && ifIsTrue) {
-			Set(linebuf);
+	for (int root = 0; root < hashRoots; root++) {
+		Property *p = props[root];
+		while (p) {
+			Property *pNext = p->next;
+			p->hash = 0;
+			delete p->key;
+			p->key = 0;
+			delete p->val;
+			p->val = 0;
+			delete p;
+			p = pNext;
 		}
+		props[root] = 0;
 	}
 }
 
-void PropSet::Read(const char *filename, const char *directoryForImports) {
-	char propsData[60000];
-	FILE *rcfile = fopen(filename, "rb");
-	if (rcfile) {
-		int lenFile = fread(propsData, 1, sizeof(propsData), rcfile);
-		fclose(rcfile);
-		ReadFromMemory(propsData, lenFile, directoryForImports);
-	} else {
-		//printf("Could not open <%s>\n", filename);
+char *PropSet::ToString() {
+	unsigned int len=0;
+	for (int r = 0; r < hashRoots; r++) {
+		for (Property *p = props[r]; p; p = p->next) {
+			len += strlen(p->key) + 1;
+			len += strlen(p->val) + 1;
+		}
+	}
+	if (len == 0)
+		len = 1;	// Return as empty string
+	char *ret = new char [len];
+	if (ret) {
+		char *w = ret;
+		for (int root = 0; root < hashRoots; root++) {
+			for (Property *p = props[root]; p; p = p->next) {
+				strcpy(w, p->key);
+				w += strlen(p->key);
+				*w++ = '=';
+				strcpy(w, p->val);
+				w += strlen(p->val);
+				*w++ = '\n';
+			}
+		}
+		ret[len-1] = '\0';
+	}
+	return ret;
+}
+
+/**
+ * Initiate enumeration.
+ */
+bool PropSet::GetFirst(char **key, char **val) {
+	for (int i = 0; i < hashRoots; i++) {
+		for (Property *p = props[i]; p; p = p->next) {
+			if (p) {
+				*key = p->key;
+				*val = p->val;
+				enumnext = p->next; // GetNext will begin here ...
+				enumhash = i;		  // ... in this block
+				return true;
+			}
+		}
+	}
+	return false;
+}
+
+/**
+ * Continue enumeration.
+ */
+bool PropSet::GetNext(char ** key, char ** val) {
+	bool firstloop = true;
+
+	// search begins where we left it : in enumhash block
+	for (int i = enumhash; i < hashRoots; i++) {
+		if (!firstloop)
+			enumnext = props[i]; // Begin with first property in block
+		// else : begin where we left
+		firstloop = false;
+
+		for (Property *p = enumnext; p; p = p->next) {
+			if (p) {
+				*key = p->key;
+				*val = p->val;
+				enumnext = p->next; // for GetNext
+				enumhash = i;
+				return true;
+			}
+		}
 	}
+	return false;
 }
 
 static bool iswordsep(char ch, bool onlyLineEnds) {
@@ -333,10 +415,11 @@ static bool iswordsep(char ch, bool onlyLineEnds) {
 	return ch == '\r' || ch == '\n';
 }
 
-// Creates an array that points into each word in the string and puts \0 terminators
-// after each word.
+/**
+ * Creates an array that points into each word in the string and puts \0 terminators
+ * after each word.
+ */
 static char **ArrayFromWordList(char *wordlist, int *len, bool onlyLineEnds = false) {
-#if 1
 	char prev = '\n';
 	int words = 0;
 	for (int j = 0; wordlist[j]; j++) {
@@ -365,50 +448,14 @@ static char **ArrayFromWordList(char *wordlist, int *len, bool onlyLineEnds = fa
 	} else {
 		*len = 0;
 	}
-#else
-	int words = 0; // length of the returned buffer of pointers
-	#undef APICHUNK // how many pointers will be pre-allocated (to avoid buffer reallocation on each new pointer)
-	#define APICHUNK 256
-	int size = APICHUNK; // real size of the returned buffer of pointers
-	char **keywords; // buffer for the pointers returned
-	int slen = strlen(wordlist); //length of the buffer with api file
-	keywords = (char**) malloc((size + 1) * sizeof (*keywords));
-	words = 0;
-	for (int k = 0;;) {
-		while (iswordsep(wordlist[k], onlyLineEnds))
-			wordlist[k++] = '\0';
-		if (k >= slen)
-			break;
-		if (words >= size) {
-			do
-				size += APICHUNK;
-			while (size <= words);
-			keywords = (char**) realloc(keywords, (size + 1) * sizeof (*keywords));
-		}
-		keywords[words++] = wordlist + k;
-		do
-			if (k < slen)
-				k++;
-			else
-				goto out;
-		while (!iswordsep(wordlist[k], onlyLineEnds));
-	}
-out:
-	keywords[words] = wordlist + slen;
-	*len = words;
-#endif
 	return keywords;
 }
 
 void WordList::Clear() {
 	if (words) {
 		delete []list;
-#if 1
-        delete []words;
-#else
-		free(words);
-#endif
-		free(wordsNoCase);
+		delete []words;
+		delete []wordsNoCase;
 	}
 	words = 0;
 	wordsNoCase = 0;
@@ -421,7 +468,7 @@ void WordList::Set(const char *s) {
 	list = StringDup(s);
 	sorted = false;
 	words = ArrayFromWordList(list, &len, onlyLineEnds);
-	wordsNoCase = (char**) malloc ((len + 1) * sizeof (*wordsNoCase));
+	wordsNoCase = new char * [len + 1];
 	memcpy(wordsNoCase, words, (len + 1) * sizeof (*words));
 }
 
@@ -434,27 +481,27 @@ char *WordList::Allocate(int size) {
 void WordList::SetFromAllocated() {
 	sorted = false;
 	words = ArrayFromWordList(list, &len, onlyLineEnds);
-	wordsNoCase = (char**) malloc ((len + 1) * sizeof (*wordsNoCase));
+	wordsNoCase = new char * [len + 1];
 	memcpy(wordsNoCase, words, (len + 1) * sizeof (*words));
 }
 
 int cmpString(const void *a1, const void *a2) {
-    // Can't work out the correct incantation to use modern casts here
-    return strcmp(*(char**)(a1), *(char**)(a2));
+	// Can't work out the correct incantation to use modern casts here
+	return strcmp(*(char**)(a1), *(char**)(a2));
 }
 
 int cmpStringNoCase(const void *a1, const void *a2) {
-    // Can't work out the correct incantation to use modern casts here
-    return strcasecmp(*(char**)(a1), *(char**)(a2));
+	// Can't work out the correct incantation to use modern casts here
+	return CompareCaseInsensitive(*(char**)(a1), *(char**)(a2));
 }
 
 static void SortWordList(char **words, char **wordsNoCase, unsigned int len) {
 	qsort(reinterpret_cast<void*>(words), len, sizeof(*words),
-		cmpString);
+	      cmpString);
 	qsort(reinterpret_cast<void*>(wordsNoCase), len, sizeof(*wordsNoCase),
-		cmpStringNoCase);
+	      cmpStringNoCase);
 }
- 
+
 bool WordList::InList(const char *s) {
 	if (0 == words)
 		return false;
@@ -485,13 +532,28 @@ bool WordList::InList(const char *s) {
 			j++;
 		}
 	}
+	j = starts['^'];
+	if (j >= 0) {
+		while (words[j][0] == '^') {
+			const char *a = words[j] + 1;
+			const char *b = s;
+			while (*a && *a == *b) {
+				a++;
+				b++;
+			}
+			if (!*a)
+				return true;
+			j++;
+		}
+	}
 	return false;
 }
 
 /**
- * Returns an element (complete) of the wordlist array which has the beginning
- * the same as the passed string. The length of the word to compare is passed
- * too. Letter case can be ignored or preserved (default).
+ * Returns an element (complete) of the wordlist array which has
+ * the same beginning as the passed string.
+ * 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*/) {
 	int start = 0; // lower bound of the api array block to search
@@ -506,57 +568,84 @@ const char *WordList::GetNearestWord(const char *wordStart, int searchLen /*= -1
 		sorted = true;
 		SortWordList(words, wordsNoCase, len);
 	}
-	if (ignoreCase)
+	if (ignoreCase) {
 		while (start <= end) { // binary searching loop
 			pivot = (start + end) >> 1;
 			word = wordsNoCase[pivot];
-			cond = strncasecmp(wordStart, word, searchLen);
+			cond = CompareNCaseInsensitive(wordStart, word, searchLen);
 			if (!cond && nonFuncChar(word[searchLen])) // maybe there should be a "non-word character" test here?
 				return word; // result must not be freed with free()
-			else if (cond < 0)
-				end = pivot - 1;
 			else if (cond > 0)
 				start = pivot + 1;
+			else if (cond <= 0)
+				end = pivot - 1;
 		}
-	else // preserve the letter case
+	} else { // preserve the letter case
 		while (start <= end) { // binary searching loop
 			pivot = (start + end) >> 1;
 			word = words[pivot];
 			cond = strncmp(wordStart, word, searchLen);
 			if (!cond && nonFuncChar(word[searchLen])) // maybe there should be a "non-word character" test here?
 				return word; // result must not be freed with free()
-			else if (cond >= 0)
+			else if (cond > 0)
 				start = pivot + 1;
-			else if (cond < 0)
+			else if (cond <= 0)
 				end = pivot - 1;
 		}
+	}
 	return NULL;
 }
-	
+
+/**
+ * Find the length of a 'word' which is actually an identifier in a string
+ * which looks like "identifier(..." or "identifier:" or "identifier" and where
+ * there may be extra spaces after the identifier that should not be
+ * counted in the length.
+ */
+static unsigned int LengthWord(const char *word, char otherSeparator) {
+	// Find a '(', or ':'. If that fails go to the end of the string.
+	const char *endWord = strchr(word, '(');
+	if (!endWord)
+		endWord = strchr(word, ':');
+	if (!endWord && otherSeparator)
+		endWord = strchr(word, otherSeparator);
+	if (!endWord)
+		endWord = word + strlen(word);
+	// Last case always succeeds so endWord != 0
+
+	// Drop any space characters.
+	if (endWord > word) {
+		endWord--;	// Back from the '(', ':', or '\0'
+		// Move backwards over any spaces
+		while ((endWord > word) && (isspace(*endWord))) {
+			endWord--;
+		}
+	}
+	return endWord - word;
+}
+
 /**
  * Returns elements (first words of them) of the wordlist array which have
- * the beginning the same as the passed string. The length of the word to
- * compare is passed too. Letter case can be ignored or preserved (default).
+ * the same beginning as the passed string.
+ * The length of the word to compare is passed too.
+ * Letter case can be ignored or preserved (default).
  * If there are more words meeting the condition they are returned all of
  * them in the ascending order separated with spaces.
  *
- * NOTE: returned buffer has to be freed with a free() call.
+ * NOTE: returned buffer has to be freed with delete[].
  */
-char *WordList::GetNearestWords(const char *wordStart, int searchLen /*= -1*/, bool ignoreCase /*= false*/) {
+char *WordList::GetNearestWords(
+    const char *wordStart,
+    int searchLen /*= -1*/,
+    bool ignoreCase /*= false*/,
+    char otherSeparator /*= '\0'*/) {
 	int wordlen; // length of the word part (before the '(' brace) of the api array element
-	int length = 0; // length of the returned buffer of words (string)
-	int newlength; // length of the new buffer before the reallocating itself
-	#undef WORDCHUNK // how many characters will be pre-allocated (to avoid buffer reallocation on each new word)
-	#define WORDCHUNK 100
-	int size = WORDCHUNK; // real size of the returned buffer of words
-	char *buffer; // buffer for the words returned
+	SString wordsNear;
+	wordsNear.setsizegrowth(1000);
 	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 cond; // comparison result (in the sense of strcmp() result)
-	int oldpivot; // pivot storage to be able to browse the api array upwards and then downwards
-	const char *word; // api array element just being compared
-	const char *brace; // position of the opening brace in the api array element just being compared
 
 	if (0 == words)
 		return NULL;
@@ -564,179 +653,58 @@ char *WordList::GetNearestWords(const char *wordStart, int searchLen /*= -1*/, b
 		sorted = true;
 		SortWordList(words, wordsNoCase, len);
 	}
-	buffer = (char*) malloc(size);
-	*buffer = '\0';
-	if (ignoreCase)
-		while (start <= end) { // binary searching loop
-			pivot = (start + end) >> 1;
-			word = wordsNoCase[pivot];
-			cond = strncasecmp(wordStart, word, searchLen);
+	if (ignoreCase) {
+		while (start <= end) { // Binary searching loop
+			pivot = (start + end) / 2;
+			cond = CompareNCaseInsensitive(wordStart, wordsNoCase[pivot], searchLen);
 			if (!cond) {
-				oldpivot = pivot;
-				do { // browse sequentially the rest after the hit
-					brace = strchr(word, '(');
-					if (brace)
-						do
-							if (--brace < word)
-								break;
-						while (isspace(*brace));
-					else {
-						brace = word + strlen(word);
-						do
-							if (--brace < word)
-								break;
-						while (isspace(*brace));
-					}
-					wordlen = brace - word + 1;
-					newlength = length + wordlen; // stretch the buffer
-					if (length)
-						newlength++;
-					if (newlength >= size) {
-						do
-							size += WORDCHUNK;
-						while (size <= newlength);
-						buffer = (char*) realloc(buffer, size);
-					}
-					if (length) // append a new entry
-						buffer[length++] = ' ';
-					memcpy(buffer + length, word, wordlen);
-					length = newlength;
-					buffer[length] = '\0';
-					if (++pivot > end)
-						break;
-					word = wordsNoCase[pivot];
-				} while (!strncasecmp(wordStart, word, searchLen));
-
-				pivot = oldpivot;
-				for (;;) { // browse sequentially the rest before the hit
-					if (--pivot < start)
-						break;
-					word = wordsNoCase[pivot];
-					if (strncasecmp(wordStart, word, searchLen))
-						break;                 
-					brace = strchr(word, '(');
-					if (brace)
-						do
-							if (--brace < word)
-								break;
-						while (isspace(*brace));
-					else {
-						brace = word + strlen(word);
-						do
-							if (--brace < word)
-								break;
-						while (isspace(*brace));
-					}
-					wordlen = brace - word + 1;
-					newlength = length + wordlen; // stretch the buffer
-					if (length)
-						newlength++;
-					if (newlength >= size)
-					{
-						do
-							size += WORDCHUNK;
-						while (size <= newlength);
-						buffer = (char*) realloc(buffer, size);
-					}
-					if (length) // append a new entry
-						buffer[length++] = ' ';
-					memcpy(buffer + length, word, wordlen);
-					length = newlength;
-					buffer[length] = '\0';
+				// Find first match
+				while ((pivot > start) &&
+					(0 == CompareNCaseInsensitive(wordStart, 
+						wordsNoCase[pivot-1], searchLen))) {
+					--pivot;
 				}
-				return buffer; // result has to be freed with free()
-			}
-			else if (cond < 0)
+				// Grab each match
+				while ((pivot <= end) &&
+					(0 == CompareNCaseInsensitive(wordStart, 
+						wordsNoCase[pivot], searchLen))) {
+					wordlen = LengthWord(wordsNoCase[pivot], otherSeparator) + 1;
+					wordsNear.append(wordsNoCase[pivot], wordlen, ' ');
+					++pivot;
+				}
+				return wordsNear.detach();
+			} else if (cond < 0) {
 				end = pivot - 1;
-			else if (cond > 0)
+			} else if (cond > 0) {
 				start = pivot + 1;
+			}
 		}
-	else // preserve the letter case
-		while (start <= end) { // binary searching loop
-			pivot = (start + end) >> 1;
-			word = words[pivot];
-			cond = strncmp(wordStart, word, searchLen);
+	} else {	// Preserve the letter case
+		while (start <= end) { // Binary searching loop
+			pivot = (start + end) / 2;
+			cond = strncmp(wordStart, words[pivot], searchLen);
 			if (!cond) {
-				oldpivot = pivot;
-				do { // browse sequentially the rest after the hit
-					brace = strchr(word, '(');
-					if (brace)
-						do
-							if (--brace < word)
-								break;
-						while (isspace(*brace));
-					else {
-						brace = word + strlen(word);
-						do
-							if (--brace < word)
-								break;
-						while (isspace(*brace));
-					}
-					wordlen = brace - word + 1;
-					newlength = length + wordlen; // stretch the buffer
-					if (length)
-						newlength++;
-					if (newlength >= size)
-					{
-						do
-							size += WORDCHUNK;
-						while (size <= newlength);
-						buffer = (char*) realloc(buffer, size);
-					}
-					if (length) // append a new entry
-						buffer[length++] = ' ';
-					memcpy(buffer + length, word, wordlen);
-					length = newlength;
-					buffer[length] = '\0';
-					if (++pivot > end)
-						break;
-					word = words[pivot];
-				} while (!strncmp(wordStart, word, searchLen));
-
-				pivot = oldpivot;
-				for (;;) { // browse sequentially the rest before the hit
-					if (--pivot < start)
-						break;
-					word = words[pivot];
-					if (strncmp(wordStart, word, searchLen))
-						break;
-					brace = strchr(word, '(');
-					if (brace)
-						do
-							if (--brace < word)
-								break;
-						while (isspace(*brace));
-					else {
-						brace = word + strlen(word);
-						do
-							if (--brace < word)
-								break;
-						while (isspace(*brace));
-					}
-					wordlen = brace - word + 1;
-					newlength = length + wordlen; // stretch the buffer
-					if (length)
-						newlength++;
-					if (newlength >= size)
-					{
-						do
-							size += WORDCHUNK;
-						while (size <= newlength);
-						buffer = (char*) realloc(buffer, size);
-					}
-					if (length) // append a new entry
-						buffer[length++] = ' ';
-					memcpy(buffer + length, word, wordlen);
-					length = newlength;
-					buffer[length] = '\0';
+				// Find first match
+				while ((pivot > start) &&
+					(0 == strncmp(wordStart, 
+						words[pivot-1], searchLen))) { 
+					--pivot;
 				}
-				return buffer; // result has to be freed with free()
-			}
-			else if (cond < 0)
+				// Grab each match
+				while ((pivot <= end) &&
+					(0 == strncmp(wordStart, 
+						words[pivot], searchLen))) { 
+					wordlen = LengthWord(words[pivot], otherSeparator) + 1;
+					wordsNear.append(words[pivot], wordlen, ' ');
+					++pivot;
+				}
+				return wordsNear.detach();
+			} else if (cond < 0) {
 				end = pivot - 1;
-			else if (cond > 0)
+			} else if (cond > 0) {
 				start = pivot + 1;
+			}
 		}
-	free(buffer);
+	}
 	return NULL;
 }
diff --git a/src/stc/scintilla/src/RESearch.cxx b/src/stc/scintilla/src/RESearch.cxx
new file mode 100644
index 0000000000..07534db1ef
--- /dev/null
+++ b/src/stc/scintilla/src/RESearch.cxx
@@ -0,0 +1,865 @@
+// Scintilla source code edit control
+/** @file RESearch.cxx
+ ** Regular expression search library.
+ **/
+
+/*
+ * regex - Regular expression pattern matching  and replacement
+ *
+ * By:  Ozan S. Yigit (oz)
+ *      Dept. of Computer Science
+ *      York University
+ *
+ * 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.
+ * 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
+ * routines as found in 4.nBSD UN*X, with minor extensions.
+ *
+ * These routines are derived from various implementations found
+ * in software tools books, and Conroy's grep. They are NOT derived
+ * from licensed/restricted software.
+ * For more interesting/academic/complicated implementations,
+ * see Henry Spencer's regexp routines, or GNU Emacs pattern
+ * matching module.
+ *
+ * Modification history:
+ *
+ * $Log$
+ * Revision 1.1  2001/09/01 03:05:24  RD
+ * Upgraded to version 1.39 of Scintilla, and upated wxStyledTextCtrl
+ * accordingly.
+ *
+ * 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.
+ * 
+ * Interfaces:
+ *      RESearch::Compile:        compile a regular expression into a NFA.
+ *
+ *			char *RESearch::Compile(s)
+ *			char *s;
+ *
+ *      RESearch::Execute:        execute the NFA to match a pattern.
+ *
+ *			int RESearch::Execute(s)
+ *			char *s;
+ *
+ *	RESearch::ModifyWord		change RESearch::Execute's understanding of what a "word"
+ *			looks like (for \< and \>) by adding into the
+ *			hidden word-syntax table.
+ *
+ *			void RESearch::ModifyWord(s)
+ *			char *s;
+ *
+ *      RESearch::Substitute:	substitute the matched portions in a new string.
+ *
+ *			int RESearch::Substitute(src, dst)
+ *			char *src;
+ *			char *dst;
+ *
+ *	re_fail:	failure routine for RESearch::Execute.
+ *
+ *			void re_fail(msg, op)
+ *			char *msg;
+ *			char op;
+ *  
+ * Regular Expressions:
+ *
+ *      [1]     char    matches itself, unless it is a special
+ *                      character (metachar): . \ [ ] * + ^ $
+ *
+ *      [2]     .       matches any character.
+ *
+ *      [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. 
+ *			(see [7], [8] and [9])
+ *			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 "^",
+ *                      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:
+ *
+ *                              [a-z]    any lowercase alpha
+ *
+ *                              [^]-]    any char except ] and -
+ *
+ *                              [^A-Z]   any char except uppercase
+ *                                       alpha
+ *
+ *                              [a-zA-Z] any alpha
+ *
+ *      [5]     *       any regular expression form [1] to [4], followed by
+ *                      closure char (*) matches zero or more matches of
+ *                      that form.
+ *
+ *      [6]     +       same as [5], except it matches one or more.
+ *
+ *      [7]             a regular expression in the form [1] to [10], enclosed
+ *                      as \(form\) matches what form matches. The enclosure
+ *                      creates a set of tags, used for [8] and for
+ *                      pattern substution. The tagged forms are numbered
+ *			starting from 1.
+ *
+ *      [8]             a \ followed by a digit 1 to 9 matches whatever a
+ *                      previously tagged regular expression ([7]) matched.
+ *
+ *	[9]	\<	a regular expression starting with a \< construct
+ *		\>	and/or ending with a \> construct, restricts the
+ *			pattern matching to the beginning of a word, and/or
+ *			the end of a word. A word is defined to be a character
+ *			string beginning and/or ending with the characters
+ *			A-Z a-z 0-9 and _. It must also be preceded and/or
+ *			followed by any character outside those mentioned.
+ *
+ *      [10]            a composite regular expression xy where x and y
+ *                      are in the form [1] to [10] matches the longest
+ *                      match of x followed by a match for y.
+ *
+ *      [11]	^	a regular expression starting with a ^ character
+ *		$	and/or ending with a $ character, restricts the
+ *                      pattern matching to the beginning of the line,
+ *                      or the end of line. [anchors] Elsewhere in the
+ *			pattern, ^ and $ are treated as ordinary characters.
+ *
+ *
+ * Acknowledgements:
+ *
+ *	HCR's Hugh Redelmeier has been most helpful in various
+ *	stages of development. He convinced me to include BOW
+ *	and EOW constructs, originally invented by Rob Pike at
+ *	the University of Toronto.
+ *
+ * References:
+ *              Software tools			Kernighan & Plauger
+ *              Software tools in Pascal        Kernighan & Plauger
+ *              Grep [rsx-11 C dist]            David Conroy
+ *		ed - text editor		Un*x Programmer's Manual
+ *		Advanced editing on Un*x	B. W. Kernighan
+ *		RegExp routines			Henry Spencer
+ *
+ * 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 
+ *	constant 16 bytes in the internal nfa, and RESearch::Execute does a single
+ *	bit comparison to locate the character in the set.
+ *
+ * Examples:
+ *
+ *	pattern:	foo*.*
+ *	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]	
+ *	compile:	CHR f CHR o CCL bitset CHR a CCL bitset END
+ *	matches:	fobar fooar fobaz fooaz
+ *
+ *	pattern:	foo\\+
+ *	compile:	CHR f CHR o CHR o CHR \ CLO CHR \ END END
+ *	matches:	foo\ foo\\ foo\\\  ...
+ *
+ *	pattern:	\(foo\)[1-3]\1	(same as foo[1-3]foo)
+ *	compile:	BOT 1 CHR f CHR o CHR o EOT 1 CCL bitset REF 1 END
+ *	matches:	foo1foo foo2foo foo3foo
+ *
+ *	pattern:	\(fo.*\)-\1
+ *	compile:	BOT 1 CHR f CHR o CLO ANY END EOT 1 CHR - REF 1 END
+ *	matches:	foo-foo fo-fo fob-fob foobar-foobar ...
+ */
+
+#include "RESearch.h"
+
+#define OKP     1
+#define NOP     0
+
+#define CHR     1
+#define ANY     2
+#define CCL     3
+#define BOL     4
+#define EOL     5
+#define BOT     6
+#define EOT     7
+#define BOW	8
+#define EOW	9
+#define REF     10
+#define CLO     11
+
+#define END     0
+
+/*
+ * The following defines are not meant to be changeable.
+ * They are for readability only.
+ */
+#define BLKIND	0170
+#define BITIND	07
+
+#define ASCIIB	0177
+
+const char bitarr[] = {1,2,4,8,16,32,64,'\200'};
+
+#define badpat(x)	(*nfa = END, x)
+ 
+RESearch::RESearch() {
+	Init();
+}
+
+RESearch::~RESearch() {
+	Clear();
+}
+
+void RESearch::Init() {
+	sta = NOP;               	/* status of lastpat */
+	bol = 0;
+	for (int i=0; i<MAXTAG; i++)
+		pat[i] = 0;
+	for (int j=0; j<BITBLK; j++)
+		bittab[j] = 0;
+}
+
+void RESearch::Clear() {
+	for (int i=0; i<MAXTAG; i++) {
+		delete []pat[i];
+		pat[i] = 0;
+		bopat[i] = NOTFOUND;
+		eopat[i] = NOTFOUND;
+	}
+}
+
+bool RESearch::GrabMatches(CharacterIndexer &ci) {
+	bool success = true;
+	for (unsigned int i=0; i<MAXTAG; i++) {
+		if ((bopat[i] != NOTFOUND) && (eopat[i] != NOTFOUND)) {
+			unsigned int len = eopat[i] - bopat[i];
+			pat[i] = new char[len + 1];
+			if (pat[i]) {
+				for (unsigned int j=0; j<len; j++)
+					pat[i][j] = ci.CharAt(bopat[i] + j);
+				pat[i][len] = '\0';
+			} else {
+				success = false;
+			}
+		}
+	}
+	return success;
+}
+
+void RESearch::ChSet(char c) {
+	bittab[((c) & BLKIND) >> 3] |= bitarr[(c) & BITIND];
+}
+
+void RESearch::ChSetWithCase(char c, bool caseSensitive) {
+	if (caseSensitive) {
+		ChSet(c);
+	} else {
+		if ((c >= 'a') && (c <= 'z')) {
+			ChSet(c);
+			ChSet(static_cast<char>(c - 'a' + 'A'));
+		} else if ((c >= 'A') && (c <= 'Z')) {
+			ChSet(c);
+			ChSet(static_cast<char>(c - 'A' + 'a'));
+		} else {
+			ChSet(c);
+		}
+	}
+}
+
+const char escapeValue(char ch) {
+	switch (ch) {
+	case 'a':	return '\a';
+	case 'b':	return '\b';
+	case 'f':	return '\f';
+	case 'n':	return '\n';
+	case 'r':	return '\r';
+	case 't':	return '\t';
+	case 'v':	return '\v';
+	}
+	return 0;
+}
+
+const char *RESearch::Compile(const char *pat, int length, bool caseSensitive) {
+	char *mp=nfa;          /* nfa pointer       */
+	char *lp;              /* saved pointer..   */
+	char *sp=nfa;          /* another one..     */
+
+	int tagi = 0;          /* tag stack index   */
+	int tagc = 1;          /* actual tag count  */
+
+	int n;
+	char mask;		/* xor mask -CCL/NCL */
+	int c1, c2;
+		
+	if (!pat || !length)
+		if (sta)
+			return 0;
+		else
+			return badpat("No previous regular expression");
+	sta = NOP;
+
+	const char *p=pat;               /* pattern pointer   */
+	for (int i=0; i<length; i++, p++) {
+		lp = mp;
+		switch(*p) {
+
+		case '.':               /* match any char..  */
+			*mp++ = ANY;
+			break;
+
+		case '^':               /* match beginning.. */
+			if (p == pat)
+				*mp++ = BOL;
+			else {
+				*mp++ = CHR;
+				*mp++ = *p;
+			}
+			break;
+
+		case '$':               /* match endofline.. */
+			if (!*(p+1))
+				*mp++ = EOL;
+			else {
+				*mp++ = CHR;
+				*mp++ = *p;
+			}
+			break;
+
+		case '[':               /* match char class..*/
+			*mp++ = CCL;
+
+			i++;
+			if (*++p == '^') {
+				mask = '\377';	
+				i++;
+				p++;
+			} else
+				mask = 0;
+
+			if (*p == '-') {		/* real dash */
+				i++;
+				ChSet(*p++);
+			}
+			if (*p == ']') {	/* real brace */
+				i++;
+				ChSet(*p++);
+			}
+			while (*p && *p != ']') {
+				if (*p == '-' && *(p+1) && *(p+1) != ']') {
+					i++;
+					p++;
+					c1 = *(p-2) + 1;
+					i++;
+					c2 = *p++;
+					while (c1 <= c2) {
+						ChSetWithCase(static_cast<char>(c1++), caseSensitive);
+					}
+				} else if (*p == '\\' && *(p+1)) {
+					i++;
+					p++;
+					char escape = escapeValue(*p);
+					if (escape)
+						ChSetWithCase(escape, caseSensitive);
+					else
+						ChSetWithCase(*p, caseSensitive);
+					i++;
+					p++;
+				} else {
+					i++;
+					ChSetWithCase(*p++, caseSensitive);
+				}
+			}
+			if (!*p)
+				return badpat("Missing ]");
+
+			for (n = 0; n < BITBLK; bittab[n++] = (char) 0)
+				*mp++ = static_cast<char>(mask ^ bittab[n]);
+	
+			break;
+
+		case '*':               /* match 0 or more.. */
+		case '+':               /* match 1 or more.. */
+			if (p == pat)
+				return badpat("Empty closure");
+			lp = sp;		/* previous opcode */
+			if (*lp == CLO)		/* equivalence..   */
+				break;
+			switch(*lp) {
+
+			case BOL:
+			case BOT:
+			case EOT:
+			case BOW:
+			case EOW:
+			case REF:
+				return badpat("Illegal closure");
+			default:
+				break;
+			}
+
+			if (*p == '+')
+				for (sp = mp; lp < sp; lp++)
+					*mp++ = *lp;
+
+			*mp++ = END;
+			*mp++ = END;
+			sp = mp;
+			while (--mp > lp)
+				*mp = mp[-1];
+			*mp = CLO;
+			mp = sp;
+			break;
+
+		case '\\':              /* tags, backrefs .. */
+			i++;
+			switch(*++p) {
+
+			case '(':
+				if (tagc < MAXTAG) {
+					tagstk[++tagi] = tagc;
+					*mp++ = BOT;
+					*mp++ = static_cast<char>(tagc++);
+				}
+				else
+					return badpat("Too many \\(\\) pairs");
+				break;
+			case ')':
+				if (*sp == BOT)
+					return badpat("Null pattern inside \\(\\)");
+				if (tagi > 0) {
+					*mp++ = static_cast<char>(EOT);
+					*mp++ = static_cast<char>(tagstk[tagi--]);
+				}
+				else
+					return badpat("Unmatched \\)");
+				break;
+			case '<':
+				*mp++ = BOW;
+				break;
+			case '>':
+				if (*sp == BOW)
+					return badpat("Null pattern inside \\<\\>");
+				*mp++ = EOW;
+				break;
+			case '1':
+			case '2':
+			case '3':
+			case '4':
+			case '5':
+			case '6':
+			case '7':
+			case '8':
+			case '9':
+				n = *p-'0';
+				if (tagi > 0 && tagstk[tagi] == n)
+					return badpat("Cyclical reference");
+				if (tagc > n) {
+					*mp++ = static_cast<char>(REF);
+					*mp++ = static_cast<char>(n);
+				}
+				else
+					return badpat("Undetermined reference");
+				break;
+			case 'a':
+			case 'b':
+			case 'n':
+			case 'f':
+			case 'r':
+			case 't':
+			case 'v':
+				*mp++ = CHR;
+				*mp++ = escapeValue(*p);
+				break;
+			default:
+				*mp++ = CHR;
+				*mp++ = *p;
+			}
+			break;
+
+		default :               /* an ordinary char  */
+			if (caseSensitive) {
+				*mp++ = CHR;
+				*mp++ = *p;
+			} else {
+				*mp++ = CCL;
+				mask = 0;
+				ChSetWithCase(*p, false);
+				for (n = 0; n < BITBLK; bittab[n++] = (char) 0)
+					*mp++ = static_cast<char>(mask ^ bittab[n]);
+			}
+			break;
+		}
+		sp = lp;
+	}
+	if (tagi > 0)
+		return badpat("Unmatched \\(");
+	*mp = END;
+	sta = OKP;
+	return 0;
+}
+
+/*
+ * RESearch::Execute:
+ * 	execute nfa to find a match.
+ *
+ *	special cases: (nfa[0])	
+ *		BOL
+ *			Match only once, starting from the
+ *			beginning.
+ *		CHR
+ *			First locate the character without
+ *			calling PMatch, and if found, call
+ *			PMatch for the remaining string.
+ *		END
+ *			RESearch::Compile failed, poor luser did not
+ *			check for it. Fail fast.
+ *
+ *	If a match is found, bopat[0] and eopat[0] are set
+ *	to the beginning and the end of the matched fragment,
+ *	respectively.
+ *
+ */
+
+int RESearch::Execute(CharacterIndexer &ci, int lp, int endp) {
+	char c;
+	int ep = NOTFOUND;
+	char *ap = nfa;
+
+	bol = lp;
+	failure = 0;
+	
+	Clear();
+
+	switch(*ap) {
+
+	case BOL:			/* anchored: match from BOL only */
+		ep = PMatch(ci, lp, endp, ap);
+		break;
+	case EOL:			/* just searching for end of line normal path doesn't work */
+		if (*(ap+1) == END) {
+			lp = endp;
+			ep = lp;
+			break;
+		} else {
+			return 0;
+		}
+	case CHR:			/* ordinary char: locate it fast */
+		c = *(ap+1);
+		while ((lp < endp) && (ci.CharAt(lp) != c))
+			lp++;
+		if (lp >= endp)		/* if EOS, fail, else fall thru. */
+			return 0;
+	default:			/* regular matching all the way. */
+		while (lp < endp) {
+			ep = PMatch(ci, lp, endp, ap);
+			if (ep != NOTFOUND)
+				break;
+			lp++;
+		}
+		break;
+	case END:			/* munged automaton. fail always */
+		return 0;
+	}
+	if (ep == NOTFOUND)
+		return 0;
+
+	bopat[0] = lp;
+	eopat[0] = ep;
+	return 1;
+}
+
+/* 
+ * PMatch: internal routine for the hard part
+ *
+ * 	This code is partly snarfed from an early grep written by
+ *	David Conroy. The backref and tag stuff, and various other
+ *	innovations are by oz.
+ *
+ *	special case optimizations: (nfa[n], nfa[n+1])
+ *		CLO ANY
+ *			We KNOW .* will match everything upto the
+ *			end of line. Thus, directly go to the end of
+ *			line, without recursive PMatch calls. As in
+ *			the other closure cases, the remaining pattern
+ *			must be matched by moving backwards on the
+ *			string recursively, to find a match for xy
+ *			(x is ".*" and y is the remaining pattern)
+ *			where the match satisfies the LONGEST match for
+ *			x followed by a match for y.
+ *		CLO CHR
+ *			We can again scan the string forward for the
+ *			single char and at the point of failure, we
+ *			execute the remaining nfa recursively, same as
+ *			above.
+ *
+ *	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).	
+ *
+ */
+
+extern void re_fail(char *,char);
+
+/*
+ * character classification table for word boundary operators BOW
+ * 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. 
+ *
+ *	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, 
+	1, 1, 1, 0, 0, 0, 0, 0
+	};
+
+#define inascii(x)	(0177&(x))
+#define iswordc(x) 	chrtyp[inascii(x)]
+#define isinset(x,y) 	((x)[((y)&BLKIND)>>3] & bitarr[(y)&BITIND])
+
+/*
+ * skip values for CLO XXX to skip past the closure
+ */
+
+#define ANYSKIP	2 	/* [CLO] ANY END ...	     */
+#define CHRSKIP	3	/* [CLO] CHR chr END ...     */
+#define CCLSKIP 18	/* [CLO] CCL 16bytes END ... */
+
+int RESearch::PMatch(CharacterIndexer &ci, int lp, int endp, char *ap) {
+	int op, c, n;
+	int e;		/* extra pointer for CLO */
+	int bp;		/* beginning of subpat.. */
+	int ep;		/* ending of subpat..	 */
+	int are;			/* to save the line ptr. */
+
+	while ((op = *ap++) != END)
+		switch(op) {
+
+		case CHR:
+			if (ci.CharAt(lp++) != *ap++)
+				return NOTFOUND;
+			break;
+		case ANY:
+			if (lp++ >= endp)
+				return NOTFOUND;
+			break;
+		case CCL:
+			c = ci.CharAt(lp++);
+			if (!isinset(ap,c))
+				return NOTFOUND;
+			ap += BITBLK;
+			break;
+		case BOL:
+			if (lp != bol)
+				return NOTFOUND;
+			break;
+		case EOL:
+			if (lp < endp)
+				return NOTFOUND;
+			break;
+		case BOT:
+			bopat[*ap++] = lp;
+			break;
+		case EOT:
+			eopat[*ap++] = lp;
+			break;
+ 		case BOW:
+			if (lp!=bol && iswordc(ci.CharAt(lp-1)) || !iswordc(ci.CharAt(lp)))
+				return NOTFOUND;
+			break;
+		case EOW:
+			if (lp==bol || !iswordc(ci.CharAt(lp-1)) || iswordc(ci.CharAt(lp)))
+				return NOTFOUND;
+			break;
+		case REF:
+			n = *ap++;
+			bp = bopat[n];
+			ep = eopat[n];
+			while (bp < ep)
+				if (ci.CharAt(bp++) != ci.CharAt(lp++))
+					return NOTFOUND;
+			break;
+		case CLO:
+			are = lp;
+			switch(*ap) {
+
+			case ANY:
+				while (lp < endp)
+					lp++;
+				n = ANYSKIP;
+				break;
+			case CHR:
+				c = *(ap+1);
+				while ((lp < endp) && (c == ci.CharAt(lp)))
+					lp++;
+				n = CHRSKIP;
+				break;
+			case CCL:
+				while ((lp < endp) && isinset(ap+1,ci.CharAt(lp)))
+					lp++;
+				n = CCLSKIP;
+				break;
+			default:
+				failure = true;
+				//re_fail("closure: bad nfa.", *ap);
+				return NOTFOUND;
+			}
+
+			ap += n;
+
+			while (lp >= are) {
+				if ((e = PMatch(ci, lp, endp, ap)) != NOTFOUND)
+					return e;
+				--lp;
+			}
+			return NOTFOUND;
+		default:
+			//re_fail("RESearch::Execute: bad nfa.", static_cast<char>(op));
+			return NOTFOUND;
+		}
+	return lp;
+}
+
+/*
+ * RESearch::ModifyWord:
+ *	add new characters into the word table to change RESearch::Execute's
+ *	understanding of what a word should look like. Note that we
+ *	only accept additions into the word definition.
+ *
+ *	If the string parameter is 0 or null string, the table is
+ *	reset back to the default containing A-Z a-z 0-9 _. [We use
+ *	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 
+}; 
+
+void RESearch::ModifyWord(char *s) {
+	int i;
+
+	if (!s || !*s) {
+		for (i = 0; i < MAXCHR; i++)
+			if (!isinset(deftab,i))
+				iswordc(i) = 0;
+	}
+	else
+		while(*s)
+			iswordc(*s++) = 1;
+}
+
+/*
+ * RESearch::Substitute:
+ *	substitute the matched portions of the src in dst.
+ *
+ *	&	substitute the entire matched pattern.
+ *
+ *	\digit	substitute a subpattern, with the given	tag number.
+ *		Tags are numbered from 1 to 9. If the particular
+ *		tagged subpattern does not exist, null is substituted.
+ */
+int RESearch::Substitute(CharacterIndexer &ci, char *src, char *dst) {
+	char c;
+	int  pin;
+	int bp;
+	int ep;
+
+	if (!*src || !bopat[0])
+		return 0;
+
+	while ((c = *src++) != 0) {
+		switch(c) {
+
+		case '&':
+			pin = 0;
+			break;
+
+		case '\\':
+			c = *src++;
+			if (c >= '0' && c <= '9') {
+				pin = c - '0';
+				break;
+			}
+			
+		default:
+			*dst++ = c;
+			continue;
+		}
+
+		if ((bp = bopat[pin]) != 0 && (ep = eopat[pin]) != 0) {
+			while (ci.CharAt(bp) && bp < ep)
+				*dst++ = ci.CharAt(bp++);
+			if (bp < ep)
+				return 0;
+		}
+	}
+	*dst = (char) 0;
+	return 1;
+}
diff --git a/src/stc/scintilla/src/RESearch.h b/src/stc/scintilla/src/RESearch.h
new file mode 100644
index 0000000000..28238bfb7c
--- /dev/null
+++ b/src/stc/scintilla/src/RESearch.h
@@ -0,0 +1,60 @@
+// Scintilla source code edit control
+/** @file RESearch.h
+ ** Interface to the regular expression search library.
+ **/
+// Written by Neil Hodgson <neilh@scintilla.org>
+// Based on the work of Ozan S. Yigit.
+// This file is in the public domain.
+
+#ifndef RESEARCH_H
+#define RESEARCH_H
+
+/*
+ * The following defines are not meant to be changeable.
+ * They are for readability only.
+ */
+#define MAXCHR	128
+#define CHRBIT	8
+#define BITBLK	MAXCHR/CHRBIT
+
+class CharacterIndexer {
+public: 
+	virtual char CharAt(int index)=0;
+};
+
+class RESearch {
+
+public:
+	RESearch();
+	~RESearch();
+	void Init();
+	void Clear();
+	bool GrabMatches(CharacterIndexer &ci);
+	void ChSet(char c);
+	void ChSetWithCase(char c, bool caseSensitive);
+	const char *Compile(const char *pat, int length, bool caseSensitive);
+	int Execute(CharacterIndexer &ci, int lp, int endp);
+	void ModifyWord(char *s);
+	int Substitute(CharacterIndexer &ci, char *src, char *dst);
+
+	enum {MAXTAG=10};
+	enum {MAXNFA=2048};
+	enum {NOTFOUND=-1};
+
+	int bopat[MAXTAG];
+	int eopat[MAXTAG];
+	char *pat[MAXTAG];
+
+private:
+	int PMatch(CharacterIndexer &ci, int lp, int endp, char *ap);
+
+	int bol;
+	int  tagstk[MAXTAG];             /* subpat tag stack..*/
+	char nfa[MAXNFA];		/* automaton..       */
+	int sta;
+	char bittab[BITBLK];		/* bit table for CCL */
+						/* pre-set bits...   */
+	int failure;
+};
+
+#endif
diff --git a/src/stc/scintilla/src/SVector.h b/src/stc/scintilla/src/SVector.h
index d4d49c717d..c8edb513bc 100644
--- a/src/stc/scintilla/src/SVector.h
+++ b/src/stc/scintilla/src/SVector.h
@@ -1,26 +1,31 @@
 // Scintilla source code edit control
-// SVector.h - a simple expandable vector
-// Copyright 1998-1999 by Neil Hodgson <neilh@hare.net.au>
+/** @file SVector.h
+ ** A simple expandable vector.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@hare.net.au>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef SVECTOR_H
 #define SVECTOR_H
 
-// A simple expandable integer vector. 
-// Storage not allocated for elements until an element is used. 
-// This makes it very lightweight unless used so is a good match for optional features.
-
+/**
+ * A simple expandable integer vector.
+ * Storage not allocated for elements until an element is used.
+ * This makes it very lightweight unless used so is a good match for optional features.
+ */
 class SVector {
-	int *v;
-	unsigned int size;	// Number of elements allocated
-	unsigned int len;	// Number of elements in vector
-	bool allocFailure;	// A memory allocation call has failed
+	enum { allocSize = 4000 };
+	
+	int *v;				///< The vector
+	unsigned int size;	///< Number of elements allocated
+	unsigned int len;	///< Number of elements used in vector
+	bool allocFailure;	///< A memory allocation call has failed
 	
-	// Internally allocate more elements than the user wants to avoid 
-	// thrashng the memory allocator
+	/** Internally allocate more elements than the user wants
+	 * to avoid thrashing the memory allocator. */
 	void SizeTo(int newSize) {
-		if (newSize < 4000)
-			newSize += 4000;
+		if (newSize < allocSize)
+			newSize += allocSize;
 		else 
 			newSize = (newSize * 3) / 2;
 		int* newv = new int[newSize];
@@ -50,6 +55,7 @@ public:
 	~SVector() {
 		Free();
 	}
+	/// Constructor from another vector.
 	SVector(const SVector &other) {
 		allocFailure = false;
 		v = 0;
@@ -64,6 +70,7 @@ public:
 			}
 		}
 	}
+	/// Copy constructor.
 	SVector &operator=(const SVector &other) {
 		if (this != &other) {
 			delete []v;
@@ -82,6 +89,9 @@ public:
 		}
 		return *this;
 	}
+	/** @brief Accessor.
+	 * Allows to access values from the list, and grows it if accessing
+	 * outside the current bounds. The returned value in this case is 0. */
 	int &operator[](unsigned int i) {
 		if (i >= len) {
 			if (i >= size) {
@@ -91,12 +101,15 @@ public:
 		}
 		return v[i];
 	}
+	/// Reset vector.
 	void Free() {
 		delete []v;
 		v = 0;
 		size = 0;
 		len = 0;
 	}
+	/** @brief Grow vector size.
+	 * Doesn't allow a vector to be shrinked. */
 	void SetLength(unsigned int newLength) {
 		if (newLength > len) {
 			if (newLength >= size) {
@@ -105,6 +118,7 @@ public:
 		}
 		len = newLength;
 	}
+	/// Get the current length (number of used elements) of the vector.
 	int Length() const {
 		return len;
 	}
diff --git a/src/stc/scintilla/src/ScintillaBase.cxx b/src/stc/scintilla/src/ScintillaBase.cxx
index 4f182850ad..707f59b9f4 100644
--- a/src/stc/scintilla/src/ScintillaBase.cxx
+++ b/src/stc/scintilla/src/ScintillaBase.cxx
@@ -1,6 +1,8 @@
 // Scintilla source code edit control
-// ScintillaBase.cxx - an enhanced subclass of Editor with calltips, autocomplete and context menu
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file ScintillaBase.cxx
+ ** An enhanced subclass of Editor with calltips, autocomplete and context menu.
+ **/
+// 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>
@@ -15,7 +17,6 @@
 #ifdef SCI_LEXER
 #include "SciLexer.h"
 #include "Accessor.h"
-#include "WindowAccessor.h"
 #include "DocumentAccessor.h"
 #include "KeyWords.h"
 #endif
@@ -34,22 +35,25 @@
 #include "ScintillaBase.h"
 
 ScintillaBase::ScintillaBase() {
-#ifdef SCI_LEXER	
+	listType = 0;
+#ifdef SCI_LEXER
 	lexLanguage = SCLEX_CONTAINER;
-	for (int wl=0;wl<numWordLists;wl++)
+	lexCurrent = 0;
+	for (int wl = 0;wl < numWordLists;wl++)
 		keyWordLists[wl] = new WordList;
+	keyWordLists[numWordLists] = 0;
 #endif
 }
 
 ScintillaBase::~ScintillaBase() {
-#ifdef SCI_LEXER	
-	for (int wl=0;wl<numWordLists;wl++)
+#ifdef SCI_LEXER
+	for (int wl = 0;wl < numWordLists;wl++)
 		delete keyWordLists[wl];
 #endif
 }
 
 void ScintillaBase::Finalise() {
-    Editor::Finalise();
+	Editor::Finalise();
 	popup.Destroy();
 }
 
@@ -70,10 +74,12 @@ void ScintillaBase::Command(int cmdId) {
 
 	switch (cmdId) {
 
-	case idAutoComplete: 	// Nothing to do
+	case idAutoComplete:  	// Nothing to do
+
 		break;
 
-	case idCallTip: 	// Nothing to do
+	case idCallTip:  	// Nothing to do
+
 		break;
 
 	case idcmdUndo:
@@ -170,7 +176,7 @@ void ScintillaBase::AutoCompleteStart(int lenEntered, const char *list) {
 	//Platform::DebugPrintf("AutoComplete %s\n", list);
 	ct.CallTipCancel();
 
-	if (ac.chooseSingle) {
+	if (ac.chooseSingle && (listType == 0)) {
 		if (list && !strchr(list, ac.GetSeparator())) {
 			if (ac.ignoreCase) {
 				SetEmptySelection(currentPos - lenEntered);
@@ -183,13 +189,13 @@ void ScintillaBase::AutoCompleteStart(int lenEntered, const char *list) {
 				pdoc->InsertString(currentPos, list + lenEntered);
 				SetEmptySelection(currentPos + strlen(list + lenEntered));
 			}
-			return;
+			return ;
 		}
 	}
-	ac.Start(wDraw, idAutoComplete, currentPos, lenEntered);
+	ac.Start(wMain, idAutoComplete, currentPos, lenEntered);
 
 	PRectangle rcClient = GetClientRectangle();
-	Point pt = LocationFromPosition(currentPos-lenEntered);
+	Point pt = LocationFromPosition(currentPos - lenEntered);
 
 	int heightLB = 100;
 	int widthLB = 100;
@@ -200,8 +206,8 @@ void ScintillaBase::AutoCompleteStart(int lenEntered, const char *list) {
 	}
 	PRectangle rcac;
 	rcac.left = pt.x - 5;
-	if (pt.y >= rcClient.bottom - heightLB && // Wont fit below.
-	    pt.y >= (rcClient.bottom + rcClient.top) / 2) { // and there is more room above.
+	if (pt.y >= rcClient.bottom - heightLB &&  // Wont fit below.
+	        pt.y >= (rcClient.bottom + rcClient.top) / 2) { // and there is more room above.
 		rcac.top = pt.y - heightLB;
 		if (rcac.top < 0) {
 			heightLB += rcac.top;
@@ -225,8 +231,8 @@ void ScintillaBase::AutoCompleteStart(int lenEntered, const char *list) {
 	// Make an allowance for large strings in list
 	rcList.left = pt.x - 5;
 	rcList.right = rcList.left + widthLB;
-	if (pt.y >= rcClient.bottom - heightLB && // Wont fit below.
-	    pt.y >= (rcClient.bottom + rcClient.top) / 2) { // and there is more room above.
+	if (pt.y >= rcClient.bottom - heightLB &&  // Wont fit below.
+	        pt.y >= (rcClient.bottom + rcClient.top) / 2) { // and there is more room above.
 		rcList.top = pt.y - heightAlloced;
 	} else {
 		rcList.top = pt.y + vs.lineHeight;
@@ -236,7 +242,7 @@ void ScintillaBase::AutoCompleteStart(int lenEntered, const char *list) {
 	ac.Show();
 	if (lenEntered != 0) {
 		AutoCompleteMoveToCurrentWord();
-	}		
+	}
 }
 
 void ScintillaBase::AutoCompleteCancel() {
@@ -278,44 +284,45 @@ void ScintillaBase::AutoCompleteCompleted(char fillUp/*='\0'*/) {
 		ac.lb.GetValue(item, selected, sizeof(selected));
 	}
 	ac.Cancel();
-	
-	if (ac.ignoreCase) {
-		if (currentPos != ac.posStart) {
-			pdoc->DeleteChars(ac.posStart, currentPos - ac.posStart);
-		}
-		SetEmptySelection(ac.posStart - ac.startLen);
-		pdoc->DeleteChars(ac.posStart - ac.startLen, ac.startLen);
-		if (item != -1) {
-			SString piece = selected;
-			if (fillUp)
-				piece += fillUp;
-			pdoc->InsertString(currentPos, piece.c_str());
-			SetEmptySelection(currentPos + piece.length());
-		}
-	} else {
-		if (currentPos != ac.posStart) {
-			pdoc->DeleteChars(ac.posStart, currentPos - ac.posStart);
-		}
-		SetEmptySelection(ac.posStart);
-		if (item != -1) {
-			SString piece = selected + ac.startLen;
-			if (fillUp)
-				piece += fillUp;
-			pdoc->InsertString(currentPos, piece.c_str());
-			SetEmptySelection(currentPos + piece.length());
-		}
+
+	if (listType > 0) {
+		userListSelected = selected;
+		SCNotification scn;
+		scn.nmhdr.code = SCN_USERLISTSELECTION;
+		scn.message = 0;
+		scn.wParam = listType;
+		scn.lParam = 0;
+		scn.text = userListSelected.c_str();
+		NotifyParent(scn);
+		return ;
+	}
+
+	Position firstPos = ac.posStart - ac.startLen;
+	if (currentPos < firstPos)
+		return ;
+	if (currentPos != firstPos) {
+		pdoc->DeleteChars(firstPos, currentPos - firstPos);
+	}
+	SetEmptySelection(ac.posStart);
+	if (item != -1) {
+		SString piece = selected;
+		if (fillUp)
+			piece += fillUp;
+		pdoc->InsertString(firstPos, piece.c_str());
+		SetEmptySelection(firstPos + piece.length());
 	}
 }
 
 void ScintillaBase::ContextMenu(Point pt) {
+	bool writable = !WndProc(SCI_GETREADONLY, 0, 0);
 	popup.CreatePopUp();
-	AddToPopUp("Undo", idcmdUndo, pdoc->CanUndo());
-	AddToPopUp("Redo", idcmdRedo, pdoc->CanRedo());
+	AddToPopUp("Undo", idcmdUndo, writable && pdoc->CanUndo());
+	AddToPopUp("Redo", idcmdRedo, writable && pdoc->CanRedo());
 	AddToPopUp("");
-	AddToPopUp("Cut", idcmdCut, currentPos != anchor);
+	AddToPopUp("Cut", idcmdCut, writable && currentPos != anchor);
 	AddToPopUp("Copy", idcmdCopy, currentPos != anchor);
-	AddToPopUp("Paste", idcmdPaste, WndProc(SCI_CANPASTE, 0, 0));
-	AddToPopUp("Delete", idcmdDelete, currentPos != anchor);
+	AddToPopUp("Paste", idcmdPaste, writable && WndProc(SCI_CANPASTE, 0, 0));
+	AddToPopUp("Delete", idcmdDelete, writable && currentPos != anchor);
 	AddToPopUp("");
 	AddToPopUp("Select All", idcmdSelectAll);
 	popup.Show(pt, wMain);
@@ -333,41 +340,67 @@ void ScintillaBase::ButtonDown(Point pt, unsigned int curTime, bool shift, bool
 }
 
 #ifdef SCI_LEXER
+void ScintillaBase::SetLexer(uptr_t wParam) {
+	lexLanguage = wParam;
+	lexCurrent = LexerModule::Find(lexLanguage);
+	if (!lexCurrent)
+		lexCurrent = LexerModule::Find(SCLEX_NULL);
+}
+
+void ScintillaBase::SetLexerLanguage(const char *languageName) {
+	lexLanguage = SCLEX_CONTAINER;
+	lexCurrent = LexerModule::Find(languageName);
+	if (!lexCurrent)
+		lexCurrent = LexerModule::Find(SCLEX_NULL);
+	if (lexCurrent)
+		lexLanguage = lexCurrent->GetLanguage();
+}
+
 void ScintillaBase::Colourise(int start, int end) {
-	int lengthDoc = Platform::SendScintilla(wMain.GetID(), SCI_GETLENGTH, 0, 0);
+	int lengthDoc = pdoc->Length();
 	if (end == -1)
 		end = lengthDoc;
 	int len = end - start;
 
+	PLATFORM_ASSERT(len >= 0);
+	PLATFORM_ASSERT(start + len <= lengthDoc);
+
 	//WindowAccessor styler(wMain.GetID(), props);
-	DocumentAccessor styler(pdoc, props);
+	DocumentAccessor styler(pdoc, props, wMain.GetID());
 
 	int styleStart = 0;
 	if (start > 0)
 		styleStart = styler.StyleAt(start - 1);
 	styler.SetCodePage(pdoc->dbcsCodePage);
-	
-	LexerModule::Colourise(start, len, styleStart, lexLanguage, keyWordLists, styler);
-	styler.Flush();
+
+	if (lexCurrent) {	// Should always succeed as null lexer should always be available
+		lexCurrent->Lex(start, len, styleStart, keyWordLists, styler);
+		styler.Flush();
+		if (styler.GetPropertyInt("fold")) {
+			lexCurrent->Fold(start, len, styleStart, keyWordLists, styler);
+			styler.Flush();
+		}
+	}
 }
 #endif
 
 void ScintillaBase::NotifyStyleToNeeded(int endStyleNeeded) {
 #ifdef SCI_LEXER
 	if (lexLanguage != SCLEX_CONTAINER) {
-		int endStyled = Platform::SendScintilla(wMain.GetID(), SCI_GETENDSTYLED, 0, 0);
-		int lineEndStyled = Platform::SendScintilla(wMain.GetID(), SCI_LINEFROMPOSITION, endStyled, 0);
-		endStyled = Platform::SendScintilla(wMain.GetID(), SCI_POSITIONFROMLINE, lineEndStyled, 0);
+		int endStyled = WndProc(SCI_GETENDSTYLED, 0, 0);
+		int lineEndStyled = WndProc(SCI_LINEFROMPOSITION, endStyled, 0);
+		endStyled = WndProc(SCI_POSITIONFROMLINE, lineEndStyled, 0);
 		Colourise(endStyled, endStyleNeeded);
-		return;
+		return ;
 	}
 #endif
 	Editor::NotifyStyleToNeeded(endStyleNeeded);
 }
 
-long ScintillaBase::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) {
+sptr_t ScintillaBase::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
 	switch (iMessage) {
 	case SCI_AUTOCSHOW:
+		listType = 0;
 		AutoCompleteStart(wParam, reinterpret_cast<const char *>(lParam));
 		break;
 
@@ -395,15 +428,15 @@ long ScintillaBase::WndProc(unsigned int iMessage, unsigned long wParam, long lP
 	case SCI_AUTOCSTOPS:
 		ac.SetStopChars(reinterpret_cast<char *>(lParam));
 		break;
-		
+
 	case SCI_AUTOCSELECT:
 		ac.Select(reinterpret_cast<char *>(lParam));
 		break;
-	
+
 	case SCI_AUTOCSETCANCELATSTART:
 		ac.cancelAtStartPos = wParam;
 		break;
-	
+
 	case SCI_AUTOCGETCANCELATSTART:
 		return ac.cancelAtStartPos;
 
@@ -417,20 +450,35 @@ long ScintillaBase::WndProc(unsigned int iMessage, unsigned long wParam, long lP
 
 	case SCI_AUTOCGETCHOOSESINGLE:
 		return ac.chooseSingle;
-		
+
 	case SCI_AUTOCSETIGNORECASE:
 		ac.ignoreCase = wParam;
 		break;
-		
+
 	case SCI_AUTOCGETIGNORECASE:
 		return ac.ignoreCase;
-		
+
+	case SCI_USERLISTSHOW:
+		listType = wParam;
+		AutoCompleteStart(0, reinterpret_cast<const char *>(lParam));
+		break;
+
+	case SCI_AUTOCSETAUTOHIDE:
+		ac.autoHide = wParam;
+		break;
+
+	case SCI_AUTOCGETAUTOHIDE:
+		return ac.autoHide;
+
 	case SCI_CALLTIPSHOW: {
 			AutoCompleteCancel();
 			if (!ct.wCallTip.Created()) {
-				PRectangle rc = ct.CallTipStart(currentPos, LocationFromPosition(wParam),
+				Point pt = LocationFromPosition(wParam);
+				pt.y += vs.lineHeight;
+				PRectangle rc = ct.CallTipStart(currentPos, pt,
 				                                reinterpret_cast<char *>(lParam),
-				                                vs.styles[STYLE_DEFAULT].fontName, vs.styles[STYLE_DEFAULT].size);
+				                                vs.styles[STYLE_DEFAULT].fontName,
+				                                vs.styles[STYLE_DEFAULT].sizeZoomed);
 				// If the call-tip window would be out of the client
 				// space, adjust so it displays above the text.
 				PRectangle rcClient = GetClientRectangle();
@@ -441,7 +489,7 @@ long ScintillaBase::WndProc(unsigned int iMessage, unsigned long wParam, long lP
 				}
 				// Now display the window.
 				CreateCallTipWindow(rc);
-				ct.wCallTip.SetPositionRelative(rc, wDraw);
+				ct.wCallTip.SetPositionRelative(rc, wMain);
 				ct.wCallTip.Show();
 			}
 		}
@@ -465,31 +513,37 @@ long ScintillaBase::WndProc(unsigned int iMessage, unsigned long wParam, long lP
 		ct.colourBG = Colour(wParam);
 		InvalidateStyleRedraw();
 		break;
-		
+
 #ifdef SCI_LEXER
 	case SCI_SETLEXER:
+		SetLexer(wParam);
 		lexLanguage = wParam;
 		break;
-		
+
 	case SCI_GETLEXER:
 		return lexLanguage;
-		
+
 	case SCI_COLOURISE:
 		Colourise(wParam, lParam);
 		Redraw();
 		break;
-		
+
 	case SCI_SETPROPERTY:
-		props.Set(reinterpret_cast<const char *>(wParam), 
-			reinterpret_cast<const char *>(lParam));
+		props.Set(reinterpret_cast<const char *>(wParam),
+		          reinterpret_cast<const char *>(lParam));
 		break;
-		
+
 	case SCI_SETKEYWORDS:
 		if (wParam < numWordLists) {
 			keyWordLists[wParam]->Clear();
 			keyWordLists[wParam]->Set(reinterpret_cast<const char *>(lParam));
 		}
 		break;
+
+	case SCI_SETLEXERLANGUAGE:
+		SetLexerLanguage(reinterpret_cast<const char *>(lParam));
+		break;
+
 #endif
 
 	default:
diff --git a/src/stc/scintilla/src/ScintillaBase.h b/src/stc/scintilla/src/ScintillaBase.h
index e630ba1aac..d5b1e8ba0c 100644
--- a/src/stc/scintilla/src/ScintillaBase.h
+++ b/src/stc/scintilla/src/ScintillaBase.h
@@ -1,17 +1,22 @@
 // Scintilla source code edit control
-// ScintillaBase.h - defines an enhanced subclass of Editor with calltips, autocomplete and context menu
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file ScintillaBase.h
+ ** Defines an enhanced subclass of Editor with calltips, autocomplete and context menu.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef SCINTILLABASE_H
 #define SCINTILLABASE_H
 
+/**
+ */
 class ScintillaBase : public Editor {
 	// Private so ScintillaBase objects can not be copied
 	ScintillaBase(const ScintillaBase &) : Editor() {}
 	ScintillaBase &operator=(const ScintillaBase &) { return *this; }
+
 protected:
-	// Enumeration of commands and child windows
+	/** Enumeration of commands and child windows. */
 	enum {
 		idCallTip=1,
 		idAutoComplete=2,
@@ -30,11 +35,17 @@ protected:
 
 	CallTip ct;
 
+	int listType;			///< 0 is an autocomplete list
+	SString userListSelected;	///< Receives listbox selected string
+	
 #ifdef SCI_LEXER
 	int lexLanguage;
+	LexerModule *lexCurrent;
 	PropSet props;
 	enum {numWordLists=5};
-	WordList *keyWordLists[numWordLists];
+	WordList *keyWordLists[numWordLists+1];
+	void SetLexer(uptr_t wParam);
+	void SetLexerLanguage(const char *languageName);
 	void Colourise(int start, int end);
 #endif
 
@@ -67,7 +78,7 @@ protected:
 	virtual void NotifyStyleToNeeded(int endStyleNeeded);
 public:
 	// Public so scintilla_send_message can use it
-	virtual long WndProc(unsigned int iMessage, unsigned long wParam, long lParam);
+	virtual sptr_t WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam);
 };
 
 #endif
diff --git a/src/stc/scintilla/src/Style.cxx b/src/stc/scintilla/src/Style.cxx
index 0a52ed41a3..4a35267910 100644
--- a/src/stc/scintilla/src/Style.cxx
+++ b/src/stc/scintilla/src/Style.cxx
@@ -1,6 +1,8 @@
 // Scintilla source code edit control
-// Style.cxx - defines the font and colour style for a class of text
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file Style.cxx
+ ** Defines the font and colour style for a class of text.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include <string.h>
@@ -12,15 +14,15 @@
 
 Style::Style() {
 	aliasOfDefaultFont = true;
-	Clear(Colour(0,0,0), Colour(0xff,0xff,0xff),
-	        Platform::DefaultFontSize(), 0, SC_CHARSET_DEFAULT,
-		false, false, false, false, true);
+	Clear(Colour(0, 0, 0), Colour(0xff, 0xff, 0xff),
+	      Platform::DefaultFontSize(), 0, SC_CHARSET_DEFAULT,
+	      false, false, false, false, caseMixed, true);
 }
-	
+
 Style::Style(const Style &source) {
-	Clear(Colour(0,0,0), Colour(0xff,0xff,0xff),
-	        0, 0, 0,
-		false, false, false, false, true);
+	Clear(Colour(0, 0, 0), Colour(0xff, 0xff, 0xff),
+	      0, 0, 0,
+	      false, false, false, false, caseMixed, true);
 	fore.desired = source.fore.desired;
 	back.desired = source.back.desired;
 	characterSet = source.characterSet;
@@ -29,7 +31,8 @@ Style::Style(const Style &source) {
 	size = source.size;
 	eolFilled = source.eolFilled;
 	underline = source.underline;
-    visible = source.visible;
+	caseForce = source.caseForce;
+	visible = source.visible;
 }
 
 Style::~Style() {
@@ -42,10 +45,10 @@ Style::~Style() {
 
 Style &Style::operator=(const Style &source) {
 	if (this == &source)
-		return *this;
-	Clear(Colour(0,0,0), Colour(0xff,0xff,0xff),
-	        0, 0, SC_CHARSET_DEFAULT,
-		false, false, false, false, true);
+		return * this;
+	Clear(Colour(0, 0, 0), Colour(0xff, 0xff, 0xff),
+	      0, 0, SC_CHARSET_DEFAULT,
+	      false, false, false, false, caseMixed, true);
 	fore.desired = source.fore.desired;
 	back.desired = source.back.desired;
 	characterSet = source.characterSet;
@@ -54,13 +57,15 @@ Style &Style::operator=(const Style &source) {
 	size = source.size;
 	eolFilled = source.eolFilled;
 	underline = source.underline;
-    visible = source.visible;
+	caseForce = source.caseForce;
+	visible = source.visible;
 	return *this;
 }
 
-void Style::Clear(Colour fore_, Colour back_, int size_, 
-	const char *fontName_, int characterSet_,
-	bool bold_, bool italic_, bool eolFilled_, bool underline_, bool visible_) {
+void Style::Clear(Colour fore_, Colour back_, int size_,
+                  const char *fontName_, int characterSet_,
+                  bool bold_, bool italic_, bool eolFilled_, 
+                  bool underline_, ecaseForced caseForce_, bool visible_) {
 	fore.desired = fore_;
 	back.desired = back_;
 	characterSet = characterSet_;
@@ -70,19 +75,35 @@ void Style::Clear(Colour fore_, Colour back_, int size_,
 	fontName = fontName_;
 	eolFilled = eolFilled_;
 	underline = underline_;
-    visible = visible_;
+	caseForce = caseForce_;
+	visible = visible_;
 	if (aliasOfDefaultFont)
 		font.SetID(0);
-	else 
+	else
 		font.Release();
 	aliasOfDefaultFont = false;
 }
 
+void Style::ClearTo(const Style &source) {
+	Clear(
+		source.fore.desired,
+		source.back.desired,
+		source.size,
+		source.fontName,
+		source.characterSet,
+		source.bold,
+		source.italic,
+		source.eolFilled,
+		source.underline,
+		source.caseForce,
+		source.visible);
+}
+
 bool Style::EquivalentFontTo(const Style *other) const {
 	if (bold != other->bold ||
-		italic != other->italic ||
-		size != other->size ||
-		characterSet != other->characterSet)
+	        italic != other->italic ||
+	        size != other->size ||
+	        characterSet != other->characterSet)
 		return false;
 	if (fontName == other->fontName)
 		return true;
@@ -94,17 +115,17 @@ bool Style::EquivalentFontTo(const Style *other) const {
 }
 
 void Style::Realise(Surface &surface, int zoomLevel, Style *defaultStyle) {
-	int sizeZoomed = size + zoomLevel;
+	sizeZoomed = size + zoomLevel;
 	if (sizeZoomed <= 2)	// Hangs if sizeZoomed <= 1
 		sizeZoomed = 2;
 
 	if (aliasOfDefaultFont)
 		font.SetID(0);
-	else 
+	else
 		font.Release();
 	int deviceHeight = surface.DeviceHeightFont(sizeZoomed);
-	aliasOfDefaultFont = defaultStyle && 
-		(EquivalentFontTo(defaultStyle) || !fontName);
+	aliasOfDefaultFont = defaultStyle &&
+	                     (EquivalentFontTo(defaultStyle) || !fontName);
 	if (aliasOfDefaultFont) {
 		font.SetID(defaultStyle->font.GetID());
 	} else if (fontName) {
diff --git a/src/stc/scintilla/src/Style.h b/src/stc/scintilla/src/Style.h
index 9a2b4586a3..3600886b35 100644
--- a/src/stc/scintilla/src/Style.h
+++ b/src/stc/scintilla/src/Style.h
@@ -1,11 +1,15 @@
 // Scintilla source code edit control
-// Style.h - defines the font and colour style for a class of text
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file Style.h
+ ** Defines the font and colour style for a class of text.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef STYLE_H
 #define STYLE_H
 
+/**
+ */
 class Style {
 public:
 	ColourPair fore;
@@ -18,9 +22,12 @@ public:
 	int characterSet;
 	bool eolFilled;
 	bool underline;
+	enum ecaseForced {caseMixed, caseUpper, caseLower};
+	ecaseForced caseForce;
 	bool visible;
 
 	Font font;
+	int sizeZoomed;
 	unsigned int lineHeight;
 	unsigned int ascent;
 	unsigned int descent;
@@ -33,11 +40,13 @@ public:
 	~Style();
 	Style &operator=(const Style &source);
 	void Clear(Colour fore_, Colour back_,
-           	int size_, 
-		const char *fontName_, int characterSet_,
-		bool bold_, bool italic_, bool eolFilled_, bool underline_, bool visible_);
+	           int size_,
+	           const char *fontName_, int characterSet_,
+	           bool bold_, bool italic_, bool eolFilled_, 
+	           bool underline_, ecaseForced caseForce_, bool visible_);
+	void ClearTo(const Style &source);
 	bool EquivalentFontTo(const Style *other) const;
-	void Realise(Surface &surface, int zoomLevel, Style *defaultStyle=0);
+	void Realise(Surface &surface, int zoomLevel, Style *defaultStyle = 0);
 };
 
 #endif
diff --git a/src/stc/scintilla/src/UniConversion.cxx b/src/stc/scintilla/src/UniConversion.cxx
index 9306f307c2..c3f960c62c 100644
--- a/src/stc/scintilla/src/UniConversion.cxx
+++ b/src/stc/scintilla/src/UniConversion.cxx
@@ -1,5 +1,8 @@
-// UniConversion.h - functions to handle UFT-8 and UCS-2 strings
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file UniConversion.cxx
+ ** Functions to handle UFT-8 and UCS-2 strings.
+ **/
+// 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>
diff --git a/src/stc/scintilla/src/UniConversion.h b/src/stc/scintilla/src/UniConversion.h
index cace497c48..bd1d7754d4 100644
--- a/src/stc/scintilla/src/UniConversion.h
+++ b/src/stc/scintilla/src/UniConversion.h
@@ -1,5 +1,8 @@
-// UniConversion.h - functions to handle UFT-8 and UCS-2 strings
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file UniConversion.h
+ ** Functions to handle UFT-8 and UCS-2 strings.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 unsigned int UTF8Length(const wchar_t *uptr, unsigned int tlen);
diff --git a/src/stc/scintilla/src/ViewStyle.cxx b/src/stc/scintilla/src/ViewStyle.cxx
index 9b7a8535e9..4db7e2508b 100644
--- a/src/stc/scintilla/src/ViewStyle.cxx
+++ b/src/stc/scintilla/src/ViewStyle.cxx
@@ -1,6 +1,8 @@
 // Scintilla source code edit control
-// ViewStyle.cxx - store information on how the document is to be viewed
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file ViewStyle.cxx
+ ** Store information on how the document is to be viewed.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #include <string.h>
@@ -13,7 +15,7 @@
 #include "Style.h"
 #include "ViewStyle.h"
 
-MarginStyle::MarginStyle() : 
+MarginStyle::MarginStyle() :
 	symbol(false), width(16), mask(0xffffffff), sensitive(false) {
 }
 
@@ -64,7 +66,7 @@ ViewStyle::ViewStyle(const ViewStyle &source) {
 	for (int ind=0;ind<=INDIC_MAX;ind++) {
 		indicators[ind] = source.indicators[ind];
 	}
-	
+
 	selforeset = source.selforeset;
 	selforeground.desired = source.selforeground.desired;
 	selbackset = source.selbackset;
@@ -73,8 +75,11 @@ ViewStyle::ViewStyle(const ViewStyle &source) {
 	selbar.desired = source.selbar.desired;
 	selbarlight.desired = source.selbarlight.desired;
 	caretcolour.desired = source.caretcolour.desired;
+	showCaretLineBackground = source.showCaretLineBackground;
+	caretLineBackground.desired = source.caretLineBackground.desired;
 	edgecolour.desired = source.edgecolour.desired;
 	edgeState = source.edgeState;
+	caretWidth = source.caretWidth;
 	leftMarginWidth = source.leftMarginWidth;
 	rightMarginWidth = source.rightMarginWidth;
 	for (int i=0;i < margins; i++) {
@@ -87,7 +92,7 @@ ViewStyle::ViewStyle(const ViewStyle &source) {
 	viewWhitespace = source.viewWhitespace;
 	viewIndentationGuides = source.viewIndentationGuides;
 	viewEOL = source.viewEOL;
-	showMarkedLines = source.showMarkedLines;		
+	showMarkedLines = source.showMarkedLines;
 }
 
 ViewStyle::~ViewStyle() {
@@ -96,7 +101,7 @@ ViewStyle::~ViewStyle() {
 void ViewStyle::Init() {
 	fontNames.Clear();
 	ResetDefaultStyle();
-	
+
 	indicators[0].style = INDIC_SQUIGGLE;
 	indicators[0].fore = Colour(0, 0x7f, 0);
 	indicators[1].style = INDIC_TT;
@@ -119,11 +124,13 @@ void ViewStyle::Init() {
 	selbarlight.desired = Platform::ChromeHighlight();
 	styles[STYLE_LINENUMBER].fore.desired = Colour(0, 0, 0);
 	styles[STYLE_LINENUMBER].back.desired = Platform::Chrome();
-	//caretcolour.desired = Colour(0xff, 0, 0);
 	caretcolour.desired = Colour(0, 0, 0);
+	showCaretLineBackground = false;
+	caretLineBackground.desired = Colour(0xff, 0xff, 0);
 	edgecolour.desired = Colour(0xc0, 0xc0, 0xc0);
 	edgeState = EDGE_NONE;
-	
+	caretWidth = 1;
+
 	leftMarginWidth = 1;
 	rightMarginWidth = 1;
 	ms[0].symbol = false;
@@ -172,6 +179,7 @@ void ViewStyle::RefreshColourPalette(Palette &pal, bool want) {
 	pal.WantFind(selbar, want);
 	pal.WantFind(selbarlight, want);
 	pal.WantFind(caretcolour, want);
+	pal.WantFind(caretLineBackground, want);
 	pal.WantFind(edgecolour, want);
 }
 
@@ -190,7 +198,7 @@ void ViewStyle::Refresh(Surface &surface) {
 				maxDescent = styles[i].descent;
 		}
 	}
-	
+
 	lineHeight = maxAscent + maxDescent;
 	aveCharWidth = styles[STYLE_DEFAULT].aveCharWidth;
 	spaceWidth = styles[STYLE_DEFAULT].spaceWidth;
@@ -208,26 +216,16 @@ void ViewStyle::Refresh(Surface &surface) {
 
 void ViewStyle::ResetDefaultStyle() {
 	styles[STYLE_DEFAULT].Clear(Colour(0,0,0), Colour(0xff,0xff,0xff),
-	        Platform::DefaultFontSize(), fontNames.Save(Platform::DefaultFont()), 
+	        Platform::DefaultFontSize(), fontNames.Save(Platform::DefaultFont()),
 		SC_CHARSET_DEFAULT,
-		false, false, false, false, true);
+		false, false, false, false, Style::caseMixed, true);
 }
 
 void ViewStyle::ClearStyles() {
 	// Reset all styles to be like the default style
 	for (unsigned int i=0;i<(sizeof(styles)/sizeof(styles[0]));i++) {
 		if (i != STYLE_DEFAULT) {
-			styles[i].Clear(
-				styles[STYLE_DEFAULT].fore.desired, 
-				styles[STYLE_DEFAULT].back.desired, 
-				styles[STYLE_DEFAULT].size, 
-				styles[STYLE_DEFAULT].fontName, 
-				styles[STYLE_DEFAULT].characterSet, 
-				styles[STYLE_DEFAULT].bold, 
-				styles[STYLE_DEFAULT].italic,
-				styles[STYLE_DEFAULT].eolFilled,
-				styles[STYLE_DEFAULT].underline,
-				styles[STYLE_DEFAULT].visible);
+			styles[i].ClearTo(styles[STYLE_DEFAULT]);
 		}
 	}
 	styles[STYLE_LINENUMBER].back.desired = Platform::Chrome();
diff --git a/src/stc/scintilla/src/ViewStyle.h b/src/stc/scintilla/src/ViewStyle.h
index 5b0ab1925f..7528638c59 100644
--- a/src/stc/scintilla/src/ViewStyle.h
+++ b/src/stc/scintilla/src/ViewStyle.h
@@ -1,11 +1,15 @@
 // Scintilla source code edit control
-// ViewStyle.h - store information on how the document is to be viewed
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file ViewStyle.h
+ ** Store information on how the document is to be viewed.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
 
 #ifndef VIEWSTYLE_H
 #define VIEWSTYLE_H
 
+/**
+ */
 class MarginStyle {
 public:
 	bool symbol;
@@ -15,10 +19,13 @@ public:
 	MarginStyle();
 };
 
+/**
+ */
 class FontNames {
 private:
 	char *names[STYLE_MAX + 1];
 	int max;
+
 public:
 	FontNames();
 	~FontNames();
@@ -27,6 +34,9 @@ public:
 };
 
 enum WhiteSpaceVisibility {wsInvisible=0, wsVisibleAlways=1, wsVisibleAfterIndent=2};
+
+/**
+ */
 class ViewStyle {
 public:
 	FontNames fontNames;
@@ -45,12 +55,12 @@ public:
 	ColourPair selbackground2;
 	ColourPair selbar;
 	ColourPair selbarlight;
-	// Margins are ordered: Line Numbers, Selection Margin, Spacing Margin
-	int leftMarginWidth;		// Spacing margin on left of text
-	int rightMarginWidth;	// 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
+	int rightMarginWidth;	///< Spacing margin on left of text
 	bool symbolMargin;
-	int maskInLine;	// Mask for markers to be put into text because there is nowhere for them to go in margin
+	int maskInLine;	///< Mask for markers to be put into text because there is nowhere for them to go in margin
 	MarginStyle ms[margins];
 	int fixedColumnWidth;
 	int zoomLevel;
@@ -59,8 +69,11 @@ public:
 	bool viewEOL;
 	bool showMarkedLines;
 	ColourPair caretcolour;
+	bool showCaretLineBackground;
+	ColourPair caretLineBackground;
 	ColourPair edgecolour;
 	int edgeState;
+	int caretWidth;
 	
 	ViewStyle();
 	ViewStyle(const ViewStyle &source);
diff --git a/src/stc/scintilla/src/WindowAccessor.cxx b/src/stc/scintilla/src/WindowAccessor.cxx
index 5f3deac7db..db2f938f30 100644
--- a/src/stc/scintilla/src/WindowAccessor.cxx
+++ b/src/stc/scintilla/src/WindowAccessor.cxx
@@ -1,6 +1,8 @@
-// SciTE - Scintilla based Text Editor
-// Accessor.cxx - rapid easy access to contents of a Scintilla
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+// Scintilla source code edit control
+/** @file WindowAccessor.cxx
+ ** Rapid easy access to contents of a Scintilla.
+ **/
+// 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>
diff --git a/src/stc/stc.cpp b/src/stc/stc.cpp
index 6adfd80a84..944df02c53 100644
--- a/src/stc/stc.cpp
+++ b/src/stc/stc.cpp
@@ -28,31 +28,37 @@
 
 int wxForceScintillaLexers(void)
 {
+  extern LexerModule lmAda;
+  extern LexerModule lmAVE;
+  extern LexerModule lmConf;
   extern LexerModule lmCPP;
+  extern LexerModule lmEiffel;
   extern LexerModule lmHTML;
-  extern LexerModule lmXML;
-  extern LexerModule lmProps;
-  extern LexerModule lmErrorList;
-  extern LexerModule lmMake;
-  extern LexerModule lmBatch;
+  extern LexerModule lmLISP;
+  extern LexerModule lmLua;
+  extern LexerModule lmBatch;  // In LexOthers.cxx
+  extern LexerModule lmPascal;
   extern LexerModule lmPerl;
   extern LexerModule lmPython;
+  extern LexerModule lmRuby;
   extern LexerModule lmSQL;
   extern LexerModule lmVB;
 
-  if (
-      &lmCPP
-      && &lmHTML
-      && &lmXML
-      && &lmProps
-      && &lmErrorList
-      && &lmMake
-      && &lmBatch
-      && &lmPerl
-      && &lmPython
-      && &lmSQL
-      && &lmVB
-      )
+  if (  &lmAda
+     && &lmAVE
+     && &lmConf
+     && &lmCPP
+     && &lmEiffel
+     && &lmHTML
+     && &lmLISP
+     && &lmLua
+     && &lmBatch
+     && &lmPascal
+     && &lmPerl
+     && &lmPython
+     && &lmRuby
+     && &lmSQL
+     && &lmVB )
     {
       return 1;
     }
@@ -66,21 +72,27 @@ int wxForceScintillaLexers(void)
 
 const wxChar* wxSTCNameStr = "stcwindow";
 
-
 DEFINE_EVENT_TYPE( wxEVT_STC_CHANGE )
 DEFINE_EVENT_TYPE( wxEVT_STC_STYLENEEDED )
 DEFINE_EVENT_TYPE( wxEVT_STC_CHARADDED )
-DEFINE_EVENT_TYPE( wxEVT_STC_UPDATEUI )
 DEFINE_EVENT_TYPE( wxEVT_STC_SAVEPOINTREACHED )
 DEFINE_EVENT_TYPE( wxEVT_STC_SAVEPOINTLEFT )
 DEFINE_EVENT_TYPE( wxEVT_STC_ROMODIFYATTEMPT )
+DEFINE_EVENT_TYPE( wxEVT_STC_KEY )
 DEFINE_EVENT_TYPE( wxEVT_STC_DOUBLECLICK )
+DEFINE_EVENT_TYPE( wxEVT_STC_UPDATEUI )
 DEFINE_EVENT_TYPE( wxEVT_STC_MODIFIED )
-DEFINE_EVENT_TYPE( wxEVT_STC_KEY )
 DEFINE_EVENT_TYPE( wxEVT_STC_MACRORECORD )
 DEFINE_EVENT_TYPE( wxEVT_STC_MARGINCLICK )
 DEFINE_EVENT_TYPE( wxEVT_STC_NEEDSHOWN )
 DEFINE_EVENT_TYPE( wxEVT_STC_POSCHANGED )
+DEFINE_EVENT_TYPE( wxEVT_STC_PAINTED )
+DEFINE_EVENT_TYPE( wxEVT_STC_USERLISTSELECTION )
+DEFINE_EVENT_TYPE( wxEVT_STC_URIDROPPED )
+DEFINE_EVENT_TYPE( wxEVT_STC_DWELLSTART )
+DEFINE_EVENT_TYPE( wxEVT_STC_DWELLEND )
+
+
 
 
 BEGIN_EVENT_TABLE(wxStyledTextCtrl, wxControl)
@@ -94,7 +106,7 @@ BEGIN_EVENT_TABLE(wxStyledTextCtrl, wxControl)
 #endif
     EVT_MOTION                  (wxStyledTextCtrl::OnMouseMove)
     EVT_LEFT_UP                 (wxStyledTextCtrl::OnMouseLeftUp)
-    EVT_RIGHT_UP                (wxStyledTextCtrl::OnMouseRightUp)
+    EVT_CONTEXT_MENU            (wxStyledTextCtrl::OnContextMenu)
     EVT_MOUSEWHEEL              (wxStyledTextCtrl::OnMouseWheel)
     EVT_CHAR                    (wxStyledTextCtrl::OnChar)
     EVT_KEY_DOWN                (wxStyledTextCtrl::OnKeyDown)
@@ -299,6 +311,12 @@ int wxStyledTextCtrl::PositionFromPoint(wxPoint pt) {
                               return SendMsg(2022, pt.x, pt.y);
 }
 
+// Find the position from a point within the window but return
+// INVALID_POSITION if not close to text.
+int wxStyledTextCtrl::PositionFromPointClose(int x, int y) {
+    return SendMsg(2023, x, y);
+}
+
 // Set caret to start of a line and ensure it is visible.
 void wxStyledTextCtrl::GotoLine(int line) {
     SendMsg(2024, line, 0);
@@ -335,9 +353,9 @@ int wxStyledTextCtrl::GetEndStyled() {
     return SendMsg(2028, 0, 0);
 }
 
-// Convert all line endings in the document to use the current mode.
-void wxStyledTextCtrl::ConvertEOLs() {
-    SendMsg(2029, 0, 0);
+// Convert all line endings in the document to one mode.
+void wxStyledTextCtrl::ConvertEOLs(int eolMode) {
+    SendMsg(2029, eolMode, 0);
 }
 
 // Retrieve the current end of line mode - one of CRLF, CR, or LF.
@@ -534,6 +552,11 @@ void wxStyledTextCtrl::StyleSetUnderline(int style, bool underline) {
     SendMsg(2059, style, underline);
 }
 
+// Set a style to be mixed case, or to force upper or lower case.
+void wxStyledTextCtrl::StyleSetCase(int style, int caseForce) {
+    SendMsg(2060, style, caseForce);
+}
+
 // Set the foreground colour of the selection and whether to use this setting.
 void wxStyledTextCtrl::SetSelForeground(bool useSetting, const wxColour& fore) {
     SendMsg(2067, useSetting, wxColourAsLong(fore));
@@ -649,6 +672,27 @@ int wxStyledTextCtrl::GetMaxLineState() {
     return SendMsg(2094, 0, 0);
 }
 
+// Is the background of the line containing the caret in a different colour?
+bool wxStyledTextCtrl::GetCaretLineVisible() {
+    return SendMsg(2095, 0, 0) != 0;
+}
+
+// Display the background of the line containing the caret in a different colour.
+void wxStyledTextCtrl::SetCaretLineVisible(bool show) {
+    SendMsg(2096, show, 0);
+}
+
+// Get the colour of the background of the line containing the caret.
+wxColour wxStyledTextCtrl::GetCaretLineBack() {
+    long c = SendMsg(2097, 0, 0);
+    return wxColourFromLong(c);
+}
+
+// Set the colour of the background of the line containing the caret.
+void wxStyledTextCtrl::SetCaretLineBack(const wxColour& back) {
+    SendMsg(2098, wxColourAsLong(back), 0);
+}
+
 // Display a auto-completion list.
 // The lenEntered parameter indicates how many characters before
 // the caret should be used to provide context.
@@ -734,6 +778,21 @@ bool wxStyledTextCtrl::AutoCompGetIgnoreCase() {
     return SendMsg(2116, 0, 0) != 0;
 }
 
+// Display a list of strings and send notification when user chooses one.
+void wxStyledTextCtrl::UserListShow(int listType, const wxString& itemList) {
+    SendMsg(2117, listType, (long)itemList.c_str());
+}
+
+// Set whether or not autocompletion is hidden automatically when nothing matches
+void wxStyledTextCtrl::AutoCompSetAutoHide(bool autoHide) {
+    SendMsg(2118, autoHide, 0);
+}
+
+// Retrieve whether or not autocompletion is hidden automatically when nothing matches
+bool wxStyledTextCtrl::AutoCompGetAutoHide() {
+    return SendMsg(2119, 0, 0) != 0;
+}
+
 // Set the number of spaces used for one level of indentation.
 void wxStyledTextCtrl::SetIndent(int indentSize) {
     SendMsg(2122, indentSize, 0);
@@ -938,8 +997,8 @@ int wxStyledTextCtrl::GetLineCount() {
 }
 
 // Sets the size in pixels of the left margin.
-void wxStyledTextCtrl::SetMarginLeft(int width) {
-    SendMsg(2155, 0, width);
+void wxStyledTextCtrl::SetMarginLeft(int pixelWidth) {
+    SendMsg(2155, 0, pixelWidth);
 }
 
 // Returns the size in pixels of the left margin.
@@ -948,8 +1007,8 @@ int wxStyledTextCtrl::GetMarginLeft() {
 }
 
 // Sets the size in pixels of the right margin.
-void wxStyledTextCtrl::SetMarginRight(int width) {
-    SendMsg(2157, 0, width);
+void wxStyledTextCtrl::SetMarginRight(int pixelWidth) {
+    SendMsg(2157, 0, pixelWidth);
 }
 
 // Returns the size in pixels of the right margin.
@@ -1105,6 +1164,76 @@ bool wxStyledTextCtrl::GetOvertype() {
     return SendMsg(2187, 0, 0) != 0;
 }
 
+// Set the width of the insert mode caret
+void wxStyledTextCtrl::SetCaretWidth(int pixelWidth) {
+    SendMsg(2188, pixelWidth, 0);
+}
+
+// Returns the width of the insert mode caret
+int wxStyledTextCtrl::GetCaretWidth() {
+    return SendMsg(2189, 0, 0);
+}
+
+// Sets the position that starts the target which is used for updating the
+// document without affecting the scroll position.
+void wxStyledTextCtrl::SetTargetStart(int pos) {
+    SendMsg(2190, pos, 0);
+}
+
+// Get the position that starts the target.
+int wxStyledTextCtrl::GetTargetStart() {
+    return SendMsg(2191, 0, 0);
+}
+
+// Sets the position that ends the target which is used for updating the
+// document without affecting the scroll position.
+void wxStyledTextCtrl::SetTargetEnd(int pos) {
+    SendMsg(2192, pos, 0);
+}
+
+// Get the position that ends the target.
+int wxStyledTextCtrl::GetTargetEnd() {
+    return SendMsg(2193, 0, 0);
+}
+
+// Replace the target text with the argument text.
+// Returns the length of the replacement text.
+
+                       int wxStyledTextCtrl::ReplaceTarget(const wxString& text) {
+                           return SendMsg(2194, text.Len(), (long)text.c_str());
+                       
+}
+
+// Replace the target text with the argument text after \d processing.
+// 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
+// caused by processing the \d patterns.
+
+                       int wxStyledTextCtrl::ReplaceTargetRE(const wxString& text) {
+                           return SendMsg(2195, text.Len(), (long)text.c_str());
+                       
+}
+
+// Search for a counted string in the target and set the target to the found
+// range.
+// Returns length of range or -1 for failure in which case target is not moved.
+
+                       int wxStyledTextCtrl::SearchInTarget(const wxString& text) {
+                           return SendMsg(2197, text.Len(), (long)text.c_str());
+                       
+}
+
+// Set the search flags used by SearchInTarget
+void wxStyledTextCtrl::SetSearchFlags(int flags) {
+    SendMsg(2198, flags, 0);
+}
+
+// Get the search flags used by SearchInTarget
+int wxStyledTextCtrl::GetSearchFlags() {
+    return SendMsg(2199, 0, 0);
+}
+
 // Show a call tip containing a definition near position pos.
 void wxStyledTextCtrl::CallTipShow(int pos, const wxString& definition) {
     SendMsg(2200, pos, (long)definition.c_str());
@@ -1207,6 +1336,47 @@ void wxStyledTextCtrl::SetFoldFlags(int flags) {
     SendMsg(2233, flags, 0);
 }
 
+// Ensure a particular line is visible by expanding any header line hiding it.
+// Use the currently set visibility policy to determine which range to display.
+void wxStyledTextCtrl::EnsureVisibleEnforcePolicy(int line) {
+    SendMsg(2234, line, 0);
+}
+
+// Sets whether a tab pressed when caret is within indentation indents
+void wxStyledTextCtrl::SetTabIndents(bool tabIndents) {
+    SendMsg(2260, tabIndents, 0);
+}
+
+// Does a tab pressed when caret is within indentation indent?
+bool wxStyledTextCtrl::GetTabIndents() {
+    return SendMsg(2261, 0, 0) != 0;
+}
+
+// Sets whether a backspace pressed when caret is within indentation unindents
+void wxStyledTextCtrl::SetBackSpaceUnIndents(bool bsUnIndents) {
+    SendMsg(2262, bsUnIndents, 0);
+}
+
+// Does a backspace pressed when caret is within indentation unindent?
+bool wxStyledTextCtrl::GetBackSpaceUnIndents() {
+    return SendMsg(2263, 0, 0) != 0;
+}
+
+// Sets the time the mouse must sit still to generate a mouse dwell event
+void wxStyledTextCtrl::SetMouseDwellTime(int periodMilliseconds) {
+    SendMsg(2264, periodMilliseconds, 0);
+}
+
+// Retrieve the time the mouse must sit still to generate a mouse dwell event
+int wxStyledTextCtrl::GetMouseDwellTime() {
+    return SendMsg(2265, 0, 0);
+}
+
+// Move the caret inside current view if it's not there already
+void wxStyledTextCtrl::MoveCaretInsideView() {
+    SendMsg(2401, 0, 0);
+}
+
 // How many characters are on a line, not including end of line characters.
 int wxStyledTextCtrl::LineLength(int line) {
     return SendMsg(2350, line, 0);
@@ -1244,7 +1414,7 @@ void* wxStyledTextCtrl::GetDocPointer() {
 
 // Change the document object used.
 void wxStyledTextCtrl::SetDocPointer(void* docPointer) {
-                           SendMsg(2358, (long)docPointer);
+                           SendMsg(2358, 0, (long)docPointer);
 }
 
 // Set which document modification events are sent to the container.
@@ -1291,11 +1461,13 @@ void wxStyledTextCtrl::SearchAnchor() {
 }
 
 // Find some text starting at the search anchor.
+// Does not ensure the selection is visible.
 int wxStyledTextCtrl::SearchNext(int flags, const wxString& text) {
     return SendMsg(2367, flags, (long)text.c_str());
 }
 
 // Find some text starting at the search anchor and moving backwards.
+// Does not ensure the selection is visible.
 int wxStyledTextCtrl::SearchPrev(int flags, const wxString& text) {
     return SendMsg(2368, flags, (long)text.c_str());
 }
@@ -1353,6 +1525,81 @@ int wxStyledTextCtrl::GetModEventMask() {
     return SendMsg(2378, 0, 0);
 }
 
+// Change internal focus flag
+void wxStyledTextCtrl::SetFocus(bool focus) {
+    SendMsg(2380, focus, 0);
+}
+
+// Get internal focus flag
+bool wxStyledTextCtrl::GetFocus() {
+    return SendMsg(2381, 0, 0) != 0;
+}
+
+// Change error status - 0 = OK
+void wxStyledTextCtrl::SetStatus(int statusCode) {
+    SendMsg(2382, statusCode, 0);
+}
+
+// Get error status
+int wxStyledTextCtrl::GetStatus() {
+    return SendMsg(2383, 0, 0);
+}
+
+// Set whether the mouse is captured when its button is pressed
+void wxStyledTextCtrl::SetMouseDownCaptures(bool captures) {
+    SendMsg(2384, captures, 0);
+}
+
+// Get whether mouse gets captured
+bool wxStyledTextCtrl::GetMouseDownCaptures() {
+    return SendMsg(2385, 0, 0) != 0;
+}
+
+// Sets the cursor to one of the SC_CURSOR* values
+void wxStyledTextCtrl::SetCursor(int cursorType) {
+    SendMsg(2386, cursorType, 0);
+}
+
+// Get cursor type
+int wxStyledTextCtrl::GetCursor() {
+    return SendMsg(2387, 0, 0);
+}
+
+// Move to the previous change in capitalistion
+void wxStyledTextCtrl::WordPartLeft() {
+    SendMsg(2390, 0, 0);
+}
+
+// Move to the previous change in capitalistion extending selection to new caret position.
+void wxStyledTextCtrl::WordPartLeftExtend() {
+    SendMsg(2391, 0, 0);
+}
+
+// Move to the change next in capitalistion
+void wxStyledTextCtrl::WordPartRight() {
+    SendMsg(2392, 0, 0);
+}
+
+// Move to the next change in capitalistion extending selection to new caret position.
+void wxStyledTextCtrl::WordPartRightExtend() {
+    SendMsg(2393, 0, 0);
+}
+
+// Set the way the display area is determined when a particular line is to be moved to.
+void wxStyledTextCtrl::SetVisiblePolicy(int visiblePolicy, int visibleSlop) {
+    SendMsg(2394, visiblePolicy, visibleSlop);
+}
+
+// Delete back from the current position to the start of the line
+void wxStyledTextCtrl::DelLineLeft() {
+    SendMsg(2395, 0, 0);
+}
+
+// Delete forwards from the current position to the end of the line
+void wxStyledTextCtrl::DelLineRight() {
+    SendMsg(2396, 0, 0);
+}
+
 // Start notifying the container of all key presses and commands.
 void wxStyledTextCtrl::StartRecord() {
     SendMsg(3001, 0, 0);
@@ -1388,6 +1635,11 @@ void wxStyledTextCtrl::SetKeyWords(int keywordSet, const wxString& keyWords) {
     SendMsg(4005, keywordSet, (long)keyWords.c_str());
 }
 
+// Set the lexing language of the document based on string name.
+void wxStyledTextCtrl::SetLexerLanguage(const wxString& language) {
+    SendMsg(4006, 0, (long)language.c_str());
+}
+
 // END of generated section
 //----------------------------------------------------------------------
 
@@ -1560,8 +1812,9 @@ void wxStyledTextCtrl::OnMouseLeftUp(wxMouseEvent& evt) {
 }
 
 
-void wxStyledTextCtrl::OnMouseRightUp(wxMouseEvent& evt) {
+void wxStyledTextCtrl::OnContextMenu(wxContextMenuEvent& evt) {
     wxPoint pt = evt.GetPosition();
+    ScreenToClient(&pt.x, &pt.y);
     m_swx->DoContextMenu(Point(pt.x, pt.y));
 }
 
@@ -1569,7 +1822,8 @@ void wxStyledTextCtrl::OnMouseRightUp(wxMouseEvent& evt) {
 void wxStyledTextCtrl::OnMouseWheel(wxMouseEvent& evt) {
     m_swx->DoMouseWheel(evt.GetWheelRotation(),
                         evt.GetWheelDelta(),
-                        evt.GetLinesPerAction());
+                        evt.GetLinesPerAction(),
+                        evt.ControlDown());
 }
 
 
@@ -1588,10 +1842,14 @@ void wxStyledTextCtrl::OnChar(wxKeyEvent& evt) {
 
 void wxStyledTextCtrl::OnKeyDown(wxKeyEvent& evt) {
     long key = evt.KeyCode();
-    key = toupper(key);
-    int processed = m_swx->DoKeyDown(key, evt.ShiftDown(),
-                                     evt.ControlDown(), evt.AltDown());
-    if (! processed)
+    //key = toupper(key);  //**** ????
+    bool consumed = FALSE;
+    int processed = m_swx->DoKeyDown(key,
+                                     evt.ShiftDown(),
+                                     evt.ControlDown(),
+                                     evt.AltDown(),
+                                     &consumed);
+    if (!processed && !consumed)
         evt.Skip();
 }
 
@@ -1634,73 +1892,110 @@ void wxStyledTextCtrl::NotifyChange() {
 
 void wxStyledTextCtrl::NotifyParent(SCNotification* _scn) {
     SCNotification& scn = *_scn;
-    int eventType = 0;
+    wxStyledTextEvent evt(0, GetId());
+
+    evt.SetPosition(scn.position);
+    evt.SetKey(scn.ch);
+    evt.SetModifiers(scn.modifiers);
+
     switch (scn.nmhdr.code) {
     case SCN_STYLENEEDED:
-        eventType = wxEVT_STC_STYLENEEDED;
+        evt.SetEventType(wxEVT_STC_STYLENEEDED);
         break;
+
     case SCN_CHARADDED:
-        eventType = wxEVT_STC_CHARADDED;
-        break;
-    case SCN_UPDATEUI:
-        eventType = wxEVT_STC_UPDATEUI;
+        evt.SetEventType(wxEVT_STC_CHARADDED);
         break;
+
     case SCN_SAVEPOINTREACHED:
-        eventType = wxEVT_STC_SAVEPOINTREACHED;
+        evt.SetEventType(wxEVT_STC_SAVEPOINTREACHED);
         break;
+
     case SCN_SAVEPOINTLEFT:
-        eventType = wxEVT_STC_SAVEPOINTLEFT;
+        evt.SetEventType(wxEVT_STC_SAVEPOINTLEFT);
         break;
+
     case SCN_MODIFYATTEMPTRO:
-        eventType = wxEVT_STC_ROMODIFYATTEMPT;
+        evt.SetEventType(wxEVT_STC_ROMODIFYATTEMPT);
         break;
+
+    case SCN_KEY:
+        evt.SetEventType(wxEVT_STC_KEY);
+        break;
+
     case SCN_DOUBLECLICK:
-        eventType = wxEVT_STC_DOUBLECLICK;
+        evt.SetEventType(wxEVT_STC_DOUBLECLICK);
         break;
-    case SCN_MODIFIED:
-        eventType = wxEVT_STC_MODIFIED;
+
+    case SCN_UPDATEUI:
+        evt.SetEventType(wxEVT_STC_UPDATEUI);
         break;
-    case SCN_KEY:
-        eventType = wxEVT_STC_KEY;
+
+    case SCN_MODIFIED:
+        evt.SetEventType(wxEVT_STC_MODIFIED);
+        evt.SetModificationType(scn.modificationType);
+        if (scn.text)
+            evt.SetText(wxString(scn.text, scn.length));
+        evt.SetLength(scn.length);
+        evt.SetLinesAdded(scn.linesAdded);
+        evt.SetLine(scn.line);
+        evt.SetFoldLevelNow(scn.foldLevelNow);
+        evt.SetFoldLevelPrev(scn.foldLevelPrev);
         break;
+
     case SCN_MACRORECORD:
-        eventType = wxEVT_STC_MACRORECORD;
+        evt.SetEventType(wxEVT_STC_MACRORECORD);
+        evt.SetMessage(scn.message);
+        evt.SetWParam(scn.wParam);
+        evt.SetLParam(scn.lParam);
         break;
+
     case SCN_MARGINCLICK:
-        eventType = wxEVT_STC_MARGINCLICK;
+        evt.SetEventType(wxEVT_STC_MARGINCLICK);
+        evt.SetMargin(scn.margin);
         break;
+
     case SCN_NEEDSHOWN:
-        eventType = wxEVT_STC_NEEDSHOWN;
+        evt.SetEventType(wxEVT_STC_NEEDSHOWN);
+        evt.SetLength(scn.length);
         break;
+
     case SCN_POSCHANGED:
-        eventType = wxEVT_STC_POSCHANGED;
+        evt.SetEventType(wxEVT_STC_POSCHANGED);
         break;
-    }
-    if (eventType) {
-        wxStyledTextEvent evt(eventType, GetId());
-        evt.SetPosition(scn.position);
-        evt.SetKey(scn.ch);
-        evt.SetModifiers(scn.modifiers);
-        if (eventType == wxEVT_STC_MODIFIED) {
-            evt.SetModificationType(scn.modificationType);
-            if (scn.text)
-                evt.SetText(wxString(scn.text, scn.length));
-            evt.SetLength(scn.length);
-            evt.SetLinesAdded(scn.linesAdded);
-            evt.SetLine(scn.line);
-            evt.SetFoldLevelNow(scn.foldLevelNow);
-            evt.SetFoldLevelPrev(scn.foldLevelPrev);
-        }
-        if (eventType == wxEVT_STC_MARGINCLICK)
-            evt.SetMargin(scn.margin);
-        if (eventType == wxEVT_STC_MACRORECORD) {
-            evt.SetMessage(scn.message);
-            evt.SetWParam(scn.wParam);
-            evt.SetLParam(scn.lParam);
-        }
 
-        GetEventHandler()->ProcessEvent(evt);
+    case SCN_PAINTED:
+        evt.SetEventType(wxEVT_STC_PAINTED);
+        break;
+
+    case SCN_USERLISTSELECTION:
+        evt.SetEventType(wxEVT_STC_USERLISTSELECTION);
+        evt.SetListType(scn.listType);
+        evt.SetText(scn.text);
+        break;
+
+    case SCN_URIDROPPED:
+        evt.SetEventType(wxEVT_STC_URIDROPPED);
+        evt.SetText(scn.text);
+        break;
+
+    case SCN_DWELLSTART:
+        evt.SetEventType(wxEVT_STC_DWELLSTART);
+        evt.SetX(scn.x);
+        evt.SetY(scn.y);
+        break;
+
+    case SCN_DWELLEND:
+        evt.SetEventType(wxEVT_STC_DWELLEND);
+        evt.SetX(scn.x);
+        evt.SetY(scn.y);
+        break;
+
+    default:
+        return;
     }
+
+    GetEventHandler()->ProcessEvent(evt);
 }
 
 
@@ -1725,8 +2020,9 @@ wxStyledTextEvent::wxStyledTextEvent(wxEventType commandType, int id)
     m_message = 0;
     m_wParam = 0;
     m_lParam = 0;
-
-
+    m_listType = 0;
+    m_x = 0;
+    m_y = 0;
 }
 
 bool wxStyledTextEvent::GetShift() const { return (m_modifiers & SCI_SHIFT) != 0; }
@@ -1754,7 +2050,9 @@ void wxStyledTextEvent::CopyObject(wxObject& obj) const {
     o->m_wParam =        m_wParam;
     o->m_lParam =        m_lParam;
 
-
+    o->m_listType =     m_listType;
+    o->m_x =            m_x;
+    o->m_y =            m_y;
 
 }
 
diff --git a/src/stc/stc.cpp.in b/src/stc/stc.cpp.in
index 890c97ab8a..65c88c28fb 100644
--- a/src/stc/stc.cpp.in
+++ b/src/stc/stc.cpp.in
@@ -28,31 +28,37 @@
 
 int wxForceScintillaLexers(void)
 {
+  extern LexerModule lmAda;
+  extern LexerModule lmAVE;
+  extern LexerModule lmConf;
   extern LexerModule lmCPP;
+  extern LexerModule lmEiffel;
   extern LexerModule lmHTML;
-  extern LexerModule lmXML;
-  extern LexerModule lmProps;
-  extern LexerModule lmErrorList;
-  extern LexerModule lmMake;
-  extern LexerModule lmBatch;
+  extern LexerModule lmLISP;
+  extern LexerModule lmLua;
+  extern LexerModule lmBatch;  // In LexOthers.cxx
+  extern LexerModule lmPascal;
   extern LexerModule lmPerl;
   extern LexerModule lmPython;
+  extern LexerModule lmRuby;
   extern LexerModule lmSQL;
   extern LexerModule lmVB;
 
-  if (
-      &lmCPP
-      && &lmHTML
-      && &lmXML
-      && &lmProps
-      && &lmErrorList
-      && &lmMake
-      && &lmBatch
-      && &lmPerl
-      && &lmPython
-      && &lmSQL
-      && &lmVB
-      )
+  if (  &lmAda
+     && &lmAVE
+     && &lmConf
+     && &lmCPP
+     && &lmEiffel
+     && &lmHTML
+     && &lmLISP
+     && &lmLua
+     && &lmBatch
+     && &lmPascal
+     && &lmPerl
+     && &lmPython
+     && &lmRuby
+     && &lmSQL
+     && &lmVB )
     {
       return 1;
     }
@@ -66,21 +72,27 @@ int wxForceScintillaLexers(void)
 
 const wxChar* wxSTCNameStr = "stcwindow";
 
-
 DEFINE_EVENT_TYPE( wxEVT_STC_CHANGE )
 DEFINE_EVENT_TYPE( wxEVT_STC_STYLENEEDED )
 DEFINE_EVENT_TYPE( wxEVT_STC_CHARADDED )
-DEFINE_EVENT_TYPE( wxEVT_STC_UPDATEUI )
 DEFINE_EVENT_TYPE( wxEVT_STC_SAVEPOINTREACHED )
 DEFINE_EVENT_TYPE( wxEVT_STC_SAVEPOINTLEFT )
 DEFINE_EVENT_TYPE( wxEVT_STC_ROMODIFYATTEMPT )
+DEFINE_EVENT_TYPE( wxEVT_STC_KEY )
 DEFINE_EVENT_TYPE( wxEVT_STC_DOUBLECLICK )
+DEFINE_EVENT_TYPE( wxEVT_STC_UPDATEUI )
 DEFINE_EVENT_TYPE( wxEVT_STC_MODIFIED )
-DEFINE_EVENT_TYPE( wxEVT_STC_KEY )
 DEFINE_EVENT_TYPE( wxEVT_STC_MACRORECORD )
 DEFINE_EVENT_TYPE( wxEVT_STC_MARGINCLICK )
 DEFINE_EVENT_TYPE( wxEVT_STC_NEEDSHOWN )
 DEFINE_EVENT_TYPE( wxEVT_STC_POSCHANGED )
+DEFINE_EVENT_TYPE( wxEVT_STC_PAINTED )
+DEFINE_EVENT_TYPE( wxEVT_STC_USERLISTSELECTION )
+DEFINE_EVENT_TYPE( wxEVT_STC_URIDROPPED )
+DEFINE_EVENT_TYPE( wxEVT_STC_DWELLSTART )
+DEFINE_EVENT_TYPE( wxEVT_STC_DWELLEND )
+
+
 
 
 BEGIN_EVENT_TABLE(wxStyledTextCtrl, wxControl)
@@ -94,7 +106,7 @@ BEGIN_EVENT_TABLE(wxStyledTextCtrl, wxControl)
 #endif
     EVT_MOTION                  (wxStyledTextCtrl::OnMouseMove)
     EVT_LEFT_UP                 (wxStyledTextCtrl::OnMouseLeftUp)
-    EVT_RIGHT_UP                (wxStyledTextCtrl::OnMouseRightUp)
+    EVT_CONTEXT_MENU            (wxStyledTextCtrl::OnContextMenu)
     EVT_MOUSEWHEEL              (wxStyledTextCtrl::OnMouseWheel)
     EVT_CHAR                    (wxStyledTextCtrl::OnChar)
     EVT_KEY_DOWN                (wxStyledTextCtrl::OnKeyDown)
@@ -350,8 +362,9 @@ void wxStyledTextCtrl::OnMouseLeftUp(wxMouseEvent& evt) {
 }
 
 
-void wxStyledTextCtrl::OnMouseRightUp(wxMouseEvent& evt) {
+void wxStyledTextCtrl::OnContextMenu(wxContextMenuEvent& evt) {
     wxPoint pt = evt.GetPosition();
+    ScreenToClient(&pt.x, &pt.y);
     m_swx->DoContextMenu(Point(pt.x, pt.y));
 }
 
@@ -359,7 +372,8 @@ void wxStyledTextCtrl::OnMouseRightUp(wxMouseEvent& evt) {
 void wxStyledTextCtrl::OnMouseWheel(wxMouseEvent& evt) {
     m_swx->DoMouseWheel(evt.GetWheelRotation(),
                         evt.GetWheelDelta(),
-                        evt.GetLinesPerAction());
+                        evt.GetLinesPerAction(),
+                        evt.ControlDown());
 }
 
 
@@ -378,10 +392,14 @@ void wxStyledTextCtrl::OnChar(wxKeyEvent& evt) {
 
 void wxStyledTextCtrl::OnKeyDown(wxKeyEvent& evt) {
     long key = evt.KeyCode();
-    key = toupper(key);
-    int processed = m_swx->DoKeyDown(key, evt.ShiftDown(),
-                                     evt.ControlDown(), evt.AltDown());
-    if (! processed)
+    //key = toupper(key);  //**** ????
+    bool consumed = FALSE;
+    int processed = m_swx->DoKeyDown(key,
+                                     evt.ShiftDown(),
+                                     evt.ControlDown(),
+                                     evt.AltDown(),
+                                     &consumed);
+    if (!processed && !consumed)
         evt.Skip();
 }
 
@@ -424,73 +442,110 @@ void wxStyledTextCtrl::NotifyChange() {
 
 void wxStyledTextCtrl::NotifyParent(SCNotification* _scn) {
     SCNotification& scn = *_scn;
-    int eventType = 0;
+    wxStyledTextEvent evt(0, GetId());
+
+    evt.SetPosition(scn.position);
+    evt.SetKey(scn.ch);
+    evt.SetModifiers(scn.modifiers);
+
     switch (scn.nmhdr.code) {
     case SCN_STYLENEEDED:
-        eventType = wxEVT_STC_STYLENEEDED;
+        evt.SetEventType(wxEVT_STC_STYLENEEDED);
         break;
+
     case SCN_CHARADDED:
-        eventType = wxEVT_STC_CHARADDED;
-        break;
-    case SCN_UPDATEUI:
-        eventType = wxEVT_STC_UPDATEUI;
+        evt.SetEventType(wxEVT_STC_CHARADDED);
         break;
+
     case SCN_SAVEPOINTREACHED:
-        eventType = wxEVT_STC_SAVEPOINTREACHED;
+        evt.SetEventType(wxEVT_STC_SAVEPOINTREACHED);
         break;
+
     case SCN_SAVEPOINTLEFT:
-        eventType = wxEVT_STC_SAVEPOINTLEFT;
+        evt.SetEventType(wxEVT_STC_SAVEPOINTLEFT);
         break;
+
     case SCN_MODIFYATTEMPTRO:
-        eventType = wxEVT_STC_ROMODIFYATTEMPT;
+        evt.SetEventType(wxEVT_STC_ROMODIFYATTEMPT);
+        break;
+
+    case SCN_KEY:
+        evt.SetEventType(wxEVT_STC_KEY);
         break;
+
     case SCN_DOUBLECLICK:
-        eventType = wxEVT_STC_DOUBLECLICK;
+        evt.SetEventType(wxEVT_STC_DOUBLECLICK);
         break;
-    case SCN_MODIFIED:
-        eventType = wxEVT_STC_MODIFIED;
+
+    case SCN_UPDATEUI:
+        evt.SetEventType(wxEVT_STC_UPDATEUI);
         break;
-    case SCN_KEY:
-        eventType = wxEVT_STC_KEY;
+
+    case SCN_MODIFIED:
+        evt.SetEventType(wxEVT_STC_MODIFIED);
+        evt.SetModificationType(scn.modificationType);
+        if (scn.text)
+            evt.SetText(wxString(scn.text, scn.length));
+        evt.SetLength(scn.length);
+        evt.SetLinesAdded(scn.linesAdded);
+        evt.SetLine(scn.line);
+        evt.SetFoldLevelNow(scn.foldLevelNow);
+        evt.SetFoldLevelPrev(scn.foldLevelPrev);
         break;
+
     case SCN_MACRORECORD:
-        eventType = wxEVT_STC_MACRORECORD;
+        evt.SetEventType(wxEVT_STC_MACRORECORD);
+        evt.SetMessage(scn.message);
+        evt.SetWParam(scn.wParam);
+        evt.SetLParam(scn.lParam);
         break;
+
     case SCN_MARGINCLICK:
-        eventType = wxEVT_STC_MARGINCLICK;
+        evt.SetEventType(wxEVT_STC_MARGINCLICK);
+        evt.SetMargin(scn.margin);
         break;
+
     case SCN_NEEDSHOWN:
-        eventType = wxEVT_STC_NEEDSHOWN;
+        evt.SetEventType(wxEVT_STC_NEEDSHOWN);
+        evt.SetLength(scn.length);
         break;
+
     case SCN_POSCHANGED:
-        eventType = wxEVT_STC_POSCHANGED;
+        evt.SetEventType(wxEVT_STC_POSCHANGED);
+        break;
+
+    case SCN_PAINTED:
+        evt.SetEventType(wxEVT_STC_PAINTED);
+        break;
+
+    case SCN_USERLISTSELECTION:
+        evt.SetEventType(wxEVT_STC_USERLISTSELECTION);
+        evt.SetListType(scn.listType);
+        evt.SetText(scn.text);
         break;
-    }
-    if (eventType) {
-        wxStyledTextEvent evt(eventType, GetId());
-        evt.SetPosition(scn.position);
-        evt.SetKey(scn.ch);
-        evt.SetModifiers(scn.modifiers);
-        if (eventType == wxEVT_STC_MODIFIED) {
-            evt.SetModificationType(scn.modificationType);
-            if (scn.text)
-                evt.SetText(wxString(scn.text, scn.length));
-            evt.SetLength(scn.length);
-            evt.SetLinesAdded(scn.linesAdded);
-            evt.SetLine(scn.line);
-            evt.SetFoldLevelNow(scn.foldLevelNow);
-            evt.SetFoldLevelPrev(scn.foldLevelPrev);
-        }
-        if (eventType == wxEVT_STC_MARGINCLICK)
-            evt.SetMargin(scn.margin);
-        if (eventType == wxEVT_STC_MACRORECORD) {
-            evt.SetMessage(scn.message);
-            evt.SetWParam(scn.wParam);
-            evt.SetLParam(scn.lParam);
-        }
 
-        GetEventHandler()->ProcessEvent(evt);
+    case SCN_URIDROPPED:
+        evt.SetEventType(wxEVT_STC_URIDROPPED);
+        evt.SetText(scn.text);
+        break;
+
+    case SCN_DWELLSTART:
+        evt.SetEventType(wxEVT_STC_DWELLSTART);
+        evt.SetX(scn.x);
+        evt.SetY(scn.y);
+        break;
+
+    case SCN_DWELLEND:
+        evt.SetEventType(wxEVT_STC_DWELLEND);
+        evt.SetX(scn.x);
+        evt.SetY(scn.y);
+        break;
+
+    default:
+        return;
     }
+
+    GetEventHandler()->ProcessEvent(evt);
 }
 
 
@@ -515,8 +570,9 @@ wxStyledTextEvent::wxStyledTextEvent(wxEventType commandType, int id)
     m_message = 0;
     m_wParam = 0;
     m_lParam = 0;
-
-
+    m_listType = 0;
+    m_x = 0;
+    m_y = 0;
 }
 
 bool wxStyledTextEvent::GetShift() const { return (m_modifiers & SCI_SHIFT) != 0; }
@@ -544,7 +600,9 @@ void wxStyledTextEvent::CopyObject(wxObject& obj) const {
     o->m_wParam =        m_wParam;
     o->m_lParam =        m_lParam;
 
-
+    o->m_listType =     m_listType;
+    o->m_x =            m_x;
+    o->m_y =            m_y;
 
 }
 
diff --git a/src/stc/stc.h.in b/src/stc/stc.h.in
index bab374459a..a742614327 100644
--- a/src/stc/stc.h.in
+++ b/src/stc/stc.h.in
@@ -141,6 +141,10 @@ public:
     // Scroll enough to make the given column visible
     void ScrollToColumn(int column);
 
+
+    // Send a message to Scintilla
+    long SendMsg(int msg, long wp=0, long lp=0);
+
 //----------------------------------------------------------------------
 
 
@@ -153,7 +157,7 @@ private:
     void OnMouseLeftDown(wxMouseEvent& evt);
     void OnMouseMove(wxMouseEvent& evt);
     void OnMouseLeftUp(wxMouseEvent& evt);
-    void OnMouseRightUp(wxMouseEvent& evt);
+    void OnContextMenu(wxContextMenuEvent& evt);
     void OnMouseWheel(wxMouseEvent& evt);
     void OnChar(wxKeyEvent& evt);
     void OnKeyDown(wxKeyEvent& evt);
@@ -169,8 +173,6 @@ private:
     void NotifyChange();
     void NotifyParent(SCNotification* scn);
 
-    long SendMsg(int msg, long wp=0, long lp=0);
-
 private:
     DECLARE_EVENT_TABLE()
     DECLARE_CLASS(wxStyledTextCtrl)
@@ -205,6 +207,9 @@ public:
     void SetMessage(int val)         { m_message = val; }
     void SetWParam(int val)          { m_wParam = val; }
     void SetLParam(int val)          { m_lParam = val; }
+    void SetListType(int val)        { m_listType = val; }
+    void SetX(int val)               { m_x = val; }
+    void SetY(int val)               { m_y = val; }
 
     int  GetPosition() const         { return m_position; }
     int  GetKey()  const             { return m_key; }
@@ -220,6 +225,9 @@ public:
     int  GetMessage() const          { return m_message; }
     int  GetWParam() const           { return m_wParam; }
     int  GetLParam() const           { return m_lParam; }
+    int  GetListType() const         { return m_listType; }
+    int  GetX() const                { return m_x; }
+    int  GetY() const                { return m_y; }
 
     bool GetShift() const;
     bool GetControl() const;
@@ -248,42 +256,56 @@ private:
     int  m_message;             // wxEVT_STC_MACRORECORD
     int  m_wParam;
     int  m_lParam;
+
+    int m_listType;
+    int m_x;
+    int m_y;
 #endif
 };
 
 #ifndef SWIG
 BEGIN_DECLARE_EVENT_TYPES()
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_CHANGE, 1650)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_STYLENEEDED, 1651)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_CHARADDED, 1652)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_UPDATEUI, 1653)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_SAVEPOINTREACHED, 1654)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_SAVEPOINTLEFT, 1655)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_ROMODIFYATTEMPT, 1656)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_DOUBLECLICK, 1657)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_MODIFIED, 1658)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_KEY, 1659)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_MACRORECORD, 1660)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_MARGINCLICK, 1661)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_NEEDSHOWN, 1662)
-    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_POSCHANGED, 1663)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_CHANGE,                  1650)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_STYLENEEDED,             1651)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_CHARADDED,               1652)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_SAVEPOINTREACHED,        1653)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_SAVEPOINTLEFT,           1654)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_ROMODIFYATTEMPT,         1655)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_KEY,                     1656)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_DOUBLECLICK,             1657)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_UPDATEUI,                1658)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_MODIFIED,                1659)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_MACRORECORD,             1660)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_MARGINCLICK,             1661)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_NEEDSHOWN,               1662)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_POSCHANGED,              1663)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_PAINTED,                 1664)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_USERLISTSELECTION,       1665)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_URIDROPPED,              1666)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_DWELLSTART,              1667)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_DWELLEND,                1668)
 END_DECLARE_EVENT_TYPES()
 #else
     enum {
         wxEVT_STC_CHANGE,
         wxEVT_STC_STYLENEEDED,
         wxEVT_STC_CHARADDED,
-        wxEVT_STC_UPDATEUI,
         wxEVT_STC_SAVEPOINTREACHED,
         wxEVT_STC_SAVEPOINTLEFT,
         wxEVT_STC_ROMODIFYATTEMPT,
+        wxEVT_STC_KEY,
         wxEVT_STC_DOUBLECLICK,
+        wxEVT_STC_UPDATEUI,
         wxEVT_STC_MODIFIED,
-        wxEVT_STC_KEY,
         wxEVT_STC_MACRORECORD,
         wxEVT_STC_MARGINCLICK,
         wxEVT_STC_NEEDSHOWN,
-        wxEVT_STC_POSCHANGED
+        wxEVT_STC_POSCHANGED,
+        wxEVT_STC_PAINTED,
+        wxEVT_STC_USERLISTSELECTION,
+        wxEVT_STC_URIDROPPED,
+        wxEVT_STC_DWELLSTART,
+        wxEVT_STC_DWELLEND,
     };
 #endif
 
@@ -292,20 +314,26 @@ END_DECLARE_EVENT_TYPES()
 #ifndef SWIG
 typedef void (wxEvtHandler::*wxStyledTextEventFunction)(wxStyledTextEvent&);
 
-#define EVT_STC_CHANGE(id, fn)           DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_CHANGE, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_STYLENEEDED(id, fn)      DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_STYLENEEDED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_CHARADDED(id, fn)        DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_CHARADDED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_UPDATEUI(id, fn)         DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_UPDATEUI, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_SAVEPOINTREACHED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_SAVEPOINTREACHED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_SAVEPOINTLEFT(id, fn)    DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_SAVEPOINTLEFT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_ROMODIFYATTEMPT(id, fn)  DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_ROMODIFYATTEMPT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_DOUBLECLICK(id, fn)      DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DOUBLECLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_MODIFIED(id, fn)         DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MODIFIED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_KEY(id, fn)              DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_KEY, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_MACRORECORD(id, fn)      DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MACRORECORD, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_MARGINCLICK(id, fn)      DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MARGINCLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_NEEDSHOWN(id, fn)        DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_NEEDSHOWN, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_STC_POSCHANGED(id, fn)       DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_POSCHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_CHANGE(id, fn)                  DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_CHANGE,                id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_STYLENEEDED(id, fn)             DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_STYLENEEDED,           id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_CHARADDED(id, fn)               DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_CHARADDED,             id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_SAVEPOINTREACHED(id, fn)        DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_SAVEPOINTREACHED,      id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_SAVEPOINTLEFT(id, fn)           DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_SAVEPOINTLEFT,         id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_ROMODIFYATTEMPT(id, fn)         DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_ROMODIFYATTEMPT,       id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_KEY(id, fn)                     DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_KEY,                   id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_DOUBLECLICK(id, fn)             DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DOUBLECLICK,           id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_UPDATEUI(id, fn)                DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_UPDATEUI,              id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_MODIFIED(id, fn)                DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MODIFIED,              id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_MACRORECORD(id, fn)             DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MACRORECORD,           id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_MARGINCLICK(id, fn)             DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MARGINCLICK,           id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_NEEDSHOWN(id, fn)               DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_NEEDSHOWN,             id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_POSCHANGED(id, fn)              DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_POSCHANGED,            id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_PAINTED(id, fn)                 DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_PAINTED,               id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_USERLISTSELECTION(id, fn)       DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_USERLISTSELECTION,     id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_URIDROPPED(id, fn)              DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_URIDROPPED,            id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_DWELLSTART(id, fn)              DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DWELLSTART,            id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_STC_DWELLEND(id, fn)                DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DWELLEND,              id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL ),
+
 
 #endif
 
diff --git a/wxPython/CHANGES.txt b/wxPython/CHANGES.txt
index 447d88fb8d..6f56d251bc 100644
--- a/wxPython/CHANGES.txt
+++ b/wxPython/CHANGES.txt
@@ -28,7 +28,8 @@ resource.  The name of the new "constructor" is the original name of
 the class with a "Pre" in it.  For example, wxPreWindow, wxPreFrame,
 etc.
 
-
+Updated to version 1.39 of Scintilla and updated wxStyledTextCtrl
+accordingly.
 
 
 
diff --git a/wxPython/contrib/stc/stc_.cpp b/wxPython/contrib/stc/stc_.cpp
index 49266313e5..ebd8dec5b5 100644
--- a/wxPython/contrib/stc/stc_.cpp
+++ b/wxPython/contrib/stc/stc_.cpp
@@ -870,6 +870,35 @@ static PyObject *_wrap_wxStyledTextCtrl_PositionFromPoint(PyObject *self, PyObje
     return _resultobj;
 }
 
+#define wxStyledTextCtrl_PositionFromPointClose(_swigobj,_swigarg0,_swigarg1)  (_swigobj->PositionFromPointClose(_swigarg0,_swigarg1))
+static PyObject *_wrap_wxStyledTextCtrl_PositionFromPointClose(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    int  _result;
+    wxStyledTextCtrl * _arg0;
+    int  _arg1;
+    int  _arg2;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self","x","y", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oii:wxStyledTextCtrl_PositionFromPointClose",_kwnames,&_argo0,&_arg1,&_arg2)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_PositionFromPointClose. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        _result = (int )wxStyledTextCtrl_PositionFromPointClose(_arg0,_arg1,_arg2);
+
+    wxPy_END_ALLOW_THREADS;
+}    _resultobj = Py_BuildValue("i",_result);
+    return _resultobj;
+}
+
 #define wxStyledTextCtrl_GotoLine(_swigobj,_swigarg0)  (_swigobj->GotoLine(_swigarg0))
 static PyObject *_wrap_wxStyledTextCtrl_GotoLine(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
@@ -1023,15 +1052,16 @@ static PyObject *_wrap_wxStyledTextCtrl_GetEndStyled(PyObject *self, PyObject *a
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_ConvertEOLs(_swigobj)  (_swigobj->ConvertEOLs())
+#define wxStyledTextCtrl_ConvertEOLs(_swigobj,_swigarg0)  (_swigobj->ConvertEOLs(_swigarg0))
 static PyObject *_wrap_wxStyledTextCtrl_ConvertEOLs(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
     wxStyledTextCtrl * _arg0;
+    int  _arg1;
     PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self", NULL };
+    char *_kwnames[] = { "self","eolMode", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_ConvertEOLs",_kwnames,&_argo0)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_ConvertEOLs",_kwnames,&_argo0,&_arg1)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
@@ -1042,7 +1072,7 @@ static PyObject *_wrap_wxStyledTextCtrl_ConvertEOLs(PyObject *self, PyObject *ar
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        wxStyledTextCtrl_ConvertEOLs(_arg0);
+        wxStyledTextCtrl_ConvertEOLs(_arg0,_arg1);
 
     wxPy_END_ALLOW_THREADS;
 }    Py_INCREF(Py_None);
@@ -2155,6 +2185,35 @@ static PyObject *_wrap_wxStyledTextCtrl_StyleSetUnderline(PyObject *self, PyObje
     return _resultobj;
 }
 
+#define wxStyledTextCtrl_StyleSetCase(_swigobj,_swigarg0,_swigarg1)  (_swigobj->StyleSetCase(_swigarg0,_swigarg1))
+static PyObject *_wrap_wxStyledTextCtrl_StyleSetCase(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextCtrl * _arg0;
+    int  _arg1;
+    int  _arg2;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self","style","caseForce", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oii:wxStyledTextCtrl_StyleSetCase",_kwnames,&_argo0,&_arg1,&_arg2)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_StyleSetCase. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextCtrl_StyleSetCase(_arg0,_arg1,_arg2);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+    return _resultobj;
+}
+
 #define wxStyledTextCtrl_SetSelForeground(_swigobj,_swigarg0,_swigarg1)  (_swigobj->SetSelForeground(_swigarg0,_swigarg1))
 static PyObject *_wrap_wxStyledTextCtrl_SetSelForeground(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
@@ -2834,6 +2893,127 @@ static PyObject *_wrap_wxStyledTextCtrl_GetMaxLineState(PyObject *self, PyObject
     return _resultobj;
 }
 
+#define wxStyledTextCtrl_GetCaretLineVisible(_swigobj)  (_swigobj->GetCaretLineVisible())
+static PyObject *_wrap_wxStyledTextCtrl_GetCaretLineVisible(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    bool  _result;
+    wxStyledTextCtrl * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_GetCaretLineVisible",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetCaretLineVisible. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        _result = (bool )wxStyledTextCtrl_GetCaretLineVisible(_arg0);
+
+    wxPy_END_ALLOW_THREADS;
+}    _resultobj = Py_BuildValue("i",_result);
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_SetCaretLineVisible(_swigobj,_swigarg0)  (_swigobj->SetCaretLineVisible(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_SetCaretLineVisible(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextCtrl * _arg0;
+    bool  _arg1;
+    PyObject * _argo0 = 0;
+    int tempbool1;
+    char *_kwnames[] = { "self","show", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_SetCaretLineVisible",_kwnames,&_argo0,&tempbool1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetCaretLineVisible. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+    _arg1 = (bool ) tempbool1;
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextCtrl_SetCaretLineVisible(_arg0,_arg1);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_GetCaretLineBack(_swigobj)  (_swigobj->GetCaretLineBack())
+static PyObject *_wrap_wxStyledTextCtrl_GetCaretLineBack(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxColour * _result;
+    wxStyledTextCtrl * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self", NULL };
+    char _ptemp[128];
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_GetCaretLineBack",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetCaretLineBack. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        _result = new wxColour (wxStyledTextCtrl_GetCaretLineBack(_arg0));
+
+    wxPy_END_ALLOW_THREADS;
+}    SWIG_MakePtr(_ptemp, (void *) _result,"_wxColour_p");
+    _resultobj = Py_BuildValue("s",_ptemp);
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_SetCaretLineBack(_swigobj,_swigarg0)  (_swigobj->SetCaretLineBack(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_SetCaretLineBack(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextCtrl * _arg0;
+    wxColour * _arg1;
+    PyObject * _argo0 = 0;
+    wxColour  temp;
+    PyObject * _obj1 = 0;
+    char *_kwnames[] = { "self","back", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxStyledTextCtrl_SetCaretLineBack",_kwnames,&_argo0,&_obj1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetCaretLineBack. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    _arg1 = &temp;
+    if (! wxColour_helper(_obj1, &_arg1))
+        return NULL;
+}
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextCtrl_SetCaretLineBack(_arg0,*_arg1);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+    return _resultobj;
+}
+
 #define wxStyledTextCtrl_AutoCompShow(_swigobj,_swigarg0,_swigarg1)  (_swigobj->AutoCompShow(_swigarg0,_swigarg1))
 static PyObject *_wrap_wxStyledTextCtrl_AutoCompShow(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
@@ -3373,6 +3553,115 @@ static PyObject *_wrap_wxStyledTextCtrl_AutoCompGetIgnoreCase(PyObject *self, Py
     return _resultobj;
 }
 
+#define wxStyledTextCtrl_UserListShow(_swigobj,_swigarg0,_swigarg1)  (_swigobj->UserListShow(_swigarg0,_swigarg1))
+static PyObject *_wrap_wxStyledTextCtrl_UserListShow(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextCtrl * _arg0;
+    int  _arg1;
+    wxString * _arg2;
+    PyObject * _argo0 = 0;
+    PyObject * _obj2 = 0;
+    char *_kwnames[] = { "self","listType","itemList", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OiO:wxStyledTextCtrl_UserListShow",_kwnames,&_argo0,&_arg1,&_obj2)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_UserListShow. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+#if PYTHON_API_VERSION >= 1009
+    char* tmpPtr; int tmpSize;
+    if (!PyString_Check(_obj2) && !PyUnicode_Check(_obj2)) {
+        PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
+        return NULL;
+    }
+    if (PyString_AsStringAndSize(_obj2, &tmpPtr, &tmpSize) == -1)
+        return NULL;
+    _arg2 = new wxString(tmpPtr, tmpSize);
+#else
+    if (!PyString_Check(_obj2)) {
+        PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
+        return NULL;
+    }
+    _arg2 = new wxString(PyString_AS_STRING(_obj2), PyString_GET_SIZE(_obj2));
+#endif
+}
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextCtrl_UserListShow(_arg0,_arg1,*_arg2);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+{
+    if (_obj2)
+        delete _arg2;
+}
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_AutoCompSetAutoHide(_swigobj,_swigarg0)  (_swigobj->AutoCompSetAutoHide(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_AutoCompSetAutoHide(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextCtrl * _arg0;
+    bool  _arg1;
+    PyObject * _argo0 = 0;
+    int tempbool1;
+    char *_kwnames[] = { "self","autoHide", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_AutoCompSetAutoHide",_kwnames,&_argo0,&tempbool1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_AutoCompSetAutoHide. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+    _arg1 = (bool ) tempbool1;
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextCtrl_AutoCompSetAutoHide(_arg0,_arg1);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_AutoCompGetAutoHide(_swigobj)  (_swigobj->AutoCompGetAutoHide())
+static PyObject *_wrap_wxStyledTextCtrl_AutoCompGetAutoHide(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    bool  _result;
+    wxStyledTextCtrl * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_AutoCompGetAutoHide",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_AutoCompGetAutoHide. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        _result = (bool )wxStyledTextCtrl_AutoCompGetAutoHide(_arg0);
+
+    wxPy_END_ALLOW_THREADS;
+}    _resultobj = Py_BuildValue("i",_result);
+    return _resultobj;
+}
+
 #define wxStyledTextCtrl_SetIndent(_swigobj,_swigarg0)  (_swigobj->SetIndent(_swigarg0))
 static PyObject *_wrap_wxStyledTextCtrl_SetIndent(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
@@ -4344,7 +4633,7 @@ static PyObject *_wrap_wxStyledTextCtrl_SetMarginLeft(PyObject *self, PyObject *
     wxStyledTextCtrl * _arg0;
     int  _arg1;
     PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self","width", NULL };
+    char *_kwnames[] = { "self","pixelWidth", NULL };
 
     self = self;
     if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_SetMarginLeft",_kwnames,&_argo0,&_arg1)) 
@@ -4399,7 +4688,7 @@ static PyObject *_wrap_wxStyledTextCtrl_SetMarginRight(PyObject *self, PyObject
     wxStyledTextCtrl * _arg0;
     int  _arg1;
     PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self","width", NULL };
+    char *_kwnames[] = { "self","pixelWidth", NULL };
 
     self = self;
     if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_SetMarginRight",_kwnames,&_argo0,&_arg1)) 
@@ -5176,114 +5465,91 @@ static PyObject *_wrap_wxStyledTextCtrl_GetOvertype(PyObject *self, PyObject *ar
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_CallTipShow(_swigobj,_swigarg0,_swigarg1)  (_swigobj->CallTipShow(_swigarg0,_swigarg1))
-static PyObject *_wrap_wxStyledTextCtrl_CallTipShow(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_SetCaretWidth(_swigobj,_swigarg0)  (_swigobj->SetCaretWidth(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_SetCaretWidth(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
     wxStyledTextCtrl * _arg0;
     int  _arg1;
-    wxString * _arg2;
     PyObject * _argo0 = 0;
-    PyObject * _obj2 = 0;
-    char *_kwnames[] = { "self","pos","definition", NULL };
+    char *_kwnames[] = { "self","pixelWidth", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OiO:wxStyledTextCtrl_CallTipShow",_kwnames,&_argo0,&_arg1,&_obj2)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_SetCaretWidth",_kwnames,&_argo0,&_arg1)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_CallTipShow. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetCaretWidth. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
-{
-#if PYTHON_API_VERSION >= 1009
-    char* tmpPtr; int tmpSize;
-    if (!PyString_Check(_obj2) && !PyUnicode_Check(_obj2)) {
-        PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
-        return NULL;
-    }
-    if (PyString_AsStringAndSize(_obj2, &tmpPtr, &tmpSize) == -1)
-        return NULL;
-    _arg2 = new wxString(tmpPtr, tmpSize);
-#else
-    if (!PyString_Check(_obj2)) {
-        PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
-        return NULL;
-    }
-    _arg2 = new wxString(PyString_AS_STRING(_obj2), PyString_GET_SIZE(_obj2));
-#endif
-}
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        wxStyledTextCtrl_CallTipShow(_arg0,_arg1,*_arg2);
+        wxStyledTextCtrl_SetCaretWidth(_arg0,_arg1);
 
     wxPy_END_ALLOW_THREADS;
 }    Py_INCREF(Py_None);
     _resultobj = Py_None;
-{
-    if (_obj2)
-        delete _arg2;
-}
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_CallTipCancel(_swigobj)  (_swigobj->CallTipCancel())
-static PyObject *_wrap_wxStyledTextCtrl_CallTipCancel(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_GetCaretWidth(_swigobj)  (_swigobj->GetCaretWidth())
+static PyObject *_wrap_wxStyledTextCtrl_GetCaretWidth(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
+    int  _result;
     wxStyledTextCtrl * _arg0;
     PyObject * _argo0 = 0;
     char *_kwnames[] = { "self", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_CallTipCancel",_kwnames,&_argo0)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_GetCaretWidth",_kwnames,&_argo0)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_CallTipCancel. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetCaretWidth. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        wxStyledTextCtrl_CallTipCancel(_arg0);
+        _result = (int )wxStyledTextCtrl_GetCaretWidth(_arg0);
 
     wxPy_END_ALLOW_THREADS;
-}    Py_INCREF(Py_None);
-    _resultobj = Py_None;
+}    _resultobj = Py_BuildValue("i",_result);
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_CallTipActive(_swigobj)  (_swigobj->CallTipActive())
-static PyObject *_wrap_wxStyledTextCtrl_CallTipActive(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_SetTargetStart(_swigobj,_swigarg0)  (_swigobj->SetTargetStart(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_SetTargetStart(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
-    bool  _result;
     wxStyledTextCtrl * _arg0;
+    int  _arg1;
     PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self", NULL };
+    char *_kwnames[] = { "self","pos", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_CallTipActive",_kwnames,&_argo0)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_SetTargetStart",_kwnames,&_argo0,&_arg1)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_CallTipActive. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetTargetStart. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        _result = (bool )wxStyledTextCtrl_CallTipActive(_arg0);
+        wxStyledTextCtrl_SetTargetStart(_arg0,_arg1);
 
     wxPy_END_ALLOW_THREADS;
-}    _resultobj = Py_BuildValue("i",_result);
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_CallTipPosAtStart(_swigobj)  (_swigobj->CallTipPosAtStart())
-static PyObject *_wrap_wxStyledTextCtrl_CallTipPosAtStart(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_GetTargetStart(_swigobj)  (_swigobj->GetTargetStart())
+static PyObject *_wrap_wxStyledTextCtrl_GetTargetStart(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
     int  _result;
     wxStyledTextCtrl * _arg0;
@@ -5291,46 +5557,45 @@ static PyObject *_wrap_wxStyledTextCtrl_CallTipPosAtStart(PyObject *self, PyObje
     char *_kwnames[] = { "self", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_CallTipPosAtStart",_kwnames,&_argo0)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_GetTargetStart",_kwnames,&_argo0)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_CallTipPosAtStart. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetTargetStart. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        _result = (int )wxStyledTextCtrl_CallTipPosAtStart(_arg0);
+        _result = (int )wxStyledTextCtrl_GetTargetStart(_arg0);
 
     wxPy_END_ALLOW_THREADS;
 }    _resultobj = Py_BuildValue("i",_result);
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_CallTipSetHighlight(_swigobj,_swigarg0,_swigarg1)  (_swigobj->CallTipSetHighlight(_swigarg0,_swigarg1))
-static PyObject *_wrap_wxStyledTextCtrl_CallTipSetHighlight(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_SetTargetEnd(_swigobj,_swigarg0)  (_swigobj->SetTargetEnd(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_SetTargetEnd(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
     wxStyledTextCtrl * _arg0;
     int  _arg1;
-    int  _arg2;
     PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self","start","end", NULL };
+    char *_kwnames[] = { "self","pos", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oii:wxStyledTextCtrl_CallTipSetHighlight",_kwnames,&_argo0,&_arg1,&_arg2)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_SetTargetEnd",_kwnames,&_argo0,&_arg1)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_CallTipSetHighlight. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetTargetEnd. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        wxStyledTextCtrl_CallTipSetHighlight(_arg0,_arg1,_arg2);
+        wxStyledTextCtrl_SetTargetEnd(_arg0,_arg1);
 
     wxPy_END_ALLOW_THREADS;
 }    Py_INCREF(Py_None);
@@ -5338,233 +5603,313 @@ static PyObject *_wrap_wxStyledTextCtrl_CallTipSetHighlight(PyObject *self, PyOb
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_CallTipSetBackground(_swigobj,_swigarg0)  (_swigobj->CallTipSetBackground(_swigarg0))
-static PyObject *_wrap_wxStyledTextCtrl_CallTipSetBackground(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_GetTargetEnd(_swigobj)  (_swigobj->GetTargetEnd())
+static PyObject *_wrap_wxStyledTextCtrl_GetTargetEnd(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
+    int  _result;
     wxStyledTextCtrl * _arg0;
-    wxColour * _arg1;
     PyObject * _argo0 = 0;
-    wxColour  temp;
-    PyObject * _obj1 = 0;
-    char *_kwnames[] = { "self","back", NULL };
+    char *_kwnames[] = { "self", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxStyledTextCtrl_CallTipSetBackground",_kwnames,&_argo0,&_obj1)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_GetTargetEnd",_kwnames,&_argo0)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_CallTipSetBackground. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetTargetEnd. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
-{
-    _arg1 = &temp;
-    if (! wxColour_helper(_obj1, &_arg1))
-        return NULL;
-}
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        wxStyledTextCtrl_CallTipSetBackground(_arg0,*_arg1);
+        _result = (int )wxStyledTextCtrl_GetTargetEnd(_arg0);
 
     wxPy_END_ALLOW_THREADS;
-}    Py_INCREF(Py_None);
-    _resultobj = Py_None;
+}    _resultobj = Py_BuildValue("i",_result);
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_VisibleFromDocLine(_swigobj,_swigarg0)  (_swigobj->VisibleFromDocLine(_swigarg0))
-static PyObject *_wrap_wxStyledTextCtrl_VisibleFromDocLine(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_ReplaceTarget(_swigobj,_swigarg0)  (_swigobj->ReplaceTarget(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_ReplaceTarget(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
     int  _result;
     wxStyledTextCtrl * _arg0;
-    int  _arg1;
+    wxString * _arg1;
     PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self","line", NULL };
+    PyObject * _obj1 = 0;
+    char *_kwnames[] = { "self","text", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_VisibleFromDocLine",_kwnames,&_argo0,&_arg1)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxStyledTextCtrl_ReplaceTarget",_kwnames,&_argo0,&_obj1)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_VisibleFromDocLine. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_ReplaceTarget. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
+{
+#if PYTHON_API_VERSION >= 1009
+    char* tmpPtr; int tmpSize;
+    if (!PyString_Check(_obj1) && !PyUnicode_Check(_obj1)) {
+        PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
+        return NULL;
+    }
+    if (PyString_AsStringAndSize(_obj1, &tmpPtr, &tmpSize) == -1)
+        return NULL;
+    _arg1 = new wxString(tmpPtr, tmpSize);
+#else
+    if (!PyString_Check(_obj1)) {
+        PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
+        return NULL;
+    }
+    _arg1 = new wxString(PyString_AS_STRING(_obj1), PyString_GET_SIZE(_obj1));
+#endif
+}
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        _result = (int )wxStyledTextCtrl_VisibleFromDocLine(_arg0,_arg1);
+        _result = (int )wxStyledTextCtrl_ReplaceTarget(_arg0,*_arg1);
 
     wxPy_END_ALLOW_THREADS;
 }    _resultobj = Py_BuildValue("i",_result);
+{
+    if (_obj1)
+        delete _arg1;
+}
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_DocLineFromVisible(_swigobj,_swigarg0)  (_swigobj->DocLineFromVisible(_swigarg0))
-static PyObject *_wrap_wxStyledTextCtrl_DocLineFromVisible(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_ReplaceTargetRE(_swigobj,_swigarg0)  (_swigobj->ReplaceTargetRE(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_ReplaceTargetRE(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
     int  _result;
     wxStyledTextCtrl * _arg0;
-    int  _arg1;
+    wxString * _arg1;
     PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self","lineDisplay", NULL };
+    PyObject * _obj1 = 0;
+    char *_kwnames[] = { "self","text", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_DocLineFromVisible",_kwnames,&_argo0,&_arg1)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxStyledTextCtrl_ReplaceTargetRE",_kwnames,&_argo0,&_obj1)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_DocLineFromVisible. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_ReplaceTargetRE. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
+{
+#if PYTHON_API_VERSION >= 1009
+    char* tmpPtr; int tmpSize;
+    if (!PyString_Check(_obj1) && !PyUnicode_Check(_obj1)) {
+        PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
+        return NULL;
+    }
+    if (PyString_AsStringAndSize(_obj1, &tmpPtr, &tmpSize) == -1)
+        return NULL;
+    _arg1 = new wxString(tmpPtr, tmpSize);
+#else
+    if (!PyString_Check(_obj1)) {
+        PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
+        return NULL;
+    }
+    _arg1 = new wxString(PyString_AS_STRING(_obj1), PyString_GET_SIZE(_obj1));
+#endif
+}
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        _result = (int )wxStyledTextCtrl_DocLineFromVisible(_arg0,_arg1);
+        _result = (int )wxStyledTextCtrl_ReplaceTargetRE(_arg0,*_arg1);
 
     wxPy_END_ALLOW_THREADS;
 }    _resultobj = Py_BuildValue("i",_result);
+{
+    if (_obj1)
+        delete _arg1;
+}
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_SetFoldLevel(_swigobj,_swigarg0,_swigarg1)  (_swigobj->SetFoldLevel(_swigarg0,_swigarg1))
-static PyObject *_wrap_wxStyledTextCtrl_SetFoldLevel(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_SearchInTarget(_swigobj,_swigarg0)  (_swigobj->SearchInTarget(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_SearchInTarget(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
+    int  _result;
     wxStyledTextCtrl * _arg0;
-    int  _arg1;
-    int  _arg2;
+    wxString * _arg1;
     PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self","line","level", NULL };
+    PyObject * _obj1 = 0;
+    char *_kwnames[] = { "self","text", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oii:wxStyledTextCtrl_SetFoldLevel",_kwnames,&_argo0,&_arg1,&_arg2)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxStyledTextCtrl_SearchInTarget",_kwnames,&_argo0,&_obj1)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetFoldLevel. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SearchInTarget. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
+{
+#if PYTHON_API_VERSION >= 1009
+    char* tmpPtr; int tmpSize;
+    if (!PyString_Check(_obj1) && !PyUnicode_Check(_obj1)) {
+        PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
+        return NULL;
+    }
+    if (PyString_AsStringAndSize(_obj1, &tmpPtr, &tmpSize) == -1)
+        return NULL;
+    _arg1 = new wxString(tmpPtr, tmpSize);
+#else
+    if (!PyString_Check(_obj1)) {
+        PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
+        return NULL;
+    }
+    _arg1 = new wxString(PyString_AS_STRING(_obj1), PyString_GET_SIZE(_obj1));
+#endif
+}
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        wxStyledTextCtrl_SetFoldLevel(_arg0,_arg1,_arg2);
+        _result = (int )wxStyledTextCtrl_SearchInTarget(_arg0,*_arg1);
 
     wxPy_END_ALLOW_THREADS;
-}    Py_INCREF(Py_None);
-    _resultobj = Py_None;
+}    _resultobj = Py_BuildValue("i",_result);
+{
+    if (_obj1)
+        delete _arg1;
+}
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_GetFoldLevel(_swigobj,_swigarg0)  (_swigobj->GetFoldLevel(_swigarg0))
-static PyObject *_wrap_wxStyledTextCtrl_GetFoldLevel(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_SetSearchFlags(_swigobj,_swigarg0)  (_swigobj->SetSearchFlags(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_SetSearchFlags(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
-    int  _result;
     wxStyledTextCtrl * _arg0;
     int  _arg1;
     PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self","line", NULL };
+    char *_kwnames[] = { "self","flags", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_GetFoldLevel",_kwnames,&_argo0,&_arg1)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_SetSearchFlags",_kwnames,&_argo0,&_arg1)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetFoldLevel. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetSearchFlags. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        _result = (int )wxStyledTextCtrl_GetFoldLevel(_arg0,_arg1);
+        wxStyledTextCtrl_SetSearchFlags(_arg0,_arg1);
 
     wxPy_END_ALLOW_THREADS;
-}    _resultobj = Py_BuildValue("i",_result);
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_GetLastChild(_swigobj,_swigarg0,_swigarg1)  (_swigobj->GetLastChild(_swigarg0,_swigarg1))
-static PyObject *_wrap_wxStyledTextCtrl_GetLastChild(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_GetSearchFlags(_swigobj)  (_swigobj->GetSearchFlags())
+static PyObject *_wrap_wxStyledTextCtrl_GetSearchFlags(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
     int  _result;
     wxStyledTextCtrl * _arg0;
-    int  _arg1;
-    int  _arg2;
     PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self","line","level", NULL };
+    char *_kwnames[] = { "self", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oii:wxStyledTextCtrl_GetLastChild",_kwnames,&_argo0,&_arg1,&_arg2)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_GetSearchFlags",_kwnames,&_argo0)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetLastChild. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetSearchFlags. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        _result = (int )wxStyledTextCtrl_GetLastChild(_arg0,_arg1,_arg2);
+        _result = (int )wxStyledTextCtrl_GetSearchFlags(_arg0);
 
     wxPy_END_ALLOW_THREADS;
 }    _resultobj = Py_BuildValue("i",_result);
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_GetFoldParent(_swigobj,_swigarg0)  (_swigobj->GetFoldParent(_swigarg0))
-static PyObject *_wrap_wxStyledTextCtrl_GetFoldParent(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_CallTipShow(_swigobj,_swigarg0,_swigarg1)  (_swigobj->CallTipShow(_swigarg0,_swigarg1))
+static PyObject *_wrap_wxStyledTextCtrl_CallTipShow(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
-    int  _result;
     wxStyledTextCtrl * _arg0;
     int  _arg1;
+    wxString * _arg2;
     PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self","line", NULL };
+    PyObject * _obj2 = 0;
+    char *_kwnames[] = { "self","pos","definition", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_GetFoldParent",_kwnames,&_argo0,&_arg1)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OiO:wxStyledTextCtrl_CallTipShow",_kwnames,&_argo0,&_arg1,&_obj2)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetFoldParent. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_CallTipShow. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
+{
+#if PYTHON_API_VERSION >= 1009
+    char* tmpPtr; int tmpSize;
+    if (!PyString_Check(_obj2) && !PyUnicode_Check(_obj2)) {
+        PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
+        return NULL;
+    }
+    if (PyString_AsStringAndSize(_obj2, &tmpPtr, &tmpSize) == -1)
+        return NULL;
+    _arg2 = new wxString(tmpPtr, tmpSize);
+#else
+    if (!PyString_Check(_obj2)) {
+        PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
+        return NULL;
+    }
+    _arg2 = new wxString(PyString_AS_STRING(_obj2), PyString_GET_SIZE(_obj2));
+#endif
+}
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        _result = (int )wxStyledTextCtrl_GetFoldParent(_arg0,_arg1);
+        wxStyledTextCtrl_CallTipShow(_arg0,_arg1,*_arg2);
 
     wxPy_END_ALLOW_THREADS;
-}    _resultobj = Py_BuildValue("i",_result);
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+{
+    if (_obj2)
+        delete _arg2;
+}
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_ShowLines(_swigobj,_swigarg0,_swigarg1)  (_swigobj->ShowLines(_swigarg0,_swigarg1))
-static PyObject *_wrap_wxStyledTextCtrl_ShowLines(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_CallTipCancel(_swigobj)  (_swigobj->CallTipCancel())
+static PyObject *_wrap_wxStyledTextCtrl_CallTipCancel(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
     wxStyledTextCtrl * _arg0;
-    int  _arg1;
-    int  _arg2;
     PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self","lineStart","lineEnd", NULL };
+    char *_kwnames[] = { "self", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oii:wxStyledTextCtrl_ShowLines",_kwnames,&_argo0,&_arg1,&_arg2)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_CallTipCancel",_kwnames,&_argo0)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_ShowLines. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_CallTipCancel. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        wxStyledTextCtrl_ShowLines(_arg0,_arg1,_arg2);
+        wxStyledTextCtrl_CallTipCancel(_arg0);
 
     wxPy_END_ALLOW_THREADS;
 }    Py_INCREF(Py_None);
@@ -5572,87 +5917,82 @@ static PyObject *_wrap_wxStyledTextCtrl_ShowLines(PyObject *self, PyObject *args
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_HideLines(_swigobj,_swigarg0,_swigarg1)  (_swigobj->HideLines(_swigarg0,_swigarg1))
-static PyObject *_wrap_wxStyledTextCtrl_HideLines(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_CallTipActive(_swigobj)  (_swigobj->CallTipActive())
+static PyObject *_wrap_wxStyledTextCtrl_CallTipActive(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
+    bool  _result;
     wxStyledTextCtrl * _arg0;
-    int  _arg1;
-    int  _arg2;
     PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self","lineStart","lineEnd", NULL };
+    char *_kwnames[] = { "self", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oii:wxStyledTextCtrl_HideLines",_kwnames,&_argo0,&_arg1,&_arg2)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_CallTipActive",_kwnames,&_argo0)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_HideLines. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_CallTipActive. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        wxStyledTextCtrl_HideLines(_arg0,_arg1,_arg2);
+        _result = (bool )wxStyledTextCtrl_CallTipActive(_arg0);
 
     wxPy_END_ALLOW_THREADS;
-}    Py_INCREF(Py_None);
-    _resultobj = Py_None;
+}    _resultobj = Py_BuildValue("i",_result);
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_GetLineVisible(_swigobj,_swigarg0)  (_swigobj->GetLineVisible(_swigarg0))
-static PyObject *_wrap_wxStyledTextCtrl_GetLineVisible(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_CallTipPosAtStart(_swigobj)  (_swigobj->CallTipPosAtStart())
+static PyObject *_wrap_wxStyledTextCtrl_CallTipPosAtStart(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
-    bool  _result;
+    int  _result;
     wxStyledTextCtrl * _arg0;
-    int  _arg1;
     PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self","line", NULL };
+    char *_kwnames[] = { "self", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_GetLineVisible",_kwnames,&_argo0,&_arg1)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_CallTipPosAtStart",_kwnames,&_argo0)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetLineVisible. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_CallTipPosAtStart. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        _result = (bool )wxStyledTextCtrl_GetLineVisible(_arg0,_arg1);
+        _result = (int )wxStyledTextCtrl_CallTipPosAtStart(_arg0);
 
     wxPy_END_ALLOW_THREADS;
 }    _resultobj = Py_BuildValue("i",_result);
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_SetFoldExpanded(_swigobj,_swigarg0,_swigarg1)  (_swigobj->SetFoldExpanded(_swigarg0,_swigarg1))
-static PyObject *_wrap_wxStyledTextCtrl_SetFoldExpanded(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_CallTipSetHighlight(_swigobj,_swigarg0,_swigarg1)  (_swigobj->CallTipSetHighlight(_swigarg0,_swigarg1))
+static PyObject *_wrap_wxStyledTextCtrl_CallTipSetHighlight(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
     wxStyledTextCtrl * _arg0;
     int  _arg1;
-    bool  _arg2;
+    int  _arg2;
     PyObject * _argo0 = 0;
-    int tempbool2;
-    char *_kwnames[] = { "self","line","expanded", NULL };
+    char *_kwnames[] = { "self","start","end", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oii:wxStyledTextCtrl_SetFoldExpanded",_kwnames,&_argo0,&_arg1,&tempbool2)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oii:wxStyledTextCtrl_CallTipSetHighlight",_kwnames,&_argo0,&_arg1,&_arg2)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetFoldExpanded. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_CallTipSetHighlight. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
-    _arg2 = (bool ) tempbool2;
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        wxStyledTextCtrl_SetFoldExpanded(_arg0,_arg1,_arg2);
+        wxStyledTextCtrl_CallTipSetHighlight(_arg0,_arg1,_arg2);
 
     wxPy_END_ALLOW_THREADS;
 }    Py_INCREF(Py_None);
@@ -5660,111 +6000,119 @@ static PyObject *_wrap_wxStyledTextCtrl_SetFoldExpanded(PyObject *self, PyObject
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_GetFoldExpanded(_swigobj,_swigarg0)  (_swigobj->GetFoldExpanded(_swigarg0))
-static PyObject *_wrap_wxStyledTextCtrl_GetFoldExpanded(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_CallTipSetBackground(_swigobj,_swigarg0)  (_swigobj->CallTipSetBackground(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_CallTipSetBackground(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
-    bool  _result;
     wxStyledTextCtrl * _arg0;
-    int  _arg1;
+    wxColour * _arg1;
     PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self","line", NULL };
+    wxColour  temp;
+    PyObject * _obj1 = 0;
+    char *_kwnames[] = { "self","back", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_GetFoldExpanded",_kwnames,&_argo0,&_arg1)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxStyledTextCtrl_CallTipSetBackground",_kwnames,&_argo0,&_obj1)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetFoldExpanded. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_CallTipSetBackground. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
+{
+    _arg1 = &temp;
+    if (! wxColour_helper(_obj1, &_arg1))
+        return NULL;
+}
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        _result = (bool )wxStyledTextCtrl_GetFoldExpanded(_arg0,_arg1);
+        wxStyledTextCtrl_CallTipSetBackground(_arg0,*_arg1);
 
     wxPy_END_ALLOW_THREADS;
-}    _resultobj = Py_BuildValue("i",_result);
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_ToggleFold(_swigobj,_swigarg0)  (_swigobj->ToggleFold(_swigarg0))
-static PyObject *_wrap_wxStyledTextCtrl_ToggleFold(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_VisibleFromDocLine(_swigobj,_swigarg0)  (_swigobj->VisibleFromDocLine(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_VisibleFromDocLine(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
+    int  _result;
     wxStyledTextCtrl * _arg0;
     int  _arg1;
     PyObject * _argo0 = 0;
     char *_kwnames[] = { "self","line", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_ToggleFold",_kwnames,&_argo0,&_arg1)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_VisibleFromDocLine",_kwnames,&_argo0,&_arg1)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_ToggleFold. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_VisibleFromDocLine. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        wxStyledTextCtrl_ToggleFold(_arg0,_arg1);
+        _result = (int )wxStyledTextCtrl_VisibleFromDocLine(_arg0,_arg1);
 
     wxPy_END_ALLOW_THREADS;
-}    Py_INCREF(Py_None);
-    _resultobj = Py_None;
+}    _resultobj = Py_BuildValue("i",_result);
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_EnsureVisible(_swigobj,_swigarg0)  (_swigobj->EnsureVisible(_swigarg0))
-static PyObject *_wrap_wxStyledTextCtrl_EnsureVisible(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_DocLineFromVisible(_swigobj,_swigarg0)  (_swigobj->DocLineFromVisible(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_DocLineFromVisible(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
+    int  _result;
     wxStyledTextCtrl * _arg0;
     int  _arg1;
     PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self","line", NULL };
+    char *_kwnames[] = { "self","lineDisplay", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_EnsureVisible",_kwnames,&_argo0,&_arg1)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_DocLineFromVisible",_kwnames,&_argo0,&_arg1)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_EnsureVisible. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_DocLineFromVisible. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        wxStyledTextCtrl_EnsureVisible(_arg0,_arg1);
+        _result = (int )wxStyledTextCtrl_DocLineFromVisible(_arg0,_arg1);
 
     wxPy_END_ALLOW_THREADS;
-}    Py_INCREF(Py_None);
-    _resultobj = Py_None;
+}    _resultobj = Py_BuildValue("i",_result);
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_SetFoldFlags(_swigobj,_swigarg0)  (_swigobj->SetFoldFlags(_swigarg0))
-static PyObject *_wrap_wxStyledTextCtrl_SetFoldFlags(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_SetFoldLevel(_swigobj,_swigarg0,_swigarg1)  (_swigobj->SetFoldLevel(_swigarg0,_swigarg1))
+static PyObject *_wrap_wxStyledTextCtrl_SetFoldLevel(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
     wxStyledTextCtrl * _arg0;
     int  _arg1;
+    int  _arg2;
     PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self","flags", NULL };
+    char *_kwnames[] = { "self","line","level", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_SetFoldFlags",_kwnames,&_argo0,&_arg1)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oii:wxStyledTextCtrl_SetFoldLevel",_kwnames,&_argo0,&_arg1,&_arg2)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetFoldFlags. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetFoldLevel. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        wxStyledTextCtrl_SetFoldFlags(_arg0,_arg1);
+        wxStyledTextCtrl_SetFoldLevel(_arg0,_arg1,_arg2);
 
     wxPy_END_ALLOW_THREADS;
 }    Py_INCREF(Py_None);
@@ -5772,8 +6120,8 @@ static PyObject *_wrap_wxStyledTextCtrl_SetFoldFlags(PyObject *self, PyObject *a
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_LineLength(_swigobj,_swigarg0)  (_swigobj->LineLength(_swigarg0))
-static PyObject *_wrap_wxStyledTextCtrl_LineLength(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_GetFoldLevel(_swigobj,_swigarg0)  (_swigobj->GetFoldLevel(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_GetFoldLevel(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
     int  _result;
     wxStyledTextCtrl * _arg0;
@@ -5782,312 +6130,1374 @@ static PyObject *_wrap_wxStyledTextCtrl_LineLength(PyObject *self, PyObject *arg
     char *_kwnames[] = { "self","line", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_LineLength",_kwnames,&_argo0,&_arg1)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_GetFoldLevel",_kwnames,&_argo0,&_arg1)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_LineLength. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetFoldLevel. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        _result = (int )wxStyledTextCtrl_LineLength(_arg0,_arg1);
+        _result = (int )wxStyledTextCtrl_GetFoldLevel(_arg0,_arg1);
 
     wxPy_END_ALLOW_THREADS;
 }    _resultobj = Py_BuildValue("i",_result);
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_BraceHighlight(_swigobj,_swigarg0,_swigarg1)  (_swigobj->BraceHighlight(_swigarg0,_swigarg1))
-static PyObject *_wrap_wxStyledTextCtrl_BraceHighlight(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_GetLastChild(_swigobj,_swigarg0,_swigarg1)  (_swigobj->GetLastChild(_swigarg0,_swigarg1))
+static PyObject *_wrap_wxStyledTextCtrl_GetLastChild(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
+    int  _result;
     wxStyledTextCtrl * _arg0;
     int  _arg1;
     int  _arg2;
     PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self","pos1","pos2", NULL };
+    char *_kwnames[] = { "self","line","level", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oii:wxStyledTextCtrl_BraceHighlight",_kwnames,&_argo0,&_arg1,&_arg2)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oii:wxStyledTextCtrl_GetLastChild",_kwnames,&_argo0,&_arg1,&_arg2)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_BraceHighlight. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetLastChild. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        wxStyledTextCtrl_BraceHighlight(_arg0,_arg1,_arg2);
+        _result = (int )wxStyledTextCtrl_GetLastChild(_arg0,_arg1,_arg2);
 
     wxPy_END_ALLOW_THREADS;
-}    Py_INCREF(Py_None);
-    _resultobj = Py_None;
+}    _resultobj = Py_BuildValue("i",_result);
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_BraceBadLight(_swigobj,_swigarg0)  (_swigobj->BraceBadLight(_swigarg0))
-static PyObject *_wrap_wxStyledTextCtrl_BraceBadLight(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_GetFoldParent(_swigobj,_swigarg0)  (_swigobj->GetFoldParent(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_GetFoldParent(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
+    int  _result;
     wxStyledTextCtrl * _arg0;
     int  _arg1;
     PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self","pos", NULL };
+    char *_kwnames[] = { "self","line", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_BraceBadLight",_kwnames,&_argo0,&_arg1)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_GetFoldParent",_kwnames,&_argo0,&_arg1)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_BraceBadLight. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetFoldParent. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        wxStyledTextCtrl_BraceBadLight(_arg0,_arg1);
+        _result = (int )wxStyledTextCtrl_GetFoldParent(_arg0,_arg1);
 
     wxPy_END_ALLOW_THREADS;
-}    Py_INCREF(Py_None);
-    _resultobj = Py_None;
+}    _resultobj = Py_BuildValue("i",_result);
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_BraceMatch(_swigobj,_swigarg0)  (_swigobj->BraceMatch(_swigarg0))
-static PyObject *_wrap_wxStyledTextCtrl_BraceMatch(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_ShowLines(_swigobj,_swigarg0,_swigarg1)  (_swigobj->ShowLines(_swigarg0,_swigarg1))
+static PyObject *_wrap_wxStyledTextCtrl_ShowLines(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
-    int  _result;
     wxStyledTextCtrl * _arg0;
     int  _arg1;
+    int  _arg2;
     PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self","pos", NULL };
+    char *_kwnames[] = { "self","lineStart","lineEnd", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_BraceMatch",_kwnames,&_argo0,&_arg1)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oii:wxStyledTextCtrl_ShowLines",_kwnames,&_argo0,&_arg1,&_arg2)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_BraceMatch. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_ShowLines. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        _result = (int )wxStyledTextCtrl_BraceMatch(_arg0,_arg1);
+        wxStyledTextCtrl_ShowLines(_arg0,_arg1,_arg2);
 
     wxPy_END_ALLOW_THREADS;
-}    _resultobj = Py_BuildValue("i",_result);
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_GetViewEOL(_swigobj)  (_swigobj->GetViewEOL())
-static PyObject *_wrap_wxStyledTextCtrl_GetViewEOL(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_HideLines(_swigobj,_swigarg0,_swigarg1)  (_swigobj->HideLines(_swigarg0,_swigarg1))
+static PyObject *_wrap_wxStyledTextCtrl_HideLines(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
-    bool  _result;
     wxStyledTextCtrl * _arg0;
+    int  _arg1;
+    int  _arg2;
     PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self", NULL };
+    char *_kwnames[] = { "self","lineStart","lineEnd", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_GetViewEOL",_kwnames,&_argo0)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oii:wxStyledTextCtrl_HideLines",_kwnames,&_argo0,&_arg1,&_arg2)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetViewEOL. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_HideLines. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        _result = (bool )wxStyledTextCtrl_GetViewEOL(_arg0);
+        wxStyledTextCtrl_HideLines(_arg0,_arg1,_arg2);
 
     wxPy_END_ALLOW_THREADS;
-}    _resultobj = Py_BuildValue("i",_result);
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_SetViewEOL(_swigobj,_swigarg0)  (_swigobj->SetViewEOL(_swigarg0))
-static PyObject *_wrap_wxStyledTextCtrl_SetViewEOL(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_GetLineVisible(_swigobj,_swigarg0)  (_swigobj->GetLineVisible(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_GetLineVisible(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
+    bool  _result;
     wxStyledTextCtrl * _arg0;
-    bool  _arg1;
+    int  _arg1;
     PyObject * _argo0 = 0;
-    int tempbool1;
-    char *_kwnames[] = { "self","visible", NULL };
+    char *_kwnames[] = { "self","line", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_SetViewEOL",_kwnames,&_argo0,&tempbool1)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_GetLineVisible",_kwnames,&_argo0,&_arg1)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetViewEOL. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetLineVisible. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
-    _arg1 = (bool ) tempbool1;
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        wxStyledTextCtrl_SetViewEOL(_arg0,_arg1);
+        _result = (bool )wxStyledTextCtrl_GetLineVisible(_arg0,_arg1);
 
     wxPy_END_ALLOW_THREADS;
-}    Py_INCREF(Py_None);
-    _resultobj = Py_None;
+}    _resultobj = Py_BuildValue("i",_result);
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_GetDocPointer(_swigobj)  (_swigobj->GetDocPointer())
-static PyObject *_wrap_wxStyledTextCtrl_GetDocPointer(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_SetFoldExpanded(_swigobj,_swigarg0,_swigarg1)  (_swigobj->SetFoldExpanded(_swigarg0,_swigarg1))
+static PyObject *_wrap_wxStyledTextCtrl_SetFoldExpanded(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
-    void * _result;
     wxStyledTextCtrl * _arg0;
+    int  _arg1;
+    bool  _arg2;
     PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self", NULL };
-    char _ptemp[128];
+    int tempbool2;
+    char *_kwnames[] = { "self","line","expanded", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_GetDocPointer",_kwnames,&_argo0)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oii:wxStyledTextCtrl_SetFoldExpanded",_kwnames,&_argo0,&_arg1,&tempbool2)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetDocPointer. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetFoldExpanded. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
+    _arg2 = (bool ) tempbool2;
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        _result = (void *)wxStyledTextCtrl_GetDocPointer(_arg0);
+        wxStyledTextCtrl_SetFoldExpanded(_arg0,_arg1,_arg2);
 
     wxPy_END_ALLOW_THREADS;
-}    if (_result) {
-        SWIG_MakePtr(_ptemp, (char *) _result,"_void_p");
-        _resultobj = Py_BuildValue("s",_ptemp);
-    } else {
-        Py_INCREF(Py_None);
-        _resultobj = Py_None;
-    }
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_SetDocPointer(_swigobj,_swigarg0)  (_swigobj->SetDocPointer(_swigarg0))
-static PyObject *_wrap_wxStyledTextCtrl_SetDocPointer(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_GetFoldExpanded(_swigobj,_swigarg0)  (_swigobj->GetFoldExpanded(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_GetFoldExpanded(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
+    bool  _result;
     wxStyledTextCtrl * _arg0;
-    void * _arg1;
+    int  _arg1;
     PyObject * _argo0 = 0;
-    PyObject * _argo1 = 0;
-    char *_kwnames[] = { "self","docPointer", NULL };
+    char *_kwnames[] = { "self","line", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxStyledTextCtrl_SetDocPointer",_kwnames,&_argo0,&_argo1)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_GetFoldExpanded",_kwnames,&_argo0,&_arg1)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetDocPointer. Expected _wxStyledTextCtrl_p.");
-        return NULL;
-        }
-    }
-    if (_argo1) {
-        if (_argo1 == Py_None) { _arg1 = NULL; }
-        else if (SWIG_GetPtrObj(_argo1,(void **) &_arg1,(char *) 0 )) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 2 of wxStyledTextCtrl_SetDocPointer. Expected _void_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetFoldExpanded. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        wxStyledTextCtrl_SetDocPointer(_arg0,_arg1);
+        _result = (bool )wxStyledTextCtrl_GetFoldExpanded(_arg0,_arg1);
 
     wxPy_END_ALLOW_THREADS;
-}    Py_INCREF(Py_None);
-    _resultobj = Py_None;
+}    _resultobj = Py_BuildValue("i",_result);
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_SetModEventMask(_swigobj,_swigarg0)  (_swigobj->SetModEventMask(_swigarg0))
+#define wxStyledTextCtrl_ToggleFold(_swigobj,_swigarg0)  (_swigobj->ToggleFold(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_ToggleFold(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextCtrl * _arg0;
+    int  _arg1;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self","line", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_ToggleFold",_kwnames,&_argo0,&_arg1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_ToggleFold. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextCtrl_ToggleFold(_arg0,_arg1);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_EnsureVisible(_swigobj,_swigarg0)  (_swigobj->EnsureVisible(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_EnsureVisible(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextCtrl * _arg0;
+    int  _arg1;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self","line", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_EnsureVisible",_kwnames,&_argo0,&_arg1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_EnsureVisible. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextCtrl_EnsureVisible(_arg0,_arg1);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_SetFoldFlags(_swigobj,_swigarg0)  (_swigobj->SetFoldFlags(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_SetFoldFlags(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextCtrl * _arg0;
+    int  _arg1;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self","flags", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_SetFoldFlags",_kwnames,&_argo0,&_arg1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetFoldFlags. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextCtrl_SetFoldFlags(_arg0,_arg1);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_EnsureVisibleEnforcePolicy(_swigobj,_swigarg0)  (_swigobj->EnsureVisibleEnforcePolicy(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_EnsureVisibleEnforcePolicy(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextCtrl * _arg0;
+    int  _arg1;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self","line", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_EnsureVisibleEnforcePolicy",_kwnames,&_argo0,&_arg1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_EnsureVisibleEnforcePolicy. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextCtrl_EnsureVisibleEnforcePolicy(_arg0,_arg1);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_SetTabIndents(_swigobj,_swigarg0)  (_swigobj->SetTabIndents(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_SetTabIndents(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextCtrl * _arg0;
+    bool  _arg1;
+    PyObject * _argo0 = 0;
+    int tempbool1;
+    char *_kwnames[] = { "self","tabIndents", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_SetTabIndents",_kwnames,&_argo0,&tempbool1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetTabIndents. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+    _arg1 = (bool ) tempbool1;
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextCtrl_SetTabIndents(_arg0,_arg1);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_GetTabIndents(_swigobj)  (_swigobj->GetTabIndents())
+static PyObject *_wrap_wxStyledTextCtrl_GetTabIndents(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    bool  _result;
+    wxStyledTextCtrl * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_GetTabIndents",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetTabIndents. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        _result = (bool )wxStyledTextCtrl_GetTabIndents(_arg0);
+
+    wxPy_END_ALLOW_THREADS;
+}    _resultobj = Py_BuildValue("i",_result);
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_SetBackSpaceUnIndents(_swigobj,_swigarg0)  (_swigobj->SetBackSpaceUnIndents(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_SetBackSpaceUnIndents(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextCtrl * _arg0;
+    bool  _arg1;
+    PyObject * _argo0 = 0;
+    int tempbool1;
+    char *_kwnames[] = { "self","bsUnIndents", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_SetBackSpaceUnIndents",_kwnames,&_argo0,&tempbool1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetBackSpaceUnIndents. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+    _arg1 = (bool ) tempbool1;
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextCtrl_SetBackSpaceUnIndents(_arg0,_arg1);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_GetBackSpaceUnIndents(_swigobj)  (_swigobj->GetBackSpaceUnIndents())
+static PyObject *_wrap_wxStyledTextCtrl_GetBackSpaceUnIndents(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    bool  _result;
+    wxStyledTextCtrl * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_GetBackSpaceUnIndents",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetBackSpaceUnIndents. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        _result = (bool )wxStyledTextCtrl_GetBackSpaceUnIndents(_arg0);
+
+    wxPy_END_ALLOW_THREADS;
+}    _resultobj = Py_BuildValue("i",_result);
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_SetMouseDwellTime(_swigobj,_swigarg0)  (_swigobj->SetMouseDwellTime(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_SetMouseDwellTime(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextCtrl * _arg0;
+    int  _arg1;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self","periodMilliseconds", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_SetMouseDwellTime",_kwnames,&_argo0,&_arg1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetMouseDwellTime. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextCtrl_SetMouseDwellTime(_arg0,_arg1);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_GetMouseDwellTime(_swigobj)  (_swigobj->GetMouseDwellTime())
+static PyObject *_wrap_wxStyledTextCtrl_GetMouseDwellTime(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    int  _result;
+    wxStyledTextCtrl * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_GetMouseDwellTime",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetMouseDwellTime. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        _result = (int )wxStyledTextCtrl_GetMouseDwellTime(_arg0);
+
+    wxPy_END_ALLOW_THREADS;
+}    _resultobj = Py_BuildValue("i",_result);
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_MoveCaretInsideView(_swigobj)  (_swigobj->MoveCaretInsideView())
+static PyObject *_wrap_wxStyledTextCtrl_MoveCaretInsideView(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextCtrl * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_MoveCaretInsideView",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_MoveCaretInsideView. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextCtrl_MoveCaretInsideView(_arg0);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_LineLength(_swigobj,_swigarg0)  (_swigobj->LineLength(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_LineLength(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    int  _result;
+    wxStyledTextCtrl * _arg0;
+    int  _arg1;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self","line", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_LineLength",_kwnames,&_argo0,&_arg1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_LineLength. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        _result = (int )wxStyledTextCtrl_LineLength(_arg0,_arg1);
+
+    wxPy_END_ALLOW_THREADS;
+}    _resultobj = Py_BuildValue("i",_result);
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_BraceHighlight(_swigobj,_swigarg0,_swigarg1)  (_swigobj->BraceHighlight(_swigarg0,_swigarg1))
+static PyObject *_wrap_wxStyledTextCtrl_BraceHighlight(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextCtrl * _arg0;
+    int  _arg1;
+    int  _arg2;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self","pos1","pos2", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oii:wxStyledTextCtrl_BraceHighlight",_kwnames,&_argo0,&_arg1,&_arg2)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_BraceHighlight. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextCtrl_BraceHighlight(_arg0,_arg1,_arg2);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_BraceBadLight(_swigobj,_swigarg0)  (_swigobj->BraceBadLight(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_BraceBadLight(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextCtrl * _arg0;
+    int  _arg1;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self","pos", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_BraceBadLight",_kwnames,&_argo0,&_arg1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_BraceBadLight. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextCtrl_BraceBadLight(_arg0,_arg1);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_BraceMatch(_swigobj,_swigarg0)  (_swigobj->BraceMatch(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_BraceMatch(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    int  _result;
+    wxStyledTextCtrl * _arg0;
+    int  _arg1;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self","pos", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_BraceMatch",_kwnames,&_argo0,&_arg1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_BraceMatch. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        _result = (int )wxStyledTextCtrl_BraceMatch(_arg0,_arg1);
+
+    wxPy_END_ALLOW_THREADS;
+}    _resultobj = Py_BuildValue("i",_result);
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_GetViewEOL(_swigobj)  (_swigobj->GetViewEOL())
+static PyObject *_wrap_wxStyledTextCtrl_GetViewEOL(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    bool  _result;
+    wxStyledTextCtrl * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_GetViewEOL",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetViewEOL. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        _result = (bool )wxStyledTextCtrl_GetViewEOL(_arg0);
+
+    wxPy_END_ALLOW_THREADS;
+}    _resultobj = Py_BuildValue("i",_result);
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_SetViewEOL(_swigobj,_swigarg0)  (_swigobj->SetViewEOL(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_SetViewEOL(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextCtrl * _arg0;
+    bool  _arg1;
+    PyObject * _argo0 = 0;
+    int tempbool1;
+    char *_kwnames[] = { "self","visible", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_SetViewEOL",_kwnames,&_argo0,&tempbool1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetViewEOL. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+    _arg1 = (bool ) tempbool1;
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextCtrl_SetViewEOL(_arg0,_arg1);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_GetDocPointer(_swigobj)  (_swigobj->GetDocPointer())
+static PyObject *_wrap_wxStyledTextCtrl_GetDocPointer(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    void * _result;
+    wxStyledTextCtrl * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self", NULL };
+    char _ptemp[128];
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_GetDocPointer",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetDocPointer. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        _result = (void *)wxStyledTextCtrl_GetDocPointer(_arg0);
+
+    wxPy_END_ALLOW_THREADS;
+}    if (_result) {
+        SWIG_MakePtr(_ptemp, (char *) _result,"_void_p");
+        _resultobj = Py_BuildValue("s",_ptemp);
+    } else {
+        Py_INCREF(Py_None);
+        _resultobj = Py_None;
+    }
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_SetDocPointer(_swigobj,_swigarg0)  (_swigobj->SetDocPointer(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_SetDocPointer(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextCtrl * _arg0;
+    void * _arg1;
+    PyObject * _argo0 = 0;
+    PyObject * _argo1 = 0;
+    char *_kwnames[] = { "self","docPointer", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxStyledTextCtrl_SetDocPointer",_kwnames,&_argo0,&_argo1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetDocPointer. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+    if (_argo1) {
+        if (_argo1 == Py_None) { _arg1 = NULL; }
+        else if (SWIG_GetPtrObj(_argo1,(void **) &_arg1,(char *) 0 )) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 2 of wxStyledTextCtrl_SetDocPointer. Expected _void_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextCtrl_SetDocPointer(_arg0,_arg1);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_SetModEventMask(_swigobj,_swigarg0)  (_swigobj->SetModEventMask(_swigarg0))
 static PyObject *_wrap_wxStyledTextCtrl_SetModEventMask(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
     wxStyledTextCtrl * _arg0;
     int  _arg1;
     PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self","mask", NULL };
+    char *_kwnames[] = { "self","mask", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_SetModEventMask",_kwnames,&_argo0,&_arg1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetModEventMask. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextCtrl_SetModEventMask(_arg0,_arg1);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_GetEdgeColumn(_swigobj)  (_swigobj->GetEdgeColumn())
+static PyObject *_wrap_wxStyledTextCtrl_GetEdgeColumn(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    int  _result;
+    wxStyledTextCtrl * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_GetEdgeColumn",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetEdgeColumn. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        _result = (int )wxStyledTextCtrl_GetEdgeColumn(_arg0);
+
+    wxPy_END_ALLOW_THREADS;
+}    _resultobj = Py_BuildValue("i",_result);
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_SetEdgeColumn(_swigobj,_swigarg0)  (_swigobj->SetEdgeColumn(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_SetEdgeColumn(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextCtrl * _arg0;
+    int  _arg1;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self","column", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_SetEdgeColumn",_kwnames,&_argo0,&_arg1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetEdgeColumn. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextCtrl_SetEdgeColumn(_arg0,_arg1);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_GetEdgeMode(_swigobj)  (_swigobj->GetEdgeMode())
+static PyObject *_wrap_wxStyledTextCtrl_GetEdgeMode(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    int  _result;
+    wxStyledTextCtrl * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_GetEdgeMode",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetEdgeMode. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        _result = (int )wxStyledTextCtrl_GetEdgeMode(_arg0);
+
+    wxPy_END_ALLOW_THREADS;
+}    _resultobj = Py_BuildValue("i",_result);
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_SetEdgeMode(_swigobj,_swigarg0)  (_swigobj->SetEdgeMode(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_SetEdgeMode(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextCtrl * _arg0;
+    int  _arg1;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self","mode", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_SetEdgeMode",_kwnames,&_argo0,&_arg1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetEdgeMode. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextCtrl_SetEdgeMode(_arg0,_arg1);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_GetEdgeColour(_swigobj)  (_swigobj->GetEdgeColour())
+static PyObject *_wrap_wxStyledTextCtrl_GetEdgeColour(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxColour * _result;
+    wxStyledTextCtrl * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self", NULL };
+    char _ptemp[128];
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_GetEdgeColour",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetEdgeColour. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        _result = new wxColour (wxStyledTextCtrl_GetEdgeColour(_arg0));
+
+    wxPy_END_ALLOW_THREADS;
+}    SWIG_MakePtr(_ptemp, (void *) _result,"_wxColour_p");
+    _resultobj = Py_BuildValue("s",_ptemp);
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_SetEdgeColour(_swigobj,_swigarg0)  (_swigobj->SetEdgeColour(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_SetEdgeColour(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextCtrl * _arg0;
+    wxColour * _arg1;
+    PyObject * _argo0 = 0;
+    wxColour  temp;
+    PyObject * _obj1 = 0;
+    char *_kwnames[] = { "self","edgeColour", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxStyledTextCtrl_SetEdgeColour",_kwnames,&_argo0,&_obj1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetEdgeColour. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    _arg1 = &temp;
+    if (! wxColour_helper(_obj1, &_arg1))
+        return NULL;
+}
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextCtrl_SetEdgeColour(_arg0,*_arg1);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_SearchAnchor(_swigobj)  (_swigobj->SearchAnchor())
+static PyObject *_wrap_wxStyledTextCtrl_SearchAnchor(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextCtrl * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_SearchAnchor",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SearchAnchor. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextCtrl_SearchAnchor(_arg0);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_SearchNext(_swigobj,_swigarg0,_swigarg1)  (_swigobj->SearchNext(_swigarg0,_swigarg1))
+static PyObject *_wrap_wxStyledTextCtrl_SearchNext(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    int  _result;
+    wxStyledTextCtrl * _arg0;
+    int  _arg1;
+    wxString * _arg2;
+    PyObject * _argo0 = 0;
+    PyObject * _obj2 = 0;
+    char *_kwnames[] = { "self","flags","text", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OiO:wxStyledTextCtrl_SearchNext",_kwnames,&_argo0,&_arg1,&_obj2)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SearchNext. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+#if PYTHON_API_VERSION >= 1009
+    char* tmpPtr; int tmpSize;
+    if (!PyString_Check(_obj2) && !PyUnicode_Check(_obj2)) {
+        PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
+        return NULL;
+    }
+    if (PyString_AsStringAndSize(_obj2, &tmpPtr, &tmpSize) == -1)
+        return NULL;
+    _arg2 = new wxString(tmpPtr, tmpSize);
+#else
+    if (!PyString_Check(_obj2)) {
+        PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
+        return NULL;
+    }
+    _arg2 = new wxString(PyString_AS_STRING(_obj2), PyString_GET_SIZE(_obj2));
+#endif
+}
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        _result = (int )wxStyledTextCtrl_SearchNext(_arg0,_arg1,*_arg2);
+
+    wxPy_END_ALLOW_THREADS;
+}    _resultobj = Py_BuildValue("i",_result);
+{
+    if (_obj2)
+        delete _arg2;
+}
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_SearchPrev(_swigobj,_swigarg0,_swigarg1)  (_swigobj->SearchPrev(_swigarg0,_swigarg1))
+static PyObject *_wrap_wxStyledTextCtrl_SearchPrev(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    int  _result;
+    wxStyledTextCtrl * _arg0;
+    int  _arg1;
+    wxString * _arg2;
+    PyObject * _argo0 = 0;
+    PyObject * _obj2 = 0;
+    char *_kwnames[] = { "self","flags","text", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_SetModEventMask",_kwnames,&_argo0,&_arg1)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OiO:wxStyledTextCtrl_SearchPrev",_kwnames,&_argo0,&_arg1,&_obj2)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetModEventMask. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SearchPrev. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+#if PYTHON_API_VERSION >= 1009
+    char* tmpPtr; int tmpSize;
+    if (!PyString_Check(_obj2) && !PyUnicode_Check(_obj2)) {
+        PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
+        return NULL;
+    }
+    if (PyString_AsStringAndSize(_obj2, &tmpPtr, &tmpSize) == -1)
+        return NULL;
+    _arg2 = new wxString(tmpPtr, tmpSize);
+#else
+    if (!PyString_Check(_obj2)) {
+        PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
+        return NULL;
+    }
+    _arg2 = new wxString(PyString_AS_STRING(_obj2), PyString_GET_SIZE(_obj2));
+#endif
+}
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        _result = (int )wxStyledTextCtrl_SearchPrev(_arg0,_arg1,*_arg2);
+
+    wxPy_END_ALLOW_THREADS;
+}    _resultobj = Py_BuildValue("i",_result);
+{
+    if (_obj2)
+        delete _arg2;
+}
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_SetCaretPolicy(_swigobj,_swigarg0,_swigarg1)  (_swigobj->SetCaretPolicy(_swigarg0,_swigarg1))
+static PyObject *_wrap_wxStyledTextCtrl_SetCaretPolicy(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextCtrl * _arg0;
+    int  _arg1;
+    int  _arg2;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self","caretPolicy","caretSlop", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oii:wxStyledTextCtrl_SetCaretPolicy",_kwnames,&_argo0,&_arg1,&_arg2)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetCaretPolicy. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextCtrl_SetCaretPolicy(_arg0,_arg1,_arg2);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_LinesOnScreen(_swigobj)  (_swigobj->LinesOnScreen())
+static PyObject *_wrap_wxStyledTextCtrl_LinesOnScreen(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    int  _result;
+    wxStyledTextCtrl * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_LinesOnScreen",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_LinesOnScreen. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        _result = (int )wxStyledTextCtrl_LinesOnScreen(_arg0);
+
+    wxPy_END_ALLOW_THREADS;
+}    _resultobj = Py_BuildValue("i",_result);
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_UsePopUp(_swigobj,_swigarg0)  (_swigobj->UsePopUp(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_UsePopUp(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextCtrl * _arg0;
+    bool  _arg1;
+    PyObject * _argo0 = 0;
+    int tempbool1;
+    char *_kwnames[] = { "self","allowPopUp", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_UsePopUp",_kwnames,&_argo0,&tempbool1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_UsePopUp. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+    _arg1 = (bool ) tempbool1;
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextCtrl_UsePopUp(_arg0,_arg1);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_SelectionIsRectangle(_swigobj)  (_swigobj->SelectionIsRectangle())
+static PyObject *_wrap_wxStyledTextCtrl_SelectionIsRectangle(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    bool  _result;
+    wxStyledTextCtrl * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_SelectionIsRectangle",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SelectionIsRectangle. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        _result = (bool )wxStyledTextCtrl_SelectionIsRectangle(_arg0);
+
+    wxPy_END_ALLOW_THREADS;
+}    _resultobj = Py_BuildValue("i",_result);
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_SetZoom(_swigobj,_swigarg0)  (_swigobj->SetZoom(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_SetZoom(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextCtrl * _arg0;
+    int  _arg1;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self","zoom", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_SetZoom",_kwnames,&_argo0,&_arg1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetZoom. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextCtrl_SetZoom(_arg0,_arg1);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_GetZoom(_swigobj)  (_swigobj->GetZoom())
+static PyObject *_wrap_wxStyledTextCtrl_GetZoom(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    int  _result;
+    wxStyledTextCtrl * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_GetZoom",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetZoom. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        _result = (int )wxStyledTextCtrl_GetZoom(_arg0);
+
+    wxPy_END_ALLOW_THREADS;
+}    _resultobj = Py_BuildValue("i",_result);
+    return _resultobj;
+}
+
+#define wxStyledTextCtrl_CreateDocument(_swigobj)  (_swigobj->CreateDocument())
+static PyObject *_wrap_wxStyledTextCtrl_CreateDocument(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    void * _result;
+    wxStyledTextCtrl * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self", NULL };
+    char _ptemp[128];
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_CreateDocument",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_CreateDocument. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        wxStyledTextCtrl_SetModEventMask(_arg0,_arg1);
+        _result = (void *)wxStyledTextCtrl_CreateDocument(_arg0);
 
     wxPy_END_ALLOW_THREADS;
-}    Py_INCREF(Py_None);
-    _resultobj = Py_None;
+}    if (_result) {
+        SWIG_MakePtr(_ptemp, (char *) _result,"_void_p");
+        _resultobj = Py_BuildValue("s",_ptemp);
+    } else {
+        Py_INCREF(Py_None);
+        _resultobj = Py_None;
+    }
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_GetEdgeColumn(_swigobj)  (_swigobj->GetEdgeColumn())
-static PyObject *_wrap_wxStyledTextCtrl_GetEdgeColumn(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_AddRefDocument(_swigobj,_swigarg0)  (_swigobj->AddRefDocument(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_AddRefDocument(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
-    int  _result;
     wxStyledTextCtrl * _arg0;
+    void * _arg1;
     PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self", NULL };
+    PyObject * _argo1 = 0;
+    char *_kwnames[] = { "self","docPointer", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_GetEdgeColumn",_kwnames,&_argo0)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxStyledTextCtrl_AddRefDocument",_kwnames,&_argo0,&_argo1)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetEdgeColumn. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_AddRefDocument. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+    if (_argo1) {
+        if (_argo1 == Py_None) { _arg1 = NULL; }
+        else if (SWIG_GetPtrObj(_argo1,(void **) &_arg1,(char *) 0 )) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 2 of wxStyledTextCtrl_AddRefDocument. Expected _void_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        _result = (int )wxStyledTextCtrl_GetEdgeColumn(_arg0);
+        wxStyledTextCtrl_AddRefDocument(_arg0,_arg1);
 
     wxPy_END_ALLOW_THREADS;
-}    _resultobj = Py_BuildValue("i",_result);
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_SetEdgeColumn(_swigobj,_swigarg0)  (_swigobj->SetEdgeColumn(_swigarg0))
-static PyObject *_wrap_wxStyledTextCtrl_SetEdgeColumn(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_ReleaseDocument(_swigobj,_swigarg0)  (_swigobj->ReleaseDocument(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_ReleaseDocument(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
     wxStyledTextCtrl * _arg0;
-    int  _arg1;
+    void * _arg1;
     PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self","column", NULL };
+    PyObject * _argo1 = 0;
+    char *_kwnames[] = { "self","docPointer", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_SetEdgeColumn",_kwnames,&_argo0,&_arg1)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxStyledTextCtrl_ReleaseDocument",_kwnames,&_argo0,&_argo1)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetEdgeColumn. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_ReleaseDocument. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+    if (_argo1) {
+        if (_argo1 == Py_None) { _arg1 = NULL; }
+        else if (SWIG_GetPtrObj(_argo1,(void **) &_arg1,(char *) 0 )) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 2 of wxStyledTextCtrl_ReleaseDocument. Expected _void_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        wxStyledTextCtrl_SetEdgeColumn(_arg0,_arg1);
+        wxStyledTextCtrl_ReleaseDocument(_arg0,_arg1);
 
     wxPy_END_ALLOW_THREADS;
 }    Py_INCREF(Py_None);
@@ -6095,8 +7505,8 @@ static PyObject *_wrap_wxStyledTextCtrl_SetEdgeColumn(PyObject *self, PyObject *
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_GetEdgeMode(_swigobj)  (_swigobj->GetEdgeMode())
-static PyObject *_wrap_wxStyledTextCtrl_GetEdgeMode(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_GetModEventMask(_swigobj)  (_swigobj->GetModEventMask())
+static PyObject *_wrap_wxStyledTextCtrl_GetModEventMask(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
     int  _result;
     wxStyledTextCtrl * _arg0;
@@ -6104,45 +7514,47 @@ static PyObject *_wrap_wxStyledTextCtrl_GetEdgeMode(PyObject *self, PyObject *ar
     char *_kwnames[] = { "self", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_GetEdgeMode",_kwnames,&_argo0)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_GetModEventMask",_kwnames,&_argo0)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetEdgeMode. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetModEventMask. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        _result = (int )wxStyledTextCtrl_GetEdgeMode(_arg0);
+        _result = (int )wxStyledTextCtrl_GetModEventMask(_arg0);
 
     wxPy_END_ALLOW_THREADS;
 }    _resultobj = Py_BuildValue("i",_result);
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_SetEdgeMode(_swigobj,_swigarg0)  (_swigobj->SetEdgeMode(_swigarg0))
-static PyObject *_wrap_wxStyledTextCtrl_SetEdgeMode(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_SetFocus(_swigobj,_swigarg0)  (_swigobj->SetFocus(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_SetFocus(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
     wxStyledTextCtrl * _arg0;
-    int  _arg1;
+    bool  _arg1;
     PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self","mode", NULL };
+    int tempbool1;
+    char *_kwnames[] = { "self","focus", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_SetEdgeMode",_kwnames,&_argo0,&_arg1)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_SetFocus",_kwnames,&_argo0,&tempbool1)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetEdgeMode. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetFocus. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
+    _arg1 = (bool ) tempbool1;
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        wxStyledTextCtrl_SetEdgeMode(_arg0,_arg1);
+        wxStyledTextCtrl_SetFocus(_arg0,_arg1);
 
     wxPy_END_ALLOW_THREADS;
 }    Py_INCREF(Py_None);
@@ -6150,63 +7562,54 @@ static PyObject *_wrap_wxStyledTextCtrl_SetEdgeMode(PyObject *self, PyObject *ar
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_GetEdgeColour(_swigobj)  (_swigobj->GetEdgeColour())
-static PyObject *_wrap_wxStyledTextCtrl_GetEdgeColour(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_GetFocus(_swigobj)  (_swigobj->GetFocus())
+static PyObject *_wrap_wxStyledTextCtrl_GetFocus(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
-    wxColour * _result;
+    bool  _result;
     wxStyledTextCtrl * _arg0;
     PyObject * _argo0 = 0;
     char *_kwnames[] = { "self", NULL };
-    char _ptemp[128];
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_GetEdgeColour",_kwnames,&_argo0)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_GetFocus",_kwnames,&_argo0)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetEdgeColour. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetFocus. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        _result = new wxColour (wxStyledTextCtrl_GetEdgeColour(_arg0));
+        _result = (bool )wxStyledTextCtrl_GetFocus(_arg0);
 
     wxPy_END_ALLOW_THREADS;
-}    SWIG_MakePtr(_ptemp, (void *) _result,"_wxColour_p");
-    _resultobj = Py_BuildValue("s",_ptemp);
+}    _resultobj = Py_BuildValue("i",_result);
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_SetEdgeColour(_swigobj,_swigarg0)  (_swigobj->SetEdgeColour(_swigarg0))
-static PyObject *_wrap_wxStyledTextCtrl_SetEdgeColour(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_SetStatus(_swigobj,_swigarg0)  (_swigobj->SetStatus(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_SetStatus(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
     wxStyledTextCtrl * _arg0;
-    wxColour * _arg1;
+    int  _arg1;
     PyObject * _argo0 = 0;
-    wxColour  temp;
-    PyObject * _obj1 = 0;
-    char *_kwnames[] = { "self","edgeColour", NULL };
+    char *_kwnames[] = { "self","statusCode", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxStyledTextCtrl_SetEdgeColour",_kwnames,&_argo0,&_obj1)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_SetStatus",_kwnames,&_argo0,&_arg1)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetEdgeColour. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetStatus. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
-{
-    _arg1 = &temp;
-    if (! wxColour_helper(_obj1, &_arg1))
-        return NULL;
-}
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        wxStyledTextCtrl_SetEdgeColour(_arg0,*_arg1);
+        wxStyledTextCtrl_SetStatus(_arg0,_arg1);
 
     wxPy_END_ALLOW_THREADS;
 }    Py_INCREF(Py_None);
@@ -6214,159 +7617,111 @@ static PyObject *_wrap_wxStyledTextCtrl_SetEdgeColour(PyObject *self, PyObject *
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_SearchAnchor(_swigobj)  (_swigobj->SearchAnchor())
-static PyObject *_wrap_wxStyledTextCtrl_SearchAnchor(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_GetStatus(_swigobj)  (_swigobj->GetStatus())
+static PyObject *_wrap_wxStyledTextCtrl_GetStatus(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
+    int  _result;
     wxStyledTextCtrl * _arg0;
     PyObject * _argo0 = 0;
     char *_kwnames[] = { "self", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_SearchAnchor",_kwnames,&_argo0)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_GetStatus",_kwnames,&_argo0)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SearchAnchor. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetStatus. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        wxStyledTextCtrl_SearchAnchor(_arg0);
+        _result = (int )wxStyledTextCtrl_GetStatus(_arg0);
 
     wxPy_END_ALLOW_THREADS;
-}    Py_INCREF(Py_None);
-    _resultobj = Py_None;
+}    _resultobj = Py_BuildValue("i",_result);
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_SearchNext(_swigobj,_swigarg0,_swigarg1)  (_swigobj->SearchNext(_swigarg0,_swigarg1))
-static PyObject *_wrap_wxStyledTextCtrl_SearchNext(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_SetMouseDownCaptures(_swigobj,_swigarg0)  (_swigobj->SetMouseDownCaptures(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_SetMouseDownCaptures(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
-    int  _result;
     wxStyledTextCtrl * _arg0;
-    int  _arg1;
-    wxString * _arg2;
+    bool  _arg1;
     PyObject * _argo0 = 0;
-    PyObject * _obj2 = 0;
-    char *_kwnames[] = { "self","flags","text", NULL };
+    int tempbool1;
+    char *_kwnames[] = { "self","captures", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OiO:wxStyledTextCtrl_SearchNext",_kwnames,&_argo0,&_arg1,&_obj2)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_SetMouseDownCaptures",_kwnames,&_argo0,&tempbool1)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SearchNext. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetMouseDownCaptures. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
-{
-#if PYTHON_API_VERSION >= 1009
-    char* tmpPtr; int tmpSize;
-    if (!PyString_Check(_obj2) && !PyUnicode_Check(_obj2)) {
-        PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
-        return NULL;
-    }
-    if (PyString_AsStringAndSize(_obj2, &tmpPtr, &tmpSize) == -1)
-        return NULL;
-    _arg2 = new wxString(tmpPtr, tmpSize);
-#else
-    if (!PyString_Check(_obj2)) {
-        PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
-        return NULL;
-    }
-    _arg2 = new wxString(PyString_AS_STRING(_obj2), PyString_GET_SIZE(_obj2));
-#endif
-}
+    _arg1 = (bool ) tempbool1;
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        _result = (int )wxStyledTextCtrl_SearchNext(_arg0,_arg1,*_arg2);
+        wxStyledTextCtrl_SetMouseDownCaptures(_arg0,_arg1);
 
     wxPy_END_ALLOW_THREADS;
-}    _resultobj = Py_BuildValue("i",_result);
-{
-    if (_obj2)
-        delete _arg2;
-}
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_SearchPrev(_swigobj,_swigarg0,_swigarg1)  (_swigobj->SearchPrev(_swigarg0,_swigarg1))
-static PyObject *_wrap_wxStyledTextCtrl_SearchPrev(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_GetMouseDownCaptures(_swigobj)  (_swigobj->GetMouseDownCaptures())
+static PyObject *_wrap_wxStyledTextCtrl_GetMouseDownCaptures(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
-    int  _result;
+    bool  _result;
     wxStyledTextCtrl * _arg0;
-    int  _arg1;
-    wxString * _arg2;
     PyObject * _argo0 = 0;
-    PyObject * _obj2 = 0;
-    char *_kwnames[] = { "self","flags","text", NULL };
+    char *_kwnames[] = { "self", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OiO:wxStyledTextCtrl_SearchPrev",_kwnames,&_argo0,&_arg1,&_obj2)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_GetMouseDownCaptures",_kwnames,&_argo0)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SearchPrev. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetMouseDownCaptures. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
-{
-#if PYTHON_API_VERSION >= 1009
-    char* tmpPtr; int tmpSize;
-    if (!PyString_Check(_obj2) && !PyUnicode_Check(_obj2)) {
-        PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
-        return NULL;
-    }
-    if (PyString_AsStringAndSize(_obj2, &tmpPtr, &tmpSize) == -1)
-        return NULL;
-    _arg2 = new wxString(tmpPtr, tmpSize);
-#else
-    if (!PyString_Check(_obj2)) {
-        PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
-        return NULL;
-    }
-    _arg2 = new wxString(PyString_AS_STRING(_obj2), PyString_GET_SIZE(_obj2));
-#endif
-}
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        _result = (int )wxStyledTextCtrl_SearchPrev(_arg0,_arg1,*_arg2);
+        _result = (bool )wxStyledTextCtrl_GetMouseDownCaptures(_arg0);
 
     wxPy_END_ALLOW_THREADS;
 }    _resultobj = Py_BuildValue("i",_result);
-{
-    if (_obj2)
-        delete _arg2;
-}
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_SetCaretPolicy(_swigobj,_swigarg0,_swigarg1)  (_swigobj->SetCaretPolicy(_swigarg0,_swigarg1))
-static PyObject *_wrap_wxStyledTextCtrl_SetCaretPolicy(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_SetCursor(_swigobj,_swigarg0)  (_swigobj->SetCursor(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_SetCursor(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
     wxStyledTextCtrl * _arg0;
     int  _arg1;
-    int  _arg2;
     PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self","caretPolicy","caretSlop", NULL };
+    char *_kwnames[] = { "self","cursorType", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oii:wxStyledTextCtrl_SetCaretPolicy",_kwnames,&_argo0,&_arg1,&_arg2)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_SetCursor",_kwnames,&_argo0,&_arg1)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetCaretPolicy. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetCursor. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        wxStyledTextCtrl_SetCaretPolicy(_arg0,_arg1,_arg2);
+        wxStyledTextCtrl_SetCursor(_arg0,_arg1);
 
     wxPy_END_ALLOW_THREADS;
 }    Py_INCREF(Py_None);
@@ -6374,8 +7729,8 @@ static PyObject *_wrap_wxStyledTextCtrl_SetCaretPolicy(PyObject *self, PyObject
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_LinesOnScreen(_swigobj)  (_swigobj->LinesOnScreen())
-static PyObject *_wrap_wxStyledTextCtrl_LinesOnScreen(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_GetCursor(_swigobj)  (_swigobj->GetCursor())
+static PyObject *_wrap_wxStyledTextCtrl_GetCursor(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
     int  _result;
     wxStyledTextCtrl * _arg0;
@@ -6383,47 +7738,44 @@ static PyObject *_wrap_wxStyledTextCtrl_LinesOnScreen(PyObject *self, PyObject *
     char *_kwnames[] = { "self", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_LinesOnScreen",_kwnames,&_argo0)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_GetCursor",_kwnames,&_argo0)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_LinesOnScreen. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetCursor. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        _result = (int )wxStyledTextCtrl_LinesOnScreen(_arg0);
+        _result = (int )wxStyledTextCtrl_GetCursor(_arg0);
 
     wxPy_END_ALLOW_THREADS;
 }    _resultobj = Py_BuildValue("i",_result);
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_UsePopUp(_swigobj,_swigarg0)  (_swigobj->UsePopUp(_swigarg0))
-static PyObject *_wrap_wxStyledTextCtrl_UsePopUp(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_WordPartLeft(_swigobj)  (_swigobj->WordPartLeft())
+static PyObject *_wrap_wxStyledTextCtrl_WordPartLeft(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
     wxStyledTextCtrl * _arg0;
-    bool  _arg1;
     PyObject * _argo0 = 0;
-    int tempbool1;
-    char *_kwnames[] = { "self","allowPopUp", NULL };
+    char *_kwnames[] = { "self", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_UsePopUp",_kwnames,&_argo0,&tempbool1)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_WordPartLeft",_kwnames,&_argo0)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_UsePopUp. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_WordPartLeft. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
-    _arg1 = (bool ) tempbool1;
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        wxStyledTextCtrl_UsePopUp(_arg0,_arg1);
+        wxStyledTextCtrl_WordPartLeft(_arg0);
 
     wxPy_END_ALLOW_THREADS;
 }    Py_INCREF(Py_None);
@@ -6431,54 +7783,26 @@ static PyObject *_wrap_wxStyledTextCtrl_UsePopUp(PyObject *self, PyObject *args,
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_SelectionIsRectangle(_swigobj)  (_swigobj->SelectionIsRectangle())
-static PyObject *_wrap_wxStyledTextCtrl_SelectionIsRectangle(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_WordPartLeftExtend(_swigobj)  (_swigobj->WordPartLeftExtend())
+static PyObject *_wrap_wxStyledTextCtrl_WordPartLeftExtend(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
-    bool  _result;
     wxStyledTextCtrl * _arg0;
     PyObject * _argo0 = 0;
     char *_kwnames[] = { "self", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_SelectionIsRectangle",_kwnames,&_argo0)) 
-        return NULL;
-    if (_argo0) {
-        if (_argo0 == Py_None) { _arg0 = NULL; }
-        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SelectionIsRectangle. Expected _wxStyledTextCtrl_p.");
-        return NULL;
-        }
-    }
-{
-    wxPy_BEGIN_ALLOW_THREADS;
-        _result = (bool )wxStyledTextCtrl_SelectionIsRectangle(_arg0);
-
-    wxPy_END_ALLOW_THREADS;
-}    _resultobj = Py_BuildValue("i",_result);
-    return _resultobj;
-}
-
-#define wxStyledTextCtrl_SetZoom(_swigobj,_swigarg0)  (_swigobj->SetZoom(_swigarg0))
-static PyObject *_wrap_wxStyledTextCtrl_SetZoom(PyObject *self, PyObject *args, PyObject *kwargs) {
-    PyObject * _resultobj;
-    wxStyledTextCtrl * _arg0;
-    int  _arg1;
-    PyObject * _argo0 = 0;
-    char *_kwnames[] = { "self","zoom", NULL };
-
-    self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextCtrl_SetZoom",_kwnames,&_argo0,&_arg1)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_WordPartLeftExtend",_kwnames,&_argo0)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetZoom. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_WordPartLeftExtend. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        wxStyledTextCtrl_SetZoom(_arg0,_arg1);
+        wxStyledTextCtrl_WordPartLeftExtend(_arg0);
 
     wxPy_END_ALLOW_THREADS;
 }    Py_INCREF(Py_None);
@@ -6486,96 +7810,82 @@ static PyObject *_wrap_wxStyledTextCtrl_SetZoom(PyObject *self, PyObject *args,
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_GetZoom(_swigobj)  (_swigobj->GetZoom())
-static PyObject *_wrap_wxStyledTextCtrl_GetZoom(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_WordPartRight(_swigobj)  (_swigobj->WordPartRight())
+static PyObject *_wrap_wxStyledTextCtrl_WordPartRight(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
-    int  _result;
     wxStyledTextCtrl * _arg0;
     PyObject * _argo0 = 0;
     char *_kwnames[] = { "self", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_GetZoom",_kwnames,&_argo0)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_WordPartRight",_kwnames,&_argo0)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetZoom. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_WordPartRight. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        _result = (int )wxStyledTextCtrl_GetZoom(_arg0);
+        wxStyledTextCtrl_WordPartRight(_arg0);
 
     wxPy_END_ALLOW_THREADS;
-}    _resultobj = Py_BuildValue("i",_result);
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_CreateDocument(_swigobj)  (_swigobj->CreateDocument())
-static PyObject *_wrap_wxStyledTextCtrl_CreateDocument(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_WordPartRightExtend(_swigobj)  (_swigobj->WordPartRightExtend())
+static PyObject *_wrap_wxStyledTextCtrl_WordPartRightExtend(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
-    void * _result;
     wxStyledTextCtrl * _arg0;
     PyObject * _argo0 = 0;
     char *_kwnames[] = { "self", NULL };
-    char _ptemp[128];
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_CreateDocument",_kwnames,&_argo0)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_WordPartRightExtend",_kwnames,&_argo0)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_CreateDocument. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_WordPartRightExtend. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        _result = (void *)wxStyledTextCtrl_CreateDocument(_arg0);
+        wxStyledTextCtrl_WordPartRightExtend(_arg0);
 
     wxPy_END_ALLOW_THREADS;
-}    if (_result) {
-        SWIG_MakePtr(_ptemp, (char *) _result,"_void_p");
-        _resultobj = Py_BuildValue("s",_ptemp);
-    } else {
-        Py_INCREF(Py_None);
-        _resultobj = Py_None;
-    }
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_AddRefDocument(_swigobj,_swigarg0)  (_swigobj->AddRefDocument(_swigarg0))
-static PyObject *_wrap_wxStyledTextCtrl_AddRefDocument(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_SetVisiblePolicy(_swigobj,_swigarg0,_swigarg1)  (_swigobj->SetVisiblePolicy(_swigarg0,_swigarg1))
+static PyObject *_wrap_wxStyledTextCtrl_SetVisiblePolicy(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
     wxStyledTextCtrl * _arg0;
-    void * _arg1;
+    int  _arg1;
+    int  _arg2;
     PyObject * _argo0 = 0;
-    PyObject * _argo1 = 0;
-    char *_kwnames[] = { "self","docPointer", NULL };
+    char *_kwnames[] = { "self","visiblePolicy","visibleSlop", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxStyledTextCtrl_AddRefDocument",_kwnames,&_argo0,&_argo1)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oii:wxStyledTextCtrl_SetVisiblePolicy",_kwnames,&_argo0,&_arg1,&_arg2)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_AddRefDocument. Expected _wxStyledTextCtrl_p.");
-        return NULL;
-        }
-    }
-    if (_argo1) {
-        if (_argo1 == Py_None) { _arg1 = NULL; }
-        else if (SWIG_GetPtrObj(_argo1,(void **) &_arg1,(char *) 0 )) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 2 of wxStyledTextCtrl_AddRefDocument. Expected _void_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetVisiblePolicy. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        wxStyledTextCtrl_AddRefDocument(_arg0,_arg1);
+        wxStyledTextCtrl_SetVisiblePolicy(_arg0,_arg1,_arg2);
 
     wxPy_END_ALLOW_THREADS;
 }    Py_INCREF(Py_None);
@@ -6583,35 +7893,26 @@ static PyObject *_wrap_wxStyledTextCtrl_AddRefDocument(PyObject *self, PyObject
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_ReleaseDocument(_swigobj,_swigarg0)  (_swigobj->ReleaseDocument(_swigarg0))
-static PyObject *_wrap_wxStyledTextCtrl_ReleaseDocument(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_DelLineLeft(_swigobj)  (_swigobj->DelLineLeft())
+static PyObject *_wrap_wxStyledTextCtrl_DelLineLeft(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
     wxStyledTextCtrl * _arg0;
-    void * _arg1;
     PyObject * _argo0 = 0;
-    PyObject * _argo1 = 0;
-    char *_kwnames[] = { "self","docPointer", NULL };
+    char *_kwnames[] = { "self", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxStyledTextCtrl_ReleaseDocument",_kwnames,&_argo0,&_argo1)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_DelLineLeft",_kwnames,&_argo0)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_ReleaseDocument. Expected _wxStyledTextCtrl_p.");
-        return NULL;
-        }
-    }
-    if (_argo1) {
-        if (_argo1 == Py_None) { _arg1 = NULL; }
-        else if (SWIG_GetPtrObj(_argo1,(void **) &_arg1,(char *) 0 )) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 2 of wxStyledTextCtrl_ReleaseDocument. Expected _void_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_DelLineLeft. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        wxStyledTextCtrl_ReleaseDocument(_arg0,_arg1);
+        wxStyledTextCtrl_DelLineLeft(_arg0);
 
     wxPy_END_ALLOW_THREADS;
 }    Py_INCREF(Py_None);
@@ -6619,30 +7920,30 @@ static PyObject *_wrap_wxStyledTextCtrl_ReleaseDocument(PyObject *self, PyObject
     return _resultobj;
 }
 
-#define wxStyledTextCtrl_GetModEventMask(_swigobj)  (_swigobj->GetModEventMask())
-static PyObject *_wrap_wxStyledTextCtrl_GetModEventMask(PyObject *self, PyObject *args, PyObject *kwargs) {
+#define wxStyledTextCtrl_DelLineRight(_swigobj)  (_swigobj->DelLineRight())
+static PyObject *_wrap_wxStyledTextCtrl_DelLineRight(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
-    int  _result;
     wxStyledTextCtrl * _arg0;
     PyObject * _argo0 = 0;
     char *_kwnames[] = { "self", NULL };
 
     self = self;
-    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_GetModEventMask",_kwnames,&_argo0)) 
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_DelLineRight",_kwnames,&_argo0)) 
         return NULL;
     if (_argo0) {
         if (_argo0 == Py_None) { _arg0 = NULL; }
         else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
-            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_GetModEventMask. Expected _wxStyledTextCtrl_p.");
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_DelLineRight. Expected _wxStyledTextCtrl_p.");
         return NULL;
         }
     }
 {
     wxPy_BEGIN_ALLOW_THREADS;
-        _result = (int )wxStyledTextCtrl_GetModEventMask(_arg0);
+        wxStyledTextCtrl_DelLineRight(_arg0);
 
     wxPy_END_ALLOW_THREADS;
-}    _resultobj = Py_BuildValue("i",_result);
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
     return _resultobj;
 }
 
@@ -6911,6 +8212,57 @@ static PyObject *_wrap_wxStyledTextCtrl_SetKeyWords(PyObject *self, PyObject *ar
     return _resultobj;
 }
 
+#define wxStyledTextCtrl_SetLexerLanguage(_swigobj,_swigarg0)  (_swigobj->SetLexerLanguage(_swigarg0))
+static PyObject *_wrap_wxStyledTextCtrl_SetLexerLanguage(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextCtrl * _arg0;
+    wxString * _arg1;
+    PyObject * _argo0 = 0;
+    PyObject * _obj1 = 0;
+    char *_kwnames[] = { "self","language", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxStyledTextCtrl_SetLexerLanguage",_kwnames,&_argo0,&_obj1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SetLexerLanguage. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+#if PYTHON_API_VERSION >= 1009
+    char* tmpPtr; int tmpSize;
+    if (!PyString_Check(_obj1) && !PyUnicode_Check(_obj1)) {
+        PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
+        return NULL;
+    }
+    if (PyString_AsStringAndSize(_obj1, &tmpPtr, &tmpSize) == -1)
+        return NULL;
+    _arg1 = new wxString(tmpPtr, tmpSize);
+#else
+    if (!PyString_Check(_obj1)) {
+        PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
+        return NULL;
+    }
+    _arg1 = new wxString(PyString_AS_STRING(_obj1), PyString_GET_SIZE(_obj1));
+#endif
+}
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextCtrl_SetLexerLanguage(_arg0,*_arg1);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+{
+    if (_obj1)
+        delete _arg1;
+}
+    return _resultobj;
+}
+
 #define wxStyledTextCtrl_GetCurrentLine(_swigobj)  (_swigobj->GetCurrentLine())
 static PyObject *_wrap_wxStyledTextCtrl_GetCurrentLine(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
@@ -7279,6 +8631,36 @@ static PyObject *_wrap_wxStyledTextCtrl_ScrollToColumn(PyObject *self, PyObject
     return _resultobj;
 }
 
+#define wxStyledTextCtrl_SendMsg(_swigobj,_swigarg0,_swigarg1,_swigarg2)  (_swigobj->SendMsg(_swigarg0,_swigarg1,_swigarg2))
+static PyObject *_wrap_wxStyledTextCtrl_SendMsg(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    long  _result;
+    wxStyledTextCtrl * _arg0;
+    int  _arg1;
+    long  _arg2 = (long ) 0;
+    long  _arg3 = (long ) 0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self","msg","wp","lp", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi|ll:wxStyledTextCtrl_SendMsg",_kwnames,&_argo0,&_arg1,&_arg2,&_arg3)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_SendMsg. Expected _wxStyledTextCtrl_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        _result = (long )wxStyledTextCtrl_SendMsg(_arg0,_arg1,_arg2,_arg3);
+
+    wxPy_END_ALLOW_THREADS;
+}    _resultobj = Py_BuildValue("l",_result);
+    return _resultobj;
+}
+
 static void *SwigwxStyledTextEventTowxCommandEvent(void *ptr) {
     wxStyledTextEvent *src;
     wxCommandEvent *dest;
@@ -7749,6 +9131,90 @@ static PyObject *_wrap_wxStyledTextEvent_SetLParam(PyObject *self, PyObject *arg
     return _resultobj;
 }
 
+#define wxStyledTextEvent_SetListType(_swigobj,_swigarg0)  (_swigobj->SetListType(_swigarg0))
+static PyObject *_wrap_wxStyledTextEvent_SetListType(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextEvent * _arg0;
+    int  _arg1;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self","val", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextEvent_SetListType",_kwnames,&_argo0,&_arg1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextEvent_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextEvent_SetListType. Expected _wxStyledTextEvent_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextEvent_SetListType(_arg0,_arg1);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+    return _resultobj;
+}
+
+#define wxStyledTextEvent_SetX(_swigobj,_swigarg0)  (_swigobj->SetX(_swigarg0))
+static PyObject *_wrap_wxStyledTextEvent_SetX(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextEvent * _arg0;
+    int  _arg1;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self","val", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextEvent_SetX",_kwnames,&_argo0,&_arg1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextEvent_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextEvent_SetX. Expected _wxStyledTextEvent_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextEvent_SetX(_arg0,_arg1);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+    return _resultobj;
+}
+
+#define wxStyledTextEvent_SetY(_swigobj,_swigarg0)  (_swigobj->SetY(_swigarg0))
+static PyObject *_wrap_wxStyledTextEvent_SetY(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    wxStyledTextEvent * _arg0;
+    int  _arg1;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self","val", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oi:wxStyledTextEvent_SetY",_kwnames,&_argo0,&_arg1)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextEvent_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextEvent_SetY. Expected _wxStyledTextEvent_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        wxStyledTextEvent_SetY(_arg0,_arg1);
+
+    wxPy_END_ALLOW_THREADS;
+}    Py_INCREF(Py_None);
+    _resultobj = Py_None;
+    return _resultobj;
+}
+
 #define wxStyledTextEvent_GetPosition(_swigobj)  (_swigobj->GetPosition())
 static PyObject *_wrap_wxStyledTextEvent_GetPosition(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
@@ -8132,6 +9598,87 @@ static PyObject *_wrap_wxStyledTextEvent_GetLParam(PyObject *self, PyObject *arg
     return _resultobj;
 }
 
+#define wxStyledTextEvent_GetListType(_swigobj)  (_swigobj->GetListType())
+static PyObject *_wrap_wxStyledTextEvent_GetListType(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    int  _result;
+    wxStyledTextEvent * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextEvent_GetListType",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextEvent_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextEvent_GetListType. Expected _wxStyledTextEvent_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        _result = (int )wxStyledTextEvent_GetListType(_arg0);
+
+    wxPy_END_ALLOW_THREADS;
+}    _resultobj = Py_BuildValue("i",_result);
+    return _resultobj;
+}
+
+#define wxStyledTextEvent_GetX(_swigobj)  (_swigobj->GetX())
+static PyObject *_wrap_wxStyledTextEvent_GetX(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    int  _result;
+    wxStyledTextEvent * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextEvent_GetX",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextEvent_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextEvent_GetX. Expected _wxStyledTextEvent_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        _result = (int )wxStyledTextEvent_GetX(_arg0);
+
+    wxPy_END_ALLOW_THREADS;
+}    _resultobj = Py_BuildValue("i",_result);
+    return _resultobj;
+}
+
+#define wxStyledTextEvent_GetY(_swigobj)  (_swigobj->GetY())
+static PyObject *_wrap_wxStyledTextEvent_GetY(PyObject *self, PyObject *args, PyObject *kwargs) {
+    PyObject * _resultobj;
+    int  _result;
+    wxStyledTextEvent * _arg0;
+    PyObject * _argo0 = 0;
+    char *_kwnames[] = { "self", NULL };
+
+    self = self;
+    if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextEvent_GetY",_kwnames,&_argo0)) 
+        return NULL;
+    if (_argo0) {
+        if (_argo0 == Py_None) { _arg0 = NULL; }
+        else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextEvent_p")) {
+            PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextEvent_GetY. Expected _wxStyledTextEvent_p.");
+        return NULL;
+        }
+    }
+{
+    wxPy_BEGIN_ALLOW_THREADS;
+        _result = (int )wxStyledTextEvent_GetY(_arg0);
+
+    wxPy_END_ALLOW_THREADS;
+}    _resultobj = Py_BuildValue("i",_result);
+    return _resultobj;
+}
+
 #define wxStyledTextEvent_GetShift(_swigobj)  (_swigobj->GetShift())
 static PyObject *_wrap_wxStyledTextEvent_GetShift(PyObject *self, PyObject *args, PyObject *kwargs) {
     PyObject * _resultobj;
@@ -8254,6 +9801,9 @@ static PyMethodDef stc_cMethods[] = {
 	 { "wxStyledTextEvent_GetAlt", (PyCFunction) _wrap_wxStyledTextEvent_GetAlt, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextEvent_GetControl", (PyCFunction) _wrap_wxStyledTextEvent_GetControl, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextEvent_GetShift", (PyCFunction) _wrap_wxStyledTextEvent_GetShift, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextEvent_GetY", (PyCFunction) _wrap_wxStyledTextEvent_GetY, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextEvent_GetX", (PyCFunction) _wrap_wxStyledTextEvent_GetX, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextEvent_GetListType", (PyCFunction) _wrap_wxStyledTextEvent_GetListType, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextEvent_GetLParam", (PyCFunction) _wrap_wxStyledTextEvent_GetLParam, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextEvent_GetWParam", (PyCFunction) _wrap_wxStyledTextEvent_GetWParam, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextEvent_GetMessage", (PyCFunction) _wrap_wxStyledTextEvent_GetMessage, METH_VARARGS | METH_KEYWORDS },
@@ -8268,6 +9818,9 @@ static PyMethodDef stc_cMethods[] = {
 	 { "wxStyledTextEvent_GetModifiers", (PyCFunction) _wrap_wxStyledTextEvent_GetModifiers, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextEvent_GetKey", (PyCFunction) _wrap_wxStyledTextEvent_GetKey, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextEvent_GetPosition", (PyCFunction) _wrap_wxStyledTextEvent_GetPosition, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextEvent_SetY", (PyCFunction) _wrap_wxStyledTextEvent_SetY, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextEvent_SetX", (PyCFunction) _wrap_wxStyledTextEvent_SetX, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextEvent_SetListType", (PyCFunction) _wrap_wxStyledTextEvent_SetListType, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextEvent_SetLParam", (PyCFunction) _wrap_wxStyledTextEvent_SetLParam, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextEvent_SetWParam", (PyCFunction) _wrap_wxStyledTextEvent_SetWParam, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextEvent_SetMessage", (PyCFunction) _wrap_wxStyledTextEvent_SetMessage, METH_VARARGS | METH_KEYWORDS },
@@ -8284,6 +9837,7 @@ static PyMethodDef stc_cMethods[] = {
 	 { "wxStyledTextEvent_SetPosition", (PyCFunction) _wrap_wxStyledTextEvent_SetPosition, METH_VARARGS | METH_KEYWORDS },
 	 { "delete_wxStyledTextEvent", (PyCFunction) _wrap_delete_wxStyledTextEvent, METH_VARARGS | METH_KEYWORDS },
 	 { "new_wxStyledTextEvent", (PyCFunction) _wrap_new_wxStyledTextEvent, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_SendMsg", (PyCFunction) _wrap_wxStyledTextCtrl_SendMsg, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_ScrollToColumn", (PyCFunction) _wrap_wxStyledTextCtrl_ScrollToColumn, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_ScrollToLine", (PyCFunction) _wrap_wxStyledTextCtrl_ScrollToLine, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_PointFromPosition", (PyCFunction) _wrap_wxStyledTextCtrl_PointFromPosition, METH_VARARGS | METH_KEYWORDS },
@@ -8294,6 +9848,7 @@ static PyMethodDef stc_cMethods[] = {
 	 { "wxStyledTextCtrl_StyleSetFont", (PyCFunction) _wrap_wxStyledTextCtrl_StyleSetFont, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_StyleSetSpec", (PyCFunction) _wrap_wxStyledTextCtrl_StyleSetSpec, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_GetCurrentLine", (PyCFunction) _wrap_wxStyledTextCtrl_GetCurrentLine, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_SetLexerLanguage", (PyCFunction) _wrap_wxStyledTextCtrl_SetLexerLanguage, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_SetKeyWords", (PyCFunction) _wrap_wxStyledTextCtrl_SetKeyWords, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_SetProperty", (PyCFunction) _wrap_wxStyledTextCtrl_SetProperty, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_Colourise", (PyCFunction) _wrap_wxStyledTextCtrl_Colourise, METH_VARARGS | METH_KEYWORDS },
@@ -8301,6 +9856,21 @@ static PyMethodDef stc_cMethods[] = {
 	 { "wxStyledTextCtrl_SetLexer", (PyCFunction) _wrap_wxStyledTextCtrl_SetLexer, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_StopRecord", (PyCFunction) _wrap_wxStyledTextCtrl_StopRecord, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_StartRecord", (PyCFunction) _wrap_wxStyledTextCtrl_StartRecord, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_DelLineRight", (PyCFunction) _wrap_wxStyledTextCtrl_DelLineRight, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_DelLineLeft", (PyCFunction) _wrap_wxStyledTextCtrl_DelLineLeft, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_SetVisiblePolicy", (PyCFunction) _wrap_wxStyledTextCtrl_SetVisiblePolicy, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_WordPartRightExtend", (PyCFunction) _wrap_wxStyledTextCtrl_WordPartRightExtend, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_WordPartRight", (PyCFunction) _wrap_wxStyledTextCtrl_WordPartRight, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_WordPartLeftExtend", (PyCFunction) _wrap_wxStyledTextCtrl_WordPartLeftExtend, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_WordPartLeft", (PyCFunction) _wrap_wxStyledTextCtrl_WordPartLeft, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_GetCursor", (PyCFunction) _wrap_wxStyledTextCtrl_GetCursor, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_SetCursor", (PyCFunction) _wrap_wxStyledTextCtrl_SetCursor, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_GetMouseDownCaptures", (PyCFunction) _wrap_wxStyledTextCtrl_GetMouseDownCaptures, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_SetMouseDownCaptures", (PyCFunction) _wrap_wxStyledTextCtrl_SetMouseDownCaptures, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_GetStatus", (PyCFunction) _wrap_wxStyledTextCtrl_GetStatus, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_SetStatus", (PyCFunction) _wrap_wxStyledTextCtrl_SetStatus, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_GetFocus", (PyCFunction) _wrap_wxStyledTextCtrl_GetFocus, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_SetFocus", (PyCFunction) _wrap_wxStyledTextCtrl_SetFocus, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_GetModEventMask", (PyCFunction) _wrap_wxStyledTextCtrl_GetModEventMask, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_ReleaseDocument", (PyCFunction) _wrap_wxStyledTextCtrl_ReleaseDocument, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_AddRefDocument", (PyCFunction) _wrap_wxStyledTextCtrl_AddRefDocument, METH_VARARGS | METH_KEYWORDS },
@@ -8329,6 +9899,14 @@ static PyMethodDef stc_cMethods[] = {
 	 { "wxStyledTextCtrl_BraceBadLight", (PyCFunction) _wrap_wxStyledTextCtrl_BraceBadLight, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_BraceHighlight", (PyCFunction) _wrap_wxStyledTextCtrl_BraceHighlight, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_LineLength", (PyCFunction) _wrap_wxStyledTextCtrl_LineLength, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_MoveCaretInsideView", (PyCFunction) _wrap_wxStyledTextCtrl_MoveCaretInsideView, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_GetMouseDwellTime", (PyCFunction) _wrap_wxStyledTextCtrl_GetMouseDwellTime, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_SetMouseDwellTime", (PyCFunction) _wrap_wxStyledTextCtrl_SetMouseDwellTime, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_GetBackSpaceUnIndents", (PyCFunction) _wrap_wxStyledTextCtrl_GetBackSpaceUnIndents, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_SetBackSpaceUnIndents", (PyCFunction) _wrap_wxStyledTextCtrl_SetBackSpaceUnIndents, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_GetTabIndents", (PyCFunction) _wrap_wxStyledTextCtrl_GetTabIndents, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_SetTabIndents", (PyCFunction) _wrap_wxStyledTextCtrl_SetTabIndents, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_EnsureVisibleEnforcePolicy", (PyCFunction) _wrap_wxStyledTextCtrl_EnsureVisibleEnforcePolicy, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_SetFoldFlags", (PyCFunction) _wrap_wxStyledTextCtrl_SetFoldFlags, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_EnsureVisible", (PyCFunction) _wrap_wxStyledTextCtrl_EnsureVisible, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_ToggleFold", (PyCFunction) _wrap_wxStyledTextCtrl_ToggleFold, METH_VARARGS | METH_KEYWORDS },
@@ -8349,6 +9927,17 @@ static PyMethodDef stc_cMethods[] = {
 	 { "wxStyledTextCtrl_CallTipActive", (PyCFunction) _wrap_wxStyledTextCtrl_CallTipActive, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_CallTipCancel", (PyCFunction) _wrap_wxStyledTextCtrl_CallTipCancel, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_CallTipShow", (PyCFunction) _wrap_wxStyledTextCtrl_CallTipShow, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_GetSearchFlags", (PyCFunction) _wrap_wxStyledTextCtrl_GetSearchFlags, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_SetSearchFlags", (PyCFunction) _wrap_wxStyledTextCtrl_SetSearchFlags, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_SearchInTarget", (PyCFunction) _wrap_wxStyledTextCtrl_SearchInTarget, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_ReplaceTargetRE", (PyCFunction) _wrap_wxStyledTextCtrl_ReplaceTargetRE, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_ReplaceTarget", (PyCFunction) _wrap_wxStyledTextCtrl_ReplaceTarget, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_GetTargetEnd", (PyCFunction) _wrap_wxStyledTextCtrl_GetTargetEnd, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_SetTargetEnd", (PyCFunction) _wrap_wxStyledTextCtrl_SetTargetEnd, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_GetTargetStart", (PyCFunction) _wrap_wxStyledTextCtrl_GetTargetStart, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_SetTargetStart", (PyCFunction) _wrap_wxStyledTextCtrl_SetTargetStart, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_GetCaretWidth", (PyCFunction) _wrap_wxStyledTextCtrl_GetCaretWidth, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_SetCaretWidth", (PyCFunction) _wrap_wxStyledTextCtrl_SetCaretWidth, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_GetOvertype", (PyCFunction) _wrap_wxStyledTextCtrl_GetOvertype, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_SetOvertype", (PyCFunction) _wrap_wxStyledTextCtrl_SetOvertype, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_GetTextLength", (PyCFunction) _wrap_wxStyledTextCtrl_GetTextLength, METH_VARARGS | METH_KEYWORDS },
@@ -8409,6 +9998,9 @@ static PyMethodDef stc_cMethods[] = {
 	 { "wxStyledTextCtrl_SetUseTabs", (PyCFunction) _wrap_wxStyledTextCtrl_SetUseTabs, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_GetIndent", (PyCFunction) _wrap_wxStyledTextCtrl_GetIndent, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_SetIndent", (PyCFunction) _wrap_wxStyledTextCtrl_SetIndent, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_AutoCompGetAutoHide", (PyCFunction) _wrap_wxStyledTextCtrl_AutoCompGetAutoHide, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_AutoCompSetAutoHide", (PyCFunction) _wrap_wxStyledTextCtrl_AutoCompSetAutoHide, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_UserListShow", (PyCFunction) _wrap_wxStyledTextCtrl_UserListShow, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_AutoCompGetIgnoreCase", (PyCFunction) _wrap_wxStyledTextCtrl_AutoCompGetIgnoreCase, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_AutoCompSetIgnoreCase", (PyCFunction) _wrap_wxStyledTextCtrl_AutoCompSetIgnoreCase, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_AutoCompGetChooseSingle", (PyCFunction) _wrap_wxStyledTextCtrl_AutoCompGetChooseSingle, METH_VARARGS | METH_KEYWORDS },
@@ -8425,6 +10017,10 @@ static PyMethodDef stc_cMethods[] = {
 	 { "wxStyledTextCtrl_AutoCompActive", (PyCFunction) _wrap_wxStyledTextCtrl_AutoCompActive, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_AutoCompCancel", (PyCFunction) _wrap_wxStyledTextCtrl_AutoCompCancel, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_AutoCompShow", (PyCFunction) _wrap_wxStyledTextCtrl_AutoCompShow, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_SetCaretLineBack", (PyCFunction) _wrap_wxStyledTextCtrl_SetCaretLineBack, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_GetCaretLineBack", (PyCFunction) _wrap_wxStyledTextCtrl_GetCaretLineBack, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_SetCaretLineVisible", (PyCFunction) _wrap_wxStyledTextCtrl_SetCaretLineVisible, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_GetCaretLineVisible", (PyCFunction) _wrap_wxStyledTextCtrl_GetCaretLineVisible, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_GetMaxLineState", (PyCFunction) _wrap_wxStyledTextCtrl_GetMaxLineState, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_GetLineState", (PyCFunction) _wrap_wxStyledTextCtrl_GetLineState, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_SetLineState", (PyCFunction) _wrap_wxStyledTextCtrl_SetLineState, METH_VARARGS | METH_KEYWORDS },
@@ -8447,6 +10043,7 @@ static PyMethodDef stc_cMethods[] = {
 	 { "wxStyledTextCtrl_SetCaretForeground", (PyCFunction) _wrap_wxStyledTextCtrl_SetCaretForeground, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_SetSelBackground", (PyCFunction) _wrap_wxStyledTextCtrl_SetSelBackground, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_SetSelForeground", (PyCFunction) _wrap_wxStyledTextCtrl_SetSelForeground, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_StyleSetCase", (PyCFunction) _wrap_wxStyledTextCtrl_StyleSetCase, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_StyleSetUnderline", (PyCFunction) _wrap_wxStyledTextCtrl_StyleSetUnderline, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_StyleResetDefault", (PyCFunction) _wrap_wxStyledTextCtrl_StyleResetDefault, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_StyleSetEOLFilled", (PyCFunction) _wrap_wxStyledTextCtrl_StyleSetEOLFilled, METH_VARARGS | METH_KEYWORDS },
@@ -8489,6 +10086,7 @@ static PyMethodDef stc_cMethods[] = {
 	 { "wxStyledTextCtrl_SetAnchor", (PyCFunction) _wrap_wxStyledTextCtrl_SetAnchor, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_GotoPos", (PyCFunction) _wrap_wxStyledTextCtrl_GotoPos, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_GotoLine", (PyCFunction) _wrap_wxStyledTextCtrl_GotoLine, METH_VARARGS | METH_KEYWORDS },
+	 { "wxStyledTextCtrl_PositionFromPointClose", (PyCFunction) _wrap_wxStyledTextCtrl_PositionFromPointClose, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_PositionFromPoint", (PyCFunction) _wrap_wxStyledTextCtrl_PositionFromPoint, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_SetViewWhiteSpace", (PyCFunction) _wrap_wxStyledTextCtrl_SetViewWhiteSpace, METH_VARARGS | METH_KEYWORDS },
 	 { "wxStyledTextCtrl_GetViewWhiteSpace", (PyCFunction) _wrap_wxStyledTextCtrl_GetViewWhiteSpace, METH_VARARGS | METH_KEYWORDS },
@@ -8660,6 +10258,24 @@ SWIGEXPORT(void) initstc_c() {
 	 PyDict_SetItemString(d,"wxSTC_MARK_ARROWDOWN", PyInt_FromLong((long) 6));
 	 PyDict_SetItemString(d,"wxSTC_MARK_MINUS", PyInt_FromLong((long) 7));
 	 PyDict_SetItemString(d,"wxSTC_MARK_PLUS", PyInt_FromLong((long) 8));
+	 PyDict_SetItemString(d,"wxSTC_MARK_VLINE", PyInt_FromLong((long) 9));
+	 PyDict_SetItemString(d,"wxSTC_MARK_LCORNER", PyInt_FromLong((long) 10));
+	 PyDict_SetItemString(d,"wxSTC_MARK_TCORNER", PyInt_FromLong((long) 11));
+	 PyDict_SetItemString(d,"wxSTC_MARK_BOXPLUS", PyInt_FromLong((long) 12));
+	 PyDict_SetItemString(d,"wxSTC_MARK_BOXPLUSCONNECTED", PyInt_FromLong((long) 13));
+	 PyDict_SetItemString(d,"wxSTC_MARK_BOXMINUS", PyInt_FromLong((long) 14));
+	 PyDict_SetItemString(d,"wxSTC_MARK_BOXMINUSCONNECTED", PyInt_FromLong((long) 15));
+	 PyDict_SetItemString(d,"wxSTC_MARK_LCORNERCURVE", PyInt_FromLong((long) 16));
+	 PyDict_SetItemString(d,"wxSTC_MARK_TCORNERCURVE", PyInt_FromLong((long) 17));
+	 PyDict_SetItemString(d,"wxSTC_MARK_CIRCLEPLUS", PyInt_FromLong((long) 18));
+	 PyDict_SetItemString(d,"wxSTC_MARK_CIRCLEPLUSCONNECTED", PyInt_FromLong((long) 19));
+	 PyDict_SetItemString(d,"wxSTC_MARK_CIRCLEMINUS", PyInt_FromLong((long) 20));
+	 PyDict_SetItemString(d,"wxSTC_MARK_CIRCLEMINUSCONNECTED", PyInt_FromLong((long) 21));
+	 PyDict_SetItemString(d,"wxSTC_MARKNUM_FOLDEREND", PyInt_FromLong((long) 25));
+	 PyDict_SetItemString(d,"wxSTC_MARKNUM_FOLDEROPENMID", PyInt_FromLong((long) 26));
+	 PyDict_SetItemString(d,"wxSTC_MARKNUM_FOLDERMIDTAIL", PyInt_FromLong((long) 27));
+	 PyDict_SetItemString(d,"wxSTC_MARKNUM_FOLDERTAIL", PyInt_FromLong((long) 28));
+	 PyDict_SetItemString(d,"wxSTC_MARKNUM_FOLDERSUB", PyInt_FromLong((long) 29));
 	 PyDict_SetItemString(d,"wxSTC_MARKNUM_FOLDER", PyInt_FromLong((long) 30));
 	 PyDict_SetItemString(d,"wxSTC_MARKNUM_FOLDEROPEN", PyInt_FromLong((long) 31));
 	 PyDict_SetItemString(d,"wxSTC_MARGIN_SYMBOL", PyInt_FromLong((long) 0));
@@ -8690,6 +10306,9 @@ SWIGEXPORT(void) initstc_c() {
 	 PyDict_SetItemString(d,"wxSTC_CHARSET_ARABIC", PyInt_FromLong((long) 178));
 	 PyDict_SetItemString(d,"wxSTC_CHARSET_VIETNAMESE", PyInt_FromLong((long) 163));
 	 PyDict_SetItemString(d,"wxSTC_CHARSET_THAI", PyInt_FromLong((long) 222));
+	 PyDict_SetItemString(d,"wxSTC_CASE_MIXED", PyInt_FromLong((long) 0));
+	 PyDict_SetItemString(d,"wxSTC_CASE_UPPER", PyInt_FromLong((long) 1));
+	 PyDict_SetItemString(d,"wxSTC_CASE_LOWER", PyInt_FromLong((long) 2));
 	 PyDict_SetItemString(d,"wxSTC_INDIC_MAX", PyInt_FromLong((long) 7));
 	 PyDict_SetItemString(d,"wxSTC_INDIC_PLAIN", PyInt_FromLong((long) 0));
 	 PyDict_SetItemString(d,"wxSTC_INDIC_SQUIGGLE", PyInt_FromLong((long) 1));
@@ -8703,7 +10322,8 @@ SWIGEXPORT(void) initstc_c() {
 	 PyDict_SetItemString(d,"wxSTC_PRINT_NORMAL", PyInt_FromLong((long) 0));
 	 PyDict_SetItemString(d,"wxSTC_PRINT_INVERTLIGHT", PyInt_FromLong((long) 1));
 	 PyDict_SetItemString(d,"wxSTC_PRINT_BLACKONWHITE", PyInt_FromLong((long) 2));
-	 PyDict_SetItemString(d,"wxSTC_FIND_DOWN", PyInt_FromLong((long) 1));
+	 PyDict_SetItemString(d,"wxSTC_PRINT_COLOURONWHITE", PyInt_FromLong((long) 3));
+	 PyDict_SetItemString(d,"wxSTC_PRINT_COLOURONWHITEDEFAULTBG", PyInt_FromLong((long) 4));
 	 PyDict_SetItemString(d,"wxSTC_FIND_WHOLEWORD", PyInt_FromLong((long) 2));
 	 PyDict_SetItemString(d,"wxSTC_FIND_MATCHCASE", PyInt_FromLong((long) 4));
 	 PyDict_SetItemString(d,"wxSTC_FIND_WORDSTART", PyInt_FromLong((long) 0x00100000));
@@ -8716,6 +10336,7 @@ SWIGEXPORT(void) initstc_c() {
 	 PyDict_SetItemString(d,"wxSTC_FOLDLEVELWHITEFLAG", PyInt_FromLong((long) 0x1000));
 	 PyDict_SetItemString(d,"wxSTC_FOLDLEVELHEADERFLAG", PyInt_FromLong((long) 0x2000));
 	 PyDict_SetItemString(d,"wxSTC_FOLDLEVELNUMBERMASK", PyInt_FromLong((long) 0x0FFF));
+	 PyDict_SetItemString(d,"wxSTC_TIME_FOREVER", PyInt_FromLong((long) 10000000));
 	 PyDict_SetItemString(d,"wxSTC_CMD_LINEDOWN", PyInt_FromLong((long) 2300));
 	 PyDict_SetItemString(d,"wxSTC_CMD_LINEDOWNEXTEND", PyInt_FromLong((long) 2301));
 	 PyDict_SetItemString(d,"wxSTC_CMD_LINEUP", PyInt_FromLong((long) 2302));
@@ -8766,6 +10387,12 @@ SWIGEXPORT(void) initstc_c() {
 	 PyDict_SetItemString(d,"wxSTC_CARET_SLOP", PyInt_FromLong((long) 0x01));
 	 PyDict_SetItemString(d,"wxSTC_CARET_CENTER", PyInt_FromLong((long) 0x02));
 	 PyDict_SetItemString(d,"wxSTC_CARET_STRICT", PyInt_FromLong((long) 0x04));
+	 PyDict_SetItemString(d,"wxSTC_CARET_XEVEN", PyInt_FromLong((long) 0x08));
+	 PyDict_SetItemString(d,"wxSTC_CARET_XJUMPS", PyInt_FromLong((long) 0x10));
+	 PyDict_SetItemString(d,"wxSTC_CURSORNORMAL", PyInt_FromLong((long) -1));
+	 PyDict_SetItemString(d,"wxSTC_CURSORWAIT", PyInt_FromLong((long) 3));
+	 PyDict_SetItemString(d,"wxSTC_VISIBLE_SLOP", PyInt_FromLong((long) 0x01));
+	 PyDict_SetItemString(d,"wxSTC_VISIBLE_STRICT", PyInt_FromLong((long) 0x04));
 	 PyDict_SetItemString(d,"wxSTC_MOD_INSERTTEXT", PyInt_FromLong((long) 0x1));
 	 PyDict_SetItemString(d,"wxSTC_MOD_DELETETEXT", PyInt_FromLong((long) 0x2));
 	 PyDict_SetItemString(d,"wxSTC_MOD_CHANGESTYLE", PyInt_FromLong((long) 0x4));
@@ -8815,6 +10442,16 @@ SWIGEXPORT(void) initstc_c() {
 	 PyDict_SetItemString(d,"wxSTC_LEX_LATEX", PyInt_FromLong((long) 14));
 	 PyDict_SetItemString(d,"wxSTC_LEX_LUA", PyInt_FromLong((long) 15));
 	 PyDict_SetItemString(d,"wxSTC_LEX_DIFF", PyInt_FromLong((long) 16));
+	 PyDict_SetItemString(d,"wxSTC_LEX_CONF", PyInt_FromLong((long) 17));
+	 PyDict_SetItemString(d,"wxSTC_LEX_PASCAL", PyInt_FromLong((long) 18));
+	 PyDict_SetItemString(d,"wxSTC_LEX_AVE", PyInt_FromLong((long) 19));
+	 PyDict_SetItemString(d,"wxSTC_LEX_ADA", PyInt_FromLong((long) 20));
+	 PyDict_SetItemString(d,"wxSTC_LEX_LISP", PyInt_FromLong((long) 21));
+	 PyDict_SetItemString(d,"wxSTC_LEX_RUBY", PyInt_FromLong((long) 22));
+	 PyDict_SetItemString(d,"wxSTC_LEX_EIFFEL", PyInt_FromLong((long) 23));
+	 PyDict_SetItemString(d,"wxSTC_LEX_EIFFELKW", PyInt_FromLong((long) 24));
+	 PyDict_SetItemString(d,"wxSTC_LEX_TCL", PyInt_FromLong((long) 25));
+	 PyDict_SetItemString(d,"wxSTC_LEX_AUTOMATIC", PyInt_FromLong((long) 1000));
 	 PyDict_SetItemString(d,"wxSTC_P_DEFAULT", PyInt_FromLong((long) 0));
 	 PyDict_SetItemString(d,"wxSTC_P_COMMENTLINE", PyInt_FromLong((long) 1));
 	 PyDict_SetItemString(d,"wxSTC_P_NUMBER", PyInt_FromLong((long) 2));
@@ -8843,6 +10480,9 @@ SWIGEXPORT(void) initstc_c() {
 	 PyDict_SetItemString(d,"wxSTC_C_IDENTIFIER", PyInt_FromLong((long) 11));
 	 PyDict_SetItemString(d,"wxSTC_C_STRINGEOL", PyInt_FromLong((long) 12));
 	 PyDict_SetItemString(d,"wxSTC_C_VERBATIM", PyInt_FromLong((long) 13));
+	 PyDict_SetItemString(d,"wxSTC_C_REGEX", PyInt_FromLong((long) 14));
+	 PyDict_SetItemString(d,"wxSTC_C_COMMENTLINEDOC", PyInt_FromLong((long) 15));
+	 PyDict_SetItemString(d,"wxSTC_C_WORD2", PyInt_FromLong((long) 16));
 	 PyDict_SetItemString(d,"wxSTC_H_DEFAULT", PyInt_FromLong((long) 0));
 	 PyDict_SetItemString(d,"wxSTC_H_TAG", PyInt_FromLong((long) 1));
 	 PyDict_SetItemString(d,"wxSTC_H_TAGUNKNOWN", PyInt_FromLong((long) 2));
@@ -8863,6 +10503,8 @@ SWIGEXPORT(void) initstc_c() {
 	 PyDict_SetItemString(d,"wxSTC_H_CDATA", PyInt_FromLong((long) 17));
 	 PyDict_SetItemString(d,"wxSTC_H_QUESTION", PyInt_FromLong((long) 18));
 	 PyDict_SetItemString(d,"wxSTC_H_VALUE", PyInt_FromLong((long) 19));
+	 PyDict_SetItemString(d,"wxSTC_H_XCCOMMENT", PyInt_FromLong((long) 20));
+	 PyDict_SetItemString(d,"wxSTC_H_SGML", PyInt_FromLong((long) 21));
 	 PyDict_SetItemString(d,"wxSTC_HJ_START", PyInt_FromLong((long) 40));
 	 PyDict_SetItemString(d,"wxSTC_HJ_DEFAULT", PyInt_FromLong((long) 41));
 	 PyDict_SetItemString(d,"wxSTC_HJ_COMMENT", PyInt_FromLong((long) 42));
@@ -8875,6 +10517,7 @@ SWIGEXPORT(void) initstc_c() {
 	 PyDict_SetItemString(d,"wxSTC_HJ_SINGLESTRING", PyInt_FromLong((long) 49));
 	 PyDict_SetItemString(d,"wxSTC_HJ_SYMBOLS", PyInt_FromLong((long) 50));
 	 PyDict_SetItemString(d,"wxSTC_HJ_STRINGEOL", PyInt_FromLong((long) 51));
+	 PyDict_SetItemString(d,"wxSTC_HJ_REGEX", PyInt_FromLong((long) 52));
 	 PyDict_SetItemString(d,"wxSTC_HJA_START", PyInt_FromLong((long) 55));
 	 PyDict_SetItemString(d,"wxSTC_HJA_DEFAULT", PyInt_FromLong((long) 56));
 	 PyDict_SetItemString(d,"wxSTC_HJA_COMMENT", PyInt_FromLong((long) 57));
@@ -8887,6 +10530,7 @@ SWIGEXPORT(void) initstc_c() {
 	 PyDict_SetItemString(d,"wxSTC_HJA_SINGLESTRING", PyInt_FromLong((long) 64));
 	 PyDict_SetItemString(d,"wxSTC_HJA_SYMBOLS", PyInt_FromLong((long) 65));
 	 PyDict_SetItemString(d,"wxSTC_HJA_STRINGEOL", PyInt_FromLong((long) 66));
+	 PyDict_SetItemString(d,"wxSTC_HJA_REGEX", PyInt_FromLong((long) 67));
 	 PyDict_SetItemString(d,"wxSTC_HB_START", PyInt_FromLong((long) 70));
 	 PyDict_SetItemString(d,"wxSTC_HB_DEFAULT", PyInt_FromLong((long) 71));
 	 PyDict_SetItemString(d,"wxSTC_HB_COMMENTLINE", PyInt_FromLong((long) 72));
@@ -8937,9 +10581,10 @@ SWIGEXPORT(void) initstc_c() {
 	 PyDict_SetItemString(d,"wxSTC_HPHP_VARIABLE", PyInt_FromLong((long) 123));
 	 PyDict_SetItemString(d,"wxSTC_HPHP_COMMENT", PyInt_FromLong((long) 124));
 	 PyDict_SetItemString(d,"wxSTC_HPHP_COMMENTLINE", PyInt_FromLong((long) 125));
-	 PyDict_SetItemString(d,"wxSTC_HPHP_STRINGEOL", PyInt_FromLong((long) 126));
+	 PyDict_SetItemString(d,"wxSTC_HPHP_HSTRING_VARIABLE", PyInt_FromLong((long) 126));
+	 PyDict_SetItemString(d,"wxSTC_HPHP_OPERATOR", PyInt_FromLong((long) 127));
 	 PyDict_SetItemString(d,"wxSTC_PL_DEFAULT", PyInt_FromLong((long) 0));
-	 PyDict_SetItemString(d,"wxSTC_PL_HERE", PyInt_FromLong((long) 1));
+	 PyDict_SetItemString(d,"wxSTC_PL_ERROR", PyInt_FromLong((long) 1));
 	 PyDict_SetItemString(d,"wxSTC_PL_COMMENTLINE", PyInt_FromLong((long) 2));
 	 PyDict_SetItemString(d,"wxSTC_PL_POD", PyInt_FromLong((long) 3));
 	 PyDict_SetItemString(d,"wxSTC_PL_NUMBER", PyInt_FromLong((long) 4));
@@ -8954,12 +10599,20 @@ SWIGEXPORT(void) initstc_c() {
 	 PyDict_SetItemString(d,"wxSTC_PL_ARRAY", PyInt_FromLong((long) 13));
 	 PyDict_SetItemString(d,"wxSTC_PL_HASH", PyInt_FromLong((long) 14));
 	 PyDict_SetItemString(d,"wxSTC_PL_SYMBOLTABLE", PyInt_FromLong((long) 15));
-	 PyDict_SetItemString(d,"wxSTC_PL_REF", PyInt_FromLong((long) 16));
 	 PyDict_SetItemString(d,"wxSTC_PL_REGEX", PyInt_FromLong((long) 17));
 	 PyDict_SetItemString(d,"wxSTC_PL_REGSUBST", PyInt_FromLong((long) 18));
 	 PyDict_SetItemString(d,"wxSTC_PL_LONGQUOTE", PyInt_FromLong((long) 19));
 	 PyDict_SetItemString(d,"wxSTC_PL_BACKTICKS", PyInt_FromLong((long) 20));
 	 PyDict_SetItemString(d,"wxSTC_PL_DATASECTION", PyInt_FromLong((long) 21));
+	 PyDict_SetItemString(d,"wxSTC_PL_HERE_DELIM", PyInt_FromLong((long) 22));
+	 PyDict_SetItemString(d,"wxSTC_PL_HERE_Q", PyInt_FromLong((long) 23));
+	 PyDict_SetItemString(d,"wxSTC_PL_HERE_QQ", PyInt_FromLong((long) 24));
+	 PyDict_SetItemString(d,"wxSTC_PL_HERE_QX", PyInt_FromLong((long) 25));
+	 PyDict_SetItemString(d,"wxSTC_PL_STRING_Q", PyInt_FromLong((long) 26));
+	 PyDict_SetItemString(d,"wxSTC_PL_STRING_QQ", PyInt_FromLong((long) 27));
+	 PyDict_SetItemString(d,"wxSTC_PL_STRING_QX", PyInt_FromLong((long) 28));
+	 PyDict_SetItemString(d,"wxSTC_PL_STRING_QR", PyInt_FromLong((long) 29));
+	 PyDict_SetItemString(d,"wxSTC_PL_STRING_QW", PyInt_FromLong((long) 30));
 	 PyDict_SetItemString(d,"wxSTC_L_DEFAULT", PyInt_FromLong((long) 0));
 	 PyDict_SetItemString(d,"wxSTC_L_COMMAND", PyInt_FromLong((long) 1));
 	 PyDict_SetItemString(d,"wxSTC_L_TAG", PyInt_FromLong((long) 2));
@@ -8985,22 +10638,95 @@ SWIGEXPORT(void) initstc_c() {
 	 PyDict_SetItemString(d,"wxSTC_ERR_CMD", PyInt_FromLong((long) 4));
 	 PyDict_SetItemString(d,"wxSTC_ERR_BORLAND", PyInt_FromLong((long) 5));
 	 PyDict_SetItemString(d,"wxSTC_ERR_PERL", PyInt_FromLong((long) 6));
+	 PyDict_SetItemString(d,"wxSTC_ERR_NET", PyInt_FromLong((long) 7));
+	 PyDict_SetItemString(d,"wxSTC_ERR_LUA", PyInt_FromLong((long) 8));
+	 PyDict_SetItemString(d,"wxSTC_ERR_DIFF_CHANGED", PyInt_FromLong((long) 10));
+	 PyDict_SetItemString(d,"wxSTC_ERR_DIFF_ADDITION", PyInt_FromLong((long) 11));
+	 PyDict_SetItemString(d,"wxSTC_ERR_DIFF_DELETION", PyInt_FromLong((long) 12));
+	 PyDict_SetItemString(d,"wxSTC_ERR_DIFF_MESSAGE", PyInt_FromLong((long) 13));
+	 PyDict_SetItemString(d,"wxSTC_BAT_DEFAULT", PyInt_FromLong((long) 0));
+	 PyDict_SetItemString(d,"wxSTC_BAT_COMMENT", PyInt_FromLong((long) 1));
+	 PyDict_SetItemString(d,"wxSTC_BAT_WORD", PyInt_FromLong((long) 2));
+	 PyDict_SetItemString(d,"wxSTC_BAT_LABEL", PyInt_FromLong((long) 3));
+	 PyDict_SetItemString(d,"wxSTC_BAT_HIDE", PyInt_FromLong((long) 4));
+	 PyDict_SetItemString(d,"wxSTC_BAT_COMMAND", PyInt_FromLong((long) 5));
+	 PyDict_SetItemString(d,"wxSTC_BAT_IDENTIFIER", PyInt_FromLong((long) 6));
+	 PyDict_SetItemString(d,"wxSTC_BAT_OPERATOR", PyInt_FromLong((long) 7));
+	 PyDict_SetItemString(d,"wxSTC_MAKE_DEFAULT", PyInt_FromLong((long) 0));
+	 PyDict_SetItemString(d,"wxSTC_MAKE_COMMENT", PyInt_FromLong((long) 1));
+	 PyDict_SetItemString(d,"wxSTC_MAKE_PREPROCESSOR", PyInt_FromLong((long) 2));
+	 PyDict_SetItemString(d,"wxSTC_MAKE_IDENTIFIER", PyInt_FromLong((long) 3));
+	 PyDict_SetItemString(d,"wxSTC_MAKE_OPERATOR", PyInt_FromLong((long) 4));
+	 PyDict_SetItemString(d,"wxSTC_MAKE_TARGET", PyInt_FromLong((long) 5));
+	 PyDict_SetItemString(d,"wxSTC_MAKE_IDEOL", PyInt_FromLong((long) 9));
+	 PyDict_SetItemString(d,"wxSTC_CONF_DEFAULT", PyInt_FromLong((long) 0));
+	 PyDict_SetItemString(d,"wxSTC_CONF_COMMENT", PyInt_FromLong((long) 1));
+	 PyDict_SetItemString(d,"wxSTC_CONF_NUMBER", PyInt_FromLong((long) 2));
+	 PyDict_SetItemString(d,"wxSTC_CONF_IDENTIFIER", PyInt_FromLong((long) 3));
+	 PyDict_SetItemString(d,"wxSTC_CONF_EXTENSION", PyInt_FromLong((long) 4));
+	 PyDict_SetItemString(d,"wxSTC_CONF_PARAMETER", PyInt_FromLong((long) 5));
+	 PyDict_SetItemString(d,"wxSTC_CONF_STRING", PyInt_FromLong((long) 6));
+	 PyDict_SetItemString(d,"wxSTC_CONF_OPERATOR", PyInt_FromLong((long) 7));
+	 PyDict_SetItemString(d,"wxSTC_CONF_IP", PyInt_FromLong((long) 8));
+	 PyDict_SetItemString(d,"wxSTC_CONF_DIRECTIVE", PyInt_FromLong((long) 9));
+	 PyDict_SetItemString(d,"wxSTC_AVE_DEFAULT", PyInt_FromLong((long) 0));
+	 PyDict_SetItemString(d,"wxSTC_AVE_COMMENT", PyInt_FromLong((long) 1));
+	 PyDict_SetItemString(d,"wxSTC_AVE_NUMBER", PyInt_FromLong((long) 2));
+	 PyDict_SetItemString(d,"wxSTC_AVE_WORD", PyInt_FromLong((long) 3));
+	 PyDict_SetItemString(d,"wxSTC_AVE_KEYWORD", PyInt_FromLong((long) 4));
+	 PyDict_SetItemString(d,"wxSTC_AVE_STATEMENT", PyInt_FromLong((long) 5));
+	 PyDict_SetItemString(d,"wxSTC_AVE_STRING", PyInt_FromLong((long) 6));
+	 PyDict_SetItemString(d,"wxSTC_AVE_ENUM", PyInt_FromLong((long) 7));
+	 PyDict_SetItemString(d,"wxSTC_AVE_STRINGEOL", PyInt_FromLong((long) 8));
+	 PyDict_SetItemString(d,"wxSTC_AVE_IDENTIFIER", PyInt_FromLong((long) 9));
+	 PyDict_SetItemString(d,"wxSTC_AVE_OPERATOR", PyInt_FromLong((long) 10));
+	 PyDict_SetItemString(d,"wxSTC_ADA_DEFAULT", PyInt_FromLong((long) 0));
+	 PyDict_SetItemString(d,"wxSTC_ADA_COMMENT", PyInt_FromLong((long) 1));
+	 PyDict_SetItemString(d,"wxSTC_ADA_NUMBER", PyInt_FromLong((long) 2));
+	 PyDict_SetItemString(d,"wxSTC_ADA_WORD", PyInt_FromLong((long) 3));
+	 PyDict_SetItemString(d,"wxSTC_ADA_STRING", PyInt_FromLong((long) 4));
+	 PyDict_SetItemString(d,"wxSTC_ADA_CHARACTER", PyInt_FromLong((long) 5));
+	 PyDict_SetItemString(d,"wxSTC_ADA_OPERATOR", PyInt_FromLong((long) 6));
+	 PyDict_SetItemString(d,"wxSTC_ADA_IDENTIFIER", PyInt_FromLong((long) 7));
+	 PyDict_SetItemString(d,"wxSTC_ADA_STRINGEOL", PyInt_FromLong((long) 8));
+	 PyDict_SetItemString(d,"wxSTC_LISP_DEFAULT", PyInt_FromLong((long) 0));
+	 PyDict_SetItemString(d,"wxSTC_LISP_COMMENT", PyInt_FromLong((long) 1));
+	 PyDict_SetItemString(d,"wxSTC_LISP_NUMBER", PyInt_FromLong((long) 2));
+	 PyDict_SetItemString(d,"wxSTC_LISP_KEYWORD", PyInt_FromLong((long) 3));
+	 PyDict_SetItemString(d,"wxSTC_LISP_STRING", PyInt_FromLong((long) 6));
+	 PyDict_SetItemString(d,"wxSTC_LISP_STRINGEOL", PyInt_FromLong((long) 8));
+	 PyDict_SetItemString(d,"wxSTC_LISP_IDENTIFIER", PyInt_FromLong((long) 9));
+	 PyDict_SetItemString(d,"wxSTC_LISP_OPERATOR", PyInt_FromLong((long) 10));
+	 PyDict_SetItemString(d,"wxSTC_EIFFEL_DEFAULT", PyInt_FromLong((long) 0));
+	 PyDict_SetItemString(d,"wxSTC_EIFFEL_COMMENTLINE", PyInt_FromLong((long) 1));
+	 PyDict_SetItemString(d,"wxSTC_EIFFEL_NUMBER", PyInt_FromLong((long) 2));
+	 PyDict_SetItemString(d,"wxSTC_EIFFEL_WORD", PyInt_FromLong((long) 3));
+	 PyDict_SetItemString(d,"wxSTC_EIFFEL_STRING", PyInt_FromLong((long) 4));
+	 PyDict_SetItemString(d,"wxSTC_EIFFEL_CHARACTER", PyInt_FromLong((long) 5));
+	 PyDict_SetItemString(d,"wxSTC_EIFFEL_OPERATOR", PyInt_FromLong((long) 6));
+	 PyDict_SetItemString(d,"wxSTC_EIFFEL_IDENTIFIER", PyInt_FromLong((long) 7));
+	 PyDict_SetItemString(d,"wxSTC_EIFFEL_STRINGEOL", PyInt_FromLong((long) 8));
 	 PyDict_SetItemString(d,"wxSTC_MASK_FOLDERS", PyInt_FromLong((long) ((1<<(30))|(1<<(31)))));
 	 PyDict_SetItemString(d,"wxSTCNameStr", PyString_FromString("wxSTCNameStr"));
 	 PyDict_SetItemString(d,"wxEVT_STC_CHANGE", PyInt_FromLong((long) wxEVT_STC_CHANGE));
 	 PyDict_SetItemString(d,"wxEVT_STC_STYLENEEDED", PyInt_FromLong((long) wxEVT_STC_STYLENEEDED));
 	 PyDict_SetItemString(d,"wxEVT_STC_CHARADDED", PyInt_FromLong((long) wxEVT_STC_CHARADDED));
-	 PyDict_SetItemString(d,"wxEVT_STC_UPDATEUI", PyInt_FromLong((long) wxEVT_STC_UPDATEUI));
 	 PyDict_SetItemString(d,"wxEVT_STC_SAVEPOINTREACHED", PyInt_FromLong((long) wxEVT_STC_SAVEPOINTREACHED));
 	 PyDict_SetItemString(d,"wxEVT_STC_SAVEPOINTLEFT", PyInt_FromLong((long) wxEVT_STC_SAVEPOINTLEFT));
 	 PyDict_SetItemString(d,"wxEVT_STC_ROMODIFYATTEMPT", PyInt_FromLong((long) wxEVT_STC_ROMODIFYATTEMPT));
+	 PyDict_SetItemString(d,"wxEVT_STC_KEY", PyInt_FromLong((long) wxEVT_STC_KEY));
 	 PyDict_SetItemString(d,"wxEVT_STC_DOUBLECLICK", PyInt_FromLong((long) wxEVT_STC_DOUBLECLICK));
+	 PyDict_SetItemString(d,"wxEVT_STC_UPDATEUI", PyInt_FromLong((long) wxEVT_STC_UPDATEUI));
 	 PyDict_SetItemString(d,"wxEVT_STC_MODIFIED", PyInt_FromLong((long) wxEVT_STC_MODIFIED));
-	 PyDict_SetItemString(d,"wxEVT_STC_KEY", PyInt_FromLong((long) wxEVT_STC_KEY));
 	 PyDict_SetItemString(d,"wxEVT_STC_MACRORECORD", PyInt_FromLong((long) wxEVT_STC_MACRORECORD));
 	 PyDict_SetItemString(d,"wxEVT_STC_MARGINCLICK", PyInt_FromLong((long) wxEVT_STC_MARGINCLICK));
 	 PyDict_SetItemString(d,"wxEVT_STC_NEEDSHOWN", PyInt_FromLong((long) wxEVT_STC_NEEDSHOWN));
 	 PyDict_SetItemString(d,"wxEVT_STC_POSCHANGED", PyInt_FromLong((long) wxEVT_STC_POSCHANGED));
+	 PyDict_SetItemString(d,"wxEVT_STC_PAINTED", PyInt_FromLong((long) wxEVT_STC_PAINTED));
+	 PyDict_SetItemString(d,"wxEVT_STC_USERLISTSELECTION", PyInt_FromLong((long) wxEVT_STC_USERLISTSELECTION));
+	 PyDict_SetItemString(d,"wxEVT_STC_URIDROPPED", PyInt_FromLong((long) wxEVT_STC_URIDROPPED));
+	 PyDict_SetItemString(d,"wxEVT_STC_DWELLSTART", PyInt_FromLong((long) wxEVT_STC_DWELLSTART));
+	 PyDict_SetItemString(d,"wxEVT_STC_DWELLEND", PyInt_FromLong((long) wxEVT_STC_DWELLEND));
 
 
     wxClassInfo::CleanUpClasses();
diff --git a/wxPython/contrib/stc/stc_.i b/wxPython/contrib/stc/stc_.i
index f3e877f24a..74a4694c58 100644
--- a/wxPython/contrib/stc/stc_.i
+++ b/wxPython/contrib/stc/stc_.i
@@ -39,47 +39,62 @@
 // Python functions to act like the event macros
 
 %pragma(python) code = "
-def EVT_STC_CHANGE(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_CHANGE, fn)
+def EVT_STC_CHANGE(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_CHANGE, func)
 
-def EVT_STC_STYLENEEDED(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_STYLENEEDED, fn)
+def EVT_STC_STYLENEEDED(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_STYLENEEDED, func)
 
-def EVT_STC_CHARADDED(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_CHARADDED, fn)
+def EVT_STC_CHARADDED(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_CHARADDED, func)
 
-def EVT_STC_UPDATEUI(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_UPDATEUI, fn)
+def EVT_STC_SAVEPOINTREACHED(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_SAVEPOINTREACHED, func)
 
-def EVT_STC_SAVEPOINTREACHED(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_SAVEPOINTREACHED, fn)
+def EVT_STC_SAVEPOINTLEFT(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_SAVEPOINTLEFT, func)
 
-def EVT_STC_SAVEPOINTLEFT(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_SAVEPOINTLEFT, fn)
+def EVT_STC_ROMODIFYATTEMPT(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_ROMODIFYATTEMPT, func)
 
-def EVT_STC_ROMODIFYATTEMPT(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_ROMODIFYATTEMPT, fn)
+def EVT_STC_KEY(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_KEY, func)
 
-def EVT_STC_DOUBLECLICK(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_DOUBLECLICK, fn)
+def EVT_STC_DOUBLECLICK(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_DOUBLECLICK, func)
 
-def EVT_STC_MODIFIED(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_MODIFIED, fn)
+def EVT_STC_UPDATEUI(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_UPDATEUI, func)
 
-def EVT_STC_KEY(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_KEY, fn)
+def EVT_STC_MODIFIED(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_MODIFIED, func)
 
-def EVT_STC_MACRORECORD(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_MACRORECORD, fn)
+def EVT_STC_MACRORECORD(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_MACRORECORD, func)
 
-def EVT_STC_MARGINCLICK(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_MARGINCLICK, fn)
+def EVT_STC_MARGINCLICK(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_MARGINCLICK, func)
 
-def EVT_STC_NEEDSHOWN(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_NEEDSHOWN, fn)
+def EVT_STC_NEEDSHOWN(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_NEEDSHOWN, func)
 
-def EVT_STC_POSCHANGED(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_POSCHANGED, fn)
+def EVT_STC_POSCHANGED(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_POSCHANGED, func)
+
+def EVT_STC_PAINTED(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_PAINTED, func)
+
+def EVT_STC_USERLISTSELECTION(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_USERLISTSELECTION, func)
+
+def EVT_STC_URIDROPPED(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_URIDROPPED, func)
+
+def EVT_STC_DWELLSTART(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_DWELLSTART, func)
+
+def EVT_STC_DWELLEND(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_DWELLEND, func)
 
 
 "
diff --git a/wxPython/contrib/stc/stc_.py b/wxPython/contrib/stc/stc_.py
index b77cd7e8d0..079b8cc4fd 100644
--- a/wxPython/contrib/stc/stc_.py
+++ b/wxPython/contrib/stc/stc_.py
@@ -41,47 +41,62 @@ from filesys import *
 
 from utils import *
 
-def EVT_STC_CHANGE(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_CHANGE, fn)
+def EVT_STC_CHANGE(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_CHANGE, func)
 
-def EVT_STC_STYLENEEDED(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_STYLENEEDED, fn)
+def EVT_STC_STYLENEEDED(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_STYLENEEDED, func)
 
-def EVT_STC_CHARADDED(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_CHARADDED, fn)
+def EVT_STC_CHARADDED(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_CHARADDED, func)
 
-def EVT_STC_UPDATEUI(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_UPDATEUI, fn)
+def EVT_STC_SAVEPOINTREACHED(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_SAVEPOINTREACHED, func)
 
-def EVT_STC_SAVEPOINTREACHED(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_SAVEPOINTREACHED, fn)
+def EVT_STC_SAVEPOINTLEFT(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_SAVEPOINTLEFT, func)
 
-def EVT_STC_SAVEPOINTLEFT(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_SAVEPOINTLEFT, fn)
+def EVT_STC_ROMODIFYATTEMPT(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_ROMODIFYATTEMPT, func)
 
-def EVT_STC_ROMODIFYATTEMPT(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_ROMODIFYATTEMPT, fn)
+def EVT_STC_KEY(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_KEY, func)
 
-def EVT_STC_DOUBLECLICK(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_DOUBLECLICK, fn)
+def EVT_STC_DOUBLECLICK(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_DOUBLECLICK, func)
 
-def EVT_STC_MODIFIED(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_MODIFIED, fn)
+def EVT_STC_UPDATEUI(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_UPDATEUI, func)
 
-def EVT_STC_KEY(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_KEY, fn)
+def EVT_STC_MODIFIED(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_MODIFIED, func)
 
-def EVT_STC_MACRORECORD(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_MACRORECORD, fn)
+def EVT_STC_MACRORECORD(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_MACRORECORD, func)
 
-def EVT_STC_MARGINCLICK(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_MARGINCLICK, fn)
+def EVT_STC_MARGINCLICK(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_MARGINCLICK, func)
 
-def EVT_STC_NEEDSHOWN(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_NEEDSHOWN, fn)
+def EVT_STC_NEEDSHOWN(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_NEEDSHOWN, func)
 
-def EVT_STC_POSCHANGED(win, id, fn):
-    win.Connect(id, -1, wxEVT_STC_POSCHANGED, fn)
+def EVT_STC_POSCHANGED(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_POSCHANGED, func)
+
+def EVT_STC_PAINTED(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_PAINTED, func)
+
+def EVT_STC_USERLISTSELECTION(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_USERLISTSELECTION, func)
+
+def EVT_STC_URIDROPPED(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_URIDROPPED, func)
+
+def EVT_STC_DWELLSTART(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_DWELLSTART, func)
+
+def EVT_STC_DWELLEND(win, id, func):
+    win.Connect(id, -1, wxEVT_STC_DWELLEND, func)
 
 
 
@@ -155,6 +170,9 @@ class wxStyledTextCtrlPtr(wxControlPtr):
     def PositionFromPoint(self, *_args, **_kwargs):
         val = apply(stc_c.wxStyledTextCtrl_PositionFromPoint,(self,) + _args, _kwargs)
         return val
+    def PositionFromPointClose(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_PositionFromPointClose,(self,) + _args, _kwargs)
+        return val
     def GotoLine(self, *_args, **_kwargs):
         val = apply(stc_c.wxStyledTextCtrl_GotoLine,(self,) + _args, _kwargs)
         return val
@@ -281,6 +299,9 @@ class wxStyledTextCtrlPtr(wxControlPtr):
     def StyleSetUnderline(self, *_args, **_kwargs):
         val = apply(stc_c.wxStyledTextCtrl_StyleSetUnderline,(self,) + _args, _kwargs)
         return val
+    def StyleSetCase(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_StyleSetCase,(self,) + _args, _kwargs)
+        return val
     def SetSelForeground(self, *_args, **_kwargs):
         val = apply(stc_c.wxStyledTextCtrl_SetSelForeground,(self,) + _args, _kwargs)
         return val
@@ -348,6 +369,19 @@ class wxStyledTextCtrlPtr(wxControlPtr):
     def GetMaxLineState(self, *_args, **_kwargs):
         val = apply(stc_c.wxStyledTextCtrl_GetMaxLineState,(self,) + _args, _kwargs)
         return val
+    def GetCaretLineVisible(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_GetCaretLineVisible,(self,) + _args, _kwargs)
+        return val
+    def SetCaretLineVisible(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_SetCaretLineVisible,(self,) + _args, _kwargs)
+        return val
+    def GetCaretLineBack(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_GetCaretLineBack,(self,) + _args, _kwargs)
+        if val: val = wxColourPtr(val) ; val.thisown = 1
+        return val
+    def SetCaretLineBack(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_SetCaretLineBack,(self,) + _args, _kwargs)
+        return val
     def AutoCompShow(self, *_args, **_kwargs):
         val = apply(stc_c.wxStyledTextCtrl_AutoCompShow,(self,) + _args, _kwargs)
         return val
@@ -396,6 +430,15 @@ class wxStyledTextCtrlPtr(wxControlPtr):
     def AutoCompGetIgnoreCase(self, *_args, **_kwargs):
         val = apply(stc_c.wxStyledTextCtrl_AutoCompGetIgnoreCase,(self,) + _args, _kwargs)
         return val
+    def UserListShow(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_UserListShow,(self,) + _args, _kwargs)
+        return val
+    def AutoCompSetAutoHide(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_AutoCompSetAutoHide,(self,) + _args, _kwargs)
+        return val
+    def AutoCompGetAutoHide(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_AutoCompGetAutoHide,(self,) + _args, _kwargs)
+        return val
     def SetIndent(self, *_args, **_kwargs):
         val = apply(stc_c.wxStyledTextCtrl_SetIndent,(self,) + _args, _kwargs)
         return val
@@ -577,6 +620,39 @@ class wxStyledTextCtrlPtr(wxControlPtr):
     def GetOvertype(self, *_args, **_kwargs):
         val = apply(stc_c.wxStyledTextCtrl_GetOvertype,(self,) + _args, _kwargs)
         return val
+    def SetCaretWidth(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_SetCaretWidth,(self,) + _args, _kwargs)
+        return val
+    def GetCaretWidth(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_GetCaretWidth,(self,) + _args, _kwargs)
+        return val
+    def SetTargetStart(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_SetTargetStart,(self,) + _args, _kwargs)
+        return val
+    def GetTargetStart(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_GetTargetStart,(self,) + _args, _kwargs)
+        return val
+    def SetTargetEnd(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_SetTargetEnd,(self,) + _args, _kwargs)
+        return val
+    def GetTargetEnd(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_GetTargetEnd,(self,) + _args, _kwargs)
+        return val
+    def ReplaceTarget(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_ReplaceTarget,(self,) + _args, _kwargs)
+        return val
+    def ReplaceTargetRE(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_ReplaceTargetRE,(self,) + _args, _kwargs)
+        return val
+    def SearchInTarget(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_SearchInTarget,(self,) + _args, _kwargs)
+        return val
+    def SetSearchFlags(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_SetSearchFlags,(self,) + _args, _kwargs)
+        return val
+    def GetSearchFlags(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_GetSearchFlags,(self,) + _args, _kwargs)
+        return val
     def CallTipShow(self, *_args, **_kwargs):
         val = apply(stc_c.wxStyledTextCtrl_CallTipShow,(self,) + _args, _kwargs)
         return val
@@ -637,6 +713,30 @@ class wxStyledTextCtrlPtr(wxControlPtr):
     def SetFoldFlags(self, *_args, **_kwargs):
         val = apply(stc_c.wxStyledTextCtrl_SetFoldFlags,(self,) + _args, _kwargs)
         return val
+    def EnsureVisibleEnforcePolicy(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_EnsureVisibleEnforcePolicy,(self,) + _args, _kwargs)
+        return val
+    def SetTabIndents(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_SetTabIndents,(self,) + _args, _kwargs)
+        return val
+    def GetTabIndents(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_GetTabIndents,(self,) + _args, _kwargs)
+        return val
+    def SetBackSpaceUnIndents(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_SetBackSpaceUnIndents,(self,) + _args, _kwargs)
+        return val
+    def GetBackSpaceUnIndents(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_GetBackSpaceUnIndents,(self,) + _args, _kwargs)
+        return val
+    def SetMouseDwellTime(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_SetMouseDwellTime,(self,) + _args, _kwargs)
+        return val
+    def GetMouseDwellTime(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_GetMouseDwellTime,(self,) + _args, _kwargs)
+        return val
+    def MoveCaretInsideView(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_MoveCaretInsideView,(self,) + _args, _kwargs)
+        return val
     def LineLength(self, *_args, **_kwargs):
         val = apply(stc_c.wxStyledTextCtrl_LineLength,(self,) + _args, _kwargs)
         return val
@@ -722,6 +822,51 @@ class wxStyledTextCtrlPtr(wxControlPtr):
     def GetModEventMask(self, *_args, **_kwargs):
         val = apply(stc_c.wxStyledTextCtrl_GetModEventMask,(self,) + _args, _kwargs)
         return val
+    def SetFocus(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_SetFocus,(self,) + _args, _kwargs)
+        return val
+    def GetFocus(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_GetFocus,(self,) + _args, _kwargs)
+        return val
+    def SetStatus(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_SetStatus,(self,) + _args, _kwargs)
+        return val
+    def GetStatus(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_GetStatus,(self,) + _args, _kwargs)
+        return val
+    def SetMouseDownCaptures(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_SetMouseDownCaptures,(self,) + _args, _kwargs)
+        return val
+    def GetMouseDownCaptures(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_GetMouseDownCaptures,(self,) + _args, _kwargs)
+        return val
+    def SetCursor(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_SetCursor,(self,) + _args, _kwargs)
+        return val
+    def GetCursor(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_GetCursor,(self,) + _args, _kwargs)
+        return val
+    def WordPartLeft(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_WordPartLeft,(self,) + _args, _kwargs)
+        return val
+    def WordPartLeftExtend(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_WordPartLeftExtend,(self,) + _args, _kwargs)
+        return val
+    def WordPartRight(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_WordPartRight,(self,) + _args, _kwargs)
+        return val
+    def WordPartRightExtend(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_WordPartRightExtend,(self,) + _args, _kwargs)
+        return val
+    def SetVisiblePolicy(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_SetVisiblePolicy,(self,) + _args, _kwargs)
+        return val
+    def DelLineLeft(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_DelLineLeft,(self,) + _args, _kwargs)
+        return val
+    def DelLineRight(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_DelLineRight,(self,) + _args, _kwargs)
+        return val
     def StartRecord(self, *_args, **_kwargs):
         val = apply(stc_c.wxStyledTextCtrl_StartRecord,(self,) + _args, _kwargs)
         return val
@@ -743,6 +888,9 @@ class wxStyledTextCtrlPtr(wxControlPtr):
     def SetKeyWords(self, *_args, **_kwargs):
         val = apply(stc_c.wxStyledTextCtrl_SetKeyWords,(self,) + _args, _kwargs)
         return val
+    def SetLexerLanguage(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_SetLexerLanguage,(self,) + _args, _kwargs)
+        return val
     def GetCurrentLine(self, *_args, **_kwargs):
         val = apply(stc_c.wxStyledTextCtrl_GetCurrentLine,(self,) + _args, _kwargs)
         return val
@@ -774,6 +922,9 @@ class wxStyledTextCtrlPtr(wxControlPtr):
     def ScrollToColumn(self, *_args, **_kwargs):
         val = apply(stc_c.wxStyledTextCtrl_ScrollToColumn,(self,) + _args, _kwargs)
         return val
+    def SendMsg(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextCtrl_SendMsg,(self,) + _args, _kwargs)
+        return val
     def __repr__(self):
         return "<C wxStyledTextCtrl instance at %s>" % (self.this,)
 class wxStyledTextCtrl(wxStyledTextCtrlPtr):
@@ -833,6 +984,15 @@ class wxStyledTextEventPtr(wxCommandEventPtr):
     def SetLParam(self, *_args, **_kwargs):
         val = apply(stc_c.wxStyledTextEvent_SetLParam,(self,) + _args, _kwargs)
         return val
+    def SetListType(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextEvent_SetListType,(self,) + _args, _kwargs)
+        return val
+    def SetX(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextEvent_SetX,(self,) + _args, _kwargs)
+        return val
+    def SetY(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextEvent_SetY,(self,) + _args, _kwargs)
+        return val
     def GetPosition(self, *_args, **_kwargs):
         val = apply(stc_c.wxStyledTextEvent_GetPosition,(self,) + _args, _kwargs)
         return val
@@ -875,6 +1035,15 @@ class wxStyledTextEventPtr(wxCommandEventPtr):
     def GetLParam(self, *_args, **_kwargs):
         val = apply(stc_c.wxStyledTextEvent_GetLParam,(self,) + _args, _kwargs)
         return val
+    def GetListType(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextEvent_GetListType,(self,) + _args, _kwargs)
+        return val
+    def GetX(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextEvent_GetX,(self,) + _args, _kwargs)
+        return val
+    def GetY(self, *_args, **_kwargs):
+        val = apply(stc_c.wxStyledTextEvent_GetY,(self,) + _args, _kwargs)
+        return val
     def GetShift(self, *_args, **_kwargs):
         val = apply(stc_c.wxStyledTextEvent_GetShift,(self,) + _args, _kwargs)
         return val
@@ -928,6 +1097,24 @@ wxSTC_MARK_EMPTY = stc_c.wxSTC_MARK_EMPTY
 wxSTC_MARK_ARROWDOWN = stc_c.wxSTC_MARK_ARROWDOWN
 wxSTC_MARK_MINUS = stc_c.wxSTC_MARK_MINUS
 wxSTC_MARK_PLUS = stc_c.wxSTC_MARK_PLUS
+wxSTC_MARK_VLINE = stc_c.wxSTC_MARK_VLINE
+wxSTC_MARK_LCORNER = stc_c.wxSTC_MARK_LCORNER
+wxSTC_MARK_TCORNER = stc_c.wxSTC_MARK_TCORNER
+wxSTC_MARK_BOXPLUS = stc_c.wxSTC_MARK_BOXPLUS
+wxSTC_MARK_BOXPLUSCONNECTED = stc_c.wxSTC_MARK_BOXPLUSCONNECTED
+wxSTC_MARK_BOXMINUS = stc_c.wxSTC_MARK_BOXMINUS
+wxSTC_MARK_BOXMINUSCONNECTED = stc_c.wxSTC_MARK_BOXMINUSCONNECTED
+wxSTC_MARK_LCORNERCURVE = stc_c.wxSTC_MARK_LCORNERCURVE
+wxSTC_MARK_TCORNERCURVE = stc_c.wxSTC_MARK_TCORNERCURVE
+wxSTC_MARK_CIRCLEPLUS = stc_c.wxSTC_MARK_CIRCLEPLUS
+wxSTC_MARK_CIRCLEPLUSCONNECTED = stc_c.wxSTC_MARK_CIRCLEPLUSCONNECTED
+wxSTC_MARK_CIRCLEMINUS = stc_c.wxSTC_MARK_CIRCLEMINUS
+wxSTC_MARK_CIRCLEMINUSCONNECTED = stc_c.wxSTC_MARK_CIRCLEMINUSCONNECTED
+wxSTC_MARKNUM_FOLDEREND = stc_c.wxSTC_MARKNUM_FOLDEREND
+wxSTC_MARKNUM_FOLDEROPENMID = stc_c.wxSTC_MARKNUM_FOLDEROPENMID
+wxSTC_MARKNUM_FOLDERMIDTAIL = stc_c.wxSTC_MARKNUM_FOLDERMIDTAIL
+wxSTC_MARKNUM_FOLDERTAIL = stc_c.wxSTC_MARKNUM_FOLDERTAIL
+wxSTC_MARKNUM_FOLDERSUB = stc_c.wxSTC_MARKNUM_FOLDERSUB
 wxSTC_MARKNUM_FOLDER = stc_c.wxSTC_MARKNUM_FOLDER
 wxSTC_MARKNUM_FOLDEROPEN = stc_c.wxSTC_MARKNUM_FOLDEROPEN
 wxSTC_MARGIN_SYMBOL = stc_c.wxSTC_MARGIN_SYMBOL
@@ -958,6 +1145,9 @@ wxSTC_CHARSET_HEBREW = stc_c.wxSTC_CHARSET_HEBREW
 wxSTC_CHARSET_ARABIC = stc_c.wxSTC_CHARSET_ARABIC
 wxSTC_CHARSET_VIETNAMESE = stc_c.wxSTC_CHARSET_VIETNAMESE
 wxSTC_CHARSET_THAI = stc_c.wxSTC_CHARSET_THAI
+wxSTC_CASE_MIXED = stc_c.wxSTC_CASE_MIXED
+wxSTC_CASE_UPPER = stc_c.wxSTC_CASE_UPPER
+wxSTC_CASE_LOWER = stc_c.wxSTC_CASE_LOWER
 wxSTC_INDIC_MAX = stc_c.wxSTC_INDIC_MAX
 wxSTC_INDIC_PLAIN = stc_c.wxSTC_INDIC_PLAIN
 wxSTC_INDIC_SQUIGGLE = stc_c.wxSTC_INDIC_SQUIGGLE
@@ -971,7 +1161,8 @@ wxSTC_INDICS_MASK = stc_c.wxSTC_INDICS_MASK
 wxSTC_PRINT_NORMAL = stc_c.wxSTC_PRINT_NORMAL
 wxSTC_PRINT_INVERTLIGHT = stc_c.wxSTC_PRINT_INVERTLIGHT
 wxSTC_PRINT_BLACKONWHITE = stc_c.wxSTC_PRINT_BLACKONWHITE
-wxSTC_FIND_DOWN = stc_c.wxSTC_FIND_DOWN
+wxSTC_PRINT_COLOURONWHITE = stc_c.wxSTC_PRINT_COLOURONWHITE
+wxSTC_PRINT_COLOURONWHITEDEFAULTBG = stc_c.wxSTC_PRINT_COLOURONWHITEDEFAULTBG
 wxSTC_FIND_WHOLEWORD = stc_c.wxSTC_FIND_WHOLEWORD
 wxSTC_FIND_MATCHCASE = stc_c.wxSTC_FIND_MATCHCASE
 wxSTC_FIND_WORDSTART = stc_c.wxSTC_FIND_WORDSTART
@@ -984,6 +1175,7 @@ wxSTC_FOLDLEVELBASE = stc_c.wxSTC_FOLDLEVELBASE
 wxSTC_FOLDLEVELWHITEFLAG = stc_c.wxSTC_FOLDLEVELWHITEFLAG
 wxSTC_FOLDLEVELHEADERFLAG = stc_c.wxSTC_FOLDLEVELHEADERFLAG
 wxSTC_FOLDLEVELNUMBERMASK = stc_c.wxSTC_FOLDLEVELNUMBERMASK
+wxSTC_TIME_FOREVER = stc_c.wxSTC_TIME_FOREVER
 wxSTC_CMD_LINEDOWN = stc_c.wxSTC_CMD_LINEDOWN
 wxSTC_CMD_LINEDOWNEXTEND = stc_c.wxSTC_CMD_LINEDOWNEXTEND
 wxSTC_CMD_LINEUP = stc_c.wxSTC_CMD_LINEUP
@@ -1034,6 +1226,12 @@ wxSTC_EDGE_BACKGROUND = stc_c.wxSTC_EDGE_BACKGROUND
 wxSTC_CARET_SLOP = stc_c.wxSTC_CARET_SLOP
 wxSTC_CARET_CENTER = stc_c.wxSTC_CARET_CENTER
 wxSTC_CARET_STRICT = stc_c.wxSTC_CARET_STRICT
+wxSTC_CARET_XEVEN = stc_c.wxSTC_CARET_XEVEN
+wxSTC_CARET_XJUMPS = stc_c.wxSTC_CARET_XJUMPS
+wxSTC_CURSORNORMAL = stc_c.wxSTC_CURSORNORMAL
+wxSTC_CURSORWAIT = stc_c.wxSTC_CURSORWAIT
+wxSTC_VISIBLE_SLOP = stc_c.wxSTC_VISIBLE_SLOP
+wxSTC_VISIBLE_STRICT = stc_c.wxSTC_VISIBLE_STRICT
 wxSTC_MOD_INSERTTEXT = stc_c.wxSTC_MOD_INSERTTEXT
 wxSTC_MOD_DELETETEXT = stc_c.wxSTC_MOD_DELETETEXT
 wxSTC_MOD_CHANGESTYLE = stc_c.wxSTC_MOD_CHANGESTYLE
@@ -1083,6 +1281,16 @@ wxSTC_LEX_XCODE = stc_c.wxSTC_LEX_XCODE
 wxSTC_LEX_LATEX = stc_c.wxSTC_LEX_LATEX
 wxSTC_LEX_LUA = stc_c.wxSTC_LEX_LUA
 wxSTC_LEX_DIFF = stc_c.wxSTC_LEX_DIFF
+wxSTC_LEX_CONF = stc_c.wxSTC_LEX_CONF
+wxSTC_LEX_PASCAL = stc_c.wxSTC_LEX_PASCAL
+wxSTC_LEX_AVE = stc_c.wxSTC_LEX_AVE
+wxSTC_LEX_ADA = stc_c.wxSTC_LEX_ADA
+wxSTC_LEX_LISP = stc_c.wxSTC_LEX_LISP
+wxSTC_LEX_RUBY = stc_c.wxSTC_LEX_RUBY
+wxSTC_LEX_EIFFEL = stc_c.wxSTC_LEX_EIFFEL
+wxSTC_LEX_EIFFELKW = stc_c.wxSTC_LEX_EIFFELKW
+wxSTC_LEX_TCL = stc_c.wxSTC_LEX_TCL
+wxSTC_LEX_AUTOMATIC = stc_c.wxSTC_LEX_AUTOMATIC
 wxSTC_P_DEFAULT = stc_c.wxSTC_P_DEFAULT
 wxSTC_P_COMMENTLINE = stc_c.wxSTC_P_COMMENTLINE
 wxSTC_P_NUMBER = stc_c.wxSTC_P_NUMBER
@@ -1111,6 +1319,9 @@ wxSTC_C_OPERATOR = stc_c.wxSTC_C_OPERATOR
 wxSTC_C_IDENTIFIER = stc_c.wxSTC_C_IDENTIFIER
 wxSTC_C_STRINGEOL = stc_c.wxSTC_C_STRINGEOL
 wxSTC_C_VERBATIM = stc_c.wxSTC_C_VERBATIM
+wxSTC_C_REGEX = stc_c.wxSTC_C_REGEX
+wxSTC_C_COMMENTLINEDOC = stc_c.wxSTC_C_COMMENTLINEDOC
+wxSTC_C_WORD2 = stc_c.wxSTC_C_WORD2
 wxSTC_H_DEFAULT = stc_c.wxSTC_H_DEFAULT
 wxSTC_H_TAG = stc_c.wxSTC_H_TAG
 wxSTC_H_TAGUNKNOWN = stc_c.wxSTC_H_TAGUNKNOWN
@@ -1131,6 +1342,8 @@ wxSTC_H_ASPAT = stc_c.wxSTC_H_ASPAT
 wxSTC_H_CDATA = stc_c.wxSTC_H_CDATA
 wxSTC_H_QUESTION = stc_c.wxSTC_H_QUESTION
 wxSTC_H_VALUE = stc_c.wxSTC_H_VALUE
+wxSTC_H_XCCOMMENT = stc_c.wxSTC_H_XCCOMMENT
+wxSTC_H_SGML = stc_c.wxSTC_H_SGML
 wxSTC_HJ_START = stc_c.wxSTC_HJ_START
 wxSTC_HJ_DEFAULT = stc_c.wxSTC_HJ_DEFAULT
 wxSTC_HJ_COMMENT = stc_c.wxSTC_HJ_COMMENT
@@ -1143,6 +1356,7 @@ wxSTC_HJ_DOUBLESTRING = stc_c.wxSTC_HJ_DOUBLESTRING
 wxSTC_HJ_SINGLESTRING = stc_c.wxSTC_HJ_SINGLESTRING
 wxSTC_HJ_SYMBOLS = stc_c.wxSTC_HJ_SYMBOLS
 wxSTC_HJ_STRINGEOL = stc_c.wxSTC_HJ_STRINGEOL
+wxSTC_HJ_REGEX = stc_c.wxSTC_HJ_REGEX
 wxSTC_HJA_START = stc_c.wxSTC_HJA_START
 wxSTC_HJA_DEFAULT = stc_c.wxSTC_HJA_DEFAULT
 wxSTC_HJA_COMMENT = stc_c.wxSTC_HJA_COMMENT
@@ -1155,6 +1369,7 @@ wxSTC_HJA_DOUBLESTRING = stc_c.wxSTC_HJA_DOUBLESTRING
 wxSTC_HJA_SINGLESTRING = stc_c.wxSTC_HJA_SINGLESTRING
 wxSTC_HJA_SYMBOLS = stc_c.wxSTC_HJA_SYMBOLS
 wxSTC_HJA_STRINGEOL = stc_c.wxSTC_HJA_STRINGEOL
+wxSTC_HJA_REGEX = stc_c.wxSTC_HJA_REGEX
 wxSTC_HB_START = stc_c.wxSTC_HB_START
 wxSTC_HB_DEFAULT = stc_c.wxSTC_HB_DEFAULT
 wxSTC_HB_COMMENTLINE = stc_c.wxSTC_HB_COMMENTLINE
@@ -1205,9 +1420,10 @@ wxSTC_HPHP_NUMBER = stc_c.wxSTC_HPHP_NUMBER
 wxSTC_HPHP_VARIABLE = stc_c.wxSTC_HPHP_VARIABLE
 wxSTC_HPHP_COMMENT = stc_c.wxSTC_HPHP_COMMENT
 wxSTC_HPHP_COMMENTLINE = stc_c.wxSTC_HPHP_COMMENTLINE
-wxSTC_HPHP_STRINGEOL = stc_c.wxSTC_HPHP_STRINGEOL
+wxSTC_HPHP_HSTRING_VARIABLE = stc_c.wxSTC_HPHP_HSTRING_VARIABLE
+wxSTC_HPHP_OPERATOR = stc_c.wxSTC_HPHP_OPERATOR
 wxSTC_PL_DEFAULT = stc_c.wxSTC_PL_DEFAULT
-wxSTC_PL_HERE = stc_c.wxSTC_PL_HERE
+wxSTC_PL_ERROR = stc_c.wxSTC_PL_ERROR
 wxSTC_PL_COMMENTLINE = stc_c.wxSTC_PL_COMMENTLINE
 wxSTC_PL_POD = stc_c.wxSTC_PL_POD
 wxSTC_PL_NUMBER = stc_c.wxSTC_PL_NUMBER
@@ -1222,12 +1438,20 @@ wxSTC_PL_SCALAR = stc_c.wxSTC_PL_SCALAR
 wxSTC_PL_ARRAY = stc_c.wxSTC_PL_ARRAY
 wxSTC_PL_HASH = stc_c.wxSTC_PL_HASH
 wxSTC_PL_SYMBOLTABLE = stc_c.wxSTC_PL_SYMBOLTABLE
-wxSTC_PL_REF = stc_c.wxSTC_PL_REF
 wxSTC_PL_REGEX = stc_c.wxSTC_PL_REGEX
 wxSTC_PL_REGSUBST = stc_c.wxSTC_PL_REGSUBST
 wxSTC_PL_LONGQUOTE = stc_c.wxSTC_PL_LONGQUOTE
 wxSTC_PL_BACKTICKS = stc_c.wxSTC_PL_BACKTICKS
 wxSTC_PL_DATASECTION = stc_c.wxSTC_PL_DATASECTION
+wxSTC_PL_HERE_DELIM = stc_c.wxSTC_PL_HERE_DELIM
+wxSTC_PL_HERE_Q = stc_c.wxSTC_PL_HERE_Q
+wxSTC_PL_HERE_QQ = stc_c.wxSTC_PL_HERE_QQ
+wxSTC_PL_HERE_QX = stc_c.wxSTC_PL_HERE_QX
+wxSTC_PL_STRING_Q = stc_c.wxSTC_PL_STRING_Q
+wxSTC_PL_STRING_QQ = stc_c.wxSTC_PL_STRING_QQ
+wxSTC_PL_STRING_QX = stc_c.wxSTC_PL_STRING_QX
+wxSTC_PL_STRING_QR = stc_c.wxSTC_PL_STRING_QR
+wxSTC_PL_STRING_QW = stc_c.wxSTC_PL_STRING_QW
 wxSTC_L_DEFAULT = stc_c.wxSTC_L_DEFAULT
 wxSTC_L_COMMAND = stc_c.wxSTC_L_COMMAND
 wxSTC_L_TAG = stc_c.wxSTC_L_TAG
@@ -1253,22 +1477,95 @@ wxSTC_ERR_MS = stc_c.wxSTC_ERR_MS
 wxSTC_ERR_CMD = stc_c.wxSTC_ERR_CMD
 wxSTC_ERR_BORLAND = stc_c.wxSTC_ERR_BORLAND
 wxSTC_ERR_PERL = stc_c.wxSTC_ERR_PERL
+wxSTC_ERR_NET = stc_c.wxSTC_ERR_NET
+wxSTC_ERR_LUA = stc_c.wxSTC_ERR_LUA
+wxSTC_ERR_DIFF_CHANGED = stc_c.wxSTC_ERR_DIFF_CHANGED
+wxSTC_ERR_DIFF_ADDITION = stc_c.wxSTC_ERR_DIFF_ADDITION
+wxSTC_ERR_DIFF_DELETION = stc_c.wxSTC_ERR_DIFF_DELETION
+wxSTC_ERR_DIFF_MESSAGE = stc_c.wxSTC_ERR_DIFF_MESSAGE
+wxSTC_BAT_DEFAULT = stc_c.wxSTC_BAT_DEFAULT
+wxSTC_BAT_COMMENT = stc_c.wxSTC_BAT_COMMENT
+wxSTC_BAT_WORD = stc_c.wxSTC_BAT_WORD
+wxSTC_BAT_LABEL = stc_c.wxSTC_BAT_LABEL
+wxSTC_BAT_HIDE = stc_c.wxSTC_BAT_HIDE
+wxSTC_BAT_COMMAND = stc_c.wxSTC_BAT_COMMAND
+wxSTC_BAT_IDENTIFIER = stc_c.wxSTC_BAT_IDENTIFIER
+wxSTC_BAT_OPERATOR = stc_c.wxSTC_BAT_OPERATOR
+wxSTC_MAKE_DEFAULT = stc_c.wxSTC_MAKE_DEFAULT
+wxSTC_MAKE_COMMENT = stc_c.wxSTC_MAKE_COMMENT
+wxSTC_MAKE_PREPROCESSOR = stc_c.wxSTC_MAKE_PREPROCESSOR
+wxSTC_MAKE_IDENTIFIER = stc_c.wxSTC_MAKE_IDENTIFIER
+wxSTC_MAKE_OPERATOR = stc_c.wxSTC_MAKE_OPERATOR
+wxSTC_MAKE_TARGET = stc_c.wxSTC_MAKE_TARGET
+wxSTC_MAKE_IDEOL = stc_c.wxSTC_MAKE_IDEOL
+wxSTC_CONF_DEFAULT = stc_c.wxSTC_CONF_DEFAULT
+wxSTC_CONF_COMMENT = stc_c.wxSTC_CONF_COMMENT
+wxSTC_CONF_NUMBER = stc_c.wxSTC_CONF_NUMBER
+wxSTC_CONF_IDENTIFIER = stc_c.wxSTC_CONF_IDENTIFIER
+wxSTC_CONF_EXTENSION = stc_c.wxSTC_CONF_EXTENSION
+wxSTC_CONF_PARAMETER = stc_c.wxSTC_CONF_PARAMETER
+wxSTC_CONF_STRING = stc_c.wxSTC_CONF_STRING
+wxSTC_CONF_OPERATOR = stc_c.wxSTC_CONF_OPERATOR
+wxSTC_CONF_IP = stc_c.wxSTC_CONF_IP
+wxSTC_CONF_DIRECTIVE = stc_c.wxSTC_CONF_DIRECTIVE
+wxSTC_AVE_DEFAULT = stc_c.wxSTC_AVE_DEFAULT
+wxSTC_AVE_COMMENT = stc_c.wxSTC_AVE_COMMENT
+wxSTC_AVE_NUMBER = stc_c.wxSTC_AVE_NUMBER
+wxSTC_AVE_WORD = stc_c.wxSTC_AVE_WORD
+wxSTC_AVE_KEYWORD = stc_c.wxSTC_AVE_KEYWORD
+wxSTC_AVE_STATEMENT = stc_c.wxSTC_AVE_STATEMENT
+wxSTC_AVE_STRING = stc_c.wxSTC_AVE_STRING
+wxSTC_AVE_ENUM = stc_c.wxSTC_AVE_ENUM
+wxSTC_AVE_STRINGEOL = stc_c.wxSTC_AVE_STRINGEOL
+wxSTC_AVE_IDENTIFIER = stc_c.wxSTC_AVE_IDENTIFIER
+wxSTC_AVE_OPERATOR = stc_c.wxSTC_AVE_OPERATOR
+wxSTC_ADA_DEFAULT = stc_c.wxSTC_ADA_DEFAULT
+wxSTC_ADA_COMMENT = stc_c.wxSTC_ADA_COMMENT
+wxSTC_ADA_NUMBER = stc_c.wxSTC_ADA_NUMBER
+wxSTC_ADA_WORD = stc_c.wxSTC_ADA_WORD
+wxSTC_ADA_STRING = stc_c.wxSTC_ADA_STRING
+wxSTC_ADA_CHARACTER = stc_c.wxSTC_ADA_CHARACTER
+wxSTC_ADA_OPERATOR = stc_c.wxSTC_ADA_OPERATOR
+wxSTC_ADA_IDENTIFIER = stc_c.wxSTC_ADA_IDENTIFIER
+wxSTC_ADA_STRINGEOL = stc_c.wxSTC_ADA_STRINGEOL
+wxSTC_LISP_DEFAULT = stc_c.wxSTC_LISP_DEFAULT
+wxSTC_LISP_COMMENT = stc_c.wxSTC_LISP_COMMENT
+wxSTC_LISP_NUMBER = stc_c.wxSTC_LISP_NUMBER
+wxSTC_LISP_KEYWORD = stc_c.wxSTC_LISP_KEYWORD
+wxSTC_LISP_STRING = stc_c.wxSTC_LISP_STRING
+wxSTC_LISP_STRINGEOL = stc_c.wxSTC_LISP_STRINGEOL
+wxSTC_LISP_IDENTIFIER = stc_c.wxSTC_LISP_IDENTIFIER
+wxSTC_LISP_OPERATOR = stc_c.wxSTC_LISP_OPERATOR
+wxSTC_EIFFEL_DEFAULT = stc_c.wxSTC_EIFFEL_DEFAULT
+wxSTC_EIFFEL_COMMENTLINE = stc_c.wxSTC_EIFFEL_COMMENTLINE
+wxSTC_EIFFEL_NUMBER = stc_c.wxSTC_EIFFEL_NUMBER
+wxSTC_EIFFEL_WORD = stc_c.wxSTC_EIFFEL_WORD
+wxSTC_EIFFEL_STRING = stc_c.wxSTC_EIFFEL_STRING
+wxSTC_EIFFEL_CHARACTER = stc_c.wxSTC_EIFFEL_CHARACTER
+wxSTC_EIFFEL_OPERATOR = stc_c.wxSTC_EIFFEL_OPERATOR
+wxSTC_EIFFEL_IDENTIFIER = stc_c.wxSTC_EIFFEL_IDENTIFIER
+wxSTC_EIFFEL_STRINGEOL = stc_c.wxSTC_EIFFEL_STRINGEOL
 wxSTC_MASK_FOLDERS = stc_c.wxSTC_MASK_FOLDERS
 wxSTCNameStr = stc_c.wxSTCNameStr
 wxEVT_STC_CHANGE = stc_c.wxEVT_STC_CHANGE
 wxEVT_STC_STYLENEEDED = stc_c.wxEVT_STC_STYLENEEDED
 wxEVT_STC_CHARADDED = stc_c.wxEVT_STC_CHARADDED
-wxEVT_STC_UPDATEUI = stc_c.wxEVT_STC_UPDATEUI
 wxEVT_STC_SAVEPOINTREACHED = stc_c.wxEVT_STC_SAVEPOINTREACHED
 wxEVT_STC_SAVEPOINTLEFT = stc_c.wxEVT_STC_SAVEPOINTLEFT
 wxEVT_STC_ROMODIFYATTEMPT = stc_c.wxEVT_STC_ROMODIFYATTEMPT
+wxEVT_STC_KEY = stc_c.wxEVT_STC_KEY
 wxEVT_STC_DOUBLECLICK = stc_c.wxEVT_STC_DOUBLECLICK
+wxEVT_STC_UPDATEUI = stc_c.wxEVT_STC_UPDATEUI
 wxEVT_STC_MODIFIED = stc_c.wxEVT_STC_MODIFIED
-wxEVT_STC_KEY = stc_c.wxEVT_STC_KEY
 wxEVT_STC_MACRORECORD = stc_c.wxEVT_STC_MACRORECORD
 wxEVT_STC_MARGINCLICK = stc_c.wxEVT_STC_MARGINCLICK
 wxEVT_STC_NEEDSHOWN = stc_c.wxEVT_STC_NEEDSHOWN
 wxEVT_STC_POSCHANGED = stc_c.wxEVT_STC_POSCHANGED
+wxEVT_STC_PAINTED = stc_c.wxEVT_STC_PAINTED
+wxEVT_STC_USERLISTSELECTION = stc_c.wxEVT_STC_USERLISTSELECTION
+wxEVT_STC_URIDROPPED = stc_c.wxEVT_STC_URIDROPPED
+wxEVT_STC_DWELLSTART = stc_c.wxEVT_STC_DWELLSTART
+wxEVT_STC_DWELLEND = stc_c.wxEVT_STC_DWELLEND
 
 
 #-------------- USER INCLUDE -----------------------
diff --git a/wxPython/demo/data/stc.h b/wxPython/demo/data/stc.h
deleted file mode 100644
index fc07f2f616..0000000000
--- a/wxPython/demo/data/stc.h
+++ /dev/null
@@ -1,1396 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-// Name:        stc.h
-// Purpose:     A wxWindows implementation of Scintilla.  This class is the
-//              one meant to be used directly by wx applications.  It does not
-//              derive directly from the Scintilla classes, and in fact there
-//              is no mention of Scintilla classes at all in this header.
-//              This class delegates all method calls and events to the
-//              Scintilla objects and so forth.  This allows the use of
-//              Scintilla without polluting the namespace with all the
-//              classes and itentifiers from Scintilla.
-//
-// Author:      Robin Dunn
-//
-// Created:     13-Jan-2000
-// RCS-ID:      $Id$
-// Copyright:   (c) 2000 by Total Control Software
-// Licence:     wxWindows license
-/////////////////////////////////////////////////////////////////////////////
-
-#ifndef __stc_h__
-#define __stc_h__
-
-
-#include <wx/wx.h>
-
-//----------------------------------------------------------------------
-// BEGIN generated section.  The following code is automatically generated
-//       by gen_iface.py.  Do not edit this file.  Edit stc.h.in instead
-//       and regenerate
-
-#define wxSTC_INVALID_POSITION -1
-#define wxSTC_START 2000
-#define wxSTC_OPTIONAL_START 3000
-#define wxSTC_LEXER_START 4000
-#define wxSTC_CMD_REDO 2011
-#define wxSTC_CMD_SELECTALL 2013
-#define wxSTC_WS_INVISIBLE 0
-#define wxSTC_WS_VISIBLEALWAYS 1
-#define wxSTC_WS_VISIBLEAFTERINDENT 2
-#define wxSTC_EOL_CRLF 0
-#define wxSTC_EOL_CR 1
-#define wxSTC_EOL_LF 2
-
-// The SC_CP_UTF8 value can be used to enter Unicode mode.
-// This is the same value as CP_UTF8 in Windows
-#define wxSTC_CP_UTF8 65001
-#define wxSTC_MARKER_MAX 31
-#define wxSTC_MARK_CIRCLE 0
-#define wxSTC_MARK_ROUNDRECT 1
-#define wxSTC_MARK_ARROW 2
-#define wxSTC_MARK_SMALLRECT 3
-#define wxSTC_MARK_SHORTARROW 4
-#define wxSTC_MARK_EMPTY 5
-#define wxSTC_MARK_ARROWDOWN 6
-#define wxSTC_MARK_MINUS 7
-#define wxSTC_MARK_PLUS 8
-#define wxSTC_MARKNUM_FOLDER 30
-#define wxSTC_MARKNUM_FOLDEROPEN 31
-#define wxSTC_MARGIN_SYMBOL 0
-#define wxSTC_MARGIN_NUMBER 1
-#define wxSTC_STYLE_DEFAULT 32
-#define wxSTC_STYLE_LINENUMBER 33
-#define wxSTC_STYLE_BRACELIGHT 34
-#define wxSTC_STYLE_BRACEBAD 35
-#define wxSTC_STYLE_CONTROLCHAR 36
-#define wxSTC_STYLE_INDENTGUIDE 37
-#define wxSTC_STYLE_MAX 127
-
-// Character set identifiers are used in StyleSetCharacterSet.
-// The values are the same as the Windows *_CHARSET values.
-#define wxSTC_CHARSET_ANSI 0
-#define wxSTC_CHARSET_DEFAULT 1
-#define wxSTC_CHARSET_BALTIC 186
-#define wxSTC_CHARSET_CHINESEBIG5 136
-#define wxSTC_CHARSET_EASTEUROPE 238
-#define wxSTC_CHARSET_GB2312 134
-#define wxSTC_CHARSET_GREEK 161
-#define wxSTC_CHARSET_HANGUL 129
-#define wxSTC_CHARSET_MAC 77
-#define wxSTC_CHARSET_OEM 255
-#define wxSTC_CHARSET_RUSSIAN 204
-#define wxSTC_CHARSET_SHIFTJIS 128
-#define wxSTC_CHARSET_SYMBOL 2
-#define wxSTC_CHARSET_TURKISH 162
-#define wxSTC_CHARSET_JOHAB 130
-#define wxSTC_CHARSET_HEBREW 177
-#define wxSTC_CHARSET_ARABIC 178
-#define wxSTC_CHARSET_VIETNAMESE 163
-#define wxSTC_CHARSET_THAI 222
-#define wxSTC_INDIC_MAX 7
-#define wxSTC_INDIC_PLAIN 0
-#define wxSTC_INDIC_SQUIGGLE 1
-#define wxSTC_INDIC_TT 2
-#define wxSTC_INDIC_DIAGONAL 3
-#define wxSTC_INDIC_STRIKE 4
-#define wxSTC_INDIC0_MASK 32
-#define wxSTC_INDIC1_MASK 64
-#define wxSTC_INDIC2_MASK 128
-#define wxSTC_INDICS_MASK 32 | 64 | 128
-
-// PrintColourMode - use same colours as screen.
-#define wxSTC_PRINT_NORMAL 0
-
-// PrintColourMode - invert the light value of each style for printing.
-#define wxSTC_PRINT_INVERTLIGHT 1
-
-// PrintColourMode - force black text on white background for printing.
-#define wxSTC_PRINT_BLACKONWHITE 2
-#define wxSTC_FIND_DOWN 1
-#define wxSTC_FIND_WHOLEWORD 2
-#define wxSTC_FIND_MATCHCASE 4
-#define wxSTC_FIND_WORDSTART 0x00100000
-
-// SCFIND_REGEXP is not yet implemented.
-#define wxSTC_FIND_REGEXP 0x00200000
-#define wxSTC_CMD_UNDO 2176
-#define wxSTC_CMD_CUT 2177
-#define wxSTC_CMD_COPY 2178
-#define wxSTC_CMD_PASTE 2179
-#define wxSTC_FOLDLEVELBASE 0x400
-#define wxSTC_FOLDLEVELWHITEFLAG 0x1000
-#define wxSTC_FOLDLEVELHEADERFLAG 0x2000
-#define wxSTC_FOLDLEVELNUMBERMASK 0x0FFF
-#define wxSTC_CMD_LINEDOWN 2300
-#define wxSTC_CMD_LINEDOWNEXTEND 2301
-#define wxSTC_CMD_LINEUP 2302
-#define wxSTC_CMD_LINEUPEXTEND 2303
-#define wxSTC_CMD_CHARLEFT 2304
-#define wxSTC_CMD_CHARLEFTEXTEND 2305
-#define wxSTC_CMD_CHARRIGHT 2306
-#define wxSTC_CMD_CHARRIGHTEXTEND 2307
-#define wxSTC_CMD_WORDLEFT 2308
-#define wxSTC_CMD_WORDLEFTEXTEND 2309
-#define wxSTC_CMD_WORDRIGHT 2310
-#define wxSTC_CMD_WORDRIGHTEXTEND 2311
-#define wxSTC_CMD_HOME 2312
-#define wxSTC_CMD_HOMEEXTEND 2313
-#define wxSTC_CMD_LINEEND 2314
-#define wxSTC_CMD_LINEENDEXTEND 2315
-#define wxSTC_CMD_DOCUMENTSTART 2316
-#define wxSTC_CMD_DOCUMENTSTARTEXTEND 2317
-#define wxSTC_CMD_DOCUMENTEND 2318
-#define wxSTC_CMD_DOCUMENTENDEXTEND 2319
-#define wxSTC_CMD_PAGEUP 2320
-#define wxSTC_CMD_PAGEUPEXTEND 2321
-#define wxSTC_CMD_PAGEDOWN 2322
-#define wxSTC_CMD_PAGEDOWNEXTEND 2323
-#define wxSTC_CMD_EDITTOGGLEOVERTYPE 2324
-#define wxSTC_CMD_CANCEL 2325
-#define wxSTC_CMD_DELETEBACK 2326
-#define wxSTC_CMD_TAB 2327
-#define wxSTC_CMD_BACKTAB 2328
-#define wxSTC_CMD_NEWLINE 2329
-#define wxSTC_CMD_FORMFEED 2330
-#define wxSTC_CMD_VCHOME 2331
-#define wxSTC_CMD_VCHOMEEXTEND 2332
-#define wxSTC_CMD_ZOOMIN 2333
-#define wxSTC_CMD_ZOOMOUT 2334
-#define wxSTC_CMD_DELWORDLEFT 2335
-#define wxSTC_CMD_DELWORDRIGHT 2336
-#define wxSTC_CMD_LINECUT 2337
-#define wxSTC_CMD_LINEDELETE 2338
-#define wxSTC_CMD_LINETRANSPOSE 2339
-#define wxSTC_CMD_LOWERCASE 2340
-#define wxSTC_CMD_UPPERCASE 2341
-#define wxSTC_CMD_LINESCROLLDOWN 2342
-#define wxSTC_CMD_LINESCROLLUP 2343
-#define wxSTC_EDGE_NONE 0
-#define wxSTC_EDGE_LINE 1
-#define wxSTC_EDGE_BACKGROUND 2
-
-// Show caret within N lines of edge when it's scrolled to view
-#define wxSTC_CARET_SLOP 0x01
-
-// Center caret on screen when it's scrolled to view
-#define wxSTC_CARET_CENTER 0x02
-
-// OR this with CARET_CENTER to reposition even when visible, or
-// OR this with CARET_SLOP to reposition whenever outside slop border
-#define wxSTC_CARET_STRICT 0x04
-
-// Notifications
-// Type of modification and the action which caused the modification
-// These are defined as a bit mask to make it easy to specify which notifications are wanted.
-// One bit is set from each of SC_MOD_* and SC_PERFORMED_*.
-#define wxSTC_MOD_INSERTTEXT 0x1
-#define wxSTC_MOD_DELETETEXT 0x2
-#define wxSTC_MOD_CHANGESTYLE 0x4
-#define wxSTC_MOD_CHANGEFOLD 0x8
-#define wxSTC_PERFORMED_USER 0x10
-#define wxSTC_PERFORMED_UNDO 0x20
-#define wxSTC_PERFORMED_REDO 0x40
-#define wxSTC_LASTSTEPINUNDOREDO 0x100
-#define wxSTC_MOD_CHANGEMARKER 0x200
-#define wxSTC_MOD_BEFOREINSERT 0x400
-#define wxSTC_MOD_BEFOREDELETE 0x800
-#define wxSTC_MODEVENTMASKALL 0xF77
-
-// Symbolic key codes and modifier flags
-// ASCII and other printable characters below 256
-// Extended keys above 300
-#define wxSTC_KEY_DOWN 300
-#define wxSTC_KEY_UP 301
-#define wxSTC_KEY_LEFT 302
-#define wxSTC_KEY_RIGHT 303
-#define wxSTC_KEY_HOME 304
-#define wxSTC_KEY_END 305
-#define wxSTC_KEY_PRIOR 306
-#define wxSTC_KEY_NEXT 307
-#define wxSTC_KEY_DELETE 308
-#define wxSTC_KEY_INSERT 309
-#define wxSTC_KEY_ESCAPE 7
-#define wxSTC_KEY_BACK 8
-#define wxSTC_KEY_TAB 9
-#define wxSTC_KEY_RETURN 13
-#define wxSTC_KEY_ADD 310
-#define wxSTC_KEY_SUBTRACT 311
-#define wxSTC_KEY_DIVIDE 312
-#define wxSTC_SCMOD_SHIFT 1
-#define wxSTC_SCMOD_CTRL 2
-#define wxSTC_SCMOD_ALT 4
-
-// For SciLexer.h
-#define wxSTC_LEX_CONTAINER 0
-#define wxSTC_LEX_NULL 1
-#define wxSTC_LEX_PYTHON 2
-#define wxSTC_LEX_CPP 3
-#define wxSTC_LEX_HTML 4
-#define wxSTC_LEX_XML 5
-#define wxSTC_LEX_PERL 6
-#define wxSTC_LEX_SQL 7
-#define wxSTC_LEX_VB 8
-#define wxSTC_LEX_PROPERTIES 9
-#define wxSTC_LEX_ERRORLIST 10
-#define wxSTC_LEX_MAKEFILE 11
-#define wxSTC_LEX_BATCH 12
-#define wxSTC_LEX_XCODE 13
-#define wxSTC_LEX_LATEX 14
-#define wxSTC_LEX_LUA 15
-#define wxSTC_LEX_DIFF 16
-
-// Lexical states for SCLEX_PYTHON
-#define wxSTC_P_DEFAULT 0
-#define wxSTC_P_COMMENTLINE 1
-#define wxSTC_P_NUMBER 2
-#define wxSTC_P_STRING 3
-#define wxSTC_P_CHARACTER 4
-#define wxSTC_P_WORD 5
-#define wxSTC_P_TRIPLE 6
-#define wxSTC_P_TRIPLEDOUBLE 7
-#define wxSTC_P_CLASSNAME 8
-#define wxSTC_P_DEFNAME 9
-#define wxSTC_P_OPERATOR 10
-#define wxSTC_P_IDENTIFIER 11
-#define wxSTC_P_COMMENTBLOCK 12
-#define wxSTC_P_STRINGEOL 13
-
-// Lexical states for SCLEX_CPP, SCLEX_VB
-#define wxSTC_C_DEFAULT 0
-#define wxSTC_C_COMMENT 1
-#define wxSTC_C_COMMENTLINE 2
-#define wxSTC_C_COMMENTDOC 3
-#define wxSTC_C_NUMBER 4
-#define wxSTC_C_WORD 5
-#define wxSTC_C_STRING 6
-#define wxSTC_C_CHARACTER 7
-#define wxSTC_C_UUID 8
-#define wxSTC_C_PREPROCESSOR 9
-#define wxSTC_C_OPERATOR 10
-#define wxSTC_C_IDENTIFIER 11
-#define wxSTC_C_STRINGEOL 12
-#define wxSTC_C_VERBATIM 13
-
-// Lexical states for SCLEX_HTML, SCLEX_XML
-#define wxSTC_H_DEFAULT 0
-#define wxSTC_H_TAG 1
-#define wxSTC_H_TAGUNKNOWN 2
-#define wxSTC_H_ATTRIBUTE 3
-#define wxSTC_H_ATTRIBUTEUNKNOWN 4
-#define wxSTC_H_NUMBER 5
-#define wxSTC_H_DOUBLESTRING 6
-#define wxSTC_H_SINGLESTRING 7
-#define wxSTC_H_OTHER 8
-#define wxSTC_H_COMMENT 9
-#define wxSTC_H_ENTITY 10
-
-// XML and ASP
-#define wxSTC_H_TAGEND 11
-#define wxSTC_H_XMLSTART 12
-#define wxSTC_H_XMLEND 13
-#define wxSTC_H_SCRIPT 14
-#define wxSTC_H_ASP 15
-#define wxSTC_H_ASPAT 16
-#define wxSTC_H_CDATA 17
-#define wxSTC_H_QUESTION 18
-
-// More HTML
-#define wxSTC_H_VALUE 19
-
-// Embedded Javascript
-#define wxSTC_HJ_START 40
-#define wxSTC_HJ_DEFAULT 41
-#define wxSTC_HJ_COMMENT 42
-#define wxSTC_HJ_COMMENTLINE 43
-#define wxSTC_HJ_COMMENTDOC 44
-#define wxSTC_HJ_NUMBER 45
-#define wxSTC_HJ_WORD 46
-#define wxSTC_HJ_KEYWORD 47
-#define wxSTC_HJ_DOUBLESTRING 48
-#define wxSTC_HJ_SINGLESTRING 49
-#define wxSTC_HJ_SYMBOLS 50
-#define wxSTC_HJ_STRINGEOL 51
-
-// ASP Javascript
-#define wxSTC_HJA_START 55
-#define wxSTC_HJA_DEFAULT 56
-#define wxSTC_HJA_COMMENT 57
-#define wxSTC_HJA_COMMENTLINE 58
-#define wxSTC_HJA_COMMENTDOC 59
-#define wxSTC_HJA_NUMBER 60
-#define wxSTC_HJA_WORD 61
-#define wxSTC_HJA_KEYWORD 62
-#define wxSTC_HJA_DOUBLESTRING 63
-#define wxSTC_HJA_SINGLESTRING 64
-#define wxSTC_HJA_SYMBOLS 65
-#define wxSTC_HJA_STRINGEOL 66
-
-// Embedded VBScript
-#define wxSTC_HB_START 70
-#define wxSTC_HB_DEFAULT 71
-#define wxSTC_HB_COMMENTLINE 72
-#define wxSTC_HB_NUMBER 73
-#define wxSTC_HB_WORD 74
-#define wxSTC_HB_STRING 75
-#define wxSTC_HB_IDENTIFIER 76
-#define wxSTC_HB_STRINGEOL 77
-
-// ASP VBScript
-#define wxSTC_HBA_START 80
-#define wxSTC_HBA_DEFAULT 81
-#define wxSTC_HBA_COMMENTLINE 82
-#define wxSTC_HBA_NUMBER 83
-#define wxSTC_HBA_WORD 84
-#define wxSTC_HBA_STRING 85
-#define wxSTC_HBA_IDENTIFIER 86
-#define wxSTC_HBA_STRINGEOL 87
-
-// Embedded Python
-#define wxSTC_HP_START 90
-#define wxSTC_HP_DEFAULT 91
-#define wxSTC_HP_COMMENTLINE 92
-#define wxSTC_HP_NUMBER 93
-#define wxSTC_HP_STRING 94
-#define wxSTC_HP_CHARACTER 95
-#define wxSTC_HP_WORD 96
-#define wxSTC_HP_TRIPLE 97
-#define wxSTC_HP_TRIPLEDOUBLE 98
-#define wxSTC_HP_CLASSNAME 99
-#define wxSTC_HP_DEFNAME 100
-#define wxSTC_HP_OPERATOR 101
-#define wxSTC_HP_IDENTIFIER 102
-
-// ASP Python
-#define wxSTC_HPA_START 105
-#define wxSTC_HPA_DEFAULT 106
-#define wxSTC_HPA_COMMENTLINE 107
-#define wxSTC_HPA_NUMBER 108
-#define wxSTC_HPA_STRING 109
-#define wxSTC_HPA_CHARACTER 110
-#define wxSTC_HPA_WORD 111
-#define wxSTC_HPA_TRIPLE 112
-#define wxSTC_HPA_TRIPLEDOUBLE 113
-#define wxSTC_HPA_CLASSNAME 114
-#define wxSTC_HPA_DEFNAME 115
-#define wxSTC_HPA_OPERATOR 116
-#define wxSTC_HPA_IDENTIFIER 117
-
-// PHP
-#define wxSTC_HPHP_DEFAULT 118
-#define wxSTC_HPHP_HSTRING 119
-#define wxSTC_HPHP_SIMPLESTRING 120
-#define wxSTC_HPHP_WORD 121
-#define wxSTC_HPHP_NUMBER 122
-#define wxSTC_HPHP_VARIABLE 123
-#define wxSTC_HPHP_COMMENT 124
-#define wxSTC_HPHP_COMMENTLINE 125
-#define wxSTC_HPHP_STRINGEOL 126
-
-// Lexical states for SCLEX_PERL
-#define wxSTC_PL_DEFAULT 0
-#define wxSTC_PL_HERE 1
-#define wxSTC_PL_COMMENTLINE 2
-#define wxSTC_PL_POD 3
-#define wxSTC_PL_NUMBER 4
-#define wxSTC_PL_WORD 5
-#define wxSTC_PL_STRING 6
-#define wxSTC_PL_CHARACTER 7
-#define wxSTC_PL_PUNCTUATION 8
-#define wxSTC_PL_PREPROCESSOR 9
-#define wxSTC_PL_OPERATOR 10
-#define wxSTC_PL_IDENTIFIER 11
-#define wxSTC_PL_SCALAR 12
-#define wxSTC_PL_ARRAY 13
-#define wxSTC_PL_HASH 14
-#define wxSTC_PL_SYMBOLTABLE 15
-#define wxSTC_PL_REF 16
-#define wxSTC_PL_REGEX 17
-#define wxSTC_PL_REGSUBST 18
-#define wxSTC_PL_LONGQUOTE 19
-#define wxSTC_PL_BACKTICKS 20
-#define wxSTC_PL_DATASECTION 21
-
-// Lexical states for SCLEX_LATEX
-#define wxSTC_L_DEFAULT 0
-#define wxSTC_L_COMMAND 1
-#define wxSTC_L_TAG 2
-#define wxSTC_L_MATH 3
-#define wxSTC_L_COMMENT 4
-
-// Lexical states for SCLEX_LUA
-#define wxSTC_LUA_DEFAULT 0
-#define wxSTC_LUA_COMMENT 1
-#define wxSTC_LUA_COMMENTLINE 2
-#define wxSTC_LUA_COMMENTDOC 3
-#define wxSTC_LUA_NUMBER 4
-#define wxSTC_LUA_WORD 5
-#define wxSTC_LUA_STRING 6
-#define wxSTC_LUA_CHARACTER 7
-#define wxSTC_LUA_LITERALSTRING 8
-#define wxSTC_LUA_PREPROCESSOR 9
-#define wxSTC_LUA_OPERATOR 10
-#define wxSTC_LUA_IDENTIFIER 11
-#define wxSTC_LUA_STRINGEOL 12
-#define wxSTC_ERR_DEFAULT 0
-#define wxSTC_ERR_PYTHON 1
-#define wxSTC_ERR_GCC 2
-#define wxSTC_ERR_MS 3
-#define wxSTC_ERR_CMD 4
-#define wxSTC_ERR_BORLAND 5
-#define wxSTC_ERR_PERL 6
-
-// END of generated section
-//----------------------------------------------------------------------
-// Others
-
-#define wxSTC_MASK_FOLDERS ((1 << wxSTC_MARKNUM_FOLDER) | (1 << wxSTC_MARKNUM_FOLDEROPEN))
-
-
-
-//----------------------------------------------------------------------
-
-class  ScintillaWX;                      // forward declare
-class  WordList;
-struct SCNotification;
-
-
-extern const wxChar* wxSTCNameStr;
-
-//----------------------------------------------------------------------
-
-class wxStyledTextCtrl : public wxControl {
-public:
-
-#ifdef SWIG
-    wxStyledTextCtrl(wxWindow *parent, wxWindowID id,
-                     const wxPoint& pos = wxDefaultPosition,
-                     const wxSize& size = wxDefaultSize, long style = 0,
-                     const char* name = "styledtext");
-#else
-    wxStyledTextCtrl(wxWindow *parent, wxWindowID id,
-                     const wxPoint& pos = wxDefaultPosition,
-                     const wxSize& size = wxDefaultSize, long style = 0,
-                     const wxString& name = wxSTCNameStr);
-#endif
-
-
-#ifndef SWIG
-    ~wxStyledTextCtrl();
-#endif
-
-//----------------------------------------------------------------------
-// BEGIN generated section.  The following code is automatically generated
-//       by gen_iface.py.  Do not edit this file.  Edit stc.h.in instead
-//       and regenerate
-
-
-    // Add text to the document
-    void AddText(const wxString& text);
-
-    // Add array of cells to document
-    void AddStyledText(const wxString& text);
-
-    // Insert string at a position
-    void InsertText(int pos, const wxString& text);
-
-    // Delete all text in the document
-    void ClearAll();
-
-    // Set all style bytes to 0, remove all folding information
-    void ClearDocumentStyle();
-
-    // The number of characters in the document
-    int GetLength();
-
-    // Returns the character byte at the position
-    int GetCharAt(int pos);
-
-    // Returns the position of the caret
-    int GetCurrentPos();
-
-    // Returns the position of the opposite end of the selection to the caret
-    int GetAnchor();
-
-    // Returns the style byte at the position
-    int GetStyleAt(int pos);
-
-    // Redoes the next action on the undo history
-    void Redo();
-
-    // Choose between collecting actions into the undo
-    // history and discarding them.
-    void SetUndoCollection(bool collectUndo);
-
-    // Select all the text in the document.
-    void SelectAll();
-
-    // Remember the current position in the undo history as the position
-    // at which the document was saved.
-    void SetSavePoint();
-
-    // Retrieve a buffer of cells.
-    wxString GetStyledText(int startPos, int endPos);
-
-    // Are there any redoable actions in the undo history.
-    bool CanRedo();
-
-    // Retrieve the line number at which a particular marker is located
-    int MarkerLineFromHandle(int handle);
-
-    // Delete a marker.
-    void MarkerDeleteHandle(int handle);
-
-    // Is undo history being collected?
-    bool GetUndoCollection();
-
-    // Are white space characters currently visible?
-    // Returns one of SCWS_* constants.
-    int GetViewWhiteSpace();
-
-    // Make white space characters invisible, always visible or visible outside indentation.
-    void SetViewWhiteSpace(int viewWS);
-
-    // Find the position from a point within the window.
-    int PositionFromPoint(wxPoint pt);
-
-    // Set caret to start of a line and ensure it is visible.
-    void GotoLine(int line);
-
-    // Set caret to a position and ensure it is visible.
-    void GotoPos(int pos);
-
-    // Set the selection anchor to a position. The anchor is the opposite
-    // end of the selection from the caret.
-    void SetAnchor(int posAnchor);
-
-    // Retrieve the text of the line containing the caret.
-    // Returns the index of the caret on the line.
-    wxString GetCurLine(int* OUTPUT=NULL);
-
-    // Retrieve the position of the last correctly styled character.
-    int GetEndStyled();
-
-    // Convert all line endings in the document to use the current mode.
-    void ConvertEOLs();
-
-    // Retrieve the current end of line mode - one of CRLF, CR, or LF.
-    int GetEOLMode();
-
-    // Set the current end of line mode.
-    void SetEOLMode(int eolMode);
-
-    // Set the current styling position to pos and the styling mask to mask.
-    // The styling mask can be used to protect some bits in each styling byte from
-    // modification.
-    void StartStyling(int pos, int mask);
-
-    // Change style from current styling position for length characters to a style
-    // and move the current styling position to after this newly styled segment.
-    void SetStyling(int length, int style);
-
-    // Is drawing done first into a buffer or direct to the screen.
-    bool GetBufferedDraw();
-
-    // If drawing is buffered then each line of text is drawn into a bitmap buffer
-    // before drawing it to the screen to avoid flicker.
-    void SetBufferedDraw(bool buffered);
-
-    // Change the visible size of a tab to be a multiple of the width of a space
-    // character.
-    void SetTabWidth(int tabWidth);
-
-    // Retrieve the visible size of a tab.
-    int GetTabWidth();
-
-    // Set the code page used to interpret the bytes of the document as characters.
-    // The SC_CP_UTF8 value can be used to enter Unicode mode.
-    void SetCodePage(int codePage);
-
-    // Set the symbol used for a particular marker number,
-    // and optionally the for and background colours.
-    void MarkerDefine(int markerNumber, int markerSymbol,
-                         const wxColour& foreground = wxNullColour,
-                         const wxColour& background = wxNullColour);
-
-    // Set the foreground colour used for a particular marker number.
-    void MarkerSetForeground(int markerNumber, const wxColour& fore);
-
-    // Set the background colour used for a particular marker number.
-    void MarkerSetBackground(int markerNumber, const wxColour& back);
-
-    // Add a marker to a line.
-    void MarkerAdd(int line, int markerNumber);
-
-    // Delete a marker from a line
-    void MarkerDelete(int line, int markerNumber);
-
-    // Delete all markers with a particular number from all lines
-    void MarkerDeleteAll(int markerNumber);
-
-    // Get a bit mask of all the markers set on a line.
-    int MarkerGet(int line);
-
-    // Find the next line after lineStart that includes a marker in mask.
-    int MarkerNext(int lineStart, int markerMask);
-
-    // Find the previous line before lineStart that includes a marker in mask.
-    int MarkerPrevious(int lineStart, int markerMask);
-
-    // Set a margin to be either numeric or symbolic.
-    void SetMarginType(int margin, int marginType);
-
-    // Retrieve the type of a margin.
-    int GetMarginType(int margin);
-
-    // Set the width of a margin to a width expressed in pixels.
-    void SetMarginWidth(int margin, int pixelWidth);
-
-    // Retrieve the width of a margin in pixels.
-    int GetMarginWidth(int margin);
-
-    // Set a mask that determines which markers are displayed in a margin.
-    void SetMarginMask(int margin, int mask);
-
-    // Retrieve the marker mask of a margin.
-    int GetMarginMask(int margin);
-
-    // Make a margin sensitive or insensitive to mouse clicks.
-    void SetMarginSensitive(int margin, bool sensitive);
-
-    // Retrieve the mouse click sensitivity of a margin.
-    bool GetMarginSensitive(int margin);
-
-    // Clear all the styles and make equivalent to the global default style.
-    void StyleClearAll();
-
-    // Set the foreground colour of a style.
-    void StyleSetForeground(int style, const wxColour& fore);
-
-    // Set the background colour of a style.
-    void StyleSetBackground(int style, const wxColour& back);
-
-    // Set a style to be bold or not.
-    void StyleSetBold(int style, bool bold);
-
-    // Set a style to be italic or not.
-    void StyleSetItalic(int style, bool italic);
-
-    // Set the size of characters of a style.
-    void StyleSetSize(int style, int sizePoints);
-
-    // Set the font of a style.
-    void StyleSetFaceName(int style, const wxString& fontName);
-
-    // Set a style to have its end of line filled or not.
-    void StyleSetEOLFilled(int style, bool filled);
-
-    // Reset the default style to its state at startup
-    void StyleResetDefault();
-
-    // Set a style to be underlined or not.
-    void StyleSetUnderline(int style, bool underline);
-
-    // Set the foreground colour of the selection and whether to use this setting.
-    void SetSelForeground(bool useSetting, const wxColour& fore);
-
-    // Set the background colour of the selection and whether to use this setting.
-    void SetSelBackground(bool useSetting, const wxColour& back);
-
-    // Set the foreground colour of the caret.
-    void SetCaretForeground(const wxColour& fore);
-
-    // When key+modifier combination km is pressed perform msg.
-    void CmdKeyAssign(int key, int modifiers, int cmd);
-
-    // When key+modifier combination km do nothing.
-    void CmdKeyClear(int key, int modifiers);
-
-    // Drop all key mappings.
-    void CmdKeyClearAll();
-
-    // Set the styles for a segment of the document.
-    void SetStyleBytes(int length, char* styleBytes);
-
-    // Set a style to be visible or not.
-    void StyleSetVisible(int style, bool visible);
-
-    // Get the time in milliseconds that the caret is on and off.
-    int GetCaretPeriod();
-
-    // Get the time in milliseconds that the caret is on and off. 0 = steady on.
-    void SetCaretPeriod(int periodMilliseconds);
-
-    // Set the set of characters making up words for when moving or selecting
-    // by word.
-    void SetWordChars(const wxString& characters);
-
-    // Start a sequence of actions that is undone and redone as a unit.
-    // May be nested.
-    void BeginUndoAction();
-
-    // End a sequence of actions that is undone and redone as a unit.
-    void EndUndoAction();
-
-    // Set an indicator to plain, squiggle or TT.
-    void IndicatorSetStyle(int indic, int style);
-
-    // Retrieve the style of an indicator.
-    int IndicatorGetStyle(int indic);
-
-    // Set the foreground colour of an indicator.
-    void IndicatorSetForeground(int indic, const wxColour& fore);
-
-    // Retrieve the foreground colour of an indicator.
-    wxColour IndicatorGetForeground(int indic);
-
-    // Divide each styling byte into lexical class bits (default:5) and indicator
-    // bits (default:3). If a lexer requires more than 32 lexical states, then this
-    // is used to expand the possible states.
-    void SetStyleBits(int bits);
-
-    // Retrieve number of bits in style bytes used to hold the lexical state.
-    int GetStyleBits();
-
-    // Used to hold extra styling information for each line.
-    void SetLineState(int line, int state);
-
-    // Retrieve the extra styling information for a line.
-    int GetLineState(int line);
-
-    // Retrieve the last line number that has line state.
-    int GetMaxLineState();
-
-    // Display a auto-completion list.
-    // The lenEntered parameter indicates how many characters before
-    // the caret should be used to provide context.
-    void AutoCompShow(int lenEntered, const wxString& itemList);
-
-    // Remove the auto-completion list from the screen.
-    void AutoCompCancel();
-
-    // Is there an auto-completion list visible?
-    bool AutoCompActive();
-
-    // Retrieve the position of the caret when the auto-completion list was
-    // displayed.
-    int AutoCompPosStart();
-
-    // User has selected an item so remove the list and insert the selection.
-    void AutoCompComplete();
-
-    // Define a set of character that when typed cancel the auto-completion list.
-    void AutoCompStops(const wxString& characterSet);
-
-    // Change the separator character in the string setting up an auto-completion
-    // list. Default is space but can be changed if items contain space.
-    void AutoCompSetSeparator(int separatorCharacter);
-
-    // Retrieve the auto-completion list separator character.
-    int AutoCompGetSeparator();
-
-    // Select the item in the auto-completion list that starts with a string.
-    void AutoCompSelect(const wxString& text);
-
-    // Should the auto-completion list be cancelled if the user backspaces to a
-    // position before where the box was created.
-    void AutoCompSetCancelAtStart(bool cancel);
-
-    // Retrieve whether auto-completion cancelled by backspacing before start.
-    bool AutoCompGetCancelAtStart();
-
-    // Define a set of character that when typed fills up the selected word.
-    void AutoCompSetFillUps(const wxString& characterSet);
-
-    // Should a single item auto-completion list automatically choose the item.
-    void AutoCompSetChooseSingle(bool chooseSingle);
-
-    // Retrieve whether a single item auto-completion list automatically choose the item.
-    bool AutoCompGetChooseSingle();
-
-    // Set whether case is significant when performing auto-completion searches.
-    void AutoCompSetIgnoreCase(bool ignoreCase);
-
-    // Retrieve state of ignore case flag.
-    bool AutoCompGetIgnoreCase();
-
-    // Set the number of spaces used for one level of indentation.
-    void SetIndent(int indentSize);
-
-    // Retrieve indentation size.
-    int GetIndent();
-
-    // Indentation will only use space characters if useTabs is false, otherwise
-    // it will use a combination of tabs and spaces.
-    void SetUseTabs(bool useTabs);
-
-    // Retrieve whether tabs will be used in indentation.
-    bool GetUseTabs();
-
-    // Change the indentation of a line to a number of columns.
-    void SetLineIndentation(int line, int indentSize);
-
-    // Retrieve the number of columns that a line is indented.
-    int GetLineIndentation(int line);
-
-    // Retrieve the position before the first non indentation character on a line.
-    int GetLineIndentPosition(int line);
-
-    // Retrieve the column number of a position, taking tab width into account.
-    int GetColumn(int pos);
-
-    // Show or hide the horizontal scroll bar.
-    void SetUseHorizontalScrollBar(bool show);
-
-    // Is the horizontal scroll bar visible?
-    bool GetUseHorizontalScrollBar();
-
-    // Show or hide indentation guides.
-    void SetIndentationGuides(bool show);
-
-    // Are the indentation guides visible?
-    bool GetIndentationGuides();
-
-    // Set the highlighted indentation guide column.
-    // 0 = no highlighted guide.
-    void SetHighlightGuide(int column);
-
-    // Get the highlighted indentation guide column.
-    int GetHighlightGuide();
-
-    // Get the position after the last visible characters on a line.
-    int GetLineEndPosition(int line);
-
-    // Get the code page used to interpret the bytes of the document as characters.
-    int GetCodePage();
-
-    // Get the foreground colour of the caret.
-    wxColour GetCaretForeground();
-
-    // In read-only mode?
-    bool GetReadOnly();
-
-    // Sets the position of the caret.
-    void SetCurrentPos(int pos);
-
-    // Sets the position that starts the selection - this becomes the anchor.
-    void SetSelectionStart(int pos);
-
-    // Returns the position at the start of the selection.
-    int GetSelectionStart();
-
-    // Sets the position that ends the selection - this becomes the currentPosition.
-    void SetSelectionEnd(int pos);
-
-    // Returns the position at the end of the selection.
-    int GetSelectionEnd();
-
-    // Sets the print magnification added to the point size of each style for printing.
-    void SetPrintMagnification(int magnification);
-
-    // Returns the print magnification.
-    int GetPrintMagnification();
-
-    // Modify colours when printing for clearer printed text.
-    void SetPrintColourMode(int mode);
-
-    // Returns the print colour mode.
-    int GetPrintColourMode();
-
-    // Find some text in the document.
-    int FindText(int minPos, int maxPos,
-                               const wxString& text,
-                               bool caseSensitive, bool wholeWord);
-
-    // On Windows will draw the document into a display context such as a printer.
-    int FormatRange(bool   doDraw,
-                               int    startPos,
-                               int    endPos,
-                               wxDC*  draw,
-                               wxDC*  target,  // Why does it use two? Can they be the same?
-                               wxRect renderRect,
-                               wxRect pageRect);
-
-    // Retrieve the line at the top of the display.
-    int GetFirstVisibleLine();
-
-    // Retrieve the contents of a line.
-    wxString GetLine(int line);
-
-    // Returns the number of lines in the document. There is always at least one.
-    int GetLineCount();
-
-    // Sets the size in pixels of the left margin.
-    void SetMarginLeft(int width);
-
-    // Returns the size in pixels of the left margin.
-    int GetMarginLeft();
-
-    // Sets the size in pixels of the right margin.
-    void SetMarginRight(int width);
-
-    // Returns the size in pixels of the right margin.
-    int GetMarginRight();
-
-    // Is the document different from when it was last saved?
-    bool GetModify();
-
-    // Select a range of text.
-    void SetSelection(int start, int end);
-
-    // Retrieve the selected text.
-    wxString GetSelectedText();
-
-    // Retrieve a range of text.
-    wxString GetTextRange(int startPos, int endPos);
-
-    // Draw the selection in normal style or with selection highlighted.
-    void HideSelection(bool normal);
-
-    // Retrieve the line containing a position.
-    int LineFromPosition(int pos);
-
-    // Retrieve the position at the start of a line.
-    int PositionFromLine(int line);
-
-    // Scroll horizontally and vertically.
-    void LineScroll(int columns, int lines);
-
-    // Ensure the caret is visible.
-    void EnsureCaretVisible();
-
-    // Replace the selected text with the argument text.
-    void ReplaceSelection(const wxString& text);
-
-    // Set to read only or read write.
-    void SetReadOnly(bool readOnly);
-
-    // Will a paste succeed?
-    bool CanPaste();
-
-    // Are there any undoable actions in the undo history.
-    bool CanUndo();
-
-    // Delete the undo history.
-    void EmptyUndoBuffer();
-
-    // Undo one action in the undo history.
-    void Undo();
-
-    // Cut the selection to the clipboard.
-    void Cut();
-
-    // Copy the selection to the clipboard.
-    void Copy();
-
-    // Paste the contents of the clipboard into the document replacing the selection.
-    void Paste();
-
-    // Clear the selection.
-    void Clear();
-
-    // Replace the contents of the document with the argument text.
-    void SetText(const wxString& text);
-
-    // Retrieve all the text in the document.
-    wxString GetText();
-
-    // Retrieve the number of characters in the document.
-    int GetTextLength();
-
-    // Set to overtype (true) or insert mode
-    void SetOvertype(bool overtype);
-
-    // Returns true if overtype mode is active otherwise false is returned.
-    bool GetOvertype();
-
-    // Show a call tip containing a definition near position pos.
-    void CallTipShow(int pos, const wxString& definition);
-
-    // Remove the call tip from the screen.
-    void CallTipCancel();
-
-    // Is there an active call tip?
-    bool CallTipActive();
-
-    // Retrieve the position where the caret was before displaying the call tip.
-    int CallTipPosAtStart();
-
-    // Highlight a segment of the definition.
-    void CallTipSetHighlight(int start, int end);
-
-    // Set the background colour for the call tip.
-    void CallTipSetBackground(const wxColour& back);
-
-    // Find the display line of a document line taking hidden lines into account.
-    int VisibleFromDocLine(int line);
-
-    // Find the document line of a display line taking hidden lines into account.
-    int DocLineFromVisible(int lineDisplay);
-
-    // Set the fold level of a line.
-    // This encodes an integer level along with flags indicating whether the
-    // line is a header and whether it is effectively white space.
-    void SetFoldLevel(int line, int level);
-
-    // Retrieve the fold level of a line.
-    int GetFoldLevel(int line);
-
-    // Find the last child line of a header line.
-    int GetLastChild(int line, int level);
-
-    // Find the parent line of a child line.
-    int GetFoldParent(int line);
-
-    // Make a range of lines visible.
-    void ShowLines(int lineStart, int lineEnd);
-
-    // Make a range of lines invisible.
-    void HideLines(int lineStart, int lineEnd);
-
-    // Is a line visible?
-    bool GetLineVisible(int line);
-
-    // Show the children of a header line.
-    void SetFoldExpanded(int line, bool expanded);
-
-    // Is a header line expanded?
-    bool GetFoldExpanded(int line);
-
-    // Switch a header line between expanded and contracted.
-    void ToggleFold(int line);
-
-    // Ensure a particular line is visible by expanding any header line hiding it.
-    void EnsureVisible(int line);
-
-    // Set some debugging options for folding
-    void SetFoldFlags(int flags);
-
-    // How many characters are on a line, not including end of line characters.
-    int LineLength(int line);
-
-    // Highlight the characters at two positions.
-    void BraceHighlight(int pos1, int pos2);
-
-    // Highlight the character at a position indicating there is no matching brace.
-    void BraceBadLight(int pos);
-
-    // Find the position of a matching brace or INVALID_POSITION if no match.
-    int BraceMatch(int pos);
-
-    // Are the end of line characters visible.
-    bool GetViewEOL();
-
-    // Make the end of line characters visible or invisible
-    void SetViewEOL(bool visible);
-
-    // Retrieve a pointer to the document object.
-    void* GetDocPointer();
-
-    // Change the document object used.
-    void SetDocPointer(void* docPointer);
-
-    // Set which document modification events are sent to the container.
-    void SetModEventMask(int mask);
-
-    // Retrieve the column number which text should be kept within.
-    int GetEdgeColumn();
-
-    // Set the column number of the edge.
-    // If text goes past the edge then it is highlighted.
-    void SetEdgeColumn(int column);
-
-    // Retrieve the edge highlight mode.
-    int GetEdgeMode();
-
-    // The edge may be displayed by a line (EDGE_LINE) or by highlighting text that
-    // goes beyond it (EDGE_BACKGROUND) or not displayed at all (EDGE_NONE).
-    void SetEdgeMode(int mode);
-
-    // Retrieve the colour used in edge indication.
-    wxColour GetEdgeColour();
-
-    // Change the colour used in edge indication.
-    void SetEdgeColour(const wxColour& edgeColour);
-
-    // Sets the current caret position to be the search anchor.
-    void SearchAnchor();
-
-    // Find some text starting at the search anchor.
-    int SearchNext(int flags, const wxString& text);
-
-    // Find some text starting at the search anchor and moving backwards.
-    int SearchPrev(int flags, const wxString& text);
-
-    // Set the way the line the caret is on is kept visible.
-    void SetCaretPolicy(int caretPolicy, int caretSlop);
-
-    // Retrieves the number of lines completely visible.
-    int LinesOnScreen();
-
-    // Set whether a pop up menu is displayed automatically when the user presses
-    // the wrong mouse button.
-    void UsePopUp(bool allowPopUp);
-
-    // Is the selection a rectangular. The alternative is the more common stream selection.
-    bool SelectionIsRectangle();
-
-    // Set the zoom level. This number of points is added to the size of all fonts.
-    // It may be positive to magnify or negative to reduce.
-    void SetZoom(int zoom);
-
-    // Retrieve the zoom level.
-    int GetZoom();
-
-    // Create a new document object.
-    // Starts with reference count of 1 and not selected into editor.
-    void* CreateDocument();
-
-    // Extend life of document.
-    void AddRefDocument(void* docPointer);
-
-    // Release a reference to the document, deleting document if it fades to black.
-    void ReleaseDocument(void* docPointer);
-
-    // Get which document modification events are sent to the container.
-    int GetModEventMask();
-
-    // Start notifying the container of all key presses and commands.
-    void StartRecord();
-
-    // Stop notifying the container of all key presses and commands.
-    void StopRecord();
-
-    // Set the lexing language of the document.
-    void SetLexer(int lexer);
-
-    // Retrieve the lexing language of the document.
-    int GetLexer();
-
-    // Colourise a segment of the document using the current lexing language.
-    void Colourise(int start, int end);
-
-    // Set up a value that may be used by a lexer for some optional feature.
-    void SetProperty(const wxString& key, const wxString& value);
-
-    // Set up the key words used by the lexer.
-    void SetKeyWords(int keywordSet, const wxString& keyWords);
-
-// END of generated section
-//----------------------------------------------------------------------
-// Others...
-
-
-    // Returns the line number of the line with the caret.
-    int GetCurrentLine();
-
-    // Extract style settings from a spec-string which is composed of one or
-    // more of the following comma separated elements:
-    //
-    //      bold                    turns on bold
-    //      italic                  turns on italics
-    //      fore:#RRGGBB            sets the foreground colour
-    //      back:#RRGGBB            sets the background colour
-    //      face:[facename]         sets the font face name to use
-    //      size:[num]              sets the font size in points
-    //      eol                     turns on eol filling
-    //      underline               turns on underlining
-    //
-    void StyleSetSpec(int styleNum, const wxString& spec);
-
-
-
-    // Set style size, face, bold, italic, and underline attributes from
-    // a wxFont's attributes.
-    void StyleSetFont(int styleNum, wxFont& font);
-
-
-
-    // Set all font style attributes at once.
-    void StyleSetFontAttr(int styleNum, int size,
-                          const wxString& faceName,
-                          bool bold, bool italic,
-                          bool underline);
-
-
-
-    // Perform one of the operations defined by the wxSTC_CMD_* constants.
-    void CmdKeyExecute(int cmd);
-
-
-
-    // Set the left and right margin in the edit area, measured in pixels.
-    void SetMargins(int left, int right);
-
-
-    // Retrieve the start and end positions of the current selection.
-#ifdef SWIG
-    void GetSelection(int* OUTPUT, int* OUTPUT);
-#else
-    void GetSelection(int* startPos, int* endPos);
-#endif
-
-    // Retrieve the point in the window where a position is displayed.
-    wxPoint PointFromPosition(int pos);
-
-
-    // Scroll enough to make the given line visible
-    void ScrollToLine(int line);
-
-
-    // Scroll enough to make the given column visible
-    void ScrollToColumn(int column);
-
-//----------------------------------------------------------------------
-
-
-#ifndef SWIG
-private:
-    // Event handlers
-    void OnPaint(wxPaintEvent& evt);
-    void OnScrollWin(wxScrollWinEvent& evt);
-    void OnSize(wxSizeEvent& evt);
-    void OnMouseLeftDown(wxMouseEvent& evt);
-    void OnMouseMove(wxMouseEvent& evt);
-    void OnMouseLeftUp(wxMouseEvent& evt);
-    void OnMouseRightUp(wxMouseEvent& evt);
-    void OnChar(wxKeyEvent& evt);
-    void OnKeyDown(wxKeyEvent& evt);
-    void OnLoseFocus(wxFocusEvent& evt);
-    void OnGainFocus(wxFocusEvent& evt);
-    void OnSysColourChanged(wxSysColourChangedEvent& evt);
-    void OnEraseBackground(wxEraseEvent& evt);
-    void OnMenu(wxCommandEvent& evt);
-    void OnListBox(wxCommandEvent& evt);
-
-
-    // Turn notifications from Scintilla into events
-    void NotifyChange();
-    void NotifyParent(SCNotification* scn);
-
-    long SendMsg(int msg, long wp=0, long lp=0);
-
-private:
-    DECLARE_EVENT_TABLE()
-    DECLARE_CLASS(wxStyledTextCtrl)
-
-    ScintillaWX*        m_swx;
-    wxStopWatch         m_stopWatch;
-
-
-    friend class ScintillaWX;
-    friend class Platform;
-#endif
-};
-
-//----------------------------------------------------------------------
-
-class wxStyledTextEvent : public wxCommandEvent {
-public:
-    wxStyledTextEvent(wxEventType commandType=0, int id=0);
-    ~wxStyledTextEvent() {}
-
-    void SetPosition(int pos)        { m_position = pos; }
-    void SetKey(int k)               { m_key = k; }
-    void SetModifiers(int m)         { m_modifiers = m; }
-    void SetModificationType(int t)  { m_modificationType = t; }
-    void SetText(const char* t)      { m_text = t; }
-    void SetLength(int len)          { m_length = len; }
-    void SetLinesAdded(int num)      { m_linesAdded = num; }
-    void SetLine(int val)            { m_line = val; }
-    void SetFoldLevelNow(int val)    { m_foldLevelNow = val; }
-    void SetFoldLevelPrev(int val)   { m_foldLevelPrev = val; }
-    void SetMargin(int val)          { m_margin = val; }
-    void SetMessage(int val)         { m_message = val; }
-    void SetWParam(int val)          { m_wParam = val; }
-    void SetLParam(int val)          { m_lParam = val; }
-
-    int  GetPosition() const         { return m_position; }
-    int  GetKey()  const             { return m_key; }
-    int  GetModifiers() const        { return m_modifiers; }
-    int  GetModificationType() const { return m_modificationType; }
-    wxString GetText() const         { return m_text; }
-    int  GetLength() const           { return m_length; }
-    int  GetLinesAdded() const       { return m_linesAdded; }
-    int  GetLine() const             { return m_line; }
-    int  GetFoldLevelNow() const     { return m_foldLevelNow; }
-    int  GetFoldLevelPrev() const    { return m_foldLevelPrev; }
-    int  GetMargin() const           { return m_margin; }
-    int  GetMessage() const          { return m_message; }
-    int  GetWParam() const           { return m_wParam; }
-    int  GetLParam() const           { return m_lParam; }
-
-    bool GetShift() const;
-    bool GetControl() const;
-    bool GetAlt() const;
-
-    void CopyObject(wxObject& obj) const;
-
-#ifndef SWIG
-private:
-    DECLARE_DYNAMIC_CLASS(wxStyledTextEvent)
-
-    int  m_position;
-    int  m_key;
-    int  m_modifiers;
-
-    int  m_modificationType;    // wxEVT_STC_MODIFIED
-    wxString m_text;
-    int  m_length;
-    int  m_linesAdded;
-    int  m_line;
-    int  m_foldLevelNow;
-    int  m_foldLevelPrev;
-
-    int  m_margin;              // wxEVT_STC_MARGINCLICK
-
-    int  m_message;             // wxEVT_STC_MACRORECORD
-    int  m_wParam;
-    int  m_lParam;
-#endif
-};
-
-
-// Event types
-enum {
-    wxEVT_STC_CHANGE = 1650,
-    wxEVT_STC_STYLENEEDED,
-    wxEVT_STC_CHARADDED,
-    wxEVT_STC_UPDATEUI,
-    wxEVT_STC_SAVEPOINTREACHED,
-    wxEVT_STC_SAVEPOINTLEFT,
-    wxEVT_STC_ROMODIFYATTEMPT,
-    wxEVT_STC_DOUBLECLICK,
-    wxEVT_STC_MODIFIED,
-    wxEVT_STC_KEY,
-    wxEVT_STC_MACRORECORD,
-    wxEVT_STC_MARGINCLICK,
-    wxEVT_STC_NEEDSHOWN,
-    wxEVT_STC_POSCHANGED
-};
-
-
-#ifndef SWIG
-typedef void (wxEvtHandler::*wxStyledTextEventFunction)(wxStyledTextEvent&);
-
-#define EVT_STC_CHANGE(id, fn) { wxEVT_STC_CHANGE, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
-#define EVT_STC_STYLENEEDED(id, fn) { wxEVT_STC_STYLENEEDED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
-#define EVT_STC_CHARADDED(id, fn) { wxEVT_STC_CHARADDED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
-#define EVT_STC_UPDATEUI(id, fn) { wxEVT_STC_UPDATEUI, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
-#define EVT_STC_SAVEPOINTREACHED(id, fn) { wxEVT_STC_SAVEPOINTREACHED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
-#define EVT_STC_SAVEPOINTLEFT(id, fn) { wxEVT_STC_SAVEPOINTLEFT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
-#define EVT_STC_ROMODIFYATTEMPT(id, fn) { wxEVT_STC_ROMODIFYATTEMPT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
-#define EVT_STC_DOUBLECLICK(id, fn) { wxEVT_STC_DOUBLECLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
-#define EVT_STC_MODIFIED(id, fn) { wxEVT_STC_MODIFIED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
-#define EVT_STC_KEY(id, fn) { wxEVT_STC_KEY, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
-#define EVT_STC_MACRORECORD(id, fn) { wxEVT_STC_MACRORECORD, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
-#define EVT_STC_MARGINCLICK(id, fn) { wxEVT_STC_MARGINCLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
-#define EVT_STC_NEEDSHOWN(id, fn) { wxEVT_STC_NEEDSHOWN, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
-#define EVT_STC_POSCHANGED(id, fn) { wxEVT_STC_POSCHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
-
-#endif
-
-//----------------------------------------------------------------------
-//----------------------------------------------------------------------
-#endif
-
-
diff --git a/wxPython/demo/data/stc.h.html b/wxPython/demo/data/stc.h.html
index 38aa8c4391..81c8e33053 100644
--- a/wxPython/demo/data/stc.h.html
+++ b/wxPython/demo/data/stc.h.html
@@ -2,1280 +2,1593 @@
 <HEAD>
 <TITLE>stc.h.html</TITLE>
 </HEAD>
-<BODY BGCOLOR=#FFFFFF TEXT=#000000>
+<BODY BGcolor=#FFFFFF TEXT=#000000>
 <PRE>
-<FONT COLOR=#0000ff>////////////////////////////////////////////////////////////////////////////</FONT>
-<FONT COLOR=#0000ff>// Name:        stc.h</FONT>
-<FONT COLOR=#0000ff>// Purpose:     A wxWindows implementation of Scintilla.  This class is the</FONT>
-<FONT COLOR=#0000ff>//              one meant to be used directly by wx applications.  It does not</FONT>
-<FONT COLOR=#0000ff>//              derive directly from the Scintilla classes, and in fact there</FONT>
-<FONT COLOR=#0000ff>//              is no mention of Scintilla classes at all in this header.</FONT>
-<FONT COLOR=#0000ff>//              This class delegates all method calls and events to the</FONT>
-<FONT COLOR=#0000ff>//              Scintilla objects and so forth.  This allows the use of</FONT>
-<FONT COLOR=#0000ff>//              Scintilla without polluting the namespace with all the</FONT>
-<FONT COLOR=#0000ff>//              classes and itentifiers from Scintilla.</FONT>
-<FONT COLOR=#0000ff>//</FONT>
-<FONT COLOR=#0000ff>// Author:      Robin Dunn</FONT>
-<FONT COLOR=#0000ff>//</FONT>
-<FONT COLOR=#0000ff>// Created:     13-Jan-2000</FONT>
-<FONT COLOR=#0000ff>// RCS-ID:      $Id$</FONT>
-<FONT COLOR=#0000ff>// Copyright:   (c) 2000 by Total Control Software</FONT>
-<FONT COLOR=#0000ff>// Licence:     wxWindows license</FONT>
-<FONT COLOR=#0000ff>/////////////////////////////////////////////////////////////////////////////</FONT>
-
-<FONT COLOR=#a020f0>#ifndef __stc_h__</FONT>
-<FONT COLOR=#a020f0>#define __stc_h__</FONT>
-
-
-<FONT COLOR=#a020f0>#include </FONT><FONT COLOR=#ff00ff>&lt;wx/wx.h&gt;</FONT>
-
-<FONT COLOR=#0000ff>//----------------------------------------------------------------------</FONT>
-<FONT COLOR=#0000ff>// BEGIN generated section.  The following code is automatically generated</FONT>
-<FONT COLOR=#0000ff>//       by gen_iface.py.  Do not edit this file.  Edit stc.h.in instead</FONT>
-<FONT COLOR=#0000ff>//       and regenerate</FONT>
-
-<FONT COLOR=#a020f0>#define wxSTC_INVALID_POSITION -</FONT><FONT COLOR=#ff00ff>1</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_START </FONT><FONT COLOR=#ff00ff>2000</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_OPTIONAL_START </FONT><FONT COLOR=#ff00ff>3000</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LEXER_START </FONT><FONT COLOR=#ff00ff>4000</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_REDO </FONT><FONT COLOR=#ff00ff>2011</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_SELECTALL </FONT><FONT COLOR=#ff00ff>2013</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_WS_INVISIBLE </FONT><FONT COLOR=#ff00ff>0</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_WS_VISIBLEALWAYS </FONT><FONT COLOR=#ff00ff>1</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_WS_VISIBLEAFTERINDENT </FONT><FONT COLOR=#ff00ff>2</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_EOL_CRLF </FONT><FONT COLOR=#ff00ff>0</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_EOL_CR </FONT><FONT COLOR=#ff00ff>1</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_EOL_LF </FONT><FONT COLOR=#ff00ff>2</FONT>
-
-<FONT COLOR=#0000ff>// The SC_CP_UTF8 value can be used to enter Unicode mode.</FONT>
-<FONT COLOR=#0000ff>// This is the same value as CP_UTF8 in Windows</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CP_UTF8 </FONT><FONT COLOR=#ff00ff>65001</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_MARKER_MAX </FONT><FONT COLOR=#ff00ff>31</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_MARK_CIRCLE </FONT><FONT COLOR=#ff00ff>0</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_MARK_ROUNDRECT </FONT><FONT COLOR=#ff00ff>1</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_MARK_ARROW </FONT><FONT COLOR=#ff00ff>2</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_MARK_SMALLRECT </FONT><FONT COLOR=#ff00ff>3</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_MARK_SHORTARROW </FONT><FONT COLOR=#ff00ff>4</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_MARK_EMPTY </FONT><FONT COLOR=#ff00ff>5</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_MARK_ARROWDOWN </FONT><FONT COLOR=#ff00ff>6</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_MARK_MINUS </FONT><FONT COLOR=#ff00ff>7</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_MARK_PLUS </FONT><FONT COLOR=#ff00ff>8</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_MARKNUM_FOLDER </FONT><FONT COLOR=#ff00ff>30</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_MARKNUM_FOLDEROPEN </FONT><FONT COLOR=#ff00ff>31</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_MARGIN_SYMBOL </FONT><FONT COLOR=#ff00ff>0</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_MARGIN_NUMBER </FONT><FONT COLOR=#ff00ff>1</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_STYLE_DEFAULT </FONT><FONT COLOR=#ff00ff>32</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_STYLE_LINENUMBER </FONT><FONT COLOR=#ff00ff>33</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_STYLE_BRACELIGHT </FONT><FONT COLOR=#ff00ff>34</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_STYLE_BRACEBAD </FONT><FONT COLOR=#ff00ff>35</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_STYLE_CONTROLCHAR </FONT><FONT COLOR=#ff00ff>36</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_STYLE_INDENTGUIDE </FONT><FONT COLOR=#ff00ff>37</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_STYLE_MAX </FONT><FONT COLOR=#ff00ff>127</FONT>
-
-<FONT COLOR=#0000ff>// Character set identifiers are used in StyleSetCharacterSet.</FONT>
-<FONT COLOR=#0000ff>// The values are the same as the Windows *_CHARSET values.</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CHARSET_ANSI </FONT><FONT COLOR=#ff00ff>0</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CHARSET_DEFAULT </FONT><FONT COLOR=#ff00ff>1</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CHARSET_BALTIC </FONT><FONT COLOR=#ff00ff>186</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CHARSET_CHINESEBIG5 </FONT><FONT COLOR=#ff00ff>136</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CHARSET_EASTEUROPE </FONT><FONT COLOR=#ff00ff>238</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CHARSET_GB2312 </FONT><FONT COLOR=#ff00ff>134</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CHARSET_GREEK </FONT><FONT COLOR=#ff00ff>161</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CHARSET_HANGUL </FONT><FONT COLOR=#ff00ff>129</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CHARSET_MAC </FONT><FONT COLOR=#ff00ff>77</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CHARSET_OEM </FONT><FONT COLOR=#ff00ff>255</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CHARSET_RUSSIAN </FONT><FONT COLOR=#ff00ff>204</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CHARSET_SHIFTJIS </FONT><FONT COLOR=#ff00ff>128</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CHARSET_SYMBOL </FONT><FONT COLOR=#ff00ff>2</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CHARSET_TURKISH </FONT><FONT COLOR=#ff00ff>162</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CHARSET_JOHAB </FONT><FONT COLOR=#ff00ff>130</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CHARSET_HEBREW </FONT><FONT COLOR=#ff00ff>177</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CHARSET_ARABIC </FONT><FONT COLOR=#ff00ff>178</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CHARSET_VIETNAMESE </FONT><FONT COLOR=#ff00ff>163</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CHARSET_THAI </FONT><FONT COLOR=#ff00ff>222</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_INDIC_MAX </FONT><FONT COLOR=#ff00ff>7</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_INDIC_PLAIN </FONT><FONT COLOR=#ff00ff>0</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_INDIC_SQUIGGLE </FONT><FONT COLOR=#ff00ff>1</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_INDIC_TT </FONT><FONT COLOR=#ff00ff>2</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_INDIC_DIAGONAL </FONT><FONT COLOR=#ff00ff>3</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_INDIC_STRIKE </FONT><FONT COLOR=#ff00ff>4</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_INDIC0_MASK </FONT><FONT COLOR=#ff00ff>32</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_INDIC1_MASK </FONT><FONT COLOR=#ff00ff>64</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_INDIC2_MASK </FONT><FONT COLOR=#ff00ff>128</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_INDICS_MASK </FONT><FONT COLOR=#ff00ff>32</FONT><FONT COLOR=#a020f0> | </FONT><FONT COLOR=#ff00ff>64</FONT><FONT COLOR=#a020f0> | </FONT><FONT COLOR=#ff00ff>128</FONT>
-
-<FONT COLOR=#0000ff>// PrintColourMode - use same colours as screen.</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PRINT_NORMAL </FONT><FONT COLOR=#ff00ff>0</FONT>
-
-<FONT COLOR=#0000ff>// PrintColourMode - invert the light value of each style for printing.</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PRINT_INVERTLIGHT </FONT><FONT COLOR=#ff00ff>1</FONT>
-
-<FONT COLOR=#0000ff>// PrintColourMode - force black text on white background for printing.</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PRINT_BLACKONWHITE </FONT><FONT COLOR=#ff00ff>2</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_FIND_DOWN </FONT><FONT COLOR=#ff00ff>1</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_FIND_WHOLEWORD </FONT><FONT COLOR=#ff00ff>2</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_FIND_MATCHCASE </FONT><FONT COLOR=#ff00ff>4</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_FIND_WORDSTART </FONT><FONT COLOR=#ff00ff>0x00100000</FONT>
-
-<FONT COLOR=#0000ff>// SCFIND_REGEXP is not yet implemented.</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_FIND_REGEXP </FONT><FONT COLOR=#ff00ff>0x00200000</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_UNDO </FONT><FONT COLOR=#ff00ff>2176</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_CUT </FONT><FONT COLOR=#ff00ff>2177</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_COPY </FONT><FONT COLOR=#ff00ff>2178</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_PASTE </FONT><FONT COLOR=#ff00ff>2179</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_FOLDLEVELBASE </FONT><FONT COLOR=#ff00ff>0x400</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_FOLDLEVELWHITEFLAG </FONT><FONT COLOR=#ff00ff>0x1000</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_FOLDLEVELHEADERFLAG </FONT><FONT COLOR=#ff00ff>0x2000</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_FOLDLEVELNUMBERMASK </FONT><FONT COLOR=#ff00ff>0x0FFF</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_LINEDOWN </FONT><FONT COLOR=#ff00ff>2300</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_LINEDOWNEXTEND </FONT><FONT COLOR=#ff00ff>2301</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_LINEUP </FONT><FONT COLOR=#ff00ff>2302</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_LINEUPEXTEND </FONT><FONT COLOR=#ff00ff>2303</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_CHARLEFT </FONT><FONT COLOR=#ff00ff>2304</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_CHARLEFTEXTEND </FONT><FONT COLOR=#ff00ff>2305</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_CHARRIGHT </FONT><FONT COLOR=#ff00ff>2306</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_CHARRIGHTEXTEND </FONT><FONT COLOR=#ff00ff>2307</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_WORDLEFT </FONT><FONT COLOR=#ff00ff>2308</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_WORDLEFTEXTEND </FONT><FONT COLOR=#ff00ff>2309</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_WORDRIGHT </FONT><FONT COLOR=#ff00ff>2310</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_WORDRIGHTEXTEND </FONT><FONT COLOR=#ff00ff>2311</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_HOME </FONT><FONT COLOR=#ff00ff>2312</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_HOMEEXTEND </FONT><FONT COLOR=#ff00ff>2313</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_LINEEND </FONT><FONT COLOR=#ff00ff>2314</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_LINEENDEXTEND </FONT><FONT COLOR=#ff00ff>2315</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_DOCUMENTSTART </FONT><FONT COLOR=#ff00ff>2316</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_DOCUMENTSTARTEXTEND </FONT><FONT COLOR=#ff00ff>2317</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_DOCUMENTEND </FONT><FONT COLOR=#ff00ff>2318</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_DOCUMENTENDEXTEND </FONT><FONT COLOR=#ff00ff>2319</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_PAGEUP </FONT><FONT COLOR=#ff00ff>2320</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_PAGEUPEXTEND </FONT><FONT COLOR=#ff00ff>2321</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_PAGEDOWN </FONT><FONT COLOR=#ff00ff>2322</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_PAGEDOWNEXTEND </FONT><FONT COLOR=#ff00ff>2323</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_EDITTOGGLEOVERTYPE </FONT><FONT COLOR=#ff00ff>2324</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_CANCEL </FONT><FONT COLOR=#ff00ff>2325</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_DELETEBACK </FONT><FONT COLOR=#ff00ff>2326</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_TAB </FONT><FONT COLOR=#ff00ff>2327</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_BACKTAB </FONT><FONT COLOR=#ff00ff>2328</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_NEWLINE </FONT><FONT COLOR=#ff00ff>2329</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_FORMFEED </FONT><FONT COLOR=#ff00ff>2330</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_VCHOME </FONT><FONT COLOR=#ff00ff>2331</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_VCHOMEEXTEND </FONT><FONT COLOR=#ff00ff>2332</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_ZOOMIN </FONT><FONT COLOR=#ff00ff>2333</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_ZOOMOUT </FONT><FONT COLOR=#ff00ff>2334</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_DELWORDLEFT </FONT><FONT COLOR=#ff00ff>2335</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_DELWORDRIGHT </FONT><FONT COLOR=#ff00ff>2336</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_LINECUT </FONT><FONT COLOR=#ff00ff>2337</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_LINEDELETE </FONT><FONT COLOR=#ff00ff>2338</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_LINETRANSPOSE </FONT><FONT COLOR=#ff00ff>2339</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_LOWERCASE </FONT><FONT COLOR=#ff00ff>2340</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_UPPERCASE </FONT><FONT COLOR=#ff00ff>2341</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_LINESCROLLDOWN </FONT><FONT COLOR=#ff00ff>2342</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CMD_LINESCROLLUP </FONT><FONT COLOR=#ff00ff>2343</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_EDGE_NONE </FONT><FONT COLOR=#ff00ff>0</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_EDGE_LINE </FONT><FONT COLOR=#ff00ff>1</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_EDGE_BACKGROUND </FONT><FONT COLOR=#ff00ff>2</FONT>
-
-<FONT COLOR=#0000ff>// Show caret within N lines of edge when it's scrolled to view</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CARET_SLOP </FONT><FONT COLOR=#ff00ff>0x01</FONT>
-
-<FONT COLOR=#0000ff>// Center caret on screen when it's scrolled to view</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CARET_CENTER </FONT><FONT COLOR=#ff00ff>0x02</FONT>
-
-<FONT COLOR=#0000ff>// OR this with CARET_CENTER to reposition even when visible, or</FONT>
-<FONT COLOR=#0000ff>// OR this with CARET_SLOP to reposition whenever outside slop border</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_CARET_STRICT </FONT><FONT COLOR=#ff00ff>0x04</FONT>
-
-<FONT COLOR=#0000ff>// Notifications</FONT>
-<FONT COLOR=#0000ff>// Type of modification and the action which caused the modification</FONT>
-<FONT COLOR=#0000ff>// These are defined as a bit mask to make it easy to specify which notifications are wanted.</FONT>
-<FONT COLOR=#0000ff>// One bit is set from each of SC_MOD_* and SC_PERFORMED_*.</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_MOD_INSERTTEXT </FONT><FONT COLOR=#ff00ff>0x1</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_MOD_DELETETEXT </FONT><FONT COLOR=#ff00ff>0x2</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_MOD_CHANGESTYLE </FONT><FONT COLOR=#ff00ff>0x4</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_MOD_CHANGEFOLD </FONT><FONT COLOR=#ff00ff>0x8</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PERFORMED_USER </FONT><FONT COLOR=#ff00ff>0x10</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PERFORMED_UNDO </FONT><FONT COLOR=#ff00ff>0x20</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PERFORMED_REDO </FONT><FONT COLOR=#ff00ff>0x40</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LASTSTEPINUNDOREDO </FONT><FONT COLOR=#ff00ff>0x100</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_MOD_CHANGEMARKER </FONT><FONT COLOR=#ff00ff>0x200</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_MOD_BEFOREINSERT </FONT><FONT COLOR=#ff00ff>0x400</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_MOD_BEFOREDELETE </FONT><FONT COLOR=#ff00ff>0x800</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_MODEVENTMASKALL </FONT><FONT COLOR=#ff00ff>0xF77</FONT>
-
-<FONT COLOR=#0000ff>// Symbolic key codes and modifier flags</FONT>
-<FONT COLOR=#0000ff>// ASCII and other printable characters below 256</FONT>
-<FONT COLOR=#0000ff>// Extended keys above 300</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_KEY_DOWN </FONT><FONT COLOR=#ff00ff>300</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_KEY_UP </FONT><FONT COLOR=#ff00ff>301</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_KEY_LEFT </FONT><FONT COLOR=#ff00ff>302</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_KEY_RIGHT </FONT><FONT COLOR=#ff00ff>303</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_KEY_HOME </FONT><FONT COLOR=#ff00ff>304</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_KEY_END </FONT><FONT COLOR=#ff00ff>305</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_KEY_PRIOR </FONT><FONT COLOR=#ff00ff>306</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_KEY_NEXT </FONT><FONT COLOR=#ff00ff>307</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_KEY_DELETE </FONT><FONT COLOR=#ff00ff>308</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_KEY_INSERT </FONT><FONT COLOR=#ff00ff>309</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_KEY_ESCAPE </FONT><FONT COLOR=#ff00ff>7</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_KEY_BACK </FONT><FONT COLOR=#ff00ff>8</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_KEY_TAB </FONT><FONT COLOR=#ff00ff>9</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_KEY_RETURN </FONT><FONT COLOR=#ff00ff>13</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_KEY_ADD </FONT><FONT COLOR=#ff00ff>310</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_KEY_SUBTRACT </FONT><FONT COLOR=#ff00ff>311</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_KEY_DIVIDE </FONT><FONT COLOR=#ff00ff>312</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_SCMOD_SHIFT </FONT><FONT COLOR=#ff00ff>1</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_SCMOD_CTRL </FONT><FONT COLOR=#ff00ff>2</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_SCMOD_ALT </FONT><FONT COLOR=#ff00ff>4</FONT>
-
-<FONT COLOR=#0000ff>// For SciLexer.h</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LEX_CONTAINER </FONT><FONT COLOR=#ff00ff>0</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LEX_NULL </FONT><FONT COLOR=#ff00ff>1</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LEX_PYTHON </FONT><FONT COLOR=#ff00ff>2</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LEX_CPP </FONT><FONT COLOR=#ff00ff>3</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LEX_HTML </FONT><FONT COLOR=#ff00ff>4</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LEX_XML </FONT><FONT COLOR=#ff00ff>5</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LEX_PERL </FONT><FONT COLOR=#ff00ff>6</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LEX_SQL </FONT><FONT COLOR=#ff00ff>7</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LEX_VB </FONT><FONT COLOR=#ff00ff>8</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LEX_PROPERTIES </FONT><FONT COLOR=#ff00ff>9</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LEX_ERRORLIST </FONT><FONT COLOR=#ff00ff>10</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LEX_MAKEFILE </FONT><FONT COLOR=#ff00ff>11</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LEX_BATCH </FONT><FONT COLOR=#ff00ff>12</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LEX_XCODE </FONT><FONT COLOR=#ff00ff>13</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LEX_LATEX </FONT><FONT COLOR=#ff00ff>14</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LEX_LUA </FONT><FONT COLOR=#ff00ff>15</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LEX_DIFF </FONT><FONT COLOR=#ff00ff>16</FONT>
-
-<FONT COLOR=#0000ff>// Lexical states for SCLEX_PYTHON</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_P_DEFAULT </FONT><FONT COLOR=#ff00ff>0</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_P_COMMENTLINE </FONT><FONT COLOR=#ff00ff>1</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_P_NUMBER </FONT><FONT COLOR=#ff00ff>2</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_P_STRING </FONT><FONT COLOR=#ff00ff>3</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_P_CHARACTER </FONT><FONT COLOR=#ff00ff>4</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_P_WORD </FONT><FONT COLOR=#ff00ff>5</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_P_TRIPLE </FONT><FONT COLOR=#ff00ff>6</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_P_TRIPLEDOUBLE </FONT><FONT COLOR=#ff00ff>7</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_P_CLASSNAME </FONT><FONT COLOR=#ff00ff>8</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_P_DEFNAME </FONT><FONT COLOR=#ff00ff>9</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_P_OPERATOR </FONT><FONT COLOR=#ff00ff>10</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_P_IDENTIFIER </FONT><FONT COLOR=#ff00ff>11</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_P_COMMENTBLOCK </FONT><FONT COLOR=#ff00ff>12</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_P_STRINGEOL </FONT><FONT COLOR=#ff00ff>13</FONT>
-
-<FONT COLOR=#0000ff>// Lexical states for SCLEX_CPP, SCLEX_VB</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_C_DEFAULT </FONT><FONT COLOR=#ff00ff>0</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_C_COMMENT </FONT><FONT COLOR=#ff00ff>1</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_C_COMMENTLINE </FONT><FONT COLOR=#ff00ff>2</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_C_COMMENTDOC </FONT><FONT COLOR=#ff00ff>3</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_C_NUMBER </FONT><FONT COLOR=#ff00ff>4</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_C_WORD </FONT><FONT COLOR=#ff00ff>5</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_C_STRING </FONT><FONT COLOR=#ff00ff>6</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_C_CHARACTER </FONT><FONT COLOR=#ff00ff>7</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_C_UUID </FONT><FONT COLOR=#ff00ff>8</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_C_PREPROCESSOR </FONT><FONT COLOR=#ff00ff>9</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_C_OPERATOR </FONT><FONT COLOR=#ff00ff>10</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_C_IDENTIFIER </FONT><FONT COLOR=#ff00ff>11</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_C_STRINGEOL </FONT><FONT COLOR=#ff00ff>12</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_C_VERBATIM </FONT><FONT COLOR=#ff00ff>13</FONT>
-
-<FONT COLOR=#0000ff>// Lexical states for SCLEX_HTML, SCLEX_XML</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_H_DEFAULT </FONT><FONT COLOR=#ff00ff>0</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_H_TAG </FONT><FONT COLOR=#ff00ff>1</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_H_TAGUNKNOWN </FONT><FONT COLOR=#ff00ff>2</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_H_ATTRIBUTE </FONT><FONT COLOR=#ff00ff>3</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_H_ATTRIBUTEUNKNOWN </FONT><FONT COLOR=#ff00ff>4</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_H_NUMBER </FONT><FONT COLOR=#ff00ff>5</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_H_DOUBLESTRING </FONT><FONT COLOR=#ff00ff>6</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_H_SINGLESTRING </FONT><FONT COLOR=#ff00ff>7</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_H_OTHER </FONT><FONT COLOR=#ff00ff>8</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_H_COMMENT </FONT><FONT COLOR=#ff00ff>9</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_H_ENTITY </FONT><FONT COLOR=#ff00ff>10</FONT>
-
-<FONT COLOR=#0000ff>// XML and ASP</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_H_TAGEND </FONT><FONT COLOR=#ff00ff>11</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_H_XMLSTART </FONT><FONT COLOR=#ff00ff>12</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_H_XMLEND </FONT><FONT COLOR=#ff00ff>13</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_H_SCRIPT </FONT><FONT COLOR=#ff00ff>14</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_H_ASP </FONT><FONT COLOR=#ff00ff>15</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_H_ASPAT </FONT><FONT COLOR=#ff00ff>16</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_H_CDATA </FONT><FONT COLOR=#ff00ff>17</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_H_QUESTION </FONT><FONT COLOR=#ff00ff>18</FONT>
-
-<FONT COLOR=#0000ff>// More HTML</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_H_VALUE </FONT><FONT COLOR=#ff00ff>19</FONT>
-
-<FONT COLOR=#0000ff>// Embedded Javascript</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HJ_START </FONT><FONT COLOR=#ff00ff>40</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HJ_DEFAULT </FONT><FONT COLOR=#ff00ff>41</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HJ_COMMENT </FONT><FONT COLOR=#ff00ff>42</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HJ_COMMENTLINE </FONT><FONT COLOR=#ff00ff>43</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HJ_COMMENTDOC </FONT><FONT COLOR=#ff00ff>44</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HJ_NUMBER </FONT><FONT COLOR=#ff00ff>45</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HJ_WORD </FONT><FONT COLOR=#ff00ff>46</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HJ_KEYWORD </FONT><FONT COLOR=#ff00ff>47</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HJ_DOUBLESTRING </FONT><FONT COLOR=#ff00ff>48</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HJ_SINGLESTRING </FONT><FONT COLOR=#ff00ff>49</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HJ_SYMBOLS </FONT><FONT COLOR=#ff00ff>50</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HJ_STRINGEOL </FONT><FONT COLOR=#ff00ff>51</FONT>
-
-<FONT COLOR=#0000ff>// ASP Javascript</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HJA_START </FONT><FONT COLOR=#ff00ff>55</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HJA_DEFAULT </FONT><FONT COLOR=#ff00ff>56</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HJA_COMMENT </FONT><FONT COLOR=#ff00ff>57</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HJA_COMMENTLINE </FONT><FONT COLOR=#ff00ff>58</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HJA_COMMENTDOC </FONT><FONT COLOR=#ff00ff>59</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HJA_NUMBER </FONT><FONT COLOR=#ff00ff>60</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HJA_WORD </FONT><FONT COLOR=#ff00ff>61</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HJA_KEYWORD </FONT><FONT COLOR=#ff00ff>62</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HJA_DOUBLESTRING </FONT><FONT COLOR=#ff00ff>63</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HJA_SINGLESTRING </FONT><FONT COLOR=#ff00ff>64</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HJA_SYMBOLS </FONT><FONT COLOR=#ff00ff>65</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HJA_STRINGEOL </FONT><FONT COLOR=#ff00ff>66</FONT>
-
-<FONT COLOR=#0000ff>// Embedded VBScript</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HB_START </FONT><FONT COLOR=#ff00ff>70</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HB_DEFAULT </FONT><FONT COLOR=#ff00ff>71</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HB_COMMENTLINE </FONT><FONT COLOR=#ff00ff>72</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HB_NUMBER </FONT><FONT COLOR=#ff00ff>73</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HB_WORD </FONT><FONT COLOR=#ff00ff>74</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HB_STRING </FONT><FONT COLOR=#ff00ff>75</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HB_IDENTIFIER </FONT><FONT COLOR=#ff00ff>76</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HB_STRINGEOL </FONT><FONT COLOR=#ff00ff>77</FONT>
-
-<FONT COLOR=#0000ff>// ASP VBScript</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HBA_START </FONT><FONT COLOR=#ff00ff>80</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HBA_DEFAULT </FONT><FONT COLOR=#ff00ff>81</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HBA_COMMENTLINE </FONT><FONT COLOR=#ff00ff>82</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HBA_NUMBER </FONT><FONT COLOR=#ff00ff>83</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HBA_WORD </FONT><FONT COLOR=#ff00ff>84</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HBA_STRING </FONT><FONT COLOR=#ff00ff>85</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HBA_IDENTIFIER </FONT><FONT COLOR=#ff00ff>86</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HBA_STRINGEOL </FONT><FONT COLOR=#ff00ff>87</FONT>
-
-<FONT COLOR=#0000ff>// Embedded Python</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HP_START </FONT><FONT COLOR=#ff00ff>90</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HP_DEFAULT </FONT><FONT COLOR=#ff00ff>91</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HP_COMMENTLINE </FONT><FONT COLOR=#ff00ff>92</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HP_NUMBER </FONT><FONT COLOR=#ff00ff>93</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HP_STRING </FONT><FONT COLOR=#ff00ff>94</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HP_CHARACTER </FONT><FONT COLOR=#ff00ff>95</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HP_WORD </FONT><FONT COLOR=#ff00ff>96</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HP_TRIPLE </FONT><FONT COLOR=#ff00ff>97</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HP_TRIPLEDOUBLE </FONT><FONT COLOR=#ff00ff>98</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HP_CLASSNAME </FONT><FONT COLOR=#ff00ff>99</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HP_DEFNAME </FONT><FONT COLOR=#ff00ff>100</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HP_OPERATOR </FONT><FONT COLOR=#ff00ff>101</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HP_IDENTIFIER </FONT><FONT COLOR=#ff00ff>102</FONT>
-
-<FONT COLOR=#0000ff>// ASP Python</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HPA_START </FONT><FONT COLOR=#ff00ff>105</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HPA_DEFAULT </FONT><FONT COLOR=#ff00ff>106</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HPA_COMMENTLINE </FONT><FONT COLOR=#ff00ff>107</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HPA_NUMBER </FONT><FONT COLOR=#ff00ff>108</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HPA_STRING </FONT><FONT COLOR=#ff00ff>109</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HPA_CHARACTER </FONT><FONT COLOR=#ff00ff>110</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HPA_WORD </FONT><FONT COLOR=#ff00ff>111</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HPA_TRIPLE </FONT><FONT COLOR=#ff00ff>112</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HPA_TRIPLEDOUBLE </FONT><FONT COLOR=#ff00ff>113</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HPA_CLASSNAME </FONT><FONT COLOR=#ff00ff>114</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HPA_DEFNAME </FONT><FONT COLOR=#ff00ff>115</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HPA_OPERATOR </FONT><FONT COLOR=#ff00ff>116</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HPA_IDENTIFIER </FONT><FONT COLOR=#ff00ff>117</FONT>
-
-<FONT COLOR=#0000ff>// PHP</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HPHP_DEFAULT </FONT><FONT COLOR=#ff00ff>118</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HPHP_HSTRING </FONT><FONT COLOR=#ff00ff>119</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HPHP_SIMPLESTRING </FONT><FONT COLOR=#ff00ff>120</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HPHP_WORD </FONT><FONT COLOR=#ff00ff>121</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HPHP_NUMBER </FONT><FONT COLOR=#ff00ff>122</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HPHP_VARIABLE </FONT><FONT COLOR=#ff00ff>123</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HPHP_COMMENT </FONT><FONT COLOR=#ff00ff>124</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HPHP_COMMENTLINE </FONT><FONT COLOR=#ff00ff>125</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_HPHP_STRINGEOL </FONT><FONT COLOR=#ff00ff>126</FONT>
-
-<FONT COLOR=#0000ff>// Lexical states for SCLEX_PERL</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PL_DEFAULT </FONT><FONT COLOR=#ff00ff>0</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PL_HERE </FONT><FONT COLOR=#ff00ff>1</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PL_COMMENTLINE </FONT><FONT COLOR=#ff00ff>2</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PL_POD </FONT><FONT COLOR=#ff00ff>3</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PL_NUMBER </FONT><FONT COLOR=#ff00ff>4</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PL_WORD </FONT><FONT COLOR=#ff00ff>5</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PL_STRING </FONT><FONT COLOR=#ff00ff>6</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PL_CHARACTER </FONT><FONT COLOR=#ff00ff>7</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PL_PUNCTUATION </FONT><FONT COLOR=#ff00ff>8</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PL_PREPROCESSOR </FONT><FONT COLOR=#ff00ff>9</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PL_OPERATOR </FONT><FONT COLOR=#ff00ff>10</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PL_IDENTIFIER </FONT><FONT COLOR=#ff00ff>11</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PL_SCALAR </FONT><FONT COLOR=#ff00ff>12</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PL_ARRAY </FONT><FONT COLOR=#ff00ff>13</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PL_HASH </FONT><FONT COLOR=#ff00ff>14</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PL_SYMBOLTABLE </FONT><FONT COLOR=#ff00ff>15</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PL_REF </FONT><FONT COLOR=#ff00ff>16</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PL_REGEX </FONT><FONT COLOR=#ff00ff>17</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PL_REGSUBST </FONT><FONT COLOR=#ff00ff>18</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PL_LONGQUOTE </FONT><FONT COLOR=#ff00ff>19</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PL_BACKTICKS </FONT><FONT COLOR=#ff00ff>20</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_PL_DATASECTION </FONT><FONT COLOR=#ff00ff>21</FONT>
-
-<FONT COLOR=#0000ff>// Lexical states for SCLEX_LATEX</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_L_DEFAULT </FONT><FONT COLOR=#ff00ff>0</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_L_COMMAND </FONT><FONT COLOR=#ff00ff>1</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_L_TAG </FONT><FONT COLOR=#ff00ff>2</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_L_MATH </FONT><FONT COLOR=#ff00ff>3</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_L_COMMENT </FONT><FONT COLOR=#ff00ff>4</FONT>
-
-<FONT COLOR=#0000ff>// Lexical states for SCLEX_LUA</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LUA_DEFAULT </FONT><FONT COLOR=#ff00ff>0</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LUA_COMMENT </FONT><FONT COLOR=#ff00ff>1</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LUA_COMMENTLINE </FONT><FONT COLOR=#ff00ff>2</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LUA_COMMENTDOC </FONT><FONT COLOR=#ff00ff>3</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LUA_NUMBER </FONT><FONT COLOR=#ff00ff>4</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LUA_WORD </FONT><FONT COLOR=#ff00ff>5</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LUA_STRING </FONT><FONT COLOR=#ff00ff>6</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LUA_CHARACTER </FONT><FONT COLOR=#ff00ff>7</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LUA_LITERALSTRING </FONT><FONT COLOR=#ff00ff>8</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LUA_PREPROCESSOR </FONT><FONT COLOR=#ff00ff>9</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LUA_OPERATOR </FONT><FONT COLOR=#ff00ff>10</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LUA_IDENTIFIER </FONT><FONT COLOR=#ff00ff>11</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_LUA_STRINGEOL </FONT><FONT COLOR=#ff00ff>12</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_ERR_DEFAULT </FONT><FONT COLOR=#ff00ff>0</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_ERR_PYTHON </FONT><FONT COLOR=#ff00ff>1</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_ERR_GCC </FONT><FONT COLOR=#ff00ff>2</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_ERR_MS </FONT><FONT COLOR=#ff00ff>3</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_ERR_CMD </FONT><FONT COLOR=#ff00ff>4</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_ERR_BORLAND </FONT><FONT COLOR=#ff00ff>5</FONT>
-<FONT COLOR=#a020f0>#define wxSTC_ERR_PERL </FONT><FONT COLOR=#ff00ff>6</FONT>
-
-<FONT COLOR=#0000ff>// END of generated section</FONT>
-<FONT COLOR=#0000ff>//----------------------------------------------------------------------</FONT>
-<FONT COLOR=#0000ff>// Others</FONT>
-
-<FONT COLOR=#a020f0>#define wxSTC_MASK_FOLDERS ((</FONT><FONT COLOR=#ff00ff>1</FONT><FONT COLOR=#a020f0> &lt;&lt; wxSTC_MARKNUM_FOLDER) | (</FONT><FONT COLOR=#ff00ff>1</FONT><FONT COLOR=#a020f0> &lt;&lt; wxSTC_MARKNUM_FOLDEROPEN))</FONT>
-
-
-
-<FONT COLOR=#0000ff>//----------------------------------------------------------------------</FONT>
-
-<B><FONT COLOR=#2e8b57>class  ScintillaWX</FONT></B>;                      <FONT COLOR=#0000ff>// forward declare</FONT>
-<B><FONT COLOR=#2e8b57>class  WordList</FONT></B>;
-<B><FONT COLOR=#2e8b57>struct</FONT></B> SCNotification;
-
-
-<B><FONT COLOR=#2e8b57>extern</FONT></B> <B><FONT COLOR=#2e8b57>const</FONT></B> wxChar* wxSTCNameStr;
-
-<FONT COLOR=#0000ff>//----------------------------------------------------------------------</FONT>
-
-<B><FONT COLOR=#2e8b57>class wxStyledTextCtrl</FONT></B> : <B><FONT COLOR=#804040>public</FONT></B> wxControl {
-<B><FONT COLOR=#804040>public</FONT></B>:
-
-<FONT COLOR=#a020f0>#ifdef SWIG</FONT>
+<FONT color=#0000ff>////////////////////////////////////////////////////////////////////////////</FONT>
+<FONT color=#0000ff>// Name:        stc.h</FONT>
+<FONT color=#0000ff>// Purpose:     A wxWindows implementation of Scintilla.  This class is the</FONT>
+<FONT color=#0000ff>//              one meant to be used directly by wx applications.  It does not</FONT>
+<FONT color=#0000ff>//              derive directly from the Scintilla classes, and in fact there</FONT>
+<FONT color=#0000ff>//              is no mention of Scintilla classes at all in this header.</FONT>
+<FONT color=#0000ff>//              This class delegates all method calls and events to the</FONT>
+<FONT color=#0000ff>//              Scintilla objects and so forth.  This allows the use of</FONT>
+<FONT color=#0000ff>//              Scintilla without polluting the namespace with all the</FONT>
+<FONT color=#0000ff>//              classes and itentifiers from Scintilla.</FONT>
+<FONT color=#0000ff>//</FONT>
+<FONT color=#0000ff>// Author:      Robin Dunn</FONT>
+<FONT color=#0000ff>//</FONT>
+<FONT color=#0000ff>// Created:     13-Jan-2000</FONT>
+<FONT color=#0000ff>// RCS-ID:      $Id$</FONT>
+<FONT color=#0000ff>// Copyright:   (c) 2000 by Total Control Software</FONT>
+<FONT color=#0000ff>// Licence:     wxWindows license</FONT>
+<FONT color=#0000ff>/////////////////////////////////////////////////////////////////////////////</FONT>
+
+<FONT color=#a020f0>#ifndef __stc_h__</FONT>
+<FONT color=#a020f0>#define __stc_h__</FONT>
+
+
+<FONT color=#a020f0>#include </FONT><FONT color=#ff00ff>&lt;wx/wx.h&gt;</FONT>
+
+<FONT color=#0000ff>//----------------------------------------------------------------------</FONT>
+<FONT color=#0000ff>// BEGIN generated section.  The following code is automatically generated</FONT>
+<FONT color=#0000ff>//       by gen_iface.py.  Do not edit this file.  Edit stc.h.in instead</FONT>
+<FONT color=#0000ff>//       and regenerate</FONT>
+
+<FONT color=#a020f0>#define wxSTC_INVALID_POSITION -</FONT><FONT color=#ff00ff>1</FONT>
+
+<FONT color=#0000ff>// Define start of Scintilla messages to be greater than all edit (EM_*) messages</FONT>
+<FONT color=#0000ff>// as many EM_ messages can be used although that use is deprecated.</FONT>
+<FONT color=#a020f0>#define wxSTC_START </FONT><FONT color=#ff00ff>2000</FONT>
+<FONT color=#a020f0>#define wxSTC_OPTIONAL_START </FONT><FONT color=#ff00ff>3000</FONT>
+<FONT color=#a020f0>#define wxSTC_LEXER_START </FONT><FONT color=#ff00ff>4000</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_REDO </FONT><FONT color=#ff00ff>2011</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_SELECTALL </FONT><FONT color=#ff00ff>2013</FONT>
+<FONT color=#a020f0>#define wxSTC_WS_INVISIBLE </FONT><FONT color=#ff00ff>0</FONT>
+<FONT color=#a020f0>#define wxSTC_WS_VISIBLEALWAYS </FONT><FONT color=#ff00ff>1</FONT>
+<FONT color=#a020f0>#define wxSTC_WS_VISIBLEAFTERINDENT </FONT><FONT color=#ff00ff>2</FONT>
+<FONT color=#a020f0>#define wxSTC_EOL_CRLF </FONT><FONT color=#ff00ff>0</FONT>
+<FONT color=#a020f0>#define wxSTC_EOL_CR </FONT><FONT color=#ff00ff>1</FONT>
+<FONT color=#a020f0>#define wxSTC_EOL_LF </FONT><FONT color=#ff00ff>2</FONT>
+
+<FONT color=#0000ff>// The SC_CP_UTF8 value can be used to enter Unicode mode.</FONT>
+<FONT color=#0000ff>// This is the same value as CP_UTF8 in Windows</FONT>
+<FONT color=#a020f0>#define wxSTC_CP_UTF8 </FONT><FONT color=#ff00ff>65001</FONT>
+<FONT color=#a020f0>#define wxSTC_MARKER_MAX </FONT><FONT color=#ff00ff>31</FONT>
+<FONT color=#a020f0>#define wxSTC_MARK_CIRCLE </FONT><FONT color=#ff00ff>0</FONT>
+<FONT color=#a020f0>#define wxSTC_MARK_ROUNDRECT </FONT><FONT color=#ff00ff>1</FONT>
+<FONT color=#a020f0>#define wxSTC_MARK_ARROW </FONT><FONT color=#ff00ff>2</FONT>
+<FONT color=#a020f0>#define wxSTC_MARK_SMALLRECT </FONT><FONT color=#ff00ff>3</FONT>
+<FONT color=#a020f0>#define wxSTC_MARK_SHORTARROW </FONT><FONT color=#ff00ff>4</FONT>
+<FONT color=#a020f0>#define wxSTC_MARK_EMPTY </FONT><FONT color=#ff00ff>5</FONT>
+<FONT color=#a020f0>#define wxSTC_MARK_ARROWDOWN </FONT><FONT color=#ff00ff>6</FONT>
+<FONT color=#a020f0>#define wxSTC_MARK_MINUS </FONT><FONT color=#ff00ff>7</FONT>
+<FONT color=#a020f0>#define wxSTC_MARK_PLUS </FONT><FONT color=#ff00ff>8</FONT>
+
+<FONT color=#0000ff>// Shapes used for outlining column</FONT>
+<FONT color=#a020f0>#define wxSTC_MARK_VLINE </FONT><FONT color=#ff00ff>9</FONT>
+<FONT color=#a020f0>#define wxSTC_MARK_LCORNER </FONT><FONT color=#ff00ff>10</FONT>
+<FONT color=#a020f0>#define wxSTC_MARK_TCORNER </FONT><FONT color=#ff00ff>11</FONT>
+<FONT color=#a020f0>#define wxSTC_MARK_BOXPLUS </FONT><FONT color=#ff00ff>12</FONT>
+<FONT color=#a020f0>#define wxSTC_MARK_BOXPLUSCONNECTED </FONT><FONT color=#ff00ff>13</FONT>
+<FONT color=#a020f0>#define wxSTC_MARK_BOXMINUS </FONT><FONT color=#ff00ff>14</FONT>
+<FONT color=#a020f0>#define wxSTC_MARK_BOXMINUSCONNECTED </FONT><FONT color=#ff00ff>15</FONT>
+<FONT color=#a020f0>#define wxSTC_MARK_LCORNERCURVE </FONT><FONT color=#ff00ff>16</FONT>
+<FONT color=#a020f0>#define wxSTC_MARK_TCORNERCURVE </FONT><FONT color=#ff00ff>17</FONT>
+<FONT color=#a020f0>#define wxSTC_MARK_CIRCLEPLUS </FONT><FONT color=#ff00ff>18</FONT>
+<FONT color=#a020f0>#define wxSTC_MARK_CIRCLEPLUSCONNECTED </FONT><FONT color=#ff00ff>19</FONT>
+<FONT color=#a020f0>#define wxSTC_MARK_CIRCLEMINUS </FONT><FONT color=#ff00ff>20</FONT>
+<FONT color=#a020f0>#define wxSTC_MARK_CIRCLEMINUSCONNECTED </FONT><FONT color=#ff00ff>21</FONT>
+
+<FONT color=#0000ff>// Markers used for outlining column</FONT>
+<FONT color=#a020f0>#define wxSTC_MARKNUM_FOLDEREND </FONT><FONT color=#ff00ff>25</FONT>
+<FONT color=#a020f0>#define wxSTC_MARKNUM_FOLDEROPENMID </FONT><FONT color=#ff00ff>26</FONT>
+<FONT color=#a020f0>#define wxSTC_MARKNUM_FOLDERMIDTAIL </FONT><FONT color=#ff00ff>27</FONT>
+<FONT color=#a020f0>#define wxSTC_MARKNUM_FOLDERTAIL </FONT><FONT color=#ff00ff>28</FONT>
+<FONT color=#a020f0>#define wxSTC_MARKNUM_FOLDERSUB </FONT><FONT color=#ff00ff>29</FONT>
+<FONT color=#a020f0>#define wxSTC_MARKNUM_FOLDER </FONT><FONT color=#ff00ff>30</FONT>
+<FONT color=#a020f0>#define wxSTC_MARKNUM_FOLDEROPEN </FONT><FONT color=#ff00ff>31</FONT>
+<FONT color=#a020f0>#define wxSTC_MARGIN_SYMBOL </FONT><FONT color=#ff00ff>0</FONT>
+<FONT color=#a020f0>#define wxSTC_MARGIN_NUMBER </FONT><FONT color=#ff00ff>1</FONT>
+<FONT color=#a020f0>#define wxSTC_STYLE_DEFAULT </FONT><FONT color=#ff00ff>32</FONT>
+<FONT color=#a020f0>#define wxSTC_STYLE_LINENUMBER </FONT><FONT color=#ff00ff>33</FONT>
+<FONT color=#a020f0>#define wxSTC_STYLE_BRACELIGHT </FONT><FONT color=#ff00ff>34</FONT>
+<FONT color=#a020f0>#define wxSTC_STYLE_BRACEBAD </FONT><FONT color=#ff00ff>35</FONT>
+<FONT color=#a020f0>#define wxSTC_STYLE_CONTROLCHAR </FONT><FONT color=#ff00ff>36</FONT>
+<FONT color=#a020f0>#define wxSTC_STYLE_INDENTGUIDE </FONT><FONT color=#ff00ff>37</FONT>
+<FONT color=#a020f0>#define wxSTC_STYLE_MAX </FONT><FONT color=#ff00ff>127</FONT>
+
+<FONT color=#0000ff>// Character set identifiers are used in StyleSetCharacterSet.</FONT>
+<FONT color=#0000ff>// The values are the same as the Windows *_CHARSET values.</FONT>
+<FONT color=#a020f0>#define wxSTC_CHARSET_ANSI </FONT><FONT color=#ff00ff>0</FONT>
+<FONT color=#a020f0>#define wxSTC_CHARSET_DEFAULT </FONT><FONT color=#ff00ff>1</FONT>
+<FONT color=#a020f0>#define wxSTC_CHARSET_BALTIC </FONT><FONT color=#ff00ff>186</FONT>
+<FONT color=#a020f0>#define wxSTC_CHARSET_CHINESEBIG5 </FONT><FONT color=#ff00ff>136</FONT>
+<FONT color=#a020f0>#define wxSTC_CHARSET_EASTEUROPE </FONT><FONT color=#ff00ff>238</FONT>
+<FONT color=#a020f0>#define wxSTC_CHARSET_GB2312 </FONT><FONT color=#ff00ff>134</FONT>
+<FONT color=#a020f0>#define wxSTC_CHARSET_GREEK </FONT><FONT color=#ff00ff>161</FONT>
+<FONT color=#a020f0>#define wxSTC_CHARSET_HANGUL </FONT><FONT color=#ff00ff>129</FONT>
+<FONT color=#a020f0>#define wxSTC_CHARSET_MAC </FONT><FONT color=#ff00ff>77</FONT>
+<FONT color=#a020f0>#define wxSTC_CHARSET_OEM </FONT><FONT color=#ff00ff>255</FONT>
+<FONT color=#a020f0>#define wxSTC_CHARSET_RUSSIAN </FONT><FONT color=#ff00ff>204</FONT>
+<FONT color=#a020f0>#define wxSTC_CHARSET_SHIFTJIS </FONT><FONT color=#ff00ff>128</FONT>
+<FONT color=#a020f0>#define wxSTC_CHARSET_SYMBOL </FONT><FONT color=#ff00ff>2</FONT>
+<FONT color=#a020f0>#define wxSTC_CHARSET_TURKISH </FONT><FONT color=#ff00ff>162</FONT>
+<FONT color=#a020f0>#define wxSTC_CHARSET_JOHAB </FONT><FONT color=#ff00ff>130</FONT>
+<FONT color=#a020f0>#define wxSTC_CHARSET_HEBREW </FONT><FONT color=#ff00ff>177</FONT>
+<FONT color=#a020f0>#define wxSTC_CHARSET_ARABIC </FONT><FONT color=#ff00ff>178</FONT>
+<FONT color=#a020f0>#define wxSTC_CHARSET_VIETNAMESE </FONT><FONT color=#ff00ff>163</FONT>
+<FONT color=#a020f0>#define wxSTC_CHARSET_THAI </FONT><FONT color=#ff00ff>222</FONT>
+<FONT color=#a020f0>#define wxSTC_CASE_MIXED </FONT><FONT color=#ff00ff>0</FONT>
+<FONT color=#a020f0>#define wxSTC_CASE_UPPER </FONT><FONT color=#ff00ff>1</FONT>
+<FONT color=#a020f0>#define wxSTC_CASE_LOWER </FONT><FONT color=#ff00ff>2</FONT>
+<FONT color=#a020f0>#define wxSTC_INDIC_MAX </FONT><FONT color=#ff00ff>7</FONT>
+<FONT color=#a020f0>#define wxSTC_INDIC_PLAIN </FONT><FONT color=#ff00ff>0</FONT>
+<FONT color=#a020f0>#define wxSTC_INDIC_SQUIGGLE </FONT><FONT color=#ff00ff>1</FONT>
+<FONT color=#a020f0>#define wxSTC_INDIC_TT </FONT><FONT color=#ff00ff>2</FONT>
+<FONT color=#a020f0>#define wxSTC_INDIC_DIAGONAL </FONT><FONT color=#ff00ff>3</FONT>
+<FONT color=#a020f0>#define wxSTC_INDIC_STRIKE </FONT><FONT color=#ff00ff>4</FONT>
+<FONT color=#a020f0>#define wxSTC_INDIC0_MASK </FONT><FONT color=#ff00ff>32</FONT>
+<FONT color=#a020f0>#define wxSTC_INDIC1_MASK </FONT><FONT color=#ff00ff>64</FONT>
+<FONT color=#a020f0>#define wxSTC_INDIC2_MASK </FONT><FONT color=#ff00ff>128</FONT>
+<FONT color=#a020f0>#define wxSTC_INDICS_MASK </FONT><FONT color=#ff00ff>224</FONT>
+
+<FONT color=#0000ff>// PrintColourMode - use same colours as screen.</FONT>
+<FONT color=#a020f0>#define wxSTC_PRINT_NORMAL </FONT><FONT color=#ff00ff>0</FONT>
+
+<FONT color=#0000ff>// PrintColourMode - invert the light value of each style for printing.</FONT>
+<FONT color=#a020f0>#define wxSTC_PRINT_INVERTLIGHT </FONT><FONT color=#ff00ff>1</FONT>
+
+<FONT color=#0000ff>// PrintColourMode - force black text on white background for printing.</FONT>
+<FONT color=#a020f0>#define wxSTC_PRINT_BLACKONWHITE </FONT><FONT color=#ff00ff>2</FONT>
+
+<FONT color=#0000ff>// PrintColourMode - text stays coloured, but all background is forced to be white for printing.</FONT>
+<FONT color=#a020f0>#define wxSTC_PRINT_COLOURONWHITE </FONT><FONT color=#ff00ff>3</FONT>
+
+<FONT color=#0000ff>// PrintColourMode - only the default-background is forced to be white for printing.</FONT>
+<FONT color=#a020f0>#define wxSTC_PRINT_COLOURONWHITEDEFAULTBG </FONT><FONT color=#ff00ff>4</FONT>
+<FONT color=#a020f0>#define wxSTC_FIND_WHOLEWORD </FONT><FONT color=#ff00ff>2</FONT>
+<FONT color=#a020f0>#define wxSTC_FIND_MATCHCASE </FONT><FONT color=#ff00ff>4</FONT>
+<FONT color=#a020f0>#define wxSTC_FIND_WORDSTART </FONT><FONT color=#ff00ff>0x00100000</FONT>
+<FONT color=#a020f0>#define wxSTC_FIND_REGEXP </FONT><FONT color=#ff00ff>0x00200000</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_UNDO </FONT><FONT color=#ff00ff>2176</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_CUT </FONT><FONT color=#ff00ff>2177</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_COPY </FONT><FONT color=#ff00ff>2178</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_PASTE </FONT><FONT color=#ff00ff>2179</FONT>
+<FONT color=#a020f0>#define wxSTC_FOLDLEVELBASE </FONT><FONT color=#ff00ff>0x400</FONT>
+<FONT color=#a020f0>#define wxSTC_FOLDLEVELWHITEFLAG </FONT><FONT color=#ff00ff>0x1000</FONT>
+<FONT color=#a020f0>#define wxSTC_FOLDLEVELHEADERFLAG </FONT><FONT color=#ff00ff>0x2000</FONT>
+<FONT color=#a020f0>#define wxSTC_FOLDLEVELNUMBERMASK </FONT><FONT color=#ff00ff>0x0FFF</FONT>
+<FONT color=#a020f0>#define wxSTC_TIME_FOREVER </FONT><FONT color=#ff00ff>10000000</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_LINEDOWN </FONT><FONT color=#ff00ff>2300</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_LINEDOWNEXTEND </FONT><FONT color=#ff00ff>2301</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_LINEUP </FONT><FONT color=#ff00ff>2302</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_LINEUPEXTEND </FONT><FONT color=#ff00ff>2303</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_CHARLEFT </FONT><FONT color=#ff00ff>2304</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_CHARLEFTEXTEND </FONT><FONT color=#ff00ff>2305</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_CHARRIGHT </FONT><FONT color=#ff00ff>2306</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_CHARRIGHTEXTEND </FONT><FONT color=#ff00ff>2307</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_WORDLEFT </FONT><FONT color=#ff00ff>2308</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_WORDLEFTEXTEND </FONT><FONT color=#ff00ff>2309</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_WORDRIGHT </FONT><FONT color=#ff00ff>2310</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_WORDRIGHTEXTEND </FONT><FONT color=#ff00ff>2311</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_HOME </FONT><FONT color=#ff00ff>2312</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_HOMEEXTEND </FONT><FONT color=#ff00ff>2313</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_LINEEND </FONT><FONT color=#ff00ff>2314</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_LINEENDEXTEND </FONT><FONT color=#ff00ff>2315</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_DOCUMENTSTART </FONT><FONT color=#ff00ff>2316</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_DOCUMENTSTARTEXTEND </FONT><FONT color=#ff00ff>2317</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_DOCUMENTEND </FONT><FONT color=#ff00ff>2318</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_DOCUMENTENDEXTEND </FONT><FONT color=#ff00ff>2319</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_PAGEUP </FONT><FONT color=#ff00ff>2320</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_PAGEUPEXTEND </FONT><FONT color=#ff00ff>2321</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_PAGEDOWN </FONT><FONT color=#ff00ff>2322</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_PAGEDOWNEXTEND </FONT><FONT color=#ff00ff>2323</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_EDITTOGGLEOVERTYPE </FONT><FONT color=#ff00ff>2324</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_CANCEL </FONT><FONT color=#ff00ff>2325</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_DELETEBACK </FONT><FONT color=#ff00ff>2326</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_TAB </FONT><FONT color=#ff00ff>2327</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_BACKTAB </FONT><FONT color=#ff00ff>2328</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_NEWLINE </FONT><FONT color=#ff00ff>2329</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_FORMFEED </FONT><FONT color=#ff00ff>2330</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_VCHOME </FONT><FONT color=#ff00ff>2331</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_VCHOMEEXTEND </FONT><FONT color=#ff00ff>2332</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_ZOOMIN </FONT><FONT color=#ff00ff>2333</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_ZOOMOUT </FONT><FONT color=#ff00ff>2334</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_DELWORDLEFT </FONT><FONT color=#ff00ff>2335</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_DELWORDRIGHT </FONT><FONT color=#ff00ff>2336</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_LINECUT </FONT><FONT color=#ff00ff>2337</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_LINEDELETE </FONT><FONT color=#ff00ff>2338</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_LINETRANSPOSE </FONT><FONT color=#ff00ff>2339</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_LOWERCASE </FONT><FONT color=#ff00ff>2340</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_UPPERCASE </FONT><FONT color=#ff00ff>2341</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_LINESCROLLDOWN </FONT><FONT color=#ff00ff>2342</FONT>
+<FONT color=#a020f0>#define wxSTC_CMD_LINESCROLLUP </FONT><FONT color=#ff00ff>2343</FONT>
+<FONT color=#a020f0>#define wxSTC_EDGE_NONE </FONT><FONT color=#ff00ff>0</FONT>
+<FONT color=#a020f0>#define wxSTC_EDGE_LINE </FONT><FONT color=#ff00ff>1</FONT>
+<FONT color=#a020f0>#define wxSTC_EDGE_BACKGROUND </FONT><FONT color=#ff00ff>2</FONT>
+
+<FONT color=#0000ff>// Show caret within N lines of edge when it's scrolled to view</FONT>
+<FONT color=#0000ff>// If CARET_SLOP not set then centre caret on screen when it's</FONT>
+<FONT color=#0000ff>// scrolled to view</FONT>
+<FONT color=#a020f0>#define wxSTC_CARET_SLOP </FONT><FONT color=#ff00ff>0x01</FONT>
+
+<FONT color=#0000ff>// Value not used</FONT>
+<FONT color=#a020f0>#define wxSTC_CARET_CENTER </FONT><FONT color=#ff00ff>0x02</FONT>
+
+<FONT color=#0000ff>// If CARET_SLOP also set then reposition whenever outside slop border</FONT>
+<FONT color=#0000ff>// If CARET_SLOP not set then recentre even when visible</FONT>
+<FONT color=#a020f0>#define wxSTC_CARET_STRICT </FONT><FONT color=#ff00ff>0x04</FONT>
+
+<FONT color=#0000ff>// If CARET_XEVEN set then both left and right margins are given equal weight</FONT>
+<FONT color=#0000ff>// rather than favouring left following behaviour.</FONT>
+<FONT color=#a020f0>#define wxSTC_CARET_XEVEN </FONT><FONT color=#ff00ff>0x08</FONT>
+
+<FONT color=#0000ff>// If CARET_XJUMPS set then when caret reaches the margin the display jumps</FONT>
+<FONT color=#0000ff>// enough to leave the caret solidly within the display.</FONT>
+<FONT color=#a020f0>#define wxSTC_CARET_XJUMPS </FONT><FONT color=#ff00ff>0x10</FONT>
+<FONT color=#a020f0>#define wxSTC_CURSORNORMAL -</FONT><FONT color=#ff00ff>1</FONT>
+<FONT color=#a020f0>#define wxSTC_CURSORWAIT </FONT><FONT color=#ff00ff>3</FONT>
+
+<FONT color=#0000ff>// Constants for use with SetVisiblePolicy, similar to SetCaretPolicy</FONT>
+<FONT color=#a020f0>#define wxSTC_VISIBLE_SLOP </FONT><FONT color=#ff00ff>0x01</FONT>
+<FONT color=#a020f0>#define wxSTC_VISIBLE_STRICT </FONT><FONT color=#ff00ff>0x04</FONT>
+
+<FONT color=#0000ff>// Notifications</FONT>
+<FONT color=#0000ff>// Type of modification and the action which caused the modification</FONT>
+<FONT color=#0000ff>// These are defined as a bit mask to make it easy to specify which notifications are wanted.</FONT>
+<FONT color=#0000ff>// One bit is set from each of SC_MOD_* and SC_PERFORMED_*.</FONT>
+<FONT color=#a020f0>#define wxSTC_MOD_INSERTTEXT </FONT><FONT color=#ff00ff>0x1</FONT>
+<FONT color=#a020f0>#define wxSTC_MOD_DELETETEXT </FONT><FONT color=#ff00ff>0x2</FONT>
+<FONT color=#a020f0>#define wxSTC_MOD_CHANGESTYLE </FONT><FONT color=#ff00ff>0x4</FONT>
+<FONT color=#a020f0>#define wxSTC_MOD_CHANGEFOLD </FONT><FONT color=#ff00ff>0x8</FONT>
+<FONT color=#a020f0>#define wxSTC_PERFORMED_USER </FONT><FONT color=#ff00ff>0x10</FONT>
+<FONT color=#a020f0>#define wxSTC_PERFORMED_UNDO </FONT><FONT color=#ff00ff>0x20</FONT>
+<FONT color=#a020f0>#define wxSTC_PERFORMED_REDO </FONT><FONT color=#ff00ff>0x40</FONT>
+<FONT color=#a020f0>#define wxSTC_LASTSTEPINUNDOREDO </FONT><FONT color=#ff00ff>0x100</FONT>
+<FONT color=#a020f0>#define wxSTC_MOD_CHANGEMARKER </FONT><FONT color=#ff00ff>0x200</FONT>
+<FONT color=#a020f0>#define wxSTC_MOD_BEFOREINSERT </FONT><FONT color=#ff00ff>0x400</FONT>
+<FONT color=#a020f0>#define wxSTC_MOD_BEFOREDELETE </FONT><FONT color=#ff00ff>0x800</FONT>
+<FONT color=#a020f0>#define wxSTC_MODEVENTMASKALL </FONT><FONT color=#ff00ff>0xF77</FONT>
+
+<FONT color=#0000ff>// Symbolic key codes and modifier flags</FONT>
+<FONT color=#0000ff>// ASCII and other printable characters below 256</FONT>
+<FONT color=#0000ff>// Extended keys above 300</FONT>
+<FONT color=#a020f0>#define wxSTC_KEY_DOWN </FONT><FONT color=#ff00ff>300</FONT>
+<FONT color=#a020f0>#define wxSTC_KEY_UP </FONT><FONT color=#ff00ff>301</FONT>
+<FONT color=#a020f0>#define wxSTC_KEY_LEFT </FONT><FONT color=#ff00ff>302</FONT>
+<FONT color=#a020f0>#define wxSTC_KEY_RIGHT </FONT><FONT color=#ff00ff>303</FONT>
+<FONT color=#a020f0>#define wxSTC_KEY_HOME </FONT><FONT color=#ff00ff>304</FONT>
+<FONT color=#a020f0>#define wxSTC_KEY_END </FONT><FONT color=#ff00ff>305</FONT>
+<FONT color=#a020f0>#define wxSTC_KEY_PRIOR </FONT><FONT color=#ff00ff>306</FONT>
+<FONT color=#a020f0>#define wxSTC_KEY_NEXT </FONT><FONT color=#ff00ff>307</FONT>
+<FONT color=#a020f0>#define wxSTC_KEY_DELETE </FONT><FONT color=#ff00ff>308</FONT>
+<FONT color=#a020f0>#define wxSTC_KEY_INSERT </FONT><FONT color=#ff00ff>309</FONT>
+<FONT color=#a020f0>#define wxSTC_KEY_ESCAPE </FONT><FONT color=#ff00ff>7</FONT>
+<FONT color=#a020f0>#define wxSTC_KEY_BACK </FONT><FONT color=#ff00ff>8</FONT>
+<FONT color=#a020f0>#define wxSTC_KEY_TAB </FONT><FONT color=#ff00ff>9</FONT>
+<FONT color=#a020f0>#define wxSTC_KEY_RETURN </FONT><FONT color=#ff00ff>13</FONT>
+<FONT color=#a020f0>#define wxSTC_KEY_ADD </FONT><FONT color=#ff00ff>310</FONT>
+<FONT color=#a020f0>#define wxSTC_KEY_SUBTRACT </FONT><FONT color=#ff00ff>311</FONT>
+<FONT color=#a020f0>#define wxSTC_KEY_DIVIDE </FONT><FONT color=#ff00ff>312</FONT>
+<FONT color=#a020f0>#define wxSTC_SCMOD_SHIFT </FONT><FONT color=#ff00ff>1</FONT>
+<FONT color=#a020f0>#define wxSTC_SCMOD_CTRL </FONT><FONT color=#ff00ff>2</FONT>
+<FONT color=#a020f0>#define wxSTC_SCMOD_ALT </FONT><FONT color=#ff00ff>4</FONT>
+
+<FONT color=#0000ff>// For SciLexer.h</FONT>
+<FONT color=#a020f0>#define wxSTC_LEX_CONTAINER </FONT><FONT color=#ff00ff>0</FONT>
+<FONT color=#a020f0>#define wxSTC_LEX_NULL </FONT><FONT color=#ff00ff>1</FONT>
+<FONT color=#a020f0>#define wxSTC_LEX_PYTHON </FONT><FONT color=#ff00ff>2</FONT>
+<FONT color=#a020f0>#define wxSTC_LEX_CPP </FONT><FONT color=#ff00ff>3</FONT>
+<FONT color=#a020f0>#define wxSTC_LEX_HTML </FONT><FONT color=#ff00ff>4</FONT>
+<FONT color=#a020f0>#define wxSTC_LEX_XML </FONT><FONT color=#ff00ff>5</FONT>
+<FONT color=#a020f0>#define wxSTC_LEX_PERL </FONT><FONT color=#ff00ff>6</FONT>
+<FONT color=#a020f0>#define wxSTC_LEX_SQL </FONT><FONT color=#ff00ff>7</FONT>
+<FONT color=#a020f0>#define wxSTC_LEX_VB </FONT><FONT color=#ff00ff>8</FONT>
+<FONT color=#a020f0>#define wxSTC_LEX_PROPERTIES </FONT><FONT color=#ff00ff>9</FONT>
+<FONT color=#a020f0>#define wxSTC_LEX_ERRORLIST </FONT><FONT color=#ff00ff>10</FONT>
+<FONT color=#a020f0>#define wxSTC_LEX_MAKEFILE </FONT><FONT color=#ff00ff>11</FONT>
+<FONT color=#a020f0>#define wxSTC_LEX_BATCH </FONT><FONT color=#ff00ff>12</FONT>
+<FONT color=#a020f0>#define wxSTC_LEX_XCODE </FONT><FONT color=#ff00ff>13</FONT>
+<FONT color=#a020f0>#define wxSTC_LEX_LATEX </FONT><FONT color=#ff00ff>14</FONT>
+<FONT color=#a020f0>#define wxSTC_LEX_LUA </FONT><FONT color=#ff00ff>15</FONT>
+<FONT color=#a020f0>#define wxSTC_LEX_DIFF </FONT><FONT color=#ff00ff>16</FONT>
+<FONT color=#a020f0>#define wxSTC_LEX_CONF </FONT><FONT color=#ff00ff>17</FONT>
+<FONT color=#a020f0>#define wxSTC_LEX_PASCAL </FONT><FONT color=#ff00ff>18</FONT>
+<FONT color=#a020f0>#define wxSTC_LEX_AVE </FONT><FONT color=#ff00ff>19</FONT>
+<FONT color=#a020f0>#define wxSTC_LEX_ADA </FONT><FONT color=#ff00ff>20</FONT>
+<FONT color=#a020f0>#define wxSTC_LEX_LISP </FONT><FONT color=#ff00ff>21</FONT>
+<FONT color=#a020f0>#define wxSTC_LEX_RUBY </FONT><FONT color=#ff00ff>22</FONT>
+<FONT color=#a020f0>#define wxSTC_LEX_EIFFEL </FONT><FONT color=#ff00ff>23</FONT>
+<FONT color=#a020f0>#define wxSTC_LEX_EIFFELKW </FONT><FONT color=#ff00ff>24</FONT>
+<FONT color=#a020f0>#define wxSTC_LEX_TCL </FONT><FONT color=#ff00ff>25</FONT>
+
+<FONT color=#0000ff>// When a lexer specifies its language as SCLEX_AUTOMATIC it receives a</FONT>
+<FONT color=#0000ff>// value assigned in sequence from SCLEX_AUTOMATIC+1.</FONT>
+<FONT color=#a020f0>#define wxSTC_LEX_AUTOMATIC </FONT><FONT color=#ff00ff>1000</FONT>
+
+<FONT color=#0000ff>// Lexical states for SCLEX_PYTHON</FONT>
+<FONT color=#a020f0>#define wxSTC_P_DEFAULT </FONT><FONT color=#ff00ff>0</FONT>
+<FONT color=#a020f0>#define wxSTC_P_COMMENTLINE </FONT><FONT color=#ff00ff>1</FONT>
+<FONT color=#a020f0>#define wxSTC_P_NUMBER </FONT><FONT color=#ff00ff>2</FONT>
+<FONT color=#a020f0>#define wxSTC_P_STRING </FONT><FONT color=#ff00ff>3</FONT>
+<FONT color=#a020f0>#define wxSTC_P_CHARACTER </FONT><FONT color=#ff00ff>4</FONT>
+<FONT color=#a020f0>#define wxSTC_P_WORD </FONT><FONT color=#ff00ff>5</FONT>
+<FONT color=#a020f0>#define wxSTC_P_TRIPLE </FONT><FONT color=#ff00ff>6</FONT>
+<FONT color=#a020f0>#define wxSTC_P_TRIPLEDOUBLE </FONT><FONT color=#ff00ff>7</FONT>
+<FONT color=#a020f0>#define wxSTC_P_CLASSNAME </FONT><FONT color=#ff00ff>8</FONT>
+<FONT color=#a020f0>#define wxSTC_P_DEFNAME </FONT><FONT color=#ff00ff>9</FONT>
+<FONT color=#a020f0>#define wxSTC_P_OPERATOR </FONT><FONT color=#ff00ff>10</FONT>
+<FONT color=#a020f0>#define wxSTC_P_IDENTIFIER </FONT><FONT color=#ff00ff>11</FONT>
+<FONT color=#a020f0>#define wxSTC_P_COMMENTBLOCK </FONT><FONT color=#ff00ff>12</FONT>
+<FONT color=#a020f0>#define wxSTC_P_STRINGEOL </FONT><FONT color=#ff00ff>13</FONT>
+
+<FONT color=#0000ff>// Lexical states for SCLEX_CPP, SCLEX_VB</FONT>
+<FONT color=#a020f0>#define wxSTC_C_DEFAULT </FONT><FONT color=#ff00ff>0</FONT>
+<FONT color=#a020f0>#define wxSTC_C_COMMENT </FONT><FONT color=#ff00ff>1</FONT>
+<FONT color=#a020f0>#define wxSTC_C_COMMENTLINE </FONT><FONT color=#ff00ff>2</FONT>
+<FONT color=#a020f0>#define wxSTC_C_COMMENTDOC </FONT><FONT color=#ff00ff>3</FONT>
+<FONT color=#a020f0>#define wxSTC_C_NUMBER </FONT><FONT color=#ff00ff>4</FONT>
+<FONT color=#a020f0>#define wxSTC_C_WORD </FONT><FONT color=#ff00ff>5</FONT>
+<FONT color=#a020f0>#define wxSTC_C_STRING </FONT><FONT color=#ff00ff>6</FONT>
+<FONT color=#a020f0>#define wxSTC_C_CHARACTER </FONT><FONT color=#ff00ff>7</FONT>
+<FONT color=#a020f0>#define wxSTC_C_UUID </FONT><FONT color=#ff00ff>8</FONT>
+<FONT color=#a020f0>#define wxSTC_C_PREPROCESSOR </FONT><FONT color=#ff00ff>9</FONT>
+<FONT color=#a020f0>#define wxSTC_C_OPERATOR </FONT><FONT color=#ff00ff>10</FONT>
+<FONT color=#a020f0>#define wxSTC_C_IDENTIFIER </FONT><FONT color=#ff00ff>11</FONT>
+<FONT color=#a020f0>#define wxSTC_C_STRINGEOL </FONT><FONT color=#ff00ff>12</FONT>
+<FONT color=#a020f0>#define wxSTC_C_VERBATIM </FONT><FONT color=#ff00ff>13</FONT>
+<FONT color=#a020f0>#define wxSTC_C_REGEX </FONT><FONT color=#ff00ff>14</FONT>
+<FONT color=#a020f0>#define wxSTC_C_COMMENTLINEDOC </FONT><FONT color=#ff00ff>15</FONT>
+<FONT color=#a020f0>#define wxSTC_C_WORD2 </FONT><FONT color=#ff00ff>16</FONT>
+
+<FONT color=#0000ff>// Lexical states for SCLEX_HTML, SCLEX_XML</FONT>
+<FONT color=#a020f0>#define wxSTC_H_DEFAULT </FONT><FONT color=#ff00ff>0</FONT>
+<FONT color=#a020f0>#define wxSTC_H_TAG </FONT><FONT color=#ff00ff>1</FONT>
+<FONT color=#a020f0>#define wxSTC_H_TAGUNKNOWN </FONT><FONT color=#ff00ff>2</FONT>
+<FONT color=#a020f0>#define wxSTC_H_ATTRIBUTE </FONT><FONT color=#ff00ff>3</FONT>
+<FONT color=#a020f0>#define wxSTC_H_ATTRIBUTEUNKNOWN </FONT><FONT color=#ff00ff>4</FONT>
+<FONT color=#a020f0>#define wxSTC_H_NUMBER </FONT><FONT color=#ff00ff>5</FONT>
+<FONT color=#a020f0>#define wxSTC_H_DOUBLESTRING </FONT><FONT color=#ff00ff>6</FONT>
+<FONT color=#a020f0>#define wxSTC_H_SINGLESTRING </FONT><FONT color=#ff00ff>7</FONT>
+<FONT color=#a020f0>#define wxSTC_H_OTHER </FONT><FONT color=#ff00ff>8</FONT>
+<FONT color=#a020f0>#define wxSTC_H_COMMENT </FONT><FONT color=#ff00ff>9</FONT>
+<FONT color=#a020f0>#define wxSTC_H_ENTITY </FONT><FONT color=#ff00ff>10</FONT>
+
+<FONT color=#0000ff>// XML and ASP</FONT>
+<FONT color=#a020f0>#define wxSTC_H_TAGEND </FONT><FONT color=#ff00ff>11</FONT>
+<FONT color=#a020f0>#define wxSTC_H_XMLSTART </FONT><FONT color=#ff00ff>12</FONT>
+<FONT color=#a020f0>#define wxSTC_H_XMLEND </FONT><FONT color=#ff00ff>13</FONT>
+<FONT color=#a020f0>#define wxSTC_H_SCRIPT </FONT><FONT color=#ff00ff>14</FONT>
+<FONT color=#a020f0>#define wxSTC_H_ASP </FONT><FONT color=#ff00ff>15</FONT>
+<FONT color=#a020f0>#define wxSTC_H_ASPAT </FONT><FONT color=#ff00ff>16</FONT>
+<FONT color=#a020f0>#define wxSTC_H_CDATA </FONT><FONT color=#ff00ff>17</FONT>
+<FONT color=#a020f0>#define wxSTC_H_QUESTION </FONT><FONT color=#ff00ff>18</FONT>
+
+<FONT color=#0000ff>// More HTML</FONT>
+<FONT color=#a020f0>#define wxSTC_H_VALUE </FONT><FONT color=#ff00ff>19</FONT>
+
+<FONT color=#0000ff>// X-Code</FONT>
+<FONT color=#a020f0>#define wxSTC_H_XCCOMMENT </FONT><FONT color=#ff00ff>20</FONT>
+
+<FONT color=#0000ff>// SGML</FONT>
+<FONT color=#a020f0>#define wxSTC_H_SGML </FONT><FONT color=#ff00ff>21</FONT>
+
+<FONT color=#0000ff>// Embedded Javascript</FONT>
+<FONT color=#a020f0>#define wxSTC_HJ_START </FONT><FONT color=#ff00ff>40</FONT>
+<FONT color=#a020f0>#define wxSTC_HJ_DEFAULT </FONT><FONT color=#ff00ff>41</FONT>
+<FONT color=#a020f0>#define wxSTC_HJ_COMMENT </FONT><FONT color=#ff00ff>42</FONT>
+<FONT color=#a020f0>#define wxSTC_HJ_COMMENTLINE </FONT><FONT color=#ff00ff>43</FONT>
+<FONT color=#a020f0>#define wxSTC_HJ_COMMENTDOC </FONT><FONT color=#ff00ff>44</FONT>
+<FONT color=#a020f0>#define wxSTC_HJ_NUMBER </FONT><FONT color=#ff00ff>45</FONT>
+<FONT color=#a020f0>#define wxSTC_HJ_WORD </FONT><FONT color=#ff00ff>46</FONT>
+<FONT color=#a020f0>#define wxSTC_HJ_KEYWORD </FONT><FONT color=#ff00ff>47</FONT>
+<FONT color=#a020f0>#define wxSTC_HJ_DOUBLESTRING </FONT><FONT color=#ff00ff>48</FONT>
+<FONT color=#a020f0>#define wxSTC_HJ_SINGLESTRING </FONT><FONT color=#ff00ff>49</FONT>
+<FONT color=#a020f0>#define wxSTC_HJ_SYMBOLS </FONT><FONT color=#ff00ff>50</FONT>
+<FONT color=#a020f0>#define wxSTC_HJ_STRINGEOL </FONT><FONT color=#ff00ff>51</FONT>
+<FONT color=#a020f0>#define wxSTC_HJ_REGEX </FONT><FONT color=#ff00ff>52</FONT>
+
+<FONT color=#0000ff>// ASP Javascript</FONT>
+<FONT color=#a020f0>#define wxSTC_HJA_START </FONT><FONT color=#ff00ff>55</FONT>
+<FONT color=#a020f0>#define wxSTC_HJA_DEFAULT </FONT><FONT color=#ff00ff>56</FONT>
+<FONT color=#a020f0>#define wxSTC_HJA_COMMENT </FONT><FONT color=#ff00ff>57</FONT>
+<FONT color=#a020f0>#define wxSTC_HJA_COMMENTLINE </FONT><FONT color=#ff00ff>58</FONT>
+<FONT color=#a020f0>#define wxSTC_HJA_COMMENTDOC </FONT><FONT color=#ff00ff>59</FONT>
+<FONT color=#a020f0>#define wxSTC_HJA_NUMBER </FONT><FONT color=#ff00ff>60</FONT>
+<FONT color=#a020f0>#define wxSTC_HJA_WORD </FONT><FONT color=#ff00ff>61</FONT>
+<FONT color=#a020f0>#define wxSTC_HJA_KEYWORD </FONT><FONT color=#ff00ff>62</FONT>
+<FONT color=#a020f0>#define wxSTC_HJA_DOUBLESTRING </FONT><FONT color=#ff00ff>63</FONT>
+<FONT color=#a020f0>#define wxSTC_HJA_SINGLESTRING </FONT><FONT color=#ff00ff>64</FONT>
+<FONT color=#a020f0>#define wxSTC_HJA_SYMBOLS </FONT><FONT color=#ff00ff>65</FONT>
+<FONT color=#a020f0>#define wxSTC_HJA_STRINGEOL </FONT><FONT color=#ff00ff>66</FONT>
+<FONT color=#a020f0>#define wxSTC_HJA_REGEX </FONT><FONT color=#ff00ff>67</FONT>
+
+<FONT color=#0000ff>// Embedded VBScript</FONT>
+<FONT color=#a020f0>#define wxSTC_HB_START </FONT><FONT color=#ff00ff>70</FONT>
+<FONT color=#a020f0>#define wxSTC_HB_DEFAULT </FONT><FONT color=#ff00ff>71</FONT>
+<FONT color=#a020f0>#define wxSTC_HB_COMMENTLINE </FONT><FONT color=#ff00ff>72</FONT>
+<FONT color=#a020f0>#define wxSTC_HB_NUMBER </FONT><FONT color=#ff00ff>73</FONT>
+<FONT color=#a020f0>#define wxSTC_HB_WORD </FONT><FONT color=#ff00ff>74</FONT>
+<FONT color=#a020f0>#define wxSTC_HB_STRING </FONT><FONT color=#ff00ff>75</FONT>
+<FONT color=#a020f0>#define wxSTC_HB_IDENTIFIER </FONT><FONT color=#ff00ff>76</FONT>
+<FONT color=#a020f0>#define wxSTC_HB_STRINGEOL </FONT><FONT color=#ff00ff>77</FONT>
+
+<FONT color=#0000ff>// ASP VBScript</FONT>
+<FONT color=#a020f0>#define wxSTC_HBA_START </FONT><FONT color=#ff00ff>80</FONT>
+<FONT color=#a020f0>#define wxSTC_HBA_DEFAULT </FONT><FONT color=#ff00ff>81</FONT>
+<FONT color=#a020f0>#define wxSTC_HBA_COMMENTLINE </FONT><FONT color=#ff00ff>82</FONT>
+<FONT color=#a020f0>#define wxSTC_HBA_NUMBER </FONT><FONT color=#ff00ff>83</FONT>
+<FONT color=#a020f0>#define wxSTC_HBA_WORD </FONT><FONT color=#ff00ff>84</FONT>
+<FONT color=#a020f0>#define wxSTC_HBA_STRING </FONT><FONT color=#ff00ff>85</FONT>
+<FONT color=#a020f0>#define wxSTC_HBA_IDENTIFIER </FONT><FONT color=#ff00ff>86</FONT>
+<FONT color=#a020f0>#define wxSTC_HBA_STRINGEOL </FONT><FONT color=#ff00ff>87</FONT>
+
+<FONT color=#0000ff>// Embedded Python</FONT>
+<FONT color=#a020f0>#define wxSTC_HP_START </FONT><FONT color=#ff00ff>90</FONT>
+<FONT color=#a020f0>#define wxSTC_HP_DEFAULT </FONT><FONT color=#ff00ff>91</FONT>
+<FONT color=#a020f0>#define wxSTC_HP_COMMENTLINE </FONT><FONT color=#ff00ff>92</FONT>
+<FONT color=#a020f0>#define wxSTC_HP_NUMBER </FONT><FONT color=#ff00ff>93</FONT>
+<FONT color=#a020f0>#define wxSTC_HP_STRING </FONT><FONT color=#ff00ff>94</FONT>
+<FONT color=#a020f0>#define wxSTC_HP_CHARACTER </FONT><FONT color=#ff00ff>95</FONT>
+<FONT color=#a020f0>#define wxSTC_HP_WORD </FONT><FONT color=#ff00ff>96</FONT>
+<FONT color=#a020f0>#define wxSTC_HP_TRIPLE </FONT><FONT color=#ff00ff>97</FONT>
+<FONT color=#a020f0>#define wxSTC_HP_TRIPLEDOUBLE </FONT><FONT color=#ff00ff>98</FONT>
+<FONT color=#a020f0>#define wxSTC_HP_CLASSNAME </FONT><FONT color=#ff00ff>99</FONT>
+<FONT color=#a020f0>#define wxSTC_HP_DEFNAME </FONT><FONT color=#ff00ff>100</FONT>
+<FONT color=#a020f0>#define wxSTC_HP_OPERATOR </FONT><FONT color=#ff00ff>101</FONT>
+<FONT color=#a020f0>#define wxSTC_HP_IDENTIFIER </FONT><FONT color=#ff00ff>102</FONT>
+
+<FONT color=#0000ff>// ASP Python</FONT>
+<FONT color=#a020f0>#define wxSTC_HPA_START </FONT><FONT color=#ff00ff>105</FONT>
+<FONT color=#a020f0>#define wxSTC_HPA_DEFAULT </FONT><FONT color=#ff00ff>106</FONT>
+<FONT color=#a020f0>#define wxSTC_HPA_COMMENTLINE </FONT><FONT color=#ff00ff>107</FONT>
+<FONT color=#a020f0>#define wxSTC_HPA_NUMBER </FONT><FONT color=#ff00ff>108</FONT>
+<FONT color=#a020f0>#define wxSTC_HPA_STRING </FONT><FONT color=#ff00ff>109</FONT>
+<FONT color=#a020f0>#define wxSTC_HPA_CHARACTER </FONT><FONT color=#ff00ff>110</FONT>
+<FONT color=#a020f0>#define wxSTC_HPA_WORD </FONT><FONT color=#ff00ff>111</FONT>
+<FONT color=#a020f0>#define wxSTC_HPA_TRIPLE </FONT><FONT color=#ff00ff>112</FONT>
+<FONT color=#a020f0>#define wxSTC_HPA_TRIPLEDOUBLE </FONT><FONT color=#ff00ff>113</FONT>
+<FONT color=#a020f0>#define wxSTC_HPA_CLASSNAME </FONT><FONT color=#ff00ff>114</FONT>
+<FONT color=#a020f0>#define wxSTC_HPA_DEFNAME </FONT><FONT color=#ff00ff>115</FONT>
+<FONT color=#a020f0>#define wxSTC_HPA_OPERATOR </FONT><FONT color=#ff00ff>116</FONT>
+<FONT color=#a020f0>#define wxSTC_HPA_IDENTIFIER </FONT><FONT color=#ff00ff>117</FONT>
+
+<FONT color=#0000ff>// PHP</FONT>
+<FONT color=#a020f0>#define wxSTC_HPHP_DEFAULT </FONT><FONT color=#ff00ff>118</FONT>
+<FONT color=#a020f0>#define wxSTC_HPHP_HSTRING </FONT><FONT color=#ff00ff>119</FONT>
+<FONT color=#a020f0>#define wxSTC_HPHP_SIMPLESTRING </FONT><FONT color=#ff00ff>120</FONT>
+<FONT color=#a020f0>#define wxSTC_HPHP_WORD </FONT><FONT color=#ff00ff>121</FONT>
+<FONT color=#a020f0>#define wxSTC_HPHP_NUMBER </FONT><FONT color=#ff00ff>122</FONT>
+<FONT color=#a020f0>#define wxSTC_HPHP_VARIABLE </FONT><FONT color=#ff00ff>123</FONT>
+<FONT color=#a020f0>#define wxSTC_HPHP_COMMENT </FONT><FONT color=#ff00ff>124</FONT>
+<FONT color=#a020f0>#define wxSTC_HPHP_COMMENTLINE </FONT><FONT color=#ff00ff>125</FONT>
+<FONT color=#a020f0>#define wxSTC_HPHP_HSTRING_VARIABLE </FONT><FONT color=#ff00ff>126</FONT>
+<FONT color=#a020f0>#define wxSTC_HPHP_OPERATOR </FONT><FONT color=#ff00ff>127</FONT>
+
+<FONT color=#0000ff>// Lexical states for SCLEX_PERL</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_DEFAULT </FONT><FONT color=#ff00ff>0</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_ERROR </FONT><FONT color=#ff00ff>1</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_COMMENTLINE </FONT><FONT color=#ff00ff>2</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_POD </FONT><FONT color=#ff00ff>3</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_NUMBER </FONT><FONT color=#ff00ff>4</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_WORD </FONT><FONT color=#ff00ff>5</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_STRING </FONT><FONT color=#ff00ff>6</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_CHARACTER </FONT><FONT color=#ff00ff>7</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_PUNCTUATION </FONT><FONT color=#ff00ff>8</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_PREPROCESSOR </FONT><FONT color=#ff00ff>9</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_OPERATOR </FONT><FONT color=#ff00ff>10</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_IDENTIFIER </FONT><FONT color=#ff00ff>11</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_SCALAR </FONT><FONT color=#ff00ff>12</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_ARRAY </FONT><FONT color=#ff00ff>13</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_HASH </FONT><FONT color=#ff00ff>14</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_SYMBOLTABLE </FONT><FONT color=#ff00ff>15</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_REGEX </FONT><FONT color=#ff00ff>17</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_REGSUBST </FONT><FONT color=#ff00ff>18</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_LONGQUOTE </FONT><FONT color=#ff00ff>19</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_BACKTICKS </FONT><FONT color=#ff00ff>20</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_DATASECTION </FONT><FONT color=#ff00ff>21</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_HERE_DELIM </FONT><FONT color=#ff00ff>22</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_HERE_Q </FONT><FONT color=#ff00ff>23</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_HERE_QQ </FONT><FONT color=#ff00ff>24</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_HERE_QX </FONT><FONT color=#ff00ff>25</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_STRING_Q </FONT><FONT color=#ff00ff>26</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_STRING_QQ </FONT><FONT color=#ff00ff>27</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_STRING_QX </FONT><FONT color=#ff00ff>28</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_STRING_QR </FONT><FONT color=#ff00ff>29</FONT>
+<FONT color=#a020f0>#define wxSTC_PL_STRING_QW </FONT><FONT color=#ff00ff>30</FONT>
+
+<FONT color=#0000ff>// Lexical states for SCLEX_LATEX</FONT>
+<FONT color=#a020f0>#define wxSTC_L_DEFAULT </FONT><FONT color=#ff00ff>0</FONT>
+<FONT color=#a020f0>#define wxSTC_L_COMMAND </FONT><FONT color=#ff00ff>1</FONT>
+<FONT color=#a020f0>#define wxSTC_L_TAG </FONT><FONT color=#ff00ff>2</FONT>
+<FONT color=#a020f0>#define wxSTC_L_MATH </FONT><FONT color=#ff00ff>3</FONT>
+<FONT color=#a020f0>#define wxSTC_L_COMMENT </FONT><FONT color=#ff00ff>4</FONT>
+
+<FONT color=#0000ff>// Lexical states for SCLEX_LUA</FONT>
+<FONT color=#a020f0>#define wxSTC_LUA_DEFAULT </FONT><FONT color=#ff00ff>0</FONT>
+<FONT color=#a020f0>#define wxSTC_LUA_COMMENT </FONT><FONT color=#ff00ff>1</FONT>
+<FONT color=#a020f0>#define wxSTC_LUA_COMMENTLINE </FONT><FONT color=#ff00ff>2</FONT>
+<FONT color=#a020f0>#define wxSTC_LUA_COMMENTDOC </FONT><FONT color=#ff00ff>3</FONT>
+<FONT color=#a020f0>#define wxSTC_LUA_NUMBER </FONT><FONT color=#ff00ff>4</FONT>
+<FONT color=#a020f0>#define wxSTC_LUA_WORD </FONT><FONT color=#ff00ff>5</FONT>
+<FONT color=#a020f0>#define wxSTC_LUA_STRING </FONT><FONT color=#ff00ff>6</FONT>
+<FONT color=#a020f0>#define wxSTC_LUA_CHARACTER </FONT><FONT color=#ff00ff>7</FONT>
+<FONT color=#a020f0>#define wxSTC_LUA_LITERALSTRING </FONT><FONT color=#ff00ff>8</FONT>
+<FONT color=#a020f0>#define wxSTC_LUA_PREPROCESSOR </FONT><FONT color=#ff00ff>9</FONT>
+<FONT color=#a020f0>#define wxSTC_LUA_OPERATOR </FONT><FONT color=#ff00ff>10</FONT>
+<FONT color=#a020f0>#define wxSTC_LUA_IDENTIFIER </FONT><FONT color=#ff00ff>11</FONT>
+<FONT color=#a020f0>#define wxSTC_LUA_STRINGEOL </FONT><FONT color=#ff00ff>12</FONT>
+
+<FONT color=#0000ff>// Lexical states for SCLEX_ERRORLIST</FONT>
+<FONT color=#a020f0>#define wxSTC_ERR_DEFAULT </FONT><FONT color=#ff00ff>0</FONT>
+<FONT color=#a020f0>#define wxSTC_ERR_PYTHON </FONT><FONT color=#ff00ff>1</FONT>
+<FONT color=#a020f0>#define wxSTC_ERR_GCC </FONT><FONT color=#ff00ff>2</FONT>
+<FONT color=#a020f0>#define wxSTC_ERR_MS </FONT><FONT color=#ff00ff>3</FONT>
+<FONT color=#a020f0>#define wxSTC_ERR_CMD </FONT><FONT color=#ff00ff>4</FONT>
+<FONT color=#a020f0>#define wxSTC_ERR_BORLAND </FONT><FONT color=#ff00ff>5</FONT>
+<FONT color=#a020f0>#define wxSTC_ERR_PERL </FONT><FONT color=#ff00ff>6</FONT>
+<FONT color=#a020f0>#define wxSTC_ERR_NET </FONT><FONT color=#ff00ff>7</FONT>
+<FONT color=#a020f0>#define wxSTC_ERR_LUA </FONT><FONT color=#ff00ff>8</FONT>
+<FONT color=#a020f0>#define wxSTC_ERR_DIFF_CHANGED </FONT><FONT color=#ff00ff>10</FONT>
+<FONT color=#a020f0>#define wxSTC_ERR_DIFF_ADDITION </FONT><FONT color=#ff00ff>11</FONT>
+<FONT color=#a020f0>#define wxSTC_ERR_DIFF_DELETION </FONT><FONT color=#ff00ff>12</FONT>
+<FONT color=#a020f0>#define wxSTC_ERR_DIFF_MESSAGE </FONT><FONT color=#ff00ff>13</FONT>
+
+<FONT color=#0000ff>// Lexical states for SCLEX_BATCH</FONT>
+<FONT color=#a020f0>#define wxSTC_BAT_DEFAULT </FONT><FONT color=#ff00ff>0</FONT>
+<FONT color=#a020f0>#define wxSTC_BAT_COMMENT </FONT><FONT color=#ff00ff>1</FONT>
+<FONT color=#a020f0>#define wxSTC_BAT_WORD </FONT><FONT color=#ff00ff>2</FONT>
+<FONT color=#a020f0>#define wxSTC_BAT_LABEL </FONT><FONT color=#ff00ff>3</FONT>
+<FONT color=#a020f0>#define wxSTC_BAT_HIDE </FONT><FONT color=#ff00ff>4</FONT>
+<FONT color=#a020f0>#define wxSTC_BAT_COMMAND </FONT><FONT color=#ff00ff>5</FONT>
+<FONT color=#a020f0>#define wxSTC_BAT_IDENTIFIER </FONT><FONT color=#ff00ff>6</FONT>
+<FONT color=#a020f0>#define wxSTC_BAT_OPERATOR </FONT><FONT color=#ff00ff>7</FONT>
+
+<FONT color=#0000ff>// Lexical states for SCLEX_MAKEFILE</FONT>
+<FONT color=#a020f0>#define wxSTC_MAKE_DEFAULT </FONT><FONT color=#ff00ff>0</FONT>
+<FONT color=#a020f0>#define wxSTC_MAKE_COMMENT </FONT><FONT color=#ff00ff>1</FONT>
+<FONT color=#a020f0>#define wxSTC_MAKE_PREPROCESSOR </FONT><FONT color=#ff00ff>2</FONT>
+<FONT color=#a020f0>#define wxSTC_MAKE_IDENTIFIER </FONT><FONT color=#ff00ff>3</FONT>
+<FONT color=#a020f0>#define wxSTC_MAKE_OPERATOR </FONT><FONT color=#ff00ff>4</FONT>
+<FONT color=#a020f0>#define wxSTC_MAKE_TARGET </FONT><FONT color=#ff00ff>5</FONT>
+<FONT color=#a020f0>#define wxSTC_MAKE_IDEOL </FONT><FONT color=#ff00ff>9</FONT>
+
+<FONT color=#0000ff>// Lexical states for the SCLEX_CONF (Apache Configuration Files Lexer)</FONT>
+<FONT color=#a020f0>#define wxSTC_CONF_DEFAULT </FONT><FONT color=#ff00ff>0</FONT>
+<FONT color=#a020f0>#define wxSTC_CONF_COMMENT </FONT><FONT color=#ff00ff>1</FONT>
+<FONT color=#a020f0>#define wxSTC_CONF_NUMBER </FONT><FONT color=#ff00ff>2</FONT>
+<FONT color=#a020f0>#define wxSTC_CONF_IDENTIFIER </FONT><FONT color=#ff00ff>3</FONT>
+<FONT color=#a020f0>#define wxSTC_CONF_EXTENSION </FONT><FONT color=#ff00ff>4</FONT>
+<FONT color=#a020f0>#define wxSTC_CONF_PARAMETER </FONT><FONT color=#ff00ff>5</FONT>
+<FONT color=#a020f0>#define wxSTC_CONF_STRING </FONT><FONT color=#ff00ff>6</FONT>
+<FONT color=#a020f0>#define wxSTC_CONF_OPERATOR </FONT><FONT color=#ff00ff>7</FONT>
+<FONT color=#a020f0>#define wxSTC_CONF_IP </FONT><FONT color=#ff00ff>8</FONT>
+<FONT color=#a020f0>#define wxSTC_CONF_DIRECTIVE </FONT><FONT color=#ff00ff>9</FONT>
+
+<FONT color=#0000ff>// Avenue</FONT>
+<FONT color=#a020f0>#define wxSTC_AVE_DEFAULT </FONT><FONT color=#ff00ff>0</FONT>
+<FONT color=#a020f0>#define wxSTC_AVE_COMMENT </FONT><FONT color=#ff00ff>1</FONT>
+<FONT color=#a020f0>#define wxSTC_AVE_NUMBER </FONT><FONT color=#ff00ff>2</FONT>
+<FONT color=#a020f0>#define wxSTC_AVE_WORD </FONT><FONT color=#ff00ff>3</FONT>
+<FONT color=#a020f0>#define wxSTC_AVE_KEYWORD </FONT><FONT color=#ff00ff>4</FONT>
+<FONT color=#a020f0>#define wxSTC_AVE_STATEMENT </FONT><FONT color=#ff00ff>5</FONT>
+<FONT color=#a020f0>#define wxSTC_AVE_STRING </FONT><FONT color=#ff00ff>6</FONT>
+<FONT color=#a020f0>#define wxSTC_AVE_ENUM </FONT><FONT color=#ff00ff>7</FONT>
+<FONT color=#a020f0>#define wxSTC_AVE_STRINGEOL </FONT><FONT color=#ff00ff>8</FONT>
+<FONT color=#a020f0>#define wxSTC_AVE_IDENTIFIER </FONT><FONT color=#ff00ff>9</FONT>
+<FONT color=#a020f0>#define wxSTC_AVE_OPERATOR </FONT><FONT color=#ff00ff>10</FONT>
+
+<FONT color=#0000ff>// Lexical states for SCLEX_ADA</FONT>
+<FONT color=#a020f0>#define wxSTC_ADA_DEFAULT </FONT><FONT color=#ff00ff>0</FONT>
+<FONT color=#a020f0>#define wxSTC_ADA_COMMENT </FONT><FONT color=#ff00ff>1</FONT>
+<FONT color=#a020f0>#define wxSTC_ADA_NUMBER </FONT><FONT color=#ff00ff>2</FONT>
+<FONT color=#a020f0>#define wxSTC_ADA_WORD </FONT><FONT color=#ff00ff>3</FONT>
+<FONT color=#a020f0>#define wxSTC_ADA_STRING </FONT><FONT color=#ff00ff>4</FONT>
+<FONT color=#a020f0>#define wxSTC_ADA_CHARACTER </FONT><FONT color=#ff00ff>5</FONT>
+<FONT color=#a020f0>#define wxSTC_ADA_OPERATOR </FONT><FONT color=#ff00ff>6</FONT>
+<FONT color=#a020f0>#define wxSTC_ADA_IDENTIFIER </FONT><FONT color=#ff00ff>7</FONT>
+<FONT color=#a020f0>#define wxSTC_ADA_STRINGEOL </FONT><FONT color=#ff00ff>8</FONT>
+
+<FONT color=#0000ff>// Lexical states for SCLEX_LISP</FONT>
+<FONT color=#a020f0>#define wxSTC_LISP_DEFAULT </FONT><FONT color=#ff00ff>0</FONT>
+<FONT color=#a020f0>#define wxSTC_LISP_COMMENT </FONT><FONT color=#ff00ff>1</FONT>
+<FONT color=#a020f0>#define wxSTC_LISP_NUMBER </FONT><FONT color=#ff00ff>2</FONT>
+<FONT color=#a020f0>#define wxSTC_LISP_KEYWORD </FONT><FONT color=#ff00ff>3</FONT>
+<FONT color=#a020f0>#define wxSTC_LISP_STRING </FONT><FONT color=#ff00ff>6</FONT>
+<FONT color=#a020f0>#define wxSTC_LISP_STRINGEOL </FONT><FONT color=#ff00ff>8</FONT>
+<FONT color=#a020f0>#define wxSTC_LISP_IDENTIFIER </FONT><FONT color=#ff00ff>9</FONT>
+<FONT color=#a020f0>#define wxSTC_LISP_OPERATOR </FONT><FONT color=#ff00ff>10</FONT>
+
+<FONT color=#0000ff>// Lexical states for SCLEX_EIFFEL and SCLEX_EIFFELKW</FONT>
+<FONT color=#a020f0>#define wxSTC_EIFFEL_DEFAULT </FONT><FONT color=#ff00ff>0</FONT>
+<FONT color=#a020f0>#define wxSTC_EIFFEL_COMMENTLINE </FONT><FONT color=#ff00ff>1</FONT>
+<FONT color=#a020f0>#define wxSTC_EIFFEL_NUMBER </FONT><FONT color=#ff00ff>2</FONT>
+<FONT color=#a020f0>#define wxSTC_EIFFEL_WORD </FONT><FONT color=#ff00ff>3</FONT>
+<FONT color=#a020f0>#define wxSTC_EIFFEL_STRING </FONT><FONT color=#ff00ff>4</FONT>
+<FONT color=#a020f0>#define wxSTC_EIFFEL_CHARACTER </FONT><FONT color=#ff00ff>5</FONT>
+<FONT color=#a020f0>#define wxSTC_EIFFEL_OPERATOR </FONT><FONT color=#ff00ff>6</FONT>
+<FONT color=#a020f0>#define wxSTC_EIFFEL_IDENTIFIER </FONT><FONT color=#ff00ff>7</FONT>
+<FONT color=#a020f0>#define wxSTC_EIFFEL_STRINGEOL </FONT><FONT color=#ff00ff>8</FONT>
+
+<FONT color=#0000ff>// END of generated section</FONT>
+<FONT color=#0000ff>//----------------------------------------------------------------------</FONT>
+<FONT color=#0000ff>// Others</FONT>
+
+<FONT color=#a020f0>#define wxSTC_MASK_FOLDERS ((</FONT><FONT color=#ff00ff>1</FONT><FONT color=#a020f0> &lt;&lt; wxSTC_MARKNUM_FOLDER) | (</FONT><FONT color=#ff00ff>1</FONT><FONT color=#a020f0> &lt;&lt; wxSTC_MARKNUM_FOLDEROPEN))</FONT>
+
+
+
+<FONT color=#0000ff>//----------------------------------------------------------------------</FONT>
+
+<B><FONT color=#2e8b57>class</FONT></B>  ScintillaWX;                      <FONT color=#0000ff>// forward declare</FONT>
+<B><FONT color=#2e8b57>class</FONT></B>  WordList;
+<B><FONT color=#2e8b57>struct</FONT></B> SCNotification;
+
+
+<B><FONT color=#2e8b57>extern</FONT></B> <B><FONT color=#2e8b57>const</FONT></B> wxChar* wxSTCNameStr;
+
+<FONT color=#0000ff>//----------------------------------------------------------------------</FONT>
+
+<B><FONT color=#2e8b57>class</FONT></B> wxStyledTextCtrl : <B><FONT color=#804040>public</FONT></B> wxControl {
+<B><FONT color=#804040>public</FONT></B>:
+
+<FONT color=#a020f0>#ifdef SWIG</FONT>
     wxStyledTextCtrl(wxWindow *parent, wxWindowID id,
-                     <B><FONT COLOR=#2e8b57>const</FONT></B> wxPoint&amp; pos = wxDefaultPosition,
-                     <B><FONT COLOR=#2e8b57>const</FONT></B> wxSize&amp; size = wxDefaultSize, <B><FONT COLOR=#2e8b57>long</FONT></B> style = <FONT COLOR=#ff00ff>0</FONT>,
-                     <B><FONT COLOR=#2e8b57>const</FONT></B> <B><FONT COLOR=#2e8b57>char</FONT></B>* name = <FONT COLOR=#ff00ff>&quot;styledtext&quot;</FONT>);
-<FONT COLOR=#a020f0>#else</FONT>
+                     <B><FONT color=#2e8b57>const</FONT></B> wxPoint&amp; pos = wxDefaultPosition,
+                     <B><FONT color=#2e8b57>const</FONT></B> wxSize&amp; size = wxDefaultSize, <B><FONT color=#2e8b57>long</FONT></B> style = <FONT color=#ff00ff>0</FONT>,
+                     <B><FONT color=#2e8b57>const</FONT></B> <B><FONT color=#2e8b57>char</FONT></B>* name = <FONT color=#ff00ff>&quot;styledtext&quot;</FONT>);
+<FONT color=#a020f0>#else</FONT>
     wxStyledTextCtrl(wxWindow *parent, wxWindowID id,
-                     <B><FONT COLOR=#2e8b57>const</FONT></B> wxPoint&amp; pos = wxDefaultPosition,
-                     <B><FONT COLOR=#2e8b57>const</FONT></B> wxSize&amp; size = wxDefaultSize, <B><FONT COLOR=#2e8b57>long</FONT></B> style = <FONT COLOR=#ff00ff>0</FONT>,
-                     <B><FONT COLOR=#2e8b57>const</FONT></B> wxString&amp; name = wxSTCNameStr);
-<FONT COLOR=#a020f0>#endif</FONT>
+                     <B><FONT color=#2e8b57>const</FONT></B> wxPoint&amp; pos = wxDefaultPosition,
+                     <B><FONT color=#2e8b57>const</FONT></B> wxSize&amp; size = wxDefaultSize, <B><FONT color=#2e8b57>long</FONT></B> style = <FONT color=#ff00ff>0</FONT>,
+                     <B><FONT color=#2e8b57>const</FONT></B> wxString&amp; name = wxSTCNameStr);
+<FONT color=#a020f0>#endif</FONT>
 
 
-<FONT COLOR=#a020f0>#ifndef SWIG</FONT>
+<FONT color=#a020f0>#ifndef SWIG</FONT>
     ~wxStyledTextCtrl();
-<FONT COLOR=#a020f0>#endif</FONT>
+<FONT color=#a020f0>#endif</FONT>
 
-<FONT COLOR=#0000ff>//----------------------------------------------------------------------</FONT>
-<FONT COLOR=#0000ff>// BEGIN generated section.  The following code is automatically generated</FONT>
-<FONT COLOR=#0000ff>//       by gen_iface.py.  Do not edit this file.  Edit stc.h.in instead</FONT>
-<FONT COLOR=#0000ff>//       and regenerate</FONT>
+<FONT color=#0000ff>//----------------------------------------------------------------------</FONT>
+<FONT color=#0000ff>// BEGIN generated section.  The following code is automatically generated</FONT>
+<FONT color=#0000ff>//       by gen_iface.py.  Do not edit this file.  Edit stc.h.in instead</FONT>
+<FONT color=#0000ff>//       and regenerate</FONT>
 
 
-    <FONT COLOR=#0000ff>// Add text to the document</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> AddText(<B><FONT COLOR=#2e8b57>const</FONT></B> wxString&amp; text);
+    <FONT color=#0000ff>// Add text to the document</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> AddText(<B><FONT color=#2e8b57>const</FONT></B> wxString&amp; text);
 
-    <FONT COLOR=#0000ff>// Add array of cells to document</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> AddStyledText(<B><FONT COLOR=#2e8b57>const</FONT></B> wxString&amp; text);
+    <FONT color=#0000ff>// Add array of cells to document</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> AddStyledText(<B><FONT color=#2e8b57>const</FONT></B> wxString&amp; text);
 
-    <FONT COLOR=#0000ff>// Insert string at a position</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> InsertText(<B><FONT COLOR=#2e8b57>int</FONT></B> pos, <B><FONT COLOR=#2e8b57>const</FONT></B> wxString&amp; text);
+    <FONT color=#0000ff>// Insert string at a position</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> InsertText(<B><FONT color=#2e8b57>int</FONT></B> pos, <B><FONT color=#2e8b57>const</FONT></B> wxString&amp; text);
 
-    <FONT COLOR=#0000ff>// Delete all text in the document</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> ClearAll();
+    <FONT color=#0000ff>// Delete all text in the document</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> ClearAll();
 
-    <FONT COLOR=#0000ff>// Set all style bytes to 0, remove all folding information</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> ClearDocumentStyle();
+    <FONT color=#0000ff>// Set all style bytes to 0, remove all folding information</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> ClearDocumentStyle();
 
-    <FONT COLOR=#0000ff>// The number of characters in the document</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetLength();
+    <FONT color=#0000ff>// The number of characters in the document</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetLength();
 
-    <FONT COLOR=#0000ff>// Returns the character byte at the position</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetCharAt(<B><FONT COLOR=#2e8b57>int</FONT></B> pos);
+    <FONT color=#0000ff>// Returns the character byte at the position</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetCharAt(<B><FONT color=#2e8b57>int</FONT></B> pos);
 
-    <FONT COLOR=#0000ff>// Returns the position of the caret</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetCurrentPos();
+    <FONT color=#0000ff>// Returns the position of the caret</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetCurrentPos();
 
-    <FONT COLOR=#0000ff>// Returns the position of the opposite end of the selection to the caret</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetAnchor();
+    <FONT color=#0000ff>// Returns the position of the opposite end of the selection to the caret</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetAnchor();
 
-    <FONT COLOR=#0000ff>// Returns the style byte at the position</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetStyleAt(<B><FONT COLOR=#2e8b57>int</FONT></B> pos);
+    <FONT color=#0000ff>// Returns the style byte at the position</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetStyleAt(<B><FONT color=#2e8b57>int</FONT></B> pos);
 
-    <FONT COLOR=#0000ff>// Redoes the next action on the undo history</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> Redo();
+    <FONT color=#0000ff>// Redoes the next action on the undo history</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> Redo();
 
-    <FONT COLOR=#0000ff>// Choose between collecting actions into the undo</FONT>
-    <FONT COLOR=#0000ff>// history and discarding them.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetUndoCollection(<B><FONT COLOR=#2e8b57>bool</FONT></B> collectUndo);
+    <FONT color=#0000ff>// Choose between collecting actions into the undo</FONT>
+    <FONT color=#0000ff>// history and discarding them.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetUndoCollection(<B><FONT color=#2e8b57>bool</FONT></B> collectUndo);
 
-    <FONT COLOR=#0000ff>// Select all the text in the document.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SelectAll();
+    <FONT color=#0000ff>// Select all the text in the document.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SelectAll();
 
-    <FONT COLOR=#0000ff>// Remember the current position in the undo history as the position</FONT>
-    <FONT COLOR=#0000ff>// at which the document was saved.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetSavePoint();
+    <FONT color=#0000ff>// Remember the current position in the undo history as the position</FONT>
+    <FONT color=#0000ff>// at which the document was saved.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetSavePoint();
 
-    <FONT COLOR=#0000ff>// Retrieve a buffer of cells.</FONT>
-    wxString GetStyledText(<B><FONT COLOR=#2e8b57>int</FONT></B> startPos, <B><FONT COLOR=#2e8b57>int</FONT></B> endPos);
+    <FONT color=#0000ff>// Retrieve a buffer of cells.</FONT>
+    wxString GetStyledText(<B><FONT color=#2e8b57>int</FONT></B> startPos, <B><FONT color=#2e8b57>int</FONT></B> endPos);
 
-    <FONT COLOR=#0000ff>// Are there any redoable actions in the undo history.</FONT>
-    <B><FONT COLOR=#2e8b57>bool</FONT></B> CanRedo();
+    <FONT color=#0000ff>// Are there any redoable actions in the undo history.</FONT>
+    <B><FONT color=#2e8b57>bool</FONT></B> CanRedo();
 
-    <FONT COLOR=#0000ff>// Retrieve the line number at which a particular marker is located</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> MarkerLineFromHandle(<B><FONT COLOR=#2e8b57>int</FONT></B> handle);
+    <FONT color=#0000ff>// Retrieve the line number at which a particular marker is located</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> MarkerLineFromHandle(<B><FONT color=#2e8b57>int</FONT></B> handle);
 
-    <FONT COLOR=#0000ff>// Delete a marker.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> MarkerDeleteHandle(<B><FONT COLOR=#2e8b57>int</FONT></B> handle);
+    <FONT color=#0000ff>// Delete a marker.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> MarkerDeleteHandle(<B><FONT color=#2e8b57>int</FONT></B> handle);
 
-    <FONT COLOR=#0000ff>// Is undo history being collected?</FONT>
-    <B><FONT COLOR=#2e8b57>bool</FONT></B> GetUndoCollection();
+    <FONT color=#0000ff>// Is undo history being collected?</FONT>
+    <B><FONT color=#2e8b57>bool</FONT></B> GetUndoCollection();
 
-    <FONT COLOR=#0000ff>// Are white space characters currently visible?</FONT>
-    <FONT COLOR=#0000ff>// Returns one of SCWS_* constants.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetViewWhiteSpace();
+    <FONT color=#0000ff>// Are white space characters currently visible?</FONT>
+    <FONT color=#0000ff>// Returns one of SCWS_* constants.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetViewWhiteSpace();
 
-    <FONT COLOR=#0000ff>// Make white space characters invisible, always visible or visible outside indentation.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetViewWhiteSpace(<B><FONT COLOR=#2e8b57>int</FONT></B> viewWS);
+    <FONT color=#0000ff>// Make white space characters invisible, always visible or visible outside indentation.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetViewWhiteSpace(<B><FONT color=#2e8b57>int</FONT></B> viewWS);
 
-    <FONT COLOR=#0000ff>// Find the position from a point within the window.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> PositionFromPoint(wxPoint pt);
+    <FONT color=#0000ff>// Find the position from a point within the window.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> PositionFromPoint(wxPoint pt);
 
-    <FONT COLOR=#0000ff>// Set caret to start of a line and ensure it is visible.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> GotoLine(<B><FONT COLOR=#2e8b57>int</FONT></B> line);
+    <FONT color=#0000ff>// Find the position from a point within the window but return</FONT>
+    <FONT color=#0000ff>// INVALID_POSITION if not close to text.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> PositionFromPointClose(<B><FONT color=#2e8b57>int</FONT></B> x, <B><FONT color=#2e8b57>int</FONT></B> y);
 
-    <FONT COLOR=#0000ff>// Set caret to a position and ensure it is visible.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> GotoPos(<B><FONT COLOR=#2e8b57>int</FONT></B> pos);
+    <FONT color=#0000ff>// Set caret to start of a line and ensure it is visible.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> GotoLine(<B><FONT color=#2e8b57>int</FONT></B> line);
 
-    <FONT COLOR=#0000ff>// Set the selection anchor to a position. The anchor is the opposite</FONT>
-    <FONT COLOR=#0000ff>// end of the selection from the caret.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetAnchor(<B><FONT COLOR=#2e8b57>int</FONT></B> posAnchor);
+    <FONT color=#0000ff>// Set caret to a position and ensure it is visible.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> GotoPos(<B><FONT color=#2e8b57>int</FONT></B> pos);
 
-    <FONT COLOR=#0000ff>// Retrieve the text of the line containing the caret.</FONT>
-    <FONT COLOR=#0000ff>// Returns the index of the caret on the line.</FONT>
-    wxString GetCurLine(<B><FONT COLOR=#2e8b57>int</FONT></B>* OUTPUT=NULL);
+    <FONT color=#0000ff>// Set the selection anchor to a position. The anchor is the opposite</FONT>
+    <FONT color=#0000ff>// end of the selection from the caret.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetAnchor(<B><FONT color=#2e8b57>int</FONT></B> posAnchor);
 
-    <FONT COLOR=#0000ff>// Retrieve the position of the last correctly styled character.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetEndStyled();
+    <FONT color=#0000ff>// Retrieve the text of the line containing the caret.</FONT>
+    <FONT color=#0000ff>// Returns the index of the caret on the line.</FONT>
+    wxString GetCurLine(<B><FONT color=#2e8b57>int</FONT></B>* OUTPUT=<FONT color=#ff00ff>NULL</FONT>);
 
-    <FONT COLOR=#0000ff>// Convert all line endings in the document to use the current mode.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> ConvertEOLs();
+    <FONT color=#0000ff>// Retrieve the position of the last correctly styled character.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetEndStyled();
 
-    <FONT COLOR=#0000ff>// Retrieve the current end of line mode - one of CRLF, CR, or LF.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetEOLMode();
+    <FONT color=#0000ff>// Convert all line endings in the document to one mode.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> ConvertEOLs(<B><FONT color=#2e8b57>int</FONT></B> eolMode);
 
-    <FONT COLOR=#0000ff>// Set the current end of line mode.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetEOLMode(<B><FONT COLOR=#2e8b57>int</FONT></B> eolMode);
+    <FONT color=#0000ff>// Retrieve the current end of line mode - one of CRLF, CR, or LF.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetEOLMode();
 
-    <FONT COLOR=#0000ff>// Set the current styling position to pos and the styling mask to mask.</FONT>
-    <FONT COLOR=#0000ff>// The styling mask can be used to protect some bits in each styling byte from</FONT>
-    <FONT COLOR=#0000ff>// modification.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> StartStyling(<B><FONT COLOR=#2e8b57>int</FONT></B> pos, <B><FONT COLOR=#2e8b57>int</FONT></B> mask);
+    <FONT color=#0000ff>// Set the current end of line mode.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetEOLMode(<B><FONT color=#2e8b57>int</FONT></B> eolMode);
 
-    <FONT COLOR=#0000ff>// Change style from current styling position for length characters to a style</FONT>
-    <FONT COLOR=#0000ff>// and move the current styling position to after this newly styled segment.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetStyling(<B><FONT COLOR=#2e8b57>int</FONT></B> length, <B><FONT COLOR=#2e8b57>int</FONT></B> style);
+    <FONT color=#0000ff>// Set the current styling position to pos and the styling mask to mask.</FONT>
+    <FONT color=#0000ff>// The styling mask can be used to protect some bits in each styling byte from</FONT>
+    <FONT color=#0000ff>// modification.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> StartStyling(<B><FONT color=#2e8b57>int</FONT></B> pos, <B><FONT color=#2e8b57>int</FONT></B> mask);
 
-    <FONT COLOR=#0000ff>// Is drawing done first into a buffer or direct to the screen.</FONT>
-    <B><FONT COLOR=#2e8b57>bool</FONT></B> GetBufferedDraw();
+    <FONT color=#0000ff>// Change style from current styling position for length characters to a style</FONT>
+    <FONT color=#0000ff>// and move the current styling position to after this newly styled segment.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetStyling(<B><FONT color=#2e8b57>int</FONT></B> length, <B><FONT color=#2e8b57>int</FONT></B> style);
 
-    <FONT COLOR=#0000ff>// If drawing is buffered then each line of text is drawn into a bitmap buffer</FONT>
-    <FONT COLOR=#0000ff>// before drawing it to the screen to avoid flicker.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetBufferedDraw(<B><FONT COLOR=#2e8b57>bool</FONT></B> buffered);
+    <FONT color=#0000ff>// Is drawing done first into a buffer or direct to the screen.</FONT>
+    <B><FONT color=#2e8b57>bool</FONT></B> GetBufferedDraw();
 
-    <FONT COLOR=#0000ff>// Change the visible size of a tab to be a multiple of the width of a space</FONT>
-    <FONT COLOR=#0000ff>// character.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetTabWidth(<B><FONT COLOR=#2e8b57>int</FONT></B> tabWidth);
+    <FONT color=#0000ff>// If drawing is buffered then each line of text is drawn into a bitmap buffer</FONT>
+    <FONT color=#0000ff>// before drawing it to the screen to avoid flicker.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetBufferedDraw(<B><FONT color=#2e8b57>bool</FONT></B> buffered);
 
-    <FONT COLOR=#0000ff>// Retrieve the visible size of a tab.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetTabWidth();
+    <FONT color=#0000ff>// Change the visible size of a tab to be a multiple of the width of a space</FONT>
+    <FONT color=#0000ff>// character.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetTabWidth(<B><FONT color=#2e8b57>int</FONT></B> tabWidth);
 
-    <FONT COLOR=#0000ff>// Set the code page used to interpret the bytes of the document as characters.</FONT>
-    <FONT COLOR=#0000ff>// The SC_CP_UTF8 value can be used to enter Unicode mode.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetCodePage(<B><FONT COLOR=#2e8b57>int</FONT></B> codePage);
+    <FONT color=#0000ff>// Retrieve the visible size of a tab.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetTabWidth();
 
-    <FONT COLOR=#0000ff>// Set the symbol used for a particular marker number,</FONT>
-    <FONT COLOR=#0000ff>// and optionally the for and background colours.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> MarkerDefine(<B><FONT COLOR=#2e8b57>int</FONT></B> markerNumber, <B><FONT COLOR=#2e8b57>int</FONT></B> markerSymbol,
-                         <B><FONT COLOR=#2e8b57>const</FONT></B> wxColour&amp; foreground = wxNullColour,
-                         <B><FONT COLOR=#2e8b57>const</FONT></B> wxColour&amp; background = wxNullColour);
+    <FONT color=#0000ff>// Set the code page used to interpret the bytes of the document as characters.</FONT>
+    <FONT color=#0000ff>// The SC_CP_UTF8 value can be used to enter Unicode mode.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetCodePage(<B><FONT color=#2e8b57>int</FONT></B> codePage);
 
-    <FONT COLOR=#0000ff>// Set the foreground colour used for a particular marker number.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> MarkerSetForeground(<B><FONT COLOR=#2e8b57>int</FONT></B> markerNumber, <B><FONT COLOR=#2e8b57>const</FONT></B> wxColour&amp; fore);
+    <FONT color=#0000ff>// Set the symbol used for a particular marker number,</FONT>
+    <FONT color=#0000ff>// and optionally the for and background colours.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> MarkerDefine(<B><FONT color=#2e8b57>int</FONT></B> markerNumber, <B><FONT color=#2e8b57>int</FONT></B> markerSymbol,
+                         <B><FONT color=#2e8b57>const</FONT></B> wxColour&amp; foreground = wxNullColour,
+                         <B><FONT color=#2e8b57>const</FONT></B> wxColour&amp; background = wxNullColour);
 
-    <FONT COLOR=#0000ff>// Set the background colour used for a particular marker number.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> MarkerSetBackground(<B><FONT COLOR=#2e8b57>int</FONT></B> markerNumber, <B><FONT COLOR=#2e8b57>const</FONT></B> wxColour&amp; back);
+    <FONT color=#0000ff>// Set the foreground colour used for a particular marker number.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> MarkerSetForeground(<B><FONT color=#2e8b57>int</FONT></B> markerNumber, <B><FONT color=#2e8b57>const</FONT></B> wxColour&amp; fore);
 
-    <FONT COLOR=#0000ff>// Add a marker to a line.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> MarkerAdd(<B><FONT COLOR=#2e8b57>int</FONT></B> line, <B><FONT COLOR=#2e8b57>int</FONT></B> markerNumber);
+    <FONT color=#0000ff>// Set the background colour used for a particular marker number.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> MarkerSetBackground(<B><FONT color=#2e8b57>int</FONT></B> markerNumber, <B><FONT color=#2e8b57>const</FONT></B> wxColour&amp; back);
 
-    <FONT COLOR=#0000ff>// Delete a marker from a line</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> MarkerDelete(<B><FONT COLOR=#2e8b57>int</FONT></B> line, <B><FONT COLOR=#2e8b57>int</FONT></B> markerNumber);
+    <FONT color=#0000ff>// Add a marker to a line.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> MarkerAdd(<B><FONT color=#2e8b57>int</FONT></B> line, <B><FONT color=#2e8b57>int</FONT></B> markerNumber);
 
-    <FONT COLOR=#0000ff>// Delete all markers with a particular number from all lines</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> MarkerDeleteAll(<B><FONT COLOR=#2e8b57>int</FONT></B> markerNumber);
+    <FONT color=#0000ff>// Delete a marker from a line</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> MarkerDelete(<B><FONT color=#2e8b57>int</FONT></B> line, <B><FONT color=#2e8b57>int</FONT></B> markerNumber);
 
-    <FONT COLOR=#0000ff>// Get a bit mask of all the markers set on a line.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> MarkerGet(<B><FONT COLOR=#2e8b57>int</FONT></B> line);
+    <FONT color=#0000ff>// Delete all markers with a particular number from all lines</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> MarkerDeleteAll(<B><FONT color=#2e8b57>int</FONT></B> markerNumber);
 
-    <FONT COLOR=#0000ff>// Find the next line after lineStart that includes a marker in mask.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> MarkerNext(<B><FONT COLOR=#2e8b57>int</FONT></B> lineStart, <B><FONT COLOR=#2e8b57>int</FONT></B> markerMask);
+    <FONT color=#0000ff>// Get a bit mask of all the markers set on a line.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> MarkerGet(<B><FONT color=#2e8b57>int</FONT></B> line);
 
-    <FONT COLOR=#0000ff>// Find the previous line before lineStart that includes a marker in mask.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> MarkerPrevious(<B><FONT COLOR=#2e8b57>int</FONT></B> lineStart, <B><FONT COLOR=#2e8b57>int</FONT></B> markerMask);
+    <FONT color=#0000ff>// Find the next line after lineStart that includes a marker in mask.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> MarkerNext(<B><FONT color=#2e8b57>int</FONT></B> lineStart, <B><FONT color=#2e8b57>int</FONT></B> markerMask);
 
-    <FONT COLOR=#0000ff>// Set a margin to be either numeric or symbolic.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetMarginType(<B><FONT COLOR=#2e8b57>int</FONT></B> margin, <B><FONT COLOR=#2e8b57>int</FONT></B> marginType);
+    <FONT color=#0000ff>// Find the previous line before lineStart that includes a marker in mask.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> MarkerPrevious(<B><FONT color=#2e8b57>int</FONT></B> lineStart, <B><FONT color=#2e8b57>int</FONT></B> markerMask);
 
-    <FONT COLOR=#0000ff>// Retrieve the type of a margin.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetMarginType(<B><FONT COLOR=#2e8b57>int</FONT></B> margin);
+    <FONT color=#0000ff>// Set a margin to be either numeric or symbolic.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetMarginType(<B><FONT color=#2e8b57>int</FONT></B> margin, <B><FONT color=#2e8b57>int</FONT></B> marginType);
 
-    <FONT COLOR=#0000ff>// Set the width of a margin to a width expressed in pixels.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetMarginWidth(<B><FONT COLOR=#2e8b57>int</FONT></B> margin, <B><FONT COLOR=#2e8b57>int</FONT></B> pixelWidth);
+    <FONT color=#0000ff>// Retrieve the type of a margin.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetMarginType(<B><FONT color=#2e8b57>int</FONT></B> margin);
 
-    <FONT COLOR=#0000ff>// Retrieve the width of a margin in pixels.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetMarginWidth(<B><FONT COLOR=#2e8b57>int</FONT></B> margin);
+    <FONT color=#0000ff>// Set the width of a margin to a width expressed in pixels.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetMarginWidth(<B><FONT color=#2e8b57>int</FONT></B> margin, <B><FONT color=#2e8b57>int</FONT></B> pixelWidth);
 
-    <FONT COLOR=#0000ff>// Set a mask that determines which markers are displayed in a margin.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetMarginMask(<B><FONT COLOR=#2e8b57>int</FONT></B> margin, <B><FONT COLOR=#2e8b57>int</FONT></B> mask);
+    <FONT color=#0000ff>// Retrieve the width of a margin in pixels.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetMarginWidth(<B><FONT color=#2e8b57>int</FONT></B> margin);
 
-    <FONT COLOR=#0000ff>// Retrieve the marker mask of a margin.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetMarginMask(<B><FONT COLOR=#2e8b57>int</FONT></B> margin);
+    <FONT color=#0000ff>// Set a mask that determines which markers are displayed in a margin.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetMarginMask(<B><FONT color=#2e8b57>int</FONT></B> margin, <B><FONT color=#2e8b57>int</FONT></B> mask);
 
-    <FONT COLOR=#0000ff>// Make a margin sensitive or insensitive to mouse clicks.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetMarginSensitive(<B><FONT COLOR=#2e8b57>int</FONT></B> margin, <B><FONT COLOR=#2e8b57>bool</FONT></B> sensitive);
+    <FONT color=#0000ff>// Retrieve the marker mask of a margin.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetMarginMask(<B><FONT color=#2e8b57>int</FONT></B> margin);
 
-    <FONT COLOR=#0000ff>// Retrieve the mouse click sensitivity of a margin.</FONT>
-    <B><FONT COLOR=#2e8b57>bool</FONT></B> GetMarginSensitive(<B><FONT COLOR=#2e8b57>int</FONT></B> margin);
+    <FONT color=#0000ff>// Make a margin sensitive or insensitive to mouse clicks.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetMarginSensitive(<B><FONT color=#2e8b57>int</FONT></B> margin, <B><FONT color=#2e8b57>bool</FONT></B> sensitive);
 
-    <FONT COLOR=#0000ff>// Clear all the styles and make equivalent to the global default style.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> StyleClearAll();
+    <FONT color=#0000ff>// Retrieve the mouse click sensitivity of a margin.</FONT>
+    <B><FONT color=#2e8b57>bool</FONT></B> GetMarginSensitive(<B><FONT color=#2e8b57>int</FONT></B> margin);
 
-    <FONT COLOR=#0000ff>// Set the foreground colour of a style.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> StyleSetForeground(<B><FONT COLOR=#2e8b57>int</FONT></B> style, <B><FONT COLOR=#2e8b57>const</FONT></B> wxColour&amp; fore);
+    <FONT color=#0000ff>// Clear all the styles and make equivalent to the global default style.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> StyleClearAll();
 
-    <FONT COLOR=#0000ff>// Set the background colour of a style.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> StyleSetBackground(<B><FONT COLOR=#2e8b57>int</FONT></B> style, <B><FONT COLOR=#2e8b57>const</FONT></B> wxColour&amp; back);
+    <FONT color=#0000ff>// Set the foreground colour of a style.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> StyleSetForeground(<B><FONT color=#2e8b57>int</FONT></B> style, <B><FONT color=#2e8b57>const</FONT></B> wxColour&amp; fore);
 
-    <FONT COLOR=#0000ff>// Set a style to be bold or not.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> StyleSetBold(<B><FONT COLOR=#2e8b57>int</FONT></B> style, <B><FONT COLOR=#2e8b57>bool</FONT></B> bold);
+    <FONT color=#0000ff>// Set the background colour of a style.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> StyleSetBackground(<B><FONT color=#2e8b57>int</FONT></B> style, <B><FONT color=#2e8b57>const</FONT></B> wxColour&amp; back);
 
-    <FONT COLOR=#0000ff>// Set a style to be italic or not.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> StyleSetItalic(<B><FONT COLOR=#2e8b57>int</FONT></B> style, <B><FONT COLOR=#2e8b57>bool</FONT></B> italic);
+    <FONT color=#0000ff>// Set a style to be bold or not.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> StyleSetBold(<B><FONT color=#2e8b57>int</FONT></B> style, <B><FONT color=#2e8b57>bool</FONT></B> bold);
 
-    <FONT COLOR=#0000ff>// Set the size of characters of a style.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> StyleSetSize(<B><FONT COLOR=#2e8b57>int</FONT></B> style, <B><FONT COLOR=#2e8b57>int</FONT></B> sizePoints);
+    <FONT color=#0000ff>// Set a style to be italic or not.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> StyleSetItalic(<B><FONT color=#2e8b57>int</FONT></B> style, <B><FONT color=#2e8b57>bool</FONT></B> italic);
 
-    <FONT COLOR=#0000ff>// Set the font of a style.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> StyleSetFaceName(<B><FONT COLOR=#2e8b57>int</FONT></B> style, <B><FONT COLOR=#2e8b57>const</FONT></B> wxString&amp; fontName);
+    <FONT color=#0000ff>// Set the size of characters of a style.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> StyleSetSize(<B><FONT color=#2e8b57>int</FONT></B> style, <B><FONT color=#2e8b57>int</FONT></B> sizePoints);
 
-    <FONT COLOR=#0000ff>// Set a style to have its end of line filled or not.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> StyleSetEOLFilled(<B><FONT COLOR=#2e8b57>int</FONT></B> style, <B><FONT COLOR=#2e8b57>bool</FONT></B> filled);
+    <FONT color=#0000ff>// Set the font of a style.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> StyleSetFaceName(<B><FONT color=#2e8b57>int</FONT></B> style, <B><FONT color=#2e8b57>const</FONT></B> wxString&amp; fontName);
 
-    <FONT COLOR=#0000ff>// Reset the default style to its state at startup</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> StyleResetDefault();
+    <FONT color=#0000ff>// Set a style to have its end of line filled or not.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> StyleSetEOLFilled(<B><FONT color=#2e8b57>int</FONT></B> style, <B><FONT color=#2e8b57>bool</FONT></B> filled);
 
-    <FONT COLOR=#0000ff>// Set a style to be underlined or not.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> StyleSetUnderline(<B><FONT COLOR=#2e8b57>int</FONT></B> style, <B><FONT COLOR=#2e8b57>bool</FONT></B> underline);
+    <FONT color=#0000ff>// Reset the default style to its state at startup</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> StyleResetDefault();
 
-    <FONT COLOR=#0000ff>// Set the foreground colour of the selection and whether to use this setting.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetSelForeground(<B><FONT COLOR=#2e8b57>bool</FONT></B> useSetting, <B><FONT COLOR=#2e8b57>const</FONT></B> wxColour&amp; fore);
+    <FONT color=#0000ff>// Set a style to be underlined or not.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> StyleSetUnderline(<B><FONT color=#2e8b57>int</FONT></B> style, <B><FONT color=#2e8b57>bool</FONT></B> underline);
 
-    <FONT COLOR=#0000ff>// Set the background colour of the selection and whether to use this setting.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetSelBackground(<B><FONT COLOR=#2e8b57>bool</FONT></B> useSetting, <B><FONT COLOR=#2e8b57>const</FONT></B> wxColour&amp; back);
+    <FONT color=#0000ff>// Set a style to be mixed case, or to force upper or lower case.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> StyleSetCase(<B><FONT color=#2e8b57>int</FONT></B> style, <B><FONT color=#2e8b57>int</FONT></B> caseForce);
 
-    <FONT COLOR=#0000ff>// Set the foreground colour of the caret.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetCaretForeground(<B><FONT COLOR=#2e8b57>const</FONT></B> wxColour&amp; fore);
+    <FONT color=#0000ff>// Set the foreground colour of the selection and whether to use this setting.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetSelForeground(<B><FONT color=#2e8b57>bool</FONT></B> useSetting, <B><FONT color=#2e8b57>const</FONT></B> wxColour&amp; fore);
 
-    <FONT COLOR=#0000ff>// When key+modifier combination km is pressed perform msg.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> CmdKeyAssign(<B><FONT COLOR=#2e8b57>int</FONT></B> key, <B><FONT COLOR=#2e8b57>int</FONT></B> modifiers, <B><FONT COLOR=#2e8b57>int</FONT></B> cmd);
+    <FONT color=#0000ff>// Set the background colour of the selection and whether to use this setting.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetSelBackground(<B><FONT color=#2e8b57>bool</FONT></B> useSetting, <B><FONT color=#2e8b57>const</FONT></B> wxColour&amp; back);
 
-    <FONT COLOR=#0000ff>// When key+modifier combination km do nothing.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> CmdKeyClear(<B><FONT COLOR=#2e8b57>int</FONT></B> key, <B><FONT COLOR=#2e8b57>int</FONT></B> modifiers);
+    <FONT color=#0000ff>// Set the foreground colour of the caret.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetCaretForeground(<B><FONT color=#2e8b57>const</FONT></B> wxColour&amp; fore);
 
-    <FONT COLOR=#0000ff>// Drop all key mappings.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> CmdKeyClearAll();
+    <FONT color=#0000ff>// When key+modifier combination km is pressed perform msg.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> CmdKeyAssign(<B><FONT color=#2e8b57>int</FONT></B> key, <B><FONT color=#2e8b57>int</FONT></B> modifiers, <B><FONT color=#2e8b57>int</FONT></B> cmd);
 
-    <FONT COLOR=#0000ff>// Set the styles for a segment of the document.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetStyleBytes(<B><FONT COLOR=#2e8b57>int</FONT></B> length, <B><FONT COLOR=#2e8b57>char</FONT></B>* styleBytes);
+    <FONT color=#0000ff>// When key+modifier combination km do nothing.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> CmdKeyClear(<B><FONT color=#2e8b57>int</FONT></B> key, <B><FONT color=#2e8b57>int</FONT></B> modifiers);
 
-    <FONT COLOR=#0000ff>// Set a style to be visible or not.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> StyleSetVisible(<B><FONT COLOR=#2e8b57>int</FONT></B> style, <B><FONT COLOR=#2e8b57>bool</FONT></B> visible);
+    <FONT color=#0000ff>// Drop all key mappings.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> CmdKeyClearAll();
 
-    <FONT COLOR=#0000ff>// Get the time in milliseconds that the caret is on and off.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetCaretPeriod();
+    <FONT color=#0000ff>// Set the styles for a segment of the document.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetStyleBytes(<B><FONT color=#2e8b57>int</FONT></B> length, <B><FONT color=#2e8b57>char</FONT></B>* styleBytes);
 
-    <FONT COLOR=#0000ff>// Get the time in milliseconds that the caret is on and off. 0 = steady on.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetCaretPeriod(<B><FONT COLOR=#2e8b57>int</FONT></B> periodMilliseconds);
+    <FONT color=#0000ff>// Set a style to be visible or not.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> StyleSetVisible(<B><FONT color=#2e8b57>int</FONT></B> style, <B><FONT color=#2e8b57>bool</FONT></B> visible);
 
-    <FONT COLOR=#0000ff>// Set the set of characters making up words for when moving or selecting</FONT>
-    <FONT COLOR=#0000ff>// by word.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetWordChars(<B><FONT COLOR=#2e8b57>const</FONT></B> wxString&amp; characters);
+    <FONT color=#0000ff>// Get the time in milliseconds that the caret is on and off.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetCaretPeriod();
 
-    <FONT COLOR=#0000ff>// Start a sequence of actions that is undone and redone as a unit.</FONT>
-    <FONT COLOR=#0000ff>// May be nested.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> BeginUndoAction();
+    <FONT color=#0000ff>// Get the time in milliseconds that the caret is on and off. 0 = steady on.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetCaretPeriod(<B><FONT color=#2e8b57>int</FONT></B> periodMilliseconds);
 
-    <FONT COLOR=#0000ff>// End a sequence of actions that is undone and redone as a unit.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> EndUndoAction();
+    <FONT color=#0000ff>// Set the set of characters making up words for when moving or selecting</FONT>
+    <FONT color=#0000ff>// by word.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetWordChars(<B><FONT color=#2e8b57>const</FONT></B> wxString&amp; characters);
 
-    <FONT COLOR=#0000ff>// Set an indicator to plain, squiggle or TT.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> IndicatorSetStyle(<B><FONT COLOR=#2e8b57>int</FONT></B> indic, <B><FONT COLOR=#2e8b57>int</FONT></B> style);
+    <FONT color=#0000ff>// Start a sequence of actions that is undone and redone as a unit.</FONT>
+    <FONT color=#0000ff>// May be nested.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> BeginUndoAction();
 
-    <FONT COLOR=#0000ff>// Retrieve the style of an indicator.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> IndicatorGetStyle(<B><FONT COLOR=#2e8b57>int</FONT></B> indic);
+    <FONT color=#0000ff>// End a sequence of actions that is undone and redone as a unit.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> EndUndoAction();
 
-    <FONT COLOR=#0000ff>// Set the foreground colour of an indicator.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> IndicatorSetForeground(<B><FONT COLOR=#2e8b57>int</FONT></B> indic, <B><FONT COLOR=#2e8b57>const</FONT></B> wxColour&amp; fore);
+    <FONT color=#0000ff>// Set an indicator to plain, squiggle or TT.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> IndicatorSetStyle(<B><FONT color=#2e8b57>int</FONT></B> indic, <B><FONT color=#2e8b57>int</FONT></B> style);
 
-    <FONT COLOR=#0000ff>// Retrieve the foreground colour of an indicator.</FONT>
-    wxColour IndicatorGetForeground(<B><FONT COLOR=#2e8b57>int</FONT></B> indic);
+    <FONT color=#0000ff>// Retrieve the style of an indicator.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> IndicatorGetStyle(<B><FONT color=#2e8b57>int</FONT></B> indic);
 
-    <FONT COLOR=#0000ff>// Divide each styling byte into lexical class bits (default:5) and indicator</FONT>
-    <FONT COLOR=#0000ff>// bits (default:3). If a lexer requires more than 32 lexical states, then this</FONT>
-    <FONT COLOR=#0000ff>// is used to expand the possible states.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetStyleBits(<B><FONT COLOR=#2e8b57>int</FONT></B> bits);
+    <FONT color=#0000ff>// Set the foreground colour of an indicator.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> IndicatorSetForeground(<B><FONT color=#2e8b57>int</FONT></B> indic, <B><FONT color=#2e8b57>const</FONT></B> wxColour&amp; fore);
 
-    <FONT COLOR=#0000ff>// Retrieve number of bits in style bytes used to hold the lexical state.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetStyleBits();
+    <FONT color=#0000ff>// Retrieve the foreground colour of an indicator.</FONT>
+    wxColour IndicatorGetForeground(<B><FONT color=#2e8b57>int</FONT></B> indic);
 
-    <FONT COLOR=#0000ff>// Used to hold extra styling information for each line.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetLineState(<B><FONT COLOR=#2e8b57>int</FONT></B> line, <B><FONT COLOR=#2e8b57>int</FONT></B> state);
+    <FONT color=#0000ff>// Divide each styling byte into lexical class bits (default:5) and indicator</FONT>
+    <FONT color=#0000ff>// bits (default:3). If a lexer requires more than 32 lexical states, then this</FONT>
+    <FONT color=#0000ff>// is used to expand the possible states.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetStyleBits(<B><FONT color=#2e8b57>int</FONT></B> bits);
 
-    <FONT COLOR=#0000ff>// Retrieve the extra styling information for a line.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetLineState(<B><FONT COLOR=#2e8b57>int</FONT></B> line);
+    <FONT color=#0000ff>// Retrieve number of bits in style bytes used to hold the lexical state.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetStyleBits();
 
-    <FONT COLOR=#0000ff>// Retrieve the last line number that has line state.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetMaxLineState();
+    <FONT color=#0000ff>// Used to hold extra styling information for each line.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetLineState(<B><FONT color=#2e8b57>int</FONT></B> line, <B><FONT color=#2e8b57>int</FONT></B> state);
 
-    <FONT COLOR=#0000ff>// Display a auto-completion list.</FONT>
-    <FONT COLOR=#0000ff>// The lenEntered parameter indicates how many characters before</FONT>
-    <FONT COLOR=#0000ff>// the caret should be used to provide context.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> AutoCompShow(<B><FONT COLOR=#2e8b57>int</FONT></B> lenEntered, <B><FONT COLOR=#2e8b57>const</FONT></B> wxString&amp; itemList);
+    <FONT color=#0000ff>// Retrieve the extra styling information for a line.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetLineState(<B><FONT color=#2e8b57>int</FONT></B> line);
 
-    <FONT COLOR=#0000ff>// Remove the auto-completion list from the screen.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> AutoCompCancel();
+    <FONT color=#0000ff>// Retrieve the last line number that has line state.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetMaxLineState();
 
-    <FONT COLOR=#0000ff>// Is there an auto-completion list visible?</FONT>
-    <B><FONT COLOR=#2e8b57>bool</FONT></B> AutoCompActive();
+    <FONT color=#0000ff>// Is the background of the line containing the caret in a different colour?</FONT>
+    <B><FONT color=#2e8b57>bool</FONT></B> GetCaretLineVisible();
 
-    <FONT COLOR=#0000ff>// Retrieve the position of the caret when the auto-completion list was</FONT>
-    <FONT COLOR=#0000ff>// displayed.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> AutoCompPosStart();
+    <FONT color=#0000ff>// Display the background of the line containing the caret in a different colour.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetCaretLineVisible(<B><FONT color=#2e8b57>bool</FONT></B> show);
 
-    <FONT COLOR=#0000ff>// User has selected an item so remove the list and insert the selection.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> AutoCompComplete();
+    <FONT color=#0000ff>// Get the colour of the background of the line containing the caret.</FONT>
+    wxColour GetCaretLineBack();
 
-    <FONT COLOR=#0000ff>// Define a set of character that when typed cancel the auto-completion list.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> AutoCompStops(<B><FONT COLOR=#2e8b57>const</FONT></B> wxString&amp; characterSet);
+    <FONT color=#0000ff>// Set the colour of the background of the line containing the caret.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetCaretLineBack(<B><FONT color=#2e8b57>const</FONT></B> wxColour&amp; back);
 
-    <FONT COLOR=#0000ff>// Change the separator character in the string setting up an auto-completion</FONT>
-    <FONT COLOR=#0000ff>// list. Default is space but can be changed if items contain space.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> AutoCompSetSeparator(<B><FONT COLOR=#2e8b57>int</FONT></B> separatorCharacter);
+    <FONT color=#0000ff>// Display a auto-completion list.</FONT>
+    <FONT color=#0000ff>// The lenEntered parameter indicates how many characters before</FONT>
+    <FONT color=#0000ff>// the caret should be used to provide context.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> AutoCompShow(<B><FONT color=#2e8b57>int</FONT></B> lenEntered, <B><FONT color=#2e8b57>const</FONT></B> wxString&amp; itemList);
 
-    <FONT COLOR=#0000ff>// Retrieve the auto-completion list separator character.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> AutoCompGetSeparator();
+    <FONT color=#0000ff>// Remove the auto-completion list from the screen.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> AutoCompCancel();
 
-    <FONT COLOR=#0000ff>// Select the item in the auto-completion list that starts with a string.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> AutoCompSelect(<B><FONT COLOR=#2e8b57>const</FONT></B> wxString&amp; text);
+    <FONT color=#0000ff>// Is there an auto-completion list visible?</FONT>
+    <B><FONT color=#2e8b57>bool</FONT></B> AutoCompActive();
 
-    <FONT COLOR=#0000ff>// Should the auto-completion list be cancelled if the user backspaces to a</FONT>
-    <FONT COLOR=#0000ff>// position before where the box was created.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> AutoCompSetCancelAtStart(<B><FONT COLOR=#2e8b57>bool</FONT></B> cancel);
+    <FONT color=#0000ff>// Retrieve the position of the caret when the auto-completion list was</FONT>
+    <FONT color=#0000ff>// displayed.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> AutoCompPosStart();
 
-    <FONT COLOR=#0000ff>// Retrieve whether auto-completion cancelled by backspacing before start.</FONT>
-    <B><FONT COLOR=#2e8b57>bool</FONT></B> AutoCompGetCancelAtStart();
+    <FONT color=#0000ff>// User has selected an item so remove the list and insert the selection.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> AutoCompComplete();
 
-    <FONT COLOR=#0000ff>// Define a set of character that when typed fills up the selected word.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> AutoCompSetFillUps(<B><FONT COLOR=#2e8b57>const</FONT></B> wxString&amp; characterSet);
+    <FONT color=#0000ff>// Define a set of character that when typed cancel the auto-completion list.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> AutoCompStops(<B><FONT color=#2e8b57>const</FONT></B> wxString&amp; characterSet);
 
-    <FONT COLOR=#0000ff>// Should a single item auto-completion list automatically choose the item.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> AutoCompSetChooseSingle(<B><FONT COLOR=#2e8b57>bool</FONT></B> chooseSingle);
+    <FONT color=#0000ff>// Change the separator character in the string setting up an auto-completion</FONT>
+    <FONT color=#0000ff>// list. Default is space but can be changed if items contain space.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> AutoCompSetSeparator(<B><FONT color=#2e8b57>int</FONT></B> separatorCharacter);
 
-    <FONT COLOR=#0000ff>// Retrieve whether a single item auto-completion list automatically choose the item.</FONT>
-    <B><FONT COLOR=#2e8b57>bool</FONT></B> AutoCompGetChooseSingle();
+    <FONT color=#0000ff>// Retrieve the auto-completion list separator character.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> AutoCompGetSeparator();
 
-    <FONT COLOR=#0000ff>// Set whether case is significant when performing auto-completion searches.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> AutoCompSetIgnoreCase(<B><FONT COLOR=#2e8b57>bool</FONT></B> ignoreCase);
+    <FONT color=#0000ff>// Select the item in the auto-completion list that starts with a string.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> AutoCompSelect(<B><FONT color=#2e8b57>const</FONT></B> wxString&amp; text);
 
-    <FONT COLOR=#0000ff>// Retrieve state of ignore case flag.</FONT>
-    <B><FONT COLOR=#2e8b57>bool</FONT></B> AutoCompGetIgnoreCase();
+    <FONT color=#0000ff>// Should the auto-completion list be cancelled if the user backspaces to a</FONT>
+    <FONT color=#0000ff>// position before where the box was created.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> AutoCompSetCancelAtStart(<B><FONT color=#2e8b57>bool</FONT></B> cancel);
 
-    <FONT COLOR=#0000ff>// Set the number of spaces used for one level of indentation.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetIndent(<B><FONT COLOR=#2e8b57>int</FONT></B> indentSize);
+    <FONT color=#0000ff>// Retrieve whether auto-completion cancelled by backspacing before start.</FONT>
+    <B><FONT color=#2e8b57>bool</FONT></B> AutoCompGetCancelAtStart();
 
-    <FONT COLOR=#0000ff>// Retrieve indentation size.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetIndent();
+    <FONT color=#0000ff>// Define a set of character that when typed fills up the selected word.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> AutoCompSetFillUps(<B><FONT color=#2e8b57>const</FONT></B> wxString&amp; characterSet);
 
-    <FONT COLOR=#0000ff>// Indentation will only use space characters if useTabs is false, otherwise</FONT>
-    <FONT COLOR=#0000ff>// it will use a combination of tabs and spaces.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetUseTabs(<B><FONT COLOR=#2e8b57>bool</FONT></B> useTabs);
+    <FONT color=#0000ff>// Should a single item auto-completion list automatically choose the item.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> AutoCompSetChooseSingle(<B><FONT color=#2e8b57>bool</FONT></B> chooseSingle);
 
-    <FONT COLOR=#0000ff>// Retrieve whether tabs will be used in indentation.</FONT>
-    <B><FONT COLOR=#2e8b57>bool</FONT></B> GetUseTabs();
+    <FONT color=#0000ff>// Retrieve whether a single item auto-completion list automatically choose the item.</FONT>
+    <B><FONT color=#2e8b57>bool</FONT></B> AutoCompGetChooseSingle();
 
-    <FONT COLOR=#0000ff>// Change the indentation of a line to a number of columns.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetLineIndentation(<B><FONT COLOR=#2e8b57>int</FONT></B> line, <B><FONT COLOR=#2e8b57>int</FONT></B> indentSize);
+    <FONT color=#0000ff>// Set whether case is significant when performing auto-completion searches.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> AutoCompSetIgnoreCase(<B><FONT color=#2e8b57>bool</FONT></B> ignoreCase);
 
-    <FONT COLOR=#0000ff>// Retrieve the number of columns that a line is indented.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetLineIndentation(<B><FONT COLOR=#2e8b57>int</FONT></B> line);
+    <FONT color=#0000ff>// Retrieve state of ignore case flag.</FONT>
+    <B><FONT color=#2e8b57>bool</FONT></B> AutoCompGetIgnoreCase();
 
-    <FONT COLOR=#0000ff>// Retrieve the position before the first non indentation character on a line.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetLineIndentPosition(<B><FONT COLOR=#2e8b57>int</FONT></B> line);
+    <FONT color=#0000ff>// Display a list of strings and send notification when user chooses one.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> UserListShow(<B><FONT color=#2e8b57>int</FONT></B> listType, <B><FONT color=#2e8b57>const</FONT></B> wxString&amp; itemList);
 
-    <FONT COLOR=#0000ff>// Retrieve the column number of a position, taking tab width into account.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetColumn(<B><FONT COLOR=#2e8b57>int</FONT></B> pos);
+    <FONT color=#0000ff>// Set whether or not autocompletion is hidden automatically when nothing matches</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> AutoCompSetAutoHide(<B><FONT color=#2e8b57>bool</FONT></B> autoHide);
 
-    <FONT COLOR=#0000ff>// Show or hide the horizontal scroll bar.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetUseHorizontalScrollBar(<B><FONT COLOR=#2e8b57>bool</FONT></B> show);
+    <FONT color=#0000ff>// Retrieve whether or not autocompletion is hidden automatically when nothing matches</FONT>
+    <B><FONT color=#2e8b57>bool</FONT></B> AutoCompGetAutoHide();
 
-    <FONT COLOR=#0000ff>// Is the horizontal scroll bar visible?</FONT>
-    <B><FONT COLOR=#2e8b57>bool</FONT></B> GetUseHorizontalScrollBar();
+    <FONT color=#0000ff>// Set the number of spaces used for one level of indentation.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetIndent(<B><FONT color=#2e8b57>int</FONT></B> indentSize);
 
-    <FONT COLOR=#0000ff>// Show or hide indentation guides.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetIndentationGuides(<B><FONT COLOR=#2e8b57>bool</FONT></B> show);
+    <FONT color=#0000ff>// Retrieve indentation size.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetIndent();
 
-    <FONT COLOR=#0000ff>// Are the indentation guides visible?</FONT>
-    <B><FONT COLOR=#2e8b57>bool</FONT></B> GetIndentationGuides();
+    <FONT color=#0000ff>// Indentation will only use space characters if useTabs is false, otherwise</FONT>
+    <FONT color=#0000ff>// it will use a combination of tabs and spaces.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetUseTabs(<B><FONT color=#2e8b57>bool</FONT></B> useTabs);
 
-    <FONT COLOR=#0000ff>// Set the highlighted indentation guide column.</FONT>
-    <FONT COLOR=#0000ff>// 0 = no highlighted guide.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetHighlightGuide(<B><FONT COLOR=#2e8b57>int</FONT></B> column);
+    <FONT color=#0000ff>// Retrieve whether tabs will be used in indentation.</FONT>
+    <B><FONT color=#2e8b57>bool</FONT></B> GetUseTabs();
 
-    <FONT COLOR=#0000ff>// Get the highlighted indentation guide column.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetHighlightGuide();
+    <FONT color=#0000ff>// Change the indentation of a line to a number of columns.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetLineIndentation(<B><FONT color=#2e8b57>int</FONT></B> line, <B><FONT color=#2e8b57>int</FONT></B> indentSize);
 
-    <FONT COLOR=#0000ff>// Get the position after the last visible characters on a line.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetLineEndPosition(<B><FONT COLOR=#2e8b57>int</FONT></B> line);
+    <FONT color=#0000ff>// Retrieve the number of columns that a line is indented.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetLineIndentation(<B><FONT color=#2e8b57>int</FONT></B> line);
 
-    <FONT COLOR=#0000ff>// Get the code page used to interpret the bytes of the document as characters.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetCodePage();
+    <FONT color=#0000ff>// Retrieve the position before the first non indentation character on a line.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetLineIndentPosition(<B><FONT color=#2e8b57>int</FONT></B> line);
 
-    <FONT COLOR=#0000ff>// Get the foreground colour of the caret.</FONT>
+    <FONT color=#0000ff>// Retrieve the column number of a position, taking tab width into account.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetColumn(<B><FONT color=#2e8b57>int</FONT></B> pos);
+
+    <FONT color=#0000ff>// Show or hide the horizontal scroll bar.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetUseHorizontalScrollBar(<B><FONT color=#2e8b57>bool</FONT></B> show);
+
+    <FONT color=#0000ff>// Is the horizontal scroll bar visible?</FONT>
+    <B><FONT color=#2e8b57>bool</FONT></B> GetUseHorizontalScrollBar();
+
+    <FONT color=#0000ff>// Show or hide indentation guides.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetIndentationGuides(<B><FONT color=#2e8b57>bool</FONT></B> show);
+
+    <FONT color=#0000ff>// Are the indentation guides visible?</FONT>
+    <B><FONT color=#2e8b57>bool</FONT></B> GetIndentationGuides();
+
+    <FONT color=#0000ff>// Set the highlighted indentation guide column.</FONT>
+    <FONT color=#0000ff>// 0 = no highlighted guide.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetHighlightGuide(<B><FONT color=#2e8b57>int</FONT></B> column);
+
+    <FONT color=#0000ff>// Get the highlighted indentation guide column.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetHighlightGuide();
+
+    <FONT color=#0000ff>// Get the position after the last visible characters on a line.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetLineEndPosition(<B><FONT color=#2e8b57>int</FONT></B> line);
+
+    <FONT color=#0000ff>// Get the code page used to interpret the bytes of the document as characters.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetCodePage();
+
+    <FONT color=#0000ff>// Get the foreground colour of the caret.</FONT>
     wxColour GetCaretForeground();
 
-    <FONT COLOR=#0000ff>// In read-only mode?</FONT>
-    <B><FONT COLOR=#2e8b57>bool</FONT></B> GetReadOnly();
+    <FONT color=#0000ff>// In read-only mode?</FONT>
+    <B><FONT color=#2e8b57>bool</FONT></B> GetReadOnly();
 
-    <FONT COLOR=#0000ff>// Sets the position of the caret.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetCurrentPos(<B><FONT COLOR=#2e8b57>int</FONT></B> pos);
+    <FONT color=#0000ff>// Sets the position of the caret.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetCurrentPos(<B><FONT color=#2e8b57>int</FONT></B> pos);
 
-    <FONT COLOR=#0000ff>// Sets the position that starts the selection - this becomes the anchor.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetSelectionStart(<B><FONT COLOR=#2e8b57>int</FONT></B> pos);
+    <FONT color=#0000ff>// Sets the position that starts the selection - this becomes the anchor.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetSelectionStart(<B><FONT color=#2e8b57>int</FONT></B> pos);
 
-    <FONT COLOR=#0000ff>// Returns the position at the start of the selection.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetSelectionStart();
+    <FONT color=#0000ff>// Returns the position at the start of the selection.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetSelectionStart();
 
-    <FONT COLOR=#0000ff>// Sets the position that ends the selection - this becomes the currentPosition.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetSelectionEnd(<B><FONT COLOR=#2e8b57>int</FONT></B> pos);
+    <FONT color=#0000ff>// Sets the position that ends the selection - this becomes the currentPosition.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetSelectionEnd(<B><FONT color=#2e8b57>int</FONT></B> pos);
 
-    <FONT COLOR=#0000ff>// Returns the position at the end of the selection.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetSelectionEnd();
+    <FONT color=#0000ff>// Returns the position at the end of the selection.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetSelectionEnd();
 
-    <FONT COLOR=#0000ff>// Sets the print magnification added to the point size of each style for printing.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetPrintMagnification(<B><FONT COLOR=#2e8b57>int</FONT></B> magnification);
+    <FONT color=#0000ff>// Sets the print magnification added to the point size of each style for printing.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetPrintMagnification(<B><FONT color=#2e8b57>int</FONT></B> magnification);
 
-    <FONT COLOR=#0000ff>// Returns the print magnification.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetPrintMagnification();
+    <FONT color=#0000ff>// Returns the print magnification.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetPrintMagnification();
 
-    <FONT COLOR=#0000ff>// Modify colours when printing for clearer printed text.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetPrintColourMode(<B><FONT COLOR=#2e8b57>int</FONT></B> mode);
+    <FONT color=#0000ff>// Modify colours when printing for clearer printed text.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetPrintColourMode(<B><FONT color=#2e8b57>int</FONT></B> mode);
 
-    <FONT COLOR=#0000ff>// Returns the print colour mode.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetPrintColourMode();
+    <FONT color=#0000ff>// Returns the print colour mode.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetPrintColourMode();
 
-    <FONT COLOR=#0000ff>// Find some text in the document.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> FindText(<B><FONT COLOR=#2e8b57>int</FONT></B> minPos, <B><FONT COLOR=#2e8b57>int</FONT></B> maxPos,
-                               <B><FONT COLOR=#2e8b57>const</FONT></B> wxString&amp; text,
-                               <B><FONT COLOR=#2e8b57>bool</FONT></B> caseSensitive, <B><FONT COLOR=#2e8b57>bool</FONT></B> wholeWord);
+    <FONT color=#0000ff>// Find some text in the document.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> FindText(<B><FONT color=#2e8b57>int</FONT></B> minPos, <B><FONT color=#2e8b57>int</FONT></B> maxPos,
+                               <B><FONT color=#2e8b57>const</FONT></B> wxString&amp; text,
+                               <B><FONT color=#2e8b57>bool</FONT></B> caseSensitive, <B><FONT color=#2e8b57>bool</FONT></B> wholeWord);
 
-    <FONT COLOR=#0000ff>// On Windows will draw the document into a display context such as a printer.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> FormatRange(<B><FONT COLOR=#2e8b57>bool</FONT></B>   doDraw,
-                               <B><FONT COLOR=#2e8b57>int</FONT></B>    startPos,
-                               <B><FONT COLOR=#2e8b57>int</FONT></B>    endPos,
+    <FONT color=#0000ff>// On Windows will draw the document into a display context such as a printer.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> FormatRange(<B><FONT color=#2e8b57>bool</FONT></B>   doDraw,
+                               <B><FONT color=#2e8b57>int</FONT></B>    startPos,
+                               <B><FONT color=#2e8b57>int</FONT></B>    endPos,
                                wxDC*  draw,
-                               wxDC*  target,  <FONT COLOR=#0000ff>// Why does it use two? Can they be the same?</FONT>
+                               wxDC*  target,  <FONT color=#0000ff>// Why does it use two? Can they be the same?</FONT>
                                wxRect renderRect,
                                wxRect pageRect);
 
-    <FONT COLOR=#0000ff>// Retrieve the line at the top of the display.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetFirstVisibleLine();
+    <FONT color=#0000ff>// Retrieve the line at the top of the display.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetFirstVisibleLine();
 
-    <FONT COLOR=#0000ff>// Retrieve the contents of a line.</FONT>
-    wxString GetLine(<B><FONT COLOR=#2e8b57>int</FONT></B> line);
+    <FONT color=#0000ff>// Retrieve the contents of a line.</FONT>
+    wxString GetLine(<B><FONT color=#2e8b57>int</FONT></B> line);
 
-    <FONT COLOR=#0000ff>// Returns the number of lines in the document. There is always at least one.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetLineCount();
+    <FONT color=#0000ff>// Returns the number of lines in the document. There is always at least one.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetLineCount();
 
-    <FONT COLOR=#0000ff>// Sets the size in pixels of the left margin.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetMarginLeft(<B><FONT COLOR=#2e8b57>int</FONT></B> width);
+    <FONT color=#0000ff>// Sets the size in pixels of the left margin.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetMarginLeft(<B><FONT color=#2e8b57>int</FONT></B> pixelWidth);
 
-    <FONT COLOR=#0000ff>// Returns the size in pixels of the left margin.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetMarginLeft();
+    <FONT color=#0000ff>// Returns the size in pixels of the left margin.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetMarginLeft();
 
-    <FONT COLOR=#0000ff>// Sets the size in pixels of the right margin.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetMarginRight(<B><FONT COLOR=#2e8b57>int</FONT></B> width);
+    <FONT color=#0000ff>// Sets the size in pixels of the right margin.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetMarginRight(<B><FONT color=#2e8b57>int</FONT></B> pixelWidth);
 
-    <FONT COLOR=#0000ff>// Returns the size in pixels of the right margin.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetMarginRight();
+    <FONT color=#0000ff>// Returns the size in pixels of the right margin.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetMarginRight();
 
-    <FONT COLOR=#0000ff>// Is the document different from when it was last saved?</FONT>
-    <B><FONT COLOR=#2e8b57>bool</FONT></B> GetModify();
+    <FONT color=#0000ff>// Is the document different from when it was last saved?</FONT>
+    <B><FONT color=#2e8b57>bool</FONT></B> GetModify();
 
-    <FONT COLOR=#0000ff>// Select a range of text.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetSelection(<B><FONT COLOR=#2e8b57>int</FONT></B> start, <B><FONT COLOR=#2e8b57>int</FONT></B> end);
+    <FONT color=#0000ff>// Select a range of text.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetSelection(<B><FONT color=#2e8b57>int</FONT></B> start, <B><FONT color=#2e8b57>int</FONT></B> end);
 
-    <FONT COLOR=#0000ff>// Retrieve the selected text.</FONT>
+    <FONT color=#0000ff>// Retrieve the selected text.</FONT>
     wxString GetSelectedText();
 
-    <FONT COLOR=#0000ff>// Retrieve a range of text.</FONT>
-    wxString GetTextRange(<B><FONT COLOR=#2e8b57>int</FONT></B> startPos, <B><FONT COLOR=#2e8b57>int</FONT></B> endPos);
+    <FONT color=#0000ff>// Retrieve a range of text.</FONT>
+    wxString GetTextRange(<B><FONT color=#2e8b57>int</FONT></B> startPos, <B><FONT color=#2e8b57>int</FONT></B> endPos);
 
-    <FONT COLOR=#0000ff>// Draw the selection in normal style or with selection highlighted.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> HideSelection(<B><FONT COLOR=#2e8b57>bool</FONT></B> normal);
+    <FONT color=#0000ff>// Draw the selection in normal style or with selection highlighted.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> HideSelection(<B><FONT color=#2e8b57>bool</FONT></B> normal);
 
-    <FONT COLOR=#0000ff>// Retrieve the line containing a position.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> LineFromPosition(<B><FONT COLOR=#2e8b57>int</FONT></B> pos);
+    <FONT color=#0000ff>// Retrieve the line containing a position.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> LineFromPosition(<B><FONT color=#2e8b57>int</FONT></B> pos);
 
-    <FONT COLOR=#0000ff>// Retrieve the position at the start of a line.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> PositionFromLine(<B><FONT COLOR=#2e8b57>int</FONT></B> line);
+    <FONT color=#0000ff>// Retrieve the position at the start of a line.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> PositionFromLine(<B><FONT color=#2e8b57>int</FONT></B> line);
 
-    <FONT COLOR=#0000ff>// Scroll horizontally and vertically.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> LineScroll(<B><FONT COLOR=#2e8b57>int</FONT></B> columns, <B><FONT COLOR=#2e8b57>int</FONT></B> lines);
+    <FONT color=#0000ff>// Scroll horizontally and vertically.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> LineScroll(<B><FONT color=#2e8b57>int</FONT></B> columns, <B><FONT color=#2e8b57>int</FONT></B> lines);
 
-    <FONT COLOR=#0000ff>// Ensure the caret is visible.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> EnsureCaretVisible();
+    <FONT color=#0000ff>// Ensure the caret is visible.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> EnsureCaretVisible();
 
-    <FONT COLOR=#0000ff>// Replace the selected text with the argument text.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> ReplaceSelection(<B><FONT COLOR=#2e8b57>const</FONT></B> wxString&amp; text);
+    <FONT color=#0000ff>// Replace the selected text with the argument text.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> ReplaceSelection(<B><FONT color=#2e8b57>const</FONT></B> wxString&amp; text);
 
-    <FONT COLOR=#0000ff>// Set to read only or read write.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetReadOnly(<B><FONT COLOR=#2e8b57>bool</FONT></B> readOnly);
+    <FONT color=#0000ff>// Set to read only or read write.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetReadOnly(<B><FONT color=#2e8b57>bool</FONT></B> readOnly);
 
-    <FONT COLOR=#0000ff>// Will a paste succeed?</FONT>
-    <B><FONT COLOR=#2e8b57>bool</FONT></B> CanPaste();
+    <FONT color=#0000ff>// Will a paste succeed?</FONT>
+    <B><FONT color=#2e8b57>bool</FONT></B> CanPaste();
 
-    <FONT COLOR=#0000ff>// Are there any undoable actions in the undo history.</FONT>
-    <B><FONT COLOR=#2e8b57>bool</FONT></B> CanUndo();
+    <FONT color=#0000ff>// Are there any undoable actions in the undo history.</FONT>
+    <B><FONT color=#2e8b57>bool</FONT></B> CanUndo();
 
-    <FONT COLOR=#0000ff>// Delete the undo history.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> EmptyUndoBuffer();
+    <FONT color=#0000ff>// Delete the undo history.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> EmptyUndoBuffer();
 
-    <FONT COLOR=#0000ff>// Undo one action in the undo history.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> Undo();
+    <FONT color=#0000ff>// Undo one action in the undo history.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> Undo();
 
-    <FONT COLOR=#0000ff>// Cut the selection to the clipboard.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> Cut();
+    <FONT color=#0000ff>// Cut the selection to the clipboard.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> Cut();
 
-    <FONT COLOR=#0000ff>// Copy the selection to the clipboard.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> Copy();
+    <FONT color=#0000ff>// Copy the selection to the clipboard.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> Copy();
 
-    <FONT COLOR=#0000ff>// Paste the contents of the clipboard into the document replacing the selection.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> Paste();
+    <FONT color=#0000ff>// Paste the contents of the clipboard into the document replacing the selection.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> Paste();
 
-    <FONT COLOR=#0000ff>// Clear the selection.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> Clear();
+    <FONT color=#0000ff>// Clear the selection.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> Clear();
 
-    <FONT COLOR=#0000ff>// Replace the contents of the document with the argument text.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetText(<B><FONT COLOR=#2e8b57>const</FONT></B> wxString&amp; text);
+    <FONT color=#0000ff>// Replace the contents of the document with the argument text.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetText(<B><FONT color=#2e8b57>const</FONT></B> wxString&amp; text);
 
-    <FONT COLOR=#0000ff>// Retrieve all the text in the document.</FONT>
+    <FONT color=#0000ff>// Retrieve all the text in the document.</FONT>
     wxString GetText();
 
-    <FONT COLOR=#0000ff>// Retrieve the number of characters in the document.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetTextLength();
+    <FONT color=#0000ff>// Retrieve the number of characters in the document.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetTextLength();
+
+    <FONT color=#0000ff>// Set to overtype (true) or insert mode</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetOvertype(<B><FONT color=#2e8b57>bool</FONT></B> overtype);
+
+    <FONT color=#0000ff>// Returns true if overtype mode is active otherwise false is returned.</FONT>
+    <B><FONT color=#2e8b57>bool</FONT></B> GetOvertype();
+
+    <FONT color=#0000ff>// Set the width of the insert mode caret</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetCaretWidth(<B><FONT color=#2e8b57>int</FONT></B> pixelWidth);
+
+    <FONT color=#0000ff>// Returns the width of the insert mode caret</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetCaretWidth();
+
+    <FONT color=#0000ff>// Sets the position that starts the target which is used for updating the</FONT>
+    <FONT color=#0000ff>// document without affecting the scroll position.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetTargetStart(<B><FONT color=#2e8b57>int</FONT></B> pos);
+
+    <FONT color=#0000ff>// Get the position that starts the target.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetTargetStart();
+
+    <FONT color=#0000ff>// Sets the position that ends the target which is used for updating the</FONT>
+    <FONT color=#0000ff>// document without affecting the scroll position.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetTargetEnd(<B><FONT color=#2e8b57>int</FONT></B> pos);
+
+    <FONT color=#0000ff>// Get the position that ends the target.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetTargetEnd();
+
+    <FONT color=#0000ff>// Replace the target text with the argument text.</FONT>
+    <FONT color=#0000ff>// Returns the length of the replacement text.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> ReplaceTarget(<B><FONT color=#2e8b57>const</FONT></B> wxString&amp; text);
+
+    <FONT color=#0000ff>// Replace the target text with the argument text after \d processing.</FONT>
+    <FONT color=#0000ff>// Looks for \d where d is between 1 and 9 and replaces these with the strings</FONT>
+    <FONT color=#0000ff>// matched in the last search operation which were surrounded by \( and \).</FONT>
+    <FONT color=#0000ff>// Returns the length of the replacement text including any change</FONT>
+    <FONT color=#0000ff>// caused by processing the \d patterns.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> ReplaceTargetRE(<B><FONT color=#2e8b57>const</FONT></B> wxString&amp; text);
+
+    <FONT color=#0000ff>// Search for a counted string in the target and set the target to the found</FONT>
+    <FONT color=#0000ff>// range.</FONT>
+    <FONT color=#0000ff>// Returns length of range or -1 for failure in which case target is not moved.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> SearchInTarget(<B><FONT color=#2e8b57>const</FONT></B> wxString&amp; text);
+
+    <FONT color=#0000ff>// Set the search flags used by SearchInTarget</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetSearchFlags(<B><FONT color=#2e8b57>int</FONT></B> flags);
+
+    <FONT color=#0000ff>// Get the search flags used by SearchInTarget</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetSearchFlags();
+
+    <FONT color=#0000ff>// Show a call tip containing a definition near position pos.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> CallTipShow(<B><FONT color=#2e8b57>int</FONT></B> pos, <B><FONT color=#2e8b57>const</FONT></B> wxString&amp; definition);
+
+    <FONT color=#0000ff>// Remove the call tip from the screen.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> CallTipCancel();
+
+    <FONT color=#0000ff>// Is there an active call tip?</FONT>
+    <B><FONT color=#2e8b57>bool</FONT></B> CallTipActive();
 
-    <FONT COLOR=#0000ff>// Set to overtype (true) or insert mode</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetOvertype(<B><FONT COLOR=#2e8b57>bool</FONT></B> overtype);
+    <FONT color=#0000ff>// Retrieve the position where the caret was before displaying the call tip.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> CallTipPosAtStart();
 
-    <FONT COLOR=#0000ff>// Returns true if overtype mode is active otherwise false is returned.</FONT>
-    <B><FONT COLOR=#2e8b57>bool</FONT></B> GetOvertype();
+    <FONT color=#0000ff>// Highlight a segment of the definition.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> CallTipSetHighlight(<B><FONT color=#2e8b57>int</FONT></B> start, <B><FONT color=#2e8b57>int</FONT></B> end);
 
-    <FONT COLOR=#0000ff>// Show a call tip containing a definition near position pos.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> CallTipShow(<B><FONT COLOR=#2e8b57>int</FONT></B> pos, <B><FONT COLOR=#2e8b57>const</FONT></B> wxString&amp; definition);
+    <FONT color=#0000ff>// Set the background colour for the call tip.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> CallTipSetBackground(<B><FONT color=#2e8b57>const</FONT></B> wxColour&amp; back);
 
-    <FONT COLOR=#0000ff>// Remove the call tip from the screen.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> CallTipCancel();
+    <FONT color=#0000ff>// Find the display line of a document line taking hidden lines into account.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> VisibleFromDocLine(<B><FONT color=#2e8b57>int</FONT></B> line);
 
-    <FONT COLOR=#0000ff>// Is there an active call tip?</FONT>
-    <B><FONT COLOR=#2e8b57>bool</FONT></B> CallTipActive();
+    <FONT color=#0000ff>// Find the document line of a display line taking hidden lines into account.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> DocLineFromVisible(<B><FONT color=#2e8b57>int</FONT></B> lineDisplay);
 
-    <FONT COLOR=#0000ff>// Retrieve the position where the caret was before displaying the call tip.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> CallTipPosAtStart();
+    <FONT color=#0000ff>// Set the fold level of a line.</FONT>
+    <FONT color=#0000ff>// This encodes an integer level along with flags indicating whether the</FONT>
+    <FONT color=#0000ff>// line is a header and whether it is effectively white space.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetFoldLevel(<B><FONT color=#2e8b57>int</FONT></B> line, <B><FONT color=#2e8b57>int</FONT></B> level);
 
-    <FONT COLOR=#0000ff>// Highlight a segment of the definition.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> CallTipSetHighlight(<B><FONT COLOR=#2e8b57>int</FONT></B> start, <B><FONT COLOR=#2e8b57>int</FONT></B> end);
+    <FONT color=#0000ff>// Retrieve the fold level of a line.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetFoldLevel(<B><FONT color=#2e8b57>int</FONT></B> line);
 
-    <FONT COLOR=#0000ff>// Set the background colour for the call tip.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> CallTipSetBackground(<B><FONT COLOR=#2e8b57>const</FONT></B> wxColour&amp; back);
+    <FONT color=#0000ff>// Find the last child line of a header line.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetLastChild(<B><FONT color=#2e8b57>int</FONT></B> line, <B><FONT color=#2e8b57>int</FONT></B> level);
 
-    <FONT COLOR=#0000ff>// Find the display line of a document line taking hidden lines into account.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> VisibleFromDocLine(<B><FONT COLOR=#2e8b57>int</FONT></B> line);
+    <FONT color=#0000ff>// Find the parent line of a child line.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetFoldParent(<B><FONT color=#2e8b57>int</FONT></B> line);
 
-    <FONT COLOR=#0000ff>// Find the document line of a display line taking hidden lines into account.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> DocLineFromVisible(<B><FONT COLOR=#2e8b57>int</FONT></B> lineDisplay);
+    <FONT color=#0000ff>// Make a range of lines visible.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> ShowLines(<B><FONT color=#2e8b57>int</FONT></B> lineStart, <B><FONT color=#2e8b57>int</FONT></B> lineEnd);
 
-    <FONT COLOR=#0000ff>// Set the fold level of a line.</FONT>
-    <FONT COLOR=#0000ff>// This encodes an integer level along with flags indicating whether the</FONT>
-    <FONT COLOR=#0000ff>// line is a header and whether it is effectively white space.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetFoldLevel(<B><FONT COLOR=#2e8b57>int</FONT></B> line, <B><FONT COLOR=#2e8b57>int</FONT></B> level);
+    <FONT color=#0000ff>// Make a range of lines invisible.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> HideLines(<B><FONT color=#2e8b57>int</FONT></B> lineStart, <B><FONT color=#2e8b57>int</FONT></B> lineEnd);
 
-    <FONT COLOR=#0000ff>// Retrieve the fold level of a line.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetFoldLevel(<B><FONT COLOR=#2e8b57>int</FONT></B> line);
+    <FONT color=#0000ff>// Is a line visible?</FONT>
+    <B><FONT color=#2e8b57>bool</FONT></B> GetLineVisible(<B><FONT color=#2e8b57>int</FONT></B> line);
 
-    <FONT COLOR=#0000ff>// Find the last child line of a header line.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetLastChild(<B><FONT COLOR=#2e8b57>int</FONT></B> line, <B><FONT COLOR=#2e8b57>int</FONT></B> level);
+    <FONT color=#0000ff>// Show the children of a header line.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetFoldExpanded(<B><FONT color=#2e8b57>int</FONT></B> line, <B><FONT color=#2e8b57>bool</FONT></B> expanded);
 
-    <FONT COLOR=#0000ff>// Find the parent line of a child line.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetFoldParent(<B><FONT COLOR=#2e8b57>int</FONT></B> line);
+    <FONT color=#0000ff>// Is a header line expanded?</FONT>
+    <B><FONT color=#2e8b57>bool</FONT></B> GetFoldExpanded(<B><FONT color=#2e8b57>int</FONT></B> line);
 
-    <FONT COLOR=#0000ff>// Make a range of lines visible.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> ShowLines(<B><FONT COLOR=#2e8b57>int</FONT></B> lineStart, <B><FONT COLOR=#2e8b57>int</FONT></B> lineEnd);
+    <FONT color=#0000ff>// Switch a header line between expanded and contracted.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> ToggleFold(<B><FONT color=#2e8b57>int</FONT></B> line);
 
-    <FONT COLOR=#0000ff>// Make a range of lines invisible.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> HideLines(<B><FONT COLOR=#2e8b57>int</FONT></B> lineStart, <B><FONT COLOR=#2e8b57>int</FONT></B> lineEnd);
+    <FONT color=#0000ff>// Ensure a particular line is visible by expanding any header line hiding it.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> EnsureVisible(<B><FONT color=#2e8b57>int</FONT></B> line);
 
-    <FONT COLOR=#0000ff>// Is a line visible?</FONT>
-    <B><FONT COLOR=#2e8b57>bool</FONT></B> GetLineVisible(<B><FONT COLOR=#2e8b57>int</FONT></B> line);
+    <FONT color=#0000ff>// Set some debugging options for folding</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetFoldFlags(<B><FONT color=#2e8b57>int</FONT></B> flags);
 
-    <FONT COLOR=#0000ff>// Show the children of a header line.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetFoldExpanded(<B><FONT COLOR=#2e8b57>int</FONT></B> line, <B><FONT COLOR=#2e8b57>bool</FONT></B> expanded);
+    <FONT color=#0000ff>// Ensure a particular line is visible by expanding any header line hiding it.</FONT>
+    <FONT color=#0000ff>// Use the currently set visibility policy to determine which range to display.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> EnsureVisibleEnforcePolicy(<B><FONT color=#2e8b57>int</FONT></B> line);
 
-    <FONT COLOR=#0000ff>// Is a header line expanded?</FONT>
-    <B><FONT COLOR=#2e8b57>bool</FONT></B> GetFoldExpanded(<B><FONT COLOR=#2e8b57>int</FONT></B> line);
+    <FONT color=#0000ff>// Sets whether a tab pressed when caret is within indentation indents</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetTabIndents(<B><FONT color=#2e8b57>bool</FONT></B> tabIndents);
 
-    <FONT COLOR=#0000ff>// Switch a header line between expanded and contracted.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> ToggleFold(<B><FONT COLOR=#2e8b57>int</FONT></B> line);
+    <FONT color=#0000ff>// Does a tab pressed when caret is within indentation indent?</FONT>
+    <B><FONT color=#2e8b57>bool</FONT></B> GetTabIndents();
 
-    <FONT COLOR=#0000ff>// Ensure a particular line is visible by expanding any header line hiding it.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> EnsureVisible(<B><FONT COLOR=#2e8b57>int</FONT></B> line);
+    <FONT color=#0000ff>// Sets whether a backspace pressed when caret is within indentation unindents</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetBackSpaceUnIndents(<B><FONT color=#2e8b57>bool</FONT></B> bsUnIndents);
 
-    <FONT COLOR=#0000ff>// Set some debugging options for folding</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetFoldFlags(<B><FONT COLOR=#2e8b57>int</FONT></B> flags);
+    <FONT color=#0000ff>// Does a backspace pressed when caret is within indentation unindent?</FONT>
+    <B><FONT color=#2e8b57>bool</FONT></B> GetBackSpaceUnIndents();
 
-    <FONT COLOR=#0000ff>// How many characters are on a line, not including end of line characters.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> LineLength(<B><FONT COLOR=#2e8b57>int</FONT></B> line);
+    <FONT color=#0000ff>// Sets the time the mouse must sit still to generate a mouse dwell event</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetMouseDwellTime(<B><FONT color=#2e8b57>int</FONT></B> periodMilliseconds);
 
-    <FONT COLOR=#0000ff>// Highlight the characters at two positions.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> BraceHighlight(<B><FONT COLOR=#2e8b57>int</FONT></B> pos1, <B><FONT COLOR=#2e8b57>int</FONT></B> pos2);
+    <FONT color=#0000ff>// Retrieve the time the mouse must sit still to generate a mouse dwell event</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetMouseDwellTime();
 
-    <FONT COLOR=#0000ff>// Highlight the character at a position indicating there is no matching brace.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> BraceBadLight(<B><FONT COLOR=#2e8b57>int</FONT></B> pos);
+    <FONT color=#0000ff>// Move the caret inside current view if it's not there already</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> MoveCaretInsideView();
 
-    <FONT COLOR=#0000ff>// Find the position of a matching brace or INVALID_POSITION if no match.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> BraceMatch(<B><FONT COLOR=#2e8b57>int</FONT></B> pos);
+    <FONT color=#0000ff>// How many characters are on a line, not including end of line characters.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> LineLength(<B><FONT color=#2e8b57>int</FONT></B> line);
 
-    <FONT COLOR=#0000ff>// Are the end of line characters visible.</FONT>
-    <B><FONT COLOR=#2e8b57>bool</FONT></B> GetViewEOL();
+    <FONT color=#0000ff>// Highlight the characters at two positions.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> BraceHighlight(<B><FONT color=#2e8b57>int</FONT></B> pos1, <B><FONT color=#2e8b57>int</FONT></B> pos2);
 
-    <FONT COLOR=#0000ff>// Make the end of line characters visible or invisible</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetViewEOL(<B><FONT COLOR=#2e8b57>bool</FONT></B> visible);
+    <FONT color=#0000ff>// Highlight the character at a position indicating there is no matching brace.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> BraceBadLight(<B><FONT color=#2e8b57>int</FONT></B> pos);
 
-    <FONT COLOR=#0000ff>// Retrieve a pointer to the document object.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B>* GetDocPointer();
+    <FONT color=#0000ff>// Find the position of a matching brace or INVALID_POSITION if no match.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> BraceMatch(<B><FONT color=#2e8b57>int</FONT></B> pos);
 
-    <FONT COLOR=#0000ff>// Change the document object used.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetDocPointer(<B><FONT COLOR=#2e8b57>void</FONT></B>* docPointer);
+    <FONT color=#0000ff>// Are the end of line characters visible.</FONT>
+    <B><FONT color=#2e8b57>bool</FONT></B> GetViewEOL();
 
-    <FONT COLOR=#0000ff>// Set which document modification events are sent to the container.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetModEventMask(<B><FONT COLOR=#2e8b57>int</FONT></B> mask);
+    <FONT color=#0000ff>// Make the end of line characters visible or invisible</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetViewEOL(<B><FONT color=#2e8b57>bool</FONT></B> visible);
 
-    <FONT COLOR=#0000ff>// Retrieve the column number which text should be kept within.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetEdgeColumn();
+    <FONT color=#0000ff>// Retrieve a pointer to the document object.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B>* GetDocPointer();
 
-    <FONT COLOR=#0000ff>// Set the column number of the edge.</FONT>
-    <FONT COLOR=#0000ff>// If text goes past the edge then it is highlighted.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetEdgeColumn(<B><FONT COLOR=#2e8b57>int</FONT></B> column);
+    <FONT color=#0000ff>// Change the document object used.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetDocPointer(<B><FONT color=#2e8b57>void</FONT></B>* docPointer);
 
-    <FONT COLOR=#0000ff>// Retrieve the edge highlight mode.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetEdgeMode();
+    <FONT color=#0000ff>// Set which document modification events are sent to the container.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetModEventMask(<B><FONT color=#2e8b57>int</FONT></B> mask);
 
-    <FONT COLOR=#0000ff>// The edge may be displayed by a line (EDGE_LINE) or by highlighting text that</FONT>
-    <FONT COLOR=#0000ff>// goes beyond it (EDGE_BACKGROUND) or not displayed at all (EDGE_NONE).</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetEdgeMode(<B><FONT COLOR=#2e8b57>int</FONT></B> mode);
+    <FONT color=#0000ff>// Retrieve the column number which text should be kept within.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetEdgeColumn();
 
-    <FONT COLOR=#0000ff>// Retrieve the colour used in edge indication.</FONT>
+    <FONT color=#0000ff>// Set the column number of the edge.</FONT>
+    <FONT color=#0000ff>// If text goes past the edge then it is highlighted.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetEdgeColumn(<B><FONT color=#2e8b57>int</FONT></B> column);
+
+    <FONT color=#0000ff>// Retrieve the edge highlight mode.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetEdgeMode();
+
+    <FONT color=#0000ff>// The edge may be displayed by a line (EDGE_LINE) or by highlighting text that</FONT>
+    <FONT color=#0000ff>// goes beyond it (EDGE_BACKGROUND) or not displayed at all (EDGE_NONE).</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetEdgeMode(<B><FONT color=#2e8b57>int</FONT></B> mode);
+
+    <FONT color=#0000ff>// Retrieve the colour used in edge indication.</FONT>
     wxColour GetEdgeColour();
 
-    <FONT COLOR=#0000ff>// Change the colour used in edge indication.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetEdgeColour(<B><FONT COLOR=#2e8b57>const</FONT></B> wxColour&amp; edgeColour);
+    <FONT color=#0000ff>// Change the colour used in edge indication.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetEdgeColour(<B><FONT color=#2e8b57>const</FONT></B> wxColour&amp; edgeColour);
+
+    <FONT color=#0000ff>// Sets the current caret position to be the search anchor.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SearchAnchor();
+
+    <FONT color=#0000ff>// Find some text starting at the search anchor.</FONT>
+    <FONT color=#0000ff>// Does not ensure the selection is visible.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> SearchNext(<B><FONT color=#2e8b57>int</FONT></B> flags, <B><FONT color=#2e8b57>const</FONT></B> wxString&amp; text);
+
+    <FONT color=#0000ff>// Find some text starting at the search anchor and moving backwards.</FONT>
+    <FONT color=#0000ff>// Does not ensure the selection is visible.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> SearchPrev(<B><FONT color=#2e8b57>int</FONT></B> flags, <B><FONT color=#2e8b57>const</FONT></B> wxString&amp; text);
+
+    <FONT color=#0000ff>// Set the way the line the caret is on is kept visible.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetCaretPolicy(<B><FONT color=#2e8b57>int</FONT></B> caretPolicy, <B><FONT color=#2e8b57>int</FONT></B> caretSlop);
+
+    <FONT color=#0000ff>// Retrieves the number of lines completely visible.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> LinesOnScreen();
+
+    <FONT color=#0000ff>// Set whether a pop up menu is displayed automatically when the user presses</FONT>
+    <FONT color=#0000ff>// the wrong mouse button.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> UsePopUp(<B><FONT color=#2e8b57>bool</FONT></B> allowPopUp);
+
+    <FONT color=#0000ff>// Is the selection a rectangular. The alternative is the more common stream selection.</FONT>
+    <B><FONT color=#2e8b57>bool</FONT></B> SelectionIsRectangle();
+
+    <FONT color=#0000ff>// Set the zoom level. This number of points is added to the size of all fonts.</FONT>
+    <FONT color=#0000ff>// It may be positive to magnify or negative to reduce.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetZoom(<B><FONT color=#2e8b57>int</FONT></B> zoom);
+
+    <FONT color=#0000ff>// Retrieve the zoom level.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetZoom();
 
-    <FONT COLOR=#0000ff>// Sets the current caret position to be the search anchor.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SearchAnchor();
+    <FONT color=#0000ff>// Create a new document object.</FONT>
+    <FONT color=#0000ff>// Starts with reference count of 1 and not selected into editor.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B>* CreateDocument();
 
-    <FONT COLOR=#0000ff>// Find some text starting at the search anchor.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> SearchNext(<B><FONT COLOR=#2e8b57>int</FONT></B> flags, <B><FONT COLOR=#2e8b57>const</FONT></B> wxString&amp; text);
+    <FONT color=#0000ff>// Extend life of document.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> AddRefDocument(<B><FONT color=#2e8b57>void</FONT></B>* docPointer);
 
-    <FONT COLOR=#0000ff>// Find some text starting at the search anchor and moving backwards.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> SearchPrev(<B><FONT COLOR=#2e8b57>int</FONT></B> flags, <B><FONT COLOR=#2e8b57>const</FONT></B> wxString&amp; text);
+    <FONT color=#0000ff>// Release a reference to the document, deleting document if it fades to black.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> ReleaseDocument(<B><FONT color=#2e8b57>void</FONT></B>* docPointer);
 
-    <FONT COLOR=#0000ff>// Set the way the line the caret is on is kept visible.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetCaretPolicy(<B><FONT COLOR=#2e8b57>int</FONT></B> caretPolicy, <B><FONT COLOR=#2e8b57>int</FONT></B> caretSlop);
+    <FONT color=#0000ff>// Get which document modification events are sent to the container.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetModEventMask();
 
-    <FONT COLOR=#0000ff>// Retrieves the number of lines completely visible.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> LinesOnScreen();
+    <FONT color=#0000ff>// Change internal focus flag</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetFocus(<B><FONT color=#2e8b57>bool</FONT></B> focus);
 
-    <FONT COLOR=#0000ff>// Set whether a pop up menu is displayed automatically when the user presses</FONT>
-    <FONT COLOR=#0000ff>// the wrong mouse button.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> UsePopUp(<B><FONT COLOR=#2e8b57>bool</FONT></B> allowPopUp);
+    <FONT color=#0000ff>// Get internal focus flag</FONT>
+    <B><FONT color=#2e8b57>bool</FONT></B> GetFocus();
 
-    <FONT COLOR=#0000ff>// Is the selection a rectangular. The alternative is the more common stream selection.</FONT>
-    <B><FONT COLOR=#2e8b57>bool</FONT></B> SelectionIsRectangle();
+    <FONT color=#0000ff>// Change error status - 0 = OK</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetStatus(<B><FONT color=#2e8b57>int</FONT></B> statusCode);
 
-    <FONT COLOR=#0000ff>// Set the zoom level. This number of points is added to the size of all fonts.</FONT>
-    <FONT COLOR=#0000ff>// It may be positive to magnify or negative to reduce.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetZoom(<B><FONT COLOR=#2e8b57>int</FONT></B> zoom);
+    <FONT color=#0000ff>// Get error status</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetStatus();
 
-    <FONT COLOR=#0000ff>// Retrieve the zoom level.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetZoom();
+    <FONT color=#0000ff>// Set whether the mouse is captured when its button is pressed</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetMouseDownCaptures(<B><FONT color=#2e8b57>bool</FONT></B> captures);
 
-    <FONT COLOR=#0000ff>// Create a new document object.</FONT>
-    <FONT COLOR=#0000ff>// Starts with reference count of 1 and not selected into editor.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B>* CreateDocument();
+    <FONT color=#0000ff>// Get whether mouse gets captured</FONT>
+    <B><FONT color=#2e8b57>bool</FONT></B> GetMouseDownCaptures();
 
-    <FONT COLOR=#0000ff>// Extend life of document.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> AddRefDocument(<B><FONT COLOR=#2e8b57>void</FONT></B>* docPointer);
+    <FONT color=#0000ff>// Sets the cursor to one of the SC_CURSOR* values</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetCursor(<B><FONT color=#2e8b57>int</FONT></B> cursorType);
 
-    <FONT COLOR=#0000ff>// Release a reference to the document, deleting document if it fades to black.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> ReleaseDocument(<B><FONT COLOR=#2e8b57>void</FONT></B>* docPointer);
+    <FONT color=#0000ff>// Get cursor type</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetCursor();
 
-    <FONT COLOR=#0000ff>// Get which document modification events are sent to the container.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetModEventMask();
+    <FONT color=#0000ff>// Move to the previous change in capitalistion</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> WordPartLeft();
 
-    <FONT COLOR=#0000ff>// Start notifying the container of all key presses and commands.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> StartRecord();
+    <FONT color=#0000ff>// Move to the previous change in capitalistion extending selection to new caret position.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> WordPartLeftExtend();
 
-    <FONT COLOR=#0000ff>// Stop notifying the container of all key presses and commands.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> StopRecord();
+    <FONT color=#0000ff>// Move to the change next in capitalistion</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> WordPartRight();
 
-    <FONT COLOR=#0000ff>// Set the lexing language of the document.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetLexer(<B><FONT COLOR=#2e8b57>int</FONT></B> lexer);
+    <FONT color=#0000ff>// Move to the next change in capitalistion extending selection to new caret position.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> WordPartRightExtend();
 
-    <FONT COLOR=#0000ff>// Retrieve the lexing language of the document.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetLexer();
+    <FONT color=#0000ff>// Set the way the display area is determined when a particular line is to be moved to.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetVisiblePolicy(<B><FONT color=#2e8b57>int</FONT></B> visiblePolicy, <B><FONT color=#2e8b57>int</FONT></B> visibleSlop);
 
-    <FONT COLOR=#0000ff>// Colourise a segment of the document using the current lexing language.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> Colourise(<B><FONT COLOR=#2e8b57>int</FONT></B> start, <B><FONT COLOR=#2e8b57>int</FONT></B> end);
+    <FONT color=#0000ff>// Delete back from the current position to the start of the line</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> DelLineLeft();
 
-    <FONT COLOR=#0000ff>// Set up a value that may be used by a lexer for some optional feature.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetProperty(<B><FONT COLOR=#2e8b57>const</FONT></B> wxString&amp; key, <B><FONT COLOR=#2e8b57>const</FONT></B> wxString&amp; value);
+    <FONT color=#0000ff>// Delete forwards from the current position to the end of the line</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> DelLineRight();
 
-    <FONT COLOR=#0000ff>// Set up the key words used by the lexer.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetKeyWords(<B><FONT COLOR=#2e8b57>int</FONT></B> keywordSet, <B><FONT COLOR=#2e8b57>const</FONT></B> wxString&amp; keyWords);
+    <FONT color=#0000ff>// Start notifying the container of all key presses and commands.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> StartRecord();
 
-<FONT COLOR=#0000ff>// END of generated section</FONT>
-<FONT COLOR=#0000ff>//----------------------------------------------------------------------</FONT>
-<FONT COLOR=#0000ff>// Others...</FONT>
+    <FONT color=#0000ff>// Stop notifying the container of all key presses and commands.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> StopRecord();
 
+    <FONT color=#0000ff>// Set the lexing language of the document.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetLexer(<B><FONT color=#2e8b57>int</FONT></B> lexer);
 
-    <FONT COLOR=#0000ff>// Returns the line number of the line with the caret.</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B> GetCurrentLine();
+    <FONT color=#0000ff>// Retrieve the lexing language of the document.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetLexer();
 
-    <FONT COLOR=#0000ff>// Extract style settings from a spec-string which is composed of one or</FONT>
-    <FONT COLOR=#0000ff>// more of the following comma separated elements:</FONT>
-    <FONT COLOR=#0000ff>//</FONT>
-    <FONT COLOR=#0000ff>//      bold                    turns on bold</FONT>
-    <FONT COLOR=#0000ff>//      italic                  turns on italics</FONT>
-    <FONT COLOR=#0000ff>//      fore:#RRGGBB            sets the foreground colour</FONT>
-    <FONT COLOR=#0000ff>//      back:#RRGGBB            sets the background colour</FONT>
-    <FONT COLOR=#0000ff>//      face:[facename]         sets the font face name to use</FONT>
-    <FONT COLOR=#0000ff>//      size:[num]              sets the font size in points</FONT>
-    <FONT COLOR=#0000ff>//      eol                     turns on eol filling</FONT>
-    <FONT COLOR=#0000ff>//      underline               turns on underlining</FONT>
-    <FONT COLOR=#0000ff>//</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> StyleSetSpec(<B><FONT COLOR=#2e8b57>int</FONT></B> styleNum, <B><FONT COLOR=#2e8b57>const</FONT></B> wxString&amp; spec);
+    <FONT color=#0000ff>// Colourise a segment of the document using the current lexing language.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> Colourise(<B><FONT color=#2e8b57>int</FONT></B> start, <B><FONT color=#2e8b57>int</FONT></B> end);
 
+    <FONT color=#0000ff>// Set up a value that may be used by a lexer for some optional feature.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetProperty(<B><FONT color=#2e8b57>const</FONT></B> wxString&amp; key, <B><FONT color=#2e8b57>const</FONT></B> wxString&amp; value);
 
+    <FONT color=#0000ff>// Set up the key words used by the lexer.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetKeyWords(<B><FONT color=#2e8b57>int</FONT></B> keywordSet, <B><FONT color=#2e8b57>const</FONT></B> wxString&amp; keyWords);
 
-    <FONT COLOR=#0000ff>// Set style size, face, bold, italic, and underline attributes from</FONT>
-    <FONT COLOR=#0000ff>// a wxFont's attributes.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> StyleSetFont(<B><FONT COLOR=#2e8b57>int</FONT></B> styleNum, wxFont&amp; font);
+    <FONT color=#0000ff>// Set the lexing language of the document based on string name.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetLexerLanguage(<B><FONT color=#2e8b57>const</FONT></B> wxString&amp; language);
 
+<FONT color=#0000ff>// END of generated section</FONT>
+<FONT color=#0000ff>//----------------------------------------------------------------------</FONT>
+<FONT color=#0000ff>// Others...</FONT>
 
 
-    <FONT COLOR=#0000ff>// Set all font style attributes at once.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> StyleSetFontAttr(<B><FONT COLOR=#2e8b57>int</FONT></B> styleNum, <B><FONT COLOR=#2e8b57>int</FONT></B> size,
-                          <B><FONT COLOR=#2e8b57>const</FONT></B> wxString&amp; faceName,
-                          <B><FONT COLOR=#2e8b57>bool</FONT></B> bold, <B><FONT COLOR=#2e8b57>bool</FONT></B> italic,
-                          <B><FONT COLOR=#2e8b57>bool</FONT></B> underline);
+    <FONT color=#0000ff>// Returns the line number of the line with the caret.</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B> GetCurrentLine();
 
+    <FONT color=#0000ff>// Extract style settings from a spec-string which is composed of one or</FONT>
+    <FONT color=#0000ff>// more of the following comma separated elements:</FONT>
+    <FONT color=#0000ff>//</FONT>
+    <FONT color=#0000ff>//      bold                    turns on bold</FONT>
+    <FONT color=#0000ff>//      italic                  turns on italics</FONT>
+    <FONT color=#0000ff>//      fore:#RRGGBB            sets the foreground colour</FONT>
+    <FONT color=#0000ff>//      back:#RRGGBB            sets the background colour</FONT>
+    <FONT color=#0000ff>//      face:[facename]         sets the font face name to use</FONT>
+    <FONT color=#0000ff>//      size:[num]              sets the font size in points</FONT>
+    <FONT color=#0000ff>//      eol                     turns on eol filling</FONT>
+    <FONT color=#0000ff>//      underline               turns on underlining</FONT>
+    <FONT color=#0000ff>//</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> StyleSetSpec(<B><FONT color=#2e8b57>int</FONT></B> styleNum, <B><FONT color=#2e8b57>const</FONT></B> wxString&amp; spec);
 
 
-    <FONT COLOR=#0000ff>// Perform one of the operations defined by the wxSTC_CMD_* constants.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> CmdKeyExecute(<B><FONT COLOR=#2e8b57>int</FONT></B> cmd);
 
+    <FONT color=#0000ff>// Set style size, face, bold, italic, and underline attributes from</FONT>
+    <FONT color=#0000ff>// a wxFont's attributes.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> StyleSetFont(<B><FONT color=#2e8b57>int</FONT></B> styleNum, wxFont&amp; font);
 
 
-    <FONT COLOR=#0000ff>// Set the left and right margin in the edit area, measured in pixels.</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetMargins(<B><FONT COLOR=#2e8b57>int</FONT></B> left, <B><FONT COLOR=#2e8b57>int</FONT></B> right);
 
+    <FONT color=#0000ff>// Set all font style attributes at once.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> StyleSetFontAttr(<B><FONT color=#2e8b57>int</FONT></B> styleNum, <B><FONT color=#2e8b57>int</FONT></B> size,
+                          <B><FONT color=#2e8b57>const</FONT></B> wxString&amp; faceName,
+                          <B><FONT color=#2e8b57>bool</FONT></B> bold, <B><FONT color=#2e8b57>bool</FONT></B> italic,
+                          <B><FONT color=#2e8b57>bool</FONT></B> underline);
 
-    <FONT COLOR=#0000ff>// Retrieve the start and end positions of the current selection.</FONT>
-<FONT COLOR=#a020f0>#ifdef SWIG</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> GetSelection(<B><FONT COLOR=#2e8b57>int</FONT></B>* OUTPUT, <B><FONT COLOR=#2e8b57>int</FONT></B>* OUTPUT);
-<FONT COLOR=#a020f0>#else</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> GetSelection(<B><FONT COLOR=#2e8b57>int</FONT></B>* startPos, <B><FONT COLOR=#2e8b57>int</FONT></B>* endPos);
-<FONT COLOR=#a020f0>#endif</FONT>
 
-    <FONT COLOR=#0000ff>// Retrieve the point in the window where a position is displayed.</FONT>
-    wxPoint PointFromPosition(<B><FONT COLOR=#2e8b57>int</FONT></B> pos);
 
+    <FONT color=#0000ff>// Perform one of the operations defined by the wxSTC_CMD_* constants.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> CmdKeyExecute(<B><FONT color=#2e8b57>int</FONT></B> cmd);
 
-    <FONT COLOR=#0000ff>// Scroll enough to make the given line visible</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> ScrollToLine(<B><FONT COLOR=#2e8b57>int</FONT></B> line);
 
 
-    <FONT COLOR=#0000ff>// Scroll enough to make the given column visible</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> ScrollToColumn(<B><FONT COLOR=#2e8b57>int</FONT></B> column);
+    <FONT color=#0000ff>// Set the left and right margin in the edit area, measured in pixels.</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> SetMargins(<B><FONT color=#2e8b57>int</FONT></B> left, <B><FONT color=#2e8b57>int</FONT></B> right);
 
-<FONT COLOR=#0000ff>//----------------------------------------------------------------------</FONT>
 
+    <FONT color=#0000ff>// Retrieve the start and end positions of the current selection.</FONT>
+<FONT color=#a020f0>#ifdef SWIG</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> GetSelection(<B><FONT color=#2e8b57>int</FONT></B>* OUTPUT, <B><FONT color=#2e8b57>int</FONT></B>* OUTPUT);
+<FONT color=#a020f0>#else</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> GetSelection(<B><FONT color=#2e8b57>int</FONT></B>* startPos, <B><FONT color=#2e8b57>int</FONT></B>* endPos);
+<FONT color=#a020f0>#endif</FONT>
 
-<FONT COLOR=#a020f0>#ifndef SWIG</FONT>
-<B><FONT COLOR=#804040>private</FONT></B>:
-    <FONT COLOR=#0000ff>// Event handlers</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> OnPaint(wxPaintEvent&amp; evt);
-    <B><FONT COLOR=#2e8b57>void</FONT></B> OnScrollWin(wxScrollWinEvent&amp; evt);
-    <B><FONT COLOR=#2e8b57>void</FONT></B> OnSize(wxSizeEvent&amp; evt);
-    <B><FONT COLOR=#2e8b57>void</FONT></B> OnMouseLeftDown(wxMouseEvent&amp; evt);
-    <B><FONT COLOR=#2e8b57>void</FONT></B> OnMouseMove(wxMouseEvent&amp; evt);
-    <B><FONT COLOR=#2e8b57>void</FONT></B> OnMouseLeftUp(wxMouseEvent&amp; evt);
-    <B><FONT COLOR=#2e8b57>void</FONT></B> OnMouseRightUp(wxMouseEvent&amp; evt);
-    <B><FONT COLOR=#2e8b57>void</FONT></B> OnChar(wxKeyEvent&amp; evt);
-    <B><FONT COLOR=#2e8b57>void</FONT></B> OnKeyDown(wxKeyEvent&amp; evt);
-    <B><FONT COLOR=#2e8b57>void</FONT></B> OnLoseFocus(wxFocusEvent&amp; evt);
-    <B><FONT COLOR=#2e8b57>void</FONT></B> OnGainFocus(wxFocusEvent&amp; evt);
-    <B><FONT COLOR=#2e8b57>void</FONT></B> OnSysColourChanged(wxSysColourChangedEvent&amp; evt);
-    <B><FONT COLOR=#2e8b57>void</FONT></B> OnEraseBackground(wxEraseEvent&amp; evt);
-    <B><FONT COLOR=#2e8b57>void</FONT></B> OnMenu(wxCommandEvent&amp; evt);
-    <B><FONT COLOR=#2e8b57>void</FONT></B> OnListBox(wxCommandEvent&amp; evt);
+    <FONT color=#0000ff>// Retrieve the point in the window where a position is displayed.</FONT>
+    wxPoint PointFromPosition(<B><FONT color=#2e8b57>int</FONT></B> pos);
 
 
-    <FONT COLOR=#0000ff>// Turn notifications from Scintilla into events</FONT>
-    <B><FONT COLOR=#2e8b57>void</FONT></B> NotifyChange();
-    <B><FONT COLOR=#2e8b57>void</FONT></B> NotifyParent(SCNotification* scn);
+    <FONT color=#0000ff>// Scroll enough to make the given line visible</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> ScrollToLine(<B><FONT color=#2e8b57>int</FONT></B> line);
 
-    <B><FONT COLOR=#2e8b57>long</FONT></B> SendMsg(<B><FONT COLOR=#2e8b57>int</FONT></B> msg, <B><FONT COLOR=#2e8b57>long</FONT></B> wp=<FONT COLOR=#ff00ff>0</FONT>, <B><FONT COLOR=#2e8b57>long</FONT></B> lp=<FONT COLOR=#ff00ff>0</FONT>);
 
-<B><FONT COLOR=#804040>private</FONT></B>:
+    <FONT color=#0000ff>// Scroll enough to make the given column visible</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> ScrollToColumn(<B><FONT color=#2e8b57>int</FONT></B> column);
+
+
+    <FONT color=#0000ff>// Send a message to Scintilla</FONT>
+    <B><FONT color=#2e8b57>long</FONT></B> SendMsg(<B><FONT color=#2e8b57>int</FONT></B> msg, <B><FONT color=#2e8b57>long</FONT></B> wp=<FONT color=#ff00ff>0</FONT>, <B><FONT color=#2e8b57>long</FONT></B> lp=<FONT color=#ff00ff>0</FONT>);
+
+<FONT color=#0000ff>//----------------------------------------------------------------------</FONT>
+
+
+<FONT color=#a020f0>#ifndef SWIG</FONT>
+<B><FONT color=#804040>private</FONT></B>:
+    <FONT color=#0000ff>// Event handlers</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> OnPaint(wxPaintEvent&amp; evt);
+    <B><FONT color=#2e8b57>void</FONT></B> OnScrollWin(wxScrollWinEvent&amp; evt);
+    <B><FONT color=#2e8b57>void</FONT></B> OnSize(wxSizeEvent&amp; evt);
+    <B><FONT color=#2e8b57>void</FONT></B> OnMouseLeftDown(wxMouseEvent&amp; evt);
+    <B><FONT color=#2e8b57>void</FONT></B> OnMouseMove(wxMouseEvent&amp; evt);
+    <B><FONT color=#2e8b57>void</FONT></B> OnMouseLeftUp(wxMouseEvent&amp; evt);
+    <B><FONT color=#2e8b57>void</FONT></B> OnContextMenu(wxContextMenuEvent&amp; evt);
+    <B><FONT color=#2e8b57>void</FONT></B> OnMouseWheel(wxMouseEvent&amp; evt);
+    <B><FONT color=#2e8b57>void</FONT></B> OnChar(wxKeyEvent&amp; evt);
+    <B><FONT color=#2e8b57>void</FONT></B> OnKeyDown(wxKeyEvent&amp; evt);
+    <B><FONT color=#2e8b57>void</FONT></B> OnLoseFocus(wxFocusEvent&amp; evt);
+    <B><FONT color=#2e8b57>void</FONT></B> OnGainFocus(wxFocusEvent&amp; evt);
+    <B><FONT color=#2e8b57>void</FONT></B> OnSysColourChanged(wxSysColourChangedEvent&amp; evt);
+    <B><FONT color=#2e8b57>void</FONT></B> OnEraseBackground(wxEraseEvent&amp; evt);
+    <B><FONT color=#2e8b57>void</FONT></B> OnMenu(wxCommandEvent&amp; evt);
+    <B><FONT color=#2e8b57>void</FONT></B> OnListBox(wxCommandEvent&amp; evt);
+
+
+    <FONT color=#0000ff>// Turn notifications from Scintilla into events</FONT>
+    <B><FONT color=#2e8b57>void</FONT></B> NotifyChange();
+    <B><FONT color=#2e8b57>void</FONT></B> NotifyParent(SCNotification* scn);
+
+<B><FONT color=#804040>private</FONT></B>:
     DECLARE_EVENT_TABLE()
     DECLARE_CLASS(wxStyledTextCtrl)
 
@@ -1283,121 +1596,165 @@
     wxStopWatch         m_stopWatch;
 
 
-    <B><FONT COLOR=#804040>friend</FONT></B> class ScintillaWX;
-    <B><FONT COLOR=#804040>friend</FONT></B> class Platform;
-<FONT COLOR=#a020f0>#endif</FONT>
+    <B><FONT color=#804040>friend</FONT></B> <B><FONT color=#2e8b57>class</FONT></B> ScintillaWX;
+    <B><FONT color=#804040>friend</FONT></B> <B><FONT color=#2e8b57>class</FONT></B> Platform;
+<FONT color=#a020f0>#endif</FONT>
 };
 
-<FONT COLOR=#0000ff>//----------------------------------------------------------------------</FONT>
+<FONT color=#0000ff>//----------------------------------------------------------------------</FONT>
 
-<B><FONT COLOR=#2e8b57>class wxStyledTextEvent</FONT></B> : <B><FONT COLOR=#804040>public</FONT></B> wxCommandEvent {
-<B><FONT COLOR=#804040>public</FONT></B>:
-    wxStyledTextEvent(wxEventType commandType=<FONT COLOR=#ff00ff>0</FONT>, <B><FONT COLOR=#2e8b57>int</FONT></B> id=<FONT COLOR=#ff00ff>0</FONT>);
+<B><FONT color=#2e8b57>class</FONT></B> wxStyledTextEvent : <B><FONT color=#804040>public</FONT></B> wxCommandEvent {
+<B><FONT color=#804040>public</FONT></B>:
+    wxStyledTextEvent(wxEventType commandType=<FONT color=#ff00ff>0</FONT>, <B><FONT color=#2e8b57>int</FONT></B> id=<FONT color=#ff00ff>0</FONT>);
     ~wxStyledTextEvent() {}
 
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetPosition(<B><FONT COLOR=#2e8b57>int</FONT></B> pos)        { m_position = pos; }
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetKey(<B><FONT COLOR=#2e8b57>int</FONT></B> k)               { m_key = k; }
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetModifiers(<B><FONT COLOR=#2e8b57>int</FONT></B> m)         { m_modifiers = m; }
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetModificationType(<B><FONT COLOR=#2e8b57>int</FONT></B> t)  { m_modificationType = t; }
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetText(<B><FONT COLOR=#2e8b57>const</FONT></B> <B><FONT COLOR=#2e8b57>char</FONT></B>* t)      { m_text = t; }
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetLength(<B><FONT COLOR=#2e8b57>int</FONT></B> len)          { m_length = len; }
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetLinesAdded(<B><FONT COLOR=#2e8b57>int</FONT></B> num)      { m_linesAdded = num; }
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetLine(<B><FONT COLOR=#2e8b57>int</FONT></B> val)            { m_line = val; }
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetFoldLevelNow(<B><FONT COLOR=#2e8b57>int</FONT></B> val)    { m_foldLevelNow = val; }
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetFoldLevelPrev(<B><FONT COLOR=#2e8b57>int</FONT></B> val)   { m_foldLevelPrev = val; }
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetMargin(<B><FONT COLOR=#2e8b57>int</FONT></B> val)          { m_margin = val; }
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetMessage(<B><FONT COLOR=#2e8b57>int</FONT></B> val)         { m_message = val; }
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetWParam(<B><FONT COLOR=#2e8b57>int</FONT></B> val)          { m_wParam = val; }
-    <B><FONT COLOR=#2e8b57>void</FONT></B> SetLParam(<B><FONT COLOR=#2e8b57>int</FONT></B> val)          { m_lParam = val; }
-
-    <B><FONT COLOR=#2e8b57>int</FONT></B>  GetPosition() <B><FONT COLOR=#2e8b57>const</FONT></B>         { <B><FONT COLOR=#804040>return</FONT></B> m_position; }
-    <B><FONT COLOR=#2e8b57>int</FONT></B>  GetKey()  <B><FONT COLOR=#2e8b57>const</FONT></B>             { <B><FONT COLOR=#804040>return</FONT></B> m_key; }
-    <B><FONT COLOR=#2e8b57>int</FONT></B>  GetModifiers() <B><FONT COLOR=#2e8b57>const</FONT></B>        { <B><FONT COLOR=#804040>return</FONT></B> m_modifiers; }
-    <B><FONT COLOR=#2e8b57>int</FONT></B>  GetModificationType() <B><FONT COLOR=#2e8b57>const</FONT></B> { <B><FONT COLOR=#804040>return</FONT></B> m_modificationType; }
-    wxString GetText() <B><FONT COLOR=#2e8b57>const</FONT></B>         { <B><FONT COLOR=#804040>return</FONT></B> m_text; }
-    <B><FONT COLOR=#2e8b57>int</FONT></B>  GetLength() <B><FONT COLOR=#2e8b57>const</FONT></B>           { <B><FONT COLOR=#804040>return</FONT></B> m_length; }
-    <B><FONT COLOR=#2e8b57>int</FONT></B>  GetLinesAdded() <B><FONT COLOR=#2e8b57>const</FONT></B>       { <B><FONT COLOR=#804040>return</FONT></B> m_linesAdded; }
-    <B><FONT COLOR=#2e8b57>int</FONT></B>  GetLine() <B><FONT COLOR=#2e8b57>const</FONT></B>             { <B><FONT COLOR=#804040>return</FONT></B> m_line; }
-    <B><FONT COLOR=#2e8b57>int</FONT></B>  GetFoldLevelNow() <B><FONT COLOR=#2e8b57>const</FONT></B>     { <B><FONT COLOR=#804040>return</FONT></B> m_foldLevelNow; }
-    <B><FONT COLOR=#2e8b57>int</FONT></B>  GetFoldLevelPrev() <B><FONT COLOR=#2e8b57>const</FONT></B>    { <B><FONT COLOR=#804040>return</FONT></B> m_foldLevelPrev; }
-    <B><FONT COLOR=#2e8b57>int</FONT></B>  GetMargin() <B><FONT COLOR=#2e8b57>const</FONT></B>           { <B><FONT COLOR=#804040>return</FONT></B> m_margin; }
-    <B><FONT COLOR=#2e8b57>int</FONT></B>  GetMessage() <B><FONT COLOR=#2e8b57>const</FONT></B>          { <B><FONT COLOR=#804040>return</FONT></B> m_message; }
-    <B><FONT COLOR=#2e8b57>int</FONT></B>  GetWParam() <B><FONT COLOR=#2e8b57>const</FONT></B>           { <B><FONT COLOR=#804040>return</FONT></B> m_wParam; }
-    <B><FONT COLOR=#2e8b57>int</FONT></B>  GetLParam() <B><FONT COLOR=#2e8b57>const</FONT></B>           { <B><FONT COLOR=#804040>return</FONT></B> m_lParam; }
-
-    <B><FONT COLOR=#2e8b57>bool</FONT></B> GetShift() <B><FONT COLOR=#2e8b57>const</FONT></B>;
-    <B><FONT COLOR=#2e8b57>bool</FONT></B> GetControl() <B><FONT COLOR=#2e8b57>const</FONT></B>;
-    <B><FONT COLOR=#2e8b57>bool</FONT></B> GetAlt() <B><FONT COLOR=#2e8b57>const</FONT></B>;
-
-    <B><FONT COLOR=#2e8b57>void</FONT></B> CopyObject(wxObject&amp; obj) <B><FONT COLOR=#2e8b57>const</FONT></B>;
-
-<FONT COLOR=#a020f0>#ifndef SWIG</FONT>
-<B><FONT COLOR=#804040>private</FONT></B>:
+    <B><FONT color=#2e8b57>void</FONT></B> SetPosition(<B><FONT color=#2e8b57>int</FONT></B> pos)        { m_position = pos; }
+    <B><FONT color=#2e8b57>void</FONT></B> SetKey(<B><FONT color=#2e8b57>int</FONT></B> k)               { m_key = k; }
+    <B><FONT color=#2e8b57>void</FONT></B> SetModifiers(<B><FONT color=#2e8b57>int</FONT></B> m)         { m_modifiers = m; }
+    <B><FONT color=#2e8b57>void</FONT></B> SetModificationType(<B><FONT color=#2e8b57>int</FONT></B> t)  { m_modificationType = t; }
+    <B><FONT color=#2e8b57>void</FONT></B> SetText(<B><FONT color=#2e8b57>const</FONT></B> <B><FONT color=#2e8b57>char</FONT></B>* t)      { m_text = t; }
+    <B><FONT color=#2e8b57>void</FONT></B> SetLength(<B><FONT color=#2e8b57>int</FONT></B> len)          { m_length = len; }
+    <B><FONT color=#2e8b57>void</FONT></B> SetLinesAdded(<B><FONT color=#2e8b57>int</FONT></B> num)      { m_linesAdded = num; }
+    <B><FONT color=#2e8b57>void</FONT></B> SetLine(<B><FONT color=#2e8b57>int</FONT></B> val)            { m_line = val; }
+    <B><FONT color=#2e8b57>void</FONT></B> SetFoldLevelNow(<B><FONT color=#2e8b57>int</FONT></B> val)    { m_foldLevelNow = val; }
+    <B><FONT color=#2e8b57>void</FONT></B> SetFoldLevelPrev(<B><FONT color=#2e8b57>int</FONT></B> val)   { m_foldLevelPrev = val; }
+    <B><FONT color=#2e8b57>void</FONT></B> SetMargin(<B><FONT color=#2e8b57>int</FONT></B> val)          { m_margin = val; }
+    <B><FONT color=#2e8b57>void</FONT></B> SetMessage(<B><FONT color=#2e8b57>int</FONT></B> val)         { m_message = val; }
+    <B><FONT color=#2e8b57>void</FONT></B> SetWParam(<B><FONT color=#2e8b57>int</FONT></B> val)          { m_wParam = val; }
+    <B><FONT color=#2e8b57>void</FONT></B> SetLParam(<B><FONT color=#2e8b57>int</FONT></B> val)          { m_lParam = val; }
+    <B><FONT color=#2e8b57>void</FONT></B> SetListType(<B><FONT color=#2e8b57>int</FONT></B> val)        { m_listType = val; }
+    <B><FONT color=#2e8b57>void</FONT></B> SetX(<B><FONT color=#2e8b57>int</FONT></B> val)               { m_x = val; }
+    <B><FONT color=#2e8b57>void</FONT></B> SetY(<B><FONT color=#2e8b57>int</FONT></B> val)               { m_y = val; }
+
+    <B><FONT color=#2e8b57>int</FONT></B>  GetPosition() <B><FONT color=#2e8b57>const</FONT></B>         { <B><FONT color=#804040>return</FONT></B> m_position; }
+    <B><FONT color=#2e8b57>int</FONT></B>  GetKey()  <B><FONT color=#2e8b57>const</FONT></B>             { <B><FONT color=#804040>return</FONT></B> m_key; }
+    <B><FONT color=#2e8b57>int</FONT></B>  GetModifiers() <B><FONT color=#2e8b57>const</FONT></B>        { <B><FONT color=#804040>return</FONT></B> m_modifiers; }
+    <B><FONT color=#2e8b57>int</FONT></B>  GetModificationType() <B><FONT color=#2e8b57>const</FONT></B> { <B><FONT color=#804040>return</FONT></B> m_modificationType; }
+    wxString GetText() <B><FONT color=#2e8b57>const</FONT></B>         { <B><FONT color=#804040>return</FONT></B> m_text; }
+    <B><FONT color=#2e8b57>int</FONT></B>  GetLength() <B><FONT color=#2e8b57>const</FONT></B>           { <B><FONT color=#804040>return</FONT></B> m_length; }
+    <B><FONT color=#2e8b57>int</FONT></B>  GetLinesAdded() <B><FONT color=#2e8b57>const</FONT></B>       { <B><FONT color=#804040>return</FONT></B> m_linesAdded; }
+    <B><FONT color=#2e8b57>int</FONT></B>  GetLine() <B><FONT color=#2e8b57>const</FONT></B>             { <B><FONT color=#804040>return</FONT></B> m_line; }
+    <B><FONT color=#2e8b57>int</FONT></B>  GetFoldLevelNow() <B><FONT color=#2e8b57>const</FONT></B>     { <B><FONT color=#804040>return</FONT></B> m_foldLevelNow; }
+    <B><FONT color=#2e8b57>int</FONT></B>  GetFoldLevelPrev() <B><FONT color=#2e8b57>const</FONT></B>    { <B><FONT color=#804040>return</FONT></B> m_foldLevelPrev; }
+    <B><FONT color=#2e8b57>int</FONT></B>  GetMargin() <B><FONT color=#2e8b57>const</FONT></B>           { <B><FONT color=#804040>return</FONT></B> m_margin; }
+    <B><FONT color=#2e8b57>int</FONT></B>  GetMessage() <B><FONT color=#2e8b57>const</FONT></B>          { <B><FONT color=#804040>return</FONT></B> m_message; }
+    <B><FONT color=#2e8b57>int</FONT></B>  GetWParam() <B><FONT color=#2e8b57>const</FONT></B>           { <B><FONT color=#804040>return</FONT></B> m_wParam; }
+    <B><FONT color=#2e8b57>int</FONT></B>  GetLParam() <B><FONT color=#2e8b57>const</FONT></B>           { <B><FONT color=#804040>return</FONT></B> m_lParam; }
+    <B><FONT color=#2e8b57>int</FONT></B>  GetListType() <B><FONT color=#2e8b57>const</FONT></B>         { <B><FONT color=#804040>return</FONT></B> m_listType; }
+    <B><FONT color=#2e8b57>int</FONT></B>  GetX() <B><FONT color=#2e8b57>const</FONT></B>                { <B><FONT color=#804040>return</FONT></B> m_x; }
+    <B><FONT color=#2e8b57>int</FONT></B>  GetY() <B><FONT color=#2e8b57>const</FONT></B>                { <B><FONT color=#804040>return</FONT></B> m_y; }
+
+    <B><FONT color=#2e8b57>bool</FONT></B> GetShift() <B><FONT color=#2e8b57>const</FONT></B>;
+    <B><FONT color=#2e8b57>bool</FONT></B> GetControl() <B><FONT color=#2e8b57>const</FONT></B>;
+    <B><FONT color=#2e8b57>bool</FONT></B> GetAlt() <B><FONT color=#2e8b57>const</FONT></B>;
+
+    <B><FONT color=#2e8b57>void</FONT></B> CopyObject(wxObject&amp; obj) <B><FONT color=#2e8b57>const</FONT></B>;
+
+<FONT color=#a020f0>#ifndef SWIG</FONT>
+<B><FONT color=#804040>private</FONT></B>:
     DECLARE_DYNAMIC_CLASS(wxStyledTextEvent)
 
-    <B><FONT COLOR=#2e8b57>int</FONT></B>  m_position;
-    <B><FONT COLOR=#2e8b57>int</FONT></B>  m_key;
-    <B><FONT COLOR=#2e8b57>int</FONT></B>  m_modifiers;
+    <B><FONT color=#2e8b57>int</FONT></B>  m_position;
+    <B><FONT color=#2e8b57>int</FONT></B>  m_key;
+    <B><FONT color=#2e8b57>int</FONT></B>  m_modifiers;
 
-    <B><FONT COLOR=#2e8b57>int</FONT></B>  m_modificationType;    <FONT COLOR=#0000ff>// wxEVT_STC_MODIFIED</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B>  m_modificationType;    <FONT color=#0000ff>// wxEVT_STC_MODIFIED</FONT>
     wxString m_text;
-    <B><FONT COLOR=#2e8b57>int</FONT></B>  m_length;
-    <B><FONT COLOR=#2e8b57>int</FONT></B>  m_linesAdded;
-    <B><FONT COLOR=#2e8b57>int</FONT></B>  m_line;
-    <B><FONT COLOR=#2e8b57>int</FONT></B>  m_foldLevelNow;
-    <B><FONT COLOR=#2e8b57>int</FONT></B>  m_foldLevelPrev;
-
-    <B><FONT COLOR=#2e8b57>int</FONT></B>  m_margin;              <FONT COLOR=#0000ff>// wxEVT_STC_MARGINCLICK</FONT>
-
-    <B><FONT COLOR=#2e8b57>int</FONT></B>  m_message;             <FONT COLOR=#0000ff>// wxEVT_STC_MACRORECORD</FONT>
-    <B><FONT COLOR=#2e8b57>int</FONT></B>  m_wParam;
-    <B><FONT COLOR=#2e8b57>int</FONT></B>  m_lParam;
-<FONT COLOR=#a020f0>#endif</FONT>
-};
-
-
-<FONT COLOR=#0000ff>// Event types</FONT>
-<B><FONT COLOR=#2e8b57>enum</FONT></B> {
-    wxEVT_STC_CHANGE = <FONT COLOR=#ff00ff>1650</FONT>,
-    wxEVT_STC_STYLENEEDED,
-    wxEVT_STC_CHARADDED,
-    wxEVT_STC_UPDATEUI,
-    wxEVT_STC_SAVEPOINTREACHED,
-    wxEVT_STC_SAVEPOINTLEFT,
-    wxEVT_STC_ROMODIFYATTEMPT,
-    wxEVT_STC_DOUBLECLICK,
-    wxEVT_STC_MODIFIED,
-    wxEVT_STC_KEY,
-    wxEVT_STC_MACRORECORD,
-    wxEVT_STC_MARGINCLICK,
-    wxEVT_STC_NEEDSHOWN,
-    wxEVT_STC_POSCHANGED
+    <B><FONT color=#2e8b57>int</FONT></B>  m_length;
+    <B><FONT color=#2e8b57>int</FONT></B>  m_linesAdded;
+    <B><FONT color=#2e8b57>int</FONT></B>  m_line;
+    <B><FONT color=#2e8b57>int</FONT></B>  m_foldLevelNow;
+    <B><FONT color=#2e8b57>int</FONT></B>  m_foldLevelPrev;
+
+    <B><FONT color=#2e8b57>int</FONT></B>  m_margin;              <FONT color=#0000ff>// wxEVT_STC_MARGINCLICK</FONT>
+
+    <B><FONT color=#2e8b57>int</FONT></B>  m_message;             <FONT color=#0000ff>// wxEVT_STC_MACRORECORD</FONT>
+    <B><FONT color=#2e8b57>int</FONT></B>  m_wParam;
+    <B><FONT color=#2e8b57>int</FONT></B>  m_lParam;
+
+    <B><FONT color=#2e8b57>int</FONT></B> m_listType;
+    <B><FONT color=#2e8b57>int</FONT></B> m_x;
+    <B><FONT color=#2e8b57>int</FONT></B> m_y;
+<FONT color=#a020f0>#endif</FONT>
 };
 
-
-<FONT COLOR=#a020f0>#ifndef SWIG</FONT>
-<B><FONT COLOR=#2e8b57>typedef</FONT></B> <B><FONT COLOR=#2e8b57>void</FONT></B> (wxEvtHandler::*wxStyledTextEventFunction)(wxStyledTextEvent&amp;);
-
-<FONT COLOR=#a020f0>#define EVT_STC_CHANGE(id, fn) { wxEVT_STC_CHANGE, id, -</FONT><FONT COLOR=#ff00ff>1</FONT><FONT COLOR=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) NULL },</FONT>
-<FONT COLOR=#a020f0>#define EVT_STC_STYLENEEDED(id, fn) { wxEVT_STC_STYLENEEDED, id, -</FONT><FONT COLOR=#ff00ff>1</FONT><FONT COLOR=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) NULL },</FONT>
-<FONT COLOR=#a020f0>#define EVT_STC_CHARADDED(id, fn) { wxEVT_STC_CHARADDED, id, -</FONT><FONT COLOR=#ff00ff>1</FONT><FONT COLOR=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) NULL },</FONT>
-<FONT COLOR=#a020f0>#define EVT_STC_UPDATEUI(id, fn) { wxEVT_STC_UPDATEUI, id, -</FONT><FONT COLOR=#ff00ff>1</FONT><FONT COLOR=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) NULL },</FONT>
-<FONT COLOR=#a020f0>#define EVT_STC_SAVEPOINTREACHED(id, fn) { wxEVT_STC_SAVEPOINTREACHED, id, -</FONT><FONT COLOR=#ff00ff>1</FONT><FONT COLOR=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) NULL },</FONT>
-<FONT COLOR=#a020f0>#define EVT_STC_SAVEPOINTLEFT(id, fn) { wxEVT_STC_SAVEPOINTLEFT, id, -</FONT><FONT COLOR=#ff00ff>1</FONT><FONT COLOR=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) NULL },</FONT>
-<FONT COLOR=#a020f0>#define EVT_STC_ROMODIFYATTEMPT(id, fn) { wxEVT_STC_ROMODIFYATTEMPT, id, -</FONT><FONT COLOR=#ff00ff>1</FONT><FONT COLOR=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) NULL },</FONT>
-<FONT COLOR=#a020f0>#define EVT_STC_DOUBLECLICK(id, fn) { wxEVT_STC_DOUBLECLICK, id, -</FONT><FONT COLOR=#ff00ff>1</FONT><FONT COLOR=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) NULL },</FONT>
-<FONT COLOR=#a020f0>#define EVT_STC_MODIFIED(id, fn) { wxEVT_STC_MODIFIED, id, -</FONT><FONT COLOR=#ff00ff>1</FONT><FONT COLOR=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) NULL },</FONT>
-<FONT COLOR=#a020f0>#define EVT_STC_KEY(id, fn) { wxEVT_STC_KEY, id, -</FONT><FONT COLOR=#ff00ff>1</FONT><FONT COLOR=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) NULL },</FONT>
-<FONT COLOR=#a020f0>#define EVT_STC_MACRORECORD(id, fn) { wxEVT_STC_MACRORECORD, id, -</FONT><FONT COLOR=#ff00ff>1</FONT><FONT COLOR=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) NULL },</FONT>
-<FONT COLOR=#a020f0>#define EVT_STC_MARGINCLICK(id, fn) { wxEVT_STC_MARGINCLICK, id, -</FONT><FONT COLOR=#ff00ff>1</FONT><FONT COLOR=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) NULL },</FONT>
-<FONT COLOR=#a020f0>#define EVT_STC_NEEDSHOWN(id, fn) { wxEVT_STC_NEEDSHOWN, id, -</FONT><FONT COLOR=#ff00ff>1</FONT><FONT COLOR=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) NULL },</FONT>
-<FONT COLOR=#a020f0>#define EVT_STC_POSCHANGED(id, fn) { wxEVT_STC_POSCHANGED, id, -</FONT><FONT COLOR=#ff00ff>1</FONT><FONT COLOR=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) NULL },</FONT>
-
-<FONT COLOR=#a020f0>#endif</FONT>
-
-<FONT COLOR=#0000ff>//----------------------------------------------------------------------</FONT>
-<FONT COLOR=#0000ff>//----------------------------------------------------------------------</FONT>
-<FONT COLOR=#a020f0>#endif</FONT>
+<FONT color=#a020f0>#ifndef SWIG</FONT>
+BEGIN_DECLARE_EVENT_TYPES()
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_CHANGE,                  <FONT color=#ff00ff>1650</FONT>)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_STYLENEEDED,             <FONT color=#ff00ff>1651</FONT>)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_CHARADDED,               <FONT color=#ff00ff>1652</FONT>)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_SAVEPOINTREACHED,        <FONT color=#ff00ff>1653</FONT>)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_SAVEPOINTLEFT,           <FONT color=#ff00ff>1654</FONT>)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_ROMODIFYATTEMPT,         <FONT color=#ff00ff>1655</FONT>)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_KEY,                     <FONT color=#ff00ff>1656</FONT>)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_DOUBLECLICK,             <FONT color=#ff00ff>1657</FONT>)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_UPDATEUI,                <FONT color=#ff00ff>1658</FONT>)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_MODIFIED,                <FONT color=#ff00ff>1659</FONT>)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_MACRORECORD,             <FONT color=#ff00ff>1660</FONT>)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_MARGINCLICK,             <FONT color=#ff00ff>1661</FONT>)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_NEEDSHOWN,               <FONT color=#ff00ff>1662</FONT>)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_POSCHANGED,              <FONT color=#ff00ff>1663</FONT>)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_PAINTED,                 <FONT color=#ff00ff>1664</FONT>)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_USERLISTSELECTION,       <FONT color=#ff00ff>1665</FONT>)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_URIDROPPED,              <FONT color=#ff00ff>1666</FONT>)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_DWELLSTART,              <FONT color=#ff00ff>1667</FONT>)
+    DECLARE_LOCAL_EVENT_TYPE(wxEVT_STC_DWELLEND,                <FONT color=#ff00ff>1668</FONT>)
+END_DECLARE_EVENT_TYPES()
+<FONT color=#a020f0>#else</FONT>
+    <B><FONT color=#2e8b57>enum</FONT></B> {
+        wxEVT_STC_CHANGE,
+        wxEVT_STC_STYLENEEDED,
+        wxEVT_STC_CHARADDED,
+        wxEVT_STC_SAVEPOINTREACHED,
+        wxEVT_STC_SAVEPOINTLEFT,
+        wxEVT_STC_ROMODIFYATTEMPT,
+        wxEVT_STC_KEY,
+        wxEVT_STC_DOUBLECLICK,
+        wxEVT_STC_UPDATEUI,
+        wxEVT_STC_MODIFIED,
+        wxEVT_STC_MACRORECORD,
+        wxEVT_STC_MARGINCLICK,
+        wxEVT_STC_NEEDSHOWN,
+        wxEVT_STC_POSCHANGED,
+        wxEVT_STC_PAINTED,
+        wxEVT_STC_USERLISTSELECTION,
+        wxEVT_STC_URIDROPPED,
+        wxEVT_STC_DWELLSTART,
+        wxEVT_STC_DWELLEND,
+    };
+<FONT color=#a020f0>#endif</FONT>
+
+
+
+<FONT color=#a020f0>#ifndef SWIG</FONT>
+<B><FONT color=#2e8b57>typedef</FONT></B> <B><FONT color=#2e8b57>void</FONT></B> (wxEvtHandler::*wxStyledTextEventFunction)(wxStyledTextEvent&amp;);
+
+<FONT color=#a020f0>#define EVT_STC_CHANGE(id, fn)                  DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_CHANGE,                id, -</FONT><FONT color=#ff00ff>1</FONT><FONT color=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) </FONT><FONT color=#ff00ff>NULL</FONT><FONT color=#a020f0> ),</FONT>
+<FONT color=#a020f0>#define EVT_STC_STYLENEEDED(id, fn)             DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_STYLENEEDED,           id, -</FONT><FONT color=#ff00ff>1</FONT><FONT color=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) </FONT><FONT color=#ff00ff>NULL</FONT><FONT color=#a020f0> ),</FONT>
+<FONT color=#a020f0>#define EVT_STC_CHARADDED(id, fn)               DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_CHARADDED,             id, -</FONT><FONT color=#ff00ff>1</FONT><FONT color=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) </FONT><FONT color=#ff00ff>NULL</FONT><FONT color=#a020f0> ),</FONT>
+<FONT color=#a020f0>#define EVT_STC_SAVEPOINTREACHED(id, fn)        DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_SAVEPOINTREACHED,      id, -</FONT><FONT color=#ff00ff>1</FONT><FONT color=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) </FONT><FONT color=#ff00ff>NULL</FONT><FONT color=#a020f0> ),</FONT>
+<FONT color=#a020f0>#define EVT_STC_SAVEPOINTLEFT(id, fn)           DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_SAVEPOINTLEFT,         id, -</FONT><FONT color=#ff00ff>1</FONT><FONT color=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) </FONT><FONT color=#ff00ff>NULL</FONT><FONT color=#a020f0> ),</FONT>
+<FONT color=#a020f0>#define EVT_STC_ROMODIFYATTEMPT(id, fn)         DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_ROMODIFYATTEMPT,       id, -</FONT><FONT color=#ff00ff>1</FONT><FONT color=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) </FONT><FONT color=#ff00ff>NULL</FONT><FONT color=#a020f0> ),</FONT>
+<FONT color=#a020f0>#define EVT_STC_KEY(id, fn)                     DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_KEY,                   id, -</FONT><FONT color=#ff00ff>1</FONT><FONT color=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) </FONT><FONT color=#ff00ff>NULL</FONT><FONT color=#a020f0> ),</FONT>
+<FONT color=#a020f0>#define EVT_STC_DOUBLECLICK(id, fn)             DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DOUBLECLICK,           id, -</FONT><FONT color=#ff00ff>1</FONT><FONT color=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) </FONT><FONT color=#ff00ff>NULL</FONT><FONT color=#a020f0> ),</FONT>
+<FONT color=#a020f0>#define EVT_STC_UPDATEUI(id, fn)                DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_UPDATEUI,              id, -</FONT><FONT color=#ff00ff>1</FONT><FONT color=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) </FONT><FONT color=#ff00ff>NULL</FONT><FONT color=#a020f0> ),</FONT>
+<FONT color=#a020f0>#define EVT_STC_MODIFIED(id, fn)                DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MODIFIED,              id, -</FONT><FONT color=#ff00ff>1</FONT><FONT color=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) </FONT><FONT color=#ff00ff>NULL</FONT><FONT color=#a020f0> ),</FONT>
+<FONT color=#a020f0>#define EVT_STC_MACRORECORD(id, fn)             DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MACRORECORD,           id, -</FONT><FONT color=#ff00ff>1</FONT><FONT color=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) </FONT><FONT color=#ff00ff>NULL</FONT><FONT color=#a020f0> ),</FONT>
+<FONT color=#a020f0>#define EVT_STC_MARGINCLICK(id, fn)             DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MARGINCLICK,           id, -</FONT><FONT color=#ff00ff>1</FONT><FONT color=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) </FONT><FONT color=#ff00ff>NULL</FONT><FONT color=#a020f0> ),</FONT>
+<FONT color=#a020f0>#define EVT_STC_NEEDSHOWN(id, fn)               DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_NEEDSHOWN,             id, -</FONT><FONT color=#ff00ff>1</FONT><FONT color=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) </FONT><FONT color=#ff00ff>NULL</FONT><FONT color=#a020f0> ),</FONT>
+<FONT color=#a020f0>#define EVT_STC_POSCHANGED(id, fn)              DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_POSCHANGED,            id, -</FONT><FONT color=#ff00ff>1</FONT><FONT color=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) </FONT><FONT color=#ff00ff>NULL</FONT><FONT color=#a020f0> ),</FONT>
+<FONT color=#a020f0>#define EVT_STC_PAINTED(id, fn)                 DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_PAINTED,               id, -</FONT><FONT color=#ff00ff>1</FONT><FONT color=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) </FONT><FONT color=#ff00ff>NULL</FONT><FONT color=#a020f0> ),</FONT>
+<FONT color=#a020f0>#define EVT_STC_USERLISTSELECTION(id, fn)       DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_USERLISTSELECTION,     id, -</FONT><FONT color=#ff00ff>1</FONT><FONT color=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) </FONT><FONT color=#ff00ff>NULL</FONT><FONT color=#a020f0> ),</FONT>
+<FONT color=#a020f0>#define EVT_STC_URIDROPPED(id, fn)              DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_URIDROPPED,            id, -</FONT><FONT color=#ff00ff>1</FONT><FONT color=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) </FONT><FONT color=#ff00ff>NULL</FONT><FONT color=#a020f0> ),</FONT>
+<FONT color=#a020f0>#define EVT_STC_DWELLSTART(id, fn)              DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DWELLSTART,            id, -</FONT><FONT color=#ff00ff>1</FONT><FONT color=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) </FONT><FONT color=#ff00ff>NULL</FONT><FONT color=#a020f0> ),</FONT>
+<FONT color=#a020f0>#define EVT_STC_DWELLEND(id, fn)                DECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DWELLEND,              id, -</FONT><FONT color=#ff00ff>1</FONT><FONT color=#a020f0>, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) &amp; fn, (wxObject *) </FONT><FONT color=#ff00ff>NULL</FONT><FONT color=#a020f0> ),</FONT>
+
+
+<FONT color=#a020f0>#endif</FONT>
+
+<FONT color=#0000ff>//----------------------------------------------------------------------</FONT>
+<FONT color=#0000ff>//----------------------------------------------------------------------</FONT>
+<FONT color=#a020f0>#endif</FONT>
 
 
 </PRE>
diff --git a/wxPython/demo/wxStyledTextCtrl_1.py b/wxPython/demo/wxStyledTextCtrl_1.py
index eb55ea356c..cf589e92f3 100644
--- a/wxPython/demo/wxStyledTextCtrl_1.py
+++ b/wxPython/demo/wxStyledTextCtrl_1.py
@@ -182,6 +182,7 @@ def runTest(frame, nb, log):
         print "GetSelectedText(): ", repr(ed.GetSelectedText())
         print "GetTextRange(25, 35): ", repr(ed.GetTextRange(25, 35))
 
+
         ed.GotoPos(0)
 
     return p
@@ -193,7 +194,7 @@ def runTest(frame, nb, log):
 
 overview = """\
 <html><body>
-Once again, no docs yet.  <b>Sorry.</b>  But <a href="data/stc.h">this</a>
+Once again, no docs yet.  <b>Sorry.</b>  But <a href="data/stc.h.html">this</a>
 and <a href="http://www.scintilla.org/ScintillaDoc.html">this</a> should
 be helpful.
 </body><html>
diff --git a/wxPython/demo/wxStyledTextCtrl_2.py b/wxPython/demo/wxStyledTextCtrl_2.py
index a6f80f6623..52597a671e 100644
--- a/wxPython/demo/wxStyledTextCtrl_2.py
+++ b/wxPython/demo/wxStyledTextCtrl_2.py
@@ -296,7 +296,7 @@ def runTest(frame, nb, log):
 
 overview = """\
 <html><body>
-Once again, no docs yet.  <b>Sorry.</b>  But <a href="data/stc.h">this</a>
+Once again, no docs yet.  <b>Sorry.</b>  But <a href="data/stc.h.html">this</a>
 and <a href="http://www.scintilla.org/ScintillaDoc.html">this</a> should
 be helpful.
 </body><html>
-- 
2.45.2