]> git.saurik.com Git - wxWidgets.git/commitdiff
Updated Scintilla to version 1.70
authorRobin Dunn <robin@alldunn.com>
Fri, 14 Jul 2006 01:20:18 +0000 (01:20 +0000)
committerRobin Dunn <robin@alldunn.com>
Fri, 14 Jul 2006 01:20:18 +0000 (01:20 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40086 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

98 files changed:
contrib/build/stc/makefile.bcc
contrib/build/stc/makefile.gcc
contrib/build/stc/makefile.vc
contrib/build/stc/makefile.wat
contrib/build/stc/stc.bkl
contrib/build/stc/stc.dsp
contrib/include/wx/stc/stc.h
contrib/src/stc/Makefile.in
contrib/src/stc/PlatWX.cpp
contrib/src/stc/ScintillaWX.h
contrib/src/stc/scintilla/README.txt
contrib/src/stc/scintilla/include/Platform.h
contrib/src/stc/scintilla/include/SciLexer.h
contrib/src/stc/scintilla/include/Scintilla.h
contrib/src/stc/scintilla/include/Scintilla.iface
contrib/src/stc/scintilla/include/ScintillaWidget.h
contrib/src/stc/scintilla/src/CallTip.cxx
contrib/src/stc/scintilla/src/CallTip.h
contrib/src/stc/scintilla/src/CharClassify.cxx [new file with mode: 0644]
contrib/src/stc/scintilla/src/CharClassify.h [new file with mode: 0644]
contrib/src/stc/scintilla/src/ContractionState.cxx
contrib/src/stc/scintilla/src/Document.cxx
contrib/src/stc/scintilla/src/Document.h
contrib/src/stc/scintilla/src/DocumentAccessor.cxx
contrib/src/stc/scintilla/src/Editor.cxx
contrib/src/stc/scintilla/src/Editor.h
contrib/src/stc/scintilla/src/ExternalLexer.cxx
contrib/src/stc/scintilla/src/Indicator.cxx
contrib/src/stc/scintilla/src/KeyWords.cxx
contrib/src/stc/scintilla/src/LexAU3.cxx
contrib/src/stc/scintilla/src/LexBash.cxx
contrib/src/stc/scintilla/src/LexBasic.cxx
contrib/src/stc/scintilla/src/LexCPP.cxx
contrib/src/stc/scintilla/src/LexEiffel.cxx
contrib/src/stc/scintilla/src/LexHTML.cxx
contrib/src/stc/scintilla/src/LexInno.cxx [new file with mode: 0644]
contrib/src/stc/scintilla/src/LexLua.cxx
contrib/src/stc/scintilla/src/LexMSSQL.cxx
contrib/src/stc/scintilla/src/LexOpal.cxx [new file with mode: 0644]
contrib/src/stc/scintilla/src/LexOthers.cxx
contrib/src/stc/scintilla/src/LexPython.cxx
contrib/src/stc/scintilla/src/LexSQL.cxx
contrib/src/stc/scintilla/src/LexSpice.cxx [new file with mode: 0644]
contrib/src/stc/scintilla/src/LexTCL.cxx [new file with mode: 0644]
contrib/src/stc/scintilla/src/LineMarker.h
contrib/src/stc/scintilla/src/RESearch.cxx
contrib/src/stc/scintilla/src/RESearch.h
contrib/src/stc/scintilla/src/ScintillaBase.cxx
contrib/src/stc/scintilla/src/ViewStyle.cxx
contrib/src/stc/scintilla/src/ViewStyle.h
contrib/src/stc/stc.cpp
include/wx/stc/stc.h
src/stc/Makefile.in
src/stc/PlatWX.cpp
src/stc/ScintillaWX.h
src/stc/scintilla/README.txt
src/stc/scintilla/include/Platform.h
src/stc/scintilla/include/SciLexer.h
src/stc/scintilla/include/Scintilla.h
src/stc/scintilla/include/Scintilla.iface
src/stc/scintilla/include/ScintillaWidget.h
src/stc/scintilla/src/CallTip.cxx
src/stc/scintilla/src/CallTip.h
src/stc/scintilla/src/CharClassify.cxx [new file with mode: 0644]
src/stc/scintilla/src/CharClassify.h [new file with mode: 0644]
src/stc/scintilla/src/ContractionState.cxx
src/stc/scintilla/src/Document.cxx
src/stc/scintilla/src/Document.h
src/stc/scintilla/src/DocumentAccessor.cxx
src/stc/scintilla/src/Editor.cxx
src/stc/scintilla/src/Editor.h
src/stc/scintilla/src/ExternalLexer.cxx
src/stc/scintilla/src/Indicator.cxx
src/stc/scintilla/src/KeyWords.cxx
src/stc/scintilla/src/LexAU3.cxx
src/stc/scintilla/src/LexBash.cxx
src/stc/scintilla/src/LexBasic.cxx
src/stc/scintilla/src/LexCPP.cxx
src/stc/scintilla/src/LexEiffel.cxx
src/stc/scintilla/src/LexHTML.cxx
src/stc/scintilla/src/LexInno.cxx [new file with mode: 0644]
src/stc/scintilla/src/LexLua.cxx
src/stc/scintilla/src/LexMSSQL.cxx
src/stc/scintilla/src/LexOpal.cxx [new file with mode: 0644]
src/stc/scintilla/src/LexOthers.cxx
src/stc/scintilla/src/LexPython.cxx
src/stc/scintilla/src/LexSQL.cxx
src/stc/scintilla/src/LexSpice.cxx [new file with mode: 0644]
src/stc/scintilla/src/LexTCL.cxx [new file with mode: 0644]
src/stc/scintilla/src/LineMarker.h
src/stc/scintilla/src/RESearch.cxx
src/stc/scintilla/src/RESearch.h
src/stc/scintilla/src/ScintillaBase.cxx
src/stc/scintilla/src/ViewStyle.cxx
src/stc/scintilla/src/ViewStyle.h
src/stc/stc.cpp
wxPython/contrib/stc/_stc_gendocs.i
wxPython/docs/CHANGES.txt

index a38c5da9f2c10a511e412e04705c93fae30a4bd2..18a1728a554e884ade8dbe54147316ace3be8389 100644 (file)
@@ -43,6 +43,7 @@ STCDLL_OBJECTS =  \
        $(OBJS)\stcdll_AutoComplete.obj \
        $(OBJS)\stcdll_CallTip.obj \
        $(OBJS)\stcdll_CellBuffer.obj \
+       $(OBJS)\stcdll_CharClassify.obj \
        $(OBJS)\stcdll_ContractionState.obj \
        $(OBJS)\stcdll_Document.obj \
        $(OBJS)\stcdll_DocumentAccessor.obj \
@@ -77,6 +78,7 @@ STCDLL_OBJECTS =  \
        $(OBJS)\stcdll_LexGui4Cli.obj \
        $(OBJS)\stcdll_LexHTML.obj \
        $(OBJS)\stcdll_LexHaskell.obj \
+       $(OBJS)\stcdll_LexInno.obj \
        $(OBJS)\stcdll_LexKix.obj \
        $(OBJS)\stcdll_LexLisp.obj \
        $(OBJS)\stcdll_LexLout.obj \
@@ -87,6 +89,7 @@ STCDLL_OBJECTS =  \
        $(OBJS)\stcdll_LexMatlab.obj \
        $(OBJS)\stcdll_LexMetapost.obj \
        $(OBJS)\stcdll_LexNsis.obj \
+       $(OBJS)\stcdll_LexOpal.obj \
        $(OBJS)\stcdll_LexOthers.obj \
        $(OBJS)\stcdll_LexPB.obj \
        $(OBJS)\stcdll_LexPOV.obj \
@@ -101,6 +104,8 @@ STCDLL_OBJECTS =  \
        $(OBJS)\stcdll_LexTADS3.obj \
        $(OBJS)\stcdll_LexScriptol.obj \
        $(OBJS)\stcdll_LexSpecman.obj \
+       $(OBJS)\stcdll_LexSpice.obj \
+       $(OBJS)\stcdll_LexTCL.obj \
        $(OBJS)\stcdll_LexTeX.obj \
        $(OBJS)\stcdll_LexVB.obj \
        $(OBJS)\stcdll_LexVHDL.obj \
@@ -131,6 +136,7 @@ STCLIB_OBJECTS =  \
        $(OBJS)\stclib_AutoComplete.obj \
        $(OBJS)\stclib_CallTip.obj \
        $(OBJS)\stclib_CellBuffer.obj \
+       $(OBJS)\stclib_CharClassify.obj \
        $(OBJS)\stclib_ContractionState.obj \
        $(OBJS)\stclib_Document.obj \
        $(OBJS)\stclib_DocumentAccessor.obj \
@@ -165,6 +171,7 @@ STCLIB_OBJECTS =  \
        $(OBJS)\stclib_LexGui4Cli.obj \
        $(OBJS)\stclib_LexHTML.obj \
        $(OBJS)\stclib_LexHaskell.obj \
+       $(OBJS)\stclib_LexInno.obj \
        $(OBJS)\stclib_LexKix.obj \
        $(OBJS)\stclib_LexLisp.obj \
        $(OBJS)\stclib_LexLout.obj \
@@ -175,6 +182,7 @@ STCLIB_OBJECTS =  \
        $(OBJS)\stclib_LexMatlab.obj \
        $(OBJS)\stclib_LexMetapost.obj \
        $(OBJS)\stclib_LexNsis.obj \
+       $(OBJS)\stclib_LexOpal.obj \
        $(OBJS)\stclib_LexOthers.obj \
        $(OBJS)\stclib_LexPB.obj \
        $(OBJS)\stclib_LexPOV.obj \
@@ -189,6 +197,8 @@ STCLIB_OBJECTS =  \
        $(OBJS)\stclib_LexTADS3.obj \
        $(OBJS)\stclib_LexScriptol.obj \
        $(OBJS)\stclib_LexSpecman.obj \
+       $(OBJS)\stclib_LexSpice.obj \
+       $(OBJS)\stclib_LexTCL.obj \
        $(OBJS)\stclib_LexTeX.obj \
        $(OBJS)\stclib_LexVB.obj \
        $(OBJS)\stclib_LexVHDL.obj \
@@ -428,6 +438,9 @@ $(OBJS)\stcdll_CallTip.obj: ../../src/stc\scintilla\src\CallTip.cxx
 $(OBJS)\stcdll_CellBuffer.obj: ../../src/stc\scintilla\src\CellBuffer.cxx
        $(CXX) -q -c -P -o$@ $(STCDLL_CXXFLAGS) $**
 
+$(OBJS)\stcdll_CharClassify.obj: ../../src/stc\scintilla\src\CharClassify.cxx
+       $(CXX) -q -c -P -o$@ $(STCDLL_CXXFLAGS) $**
+
 $(OBJS)\stcdll_ContractionState.obj: ../../src/stc\scintilla\src\ContractionState.cxx
        $(CXX) -q -c -P -o$@ $(STCDLL_CXXFLAGS) $**
 
@@ -530,6 +543,9 @@ $(OBJS)\stcdll_LexHTML.obj: ../../src/stc\scintilla\src\LexHTML.cxx
 $(OBJS)\stcdll_LexHaskell.obj: ../../src/stc\scintilla\src\LexHaskell.cxx
        $(CXX) -q -c -P -o$@ $(STCDLL_CXXFLAGS) $**
 
+$(OBJS)\stcdll_LexInno.obj: ../../src/stc\scintilla\src\LexInno.cxx
+       $(CXX) -q -c -P -o$@ $(STCDLL_CXXFLAGS) $**
+
 $(OBJS)\stcdll_LexKix.obj: ../../src/stc\scintilla\src\LexKix.cxx
        $(CXX) -q -c -P -o$@ $(STCDLL_CXXFLAGS) $**
 
@@ -560,6 +576,9 @@ $(OBJS)\stcdll_LexMetapost.obj: ../../src/stc\scintilla\src\LexMetapost.cxx
 $(OBJS)\stcdll_LexNsis.obj: ../../src/stc\scintilla\src\LexNsis.cxx
        $(CXX) -q -c -P -o$@ $(STCDLL_CXXFLAGS) $**
 
+$(OBJS)\stcdll_LexOpal.obj: ../../src/stc\scintilla\src\LexOpal.cxx
+       $(CXX) -q -c -P -o$@ $(STCDLL_CXXFLAGS) $**
+
 $(OBJS)\stcdll_LexOthers.obj: ../../src/stc\scintilla\src\LexOthers.cxx
        $(CXX) -q -c -P -o$@ $(STCDLL_CXXFLAGS) $**
 
@@ -602,6 +621,12 @@ $(OBJS)\stcdll_LexScriptol.obj: ../../src/stc\scintilla\src\LexScriptol.cxx
 $(OBJS)\stcdll_LexSpecman.obj: ../../src/stc\scintilla\src\LexSpecman.cxx
        $(CXX) -q -c -P -o$@ $(STCDLL_CXXFLAGS) $**
 
+$(OBJS)\stcdll_LexSpice.obj: ../../src/stc\scintilla\src\LexSpice.cxx
+       $(CXX) -q -c -P -o$@ $(STCDLL_CXXFLAGS) $**
+
+$(OBJS)\stcdll_LexTCL.obj: ../../src/stc\scintilla\src\LexTCL.cxx
+       $(CXX) -q -c -P -o$@ $(STCDLL_CXXFLAGS) $**
+
 $(OBJS)\stcdll_LexTeX.obj: ../../src/stc\scintilla\src\LexTeX.cxx
        $(CXX) -q -c -P -o$@ $(STCDLL_CXXFLAGS) $**
 
@@ -665,6 +690,9 @@ $(OBJS)\stclib_CallTip.obj: ../../src/stc\scintilla\src\CallTip.cxx
 $(OBJS)\stclib_CellBuffer.obj: ../../src/stc\scintilla\src\CellBuffer.cxx
        $(CXX) -q -c -P -o$@ $(STCLIB_CXXFLAGS) $**
 
+$(OBJS)\stclib_CharClassify.obj: ../../src/stc\scintilla\src\CharClassify.cxx
+       $(CXX) -q -c -P -o$@ $(STCLIB_CXXFLAGS) $**
+
 $(OBJS)\stclib_ContractionState.obj: ../../src/stc\scintilla\src\ContractionState.cxx
        $(CXX) -q -c -P -o$@ $(STCLIB_CXXFLAGS) $**
 
@@ -767,6 +795,9 @@ $(OBJS)\stclib_LexHTML.obj: ../../src/stc\scintilla\src\LexHTML.cxx
 $(OBJS)\stclib_LexHaskell.obj: ../../src/stc\scintilla\src\LexHaskell.cxx
        $(CXX) -q -c -P -o$@ $(STCLIB_CXXFLAGS) $**
 
+$(OBJS)\stclib_LexInno.obj: ../../src/stc\scintilla\src\LexInno.cxx
+       $(CXX) -q -c -P -o$@ $(STCLIB_CXXFLAGS) $**
+
 $(OBJS)\stclib_LexKix.obj: ../../src/stc\scintilla\src\LexKix.cxx
        $(CXX) -q -c -P -o$@ $(STCLIB_CXXFLAGS) $**
 
@@ -797,6 +828,9 @@ $(OBJS)\stclib_LexMetapost.obj: ../../src/stc\scintilla\src\LexMetapost.cxx
 $(OBJS)\stclib_LexNsis.obj: ../../src/stc\scintilla\src\LexNsis.cxx
        $(CXX) -q -c -P -o$@ $(STCLIB_CXXFLAGS) $**
 
+$(OBJS)\stclib_LexOpal.obj: ../../src/stc\scintilla\src\LexOpal.cxx
+       $(CXX) -q -c -P -o$@ $(STCLIB_CXXFLAGS) $**
+
 $(OBJS)\stclib_LexOthers.obj: ../../src/stc\scintilla\src\LexOthers.cxx
        $(CXX) -q -c -P -o$@ $(STCLIB_CXXFLAGS) $**
 
@@ -839,6 +873,12 @@ $(OBJS)\stclib_LexScriptol.obj: ../../src/stc\scintilla\src\LexScriptol.cxx
 $(OBJS)\stclib_LexSpecman.obj: ../../src/stc\scintilla\src\LexSpecman.cxx
        $(CXX) -q -c -P -o$@ $(STCLIB_CXXFLAGS) $**
 
+$(OBJS)\stclib_LexSpice.obj: ../../src/stc\scintilla\src\LexSpice.cxx
+       $(CXX) -q -c -P -o$@ $(STCLIB_CXXFLAGS) $**
+
+$(OBJS)\stclib_LexTCL.obj: ../../src/stc\scintilla\src\LexTCL.cxx
+       $(CXX) -q -c -P -o$@ $(STCLIB_CXXFLAGS) $**
+
 $(OBJS)\stclib_LexTeX.obj: ../../src/stc\scintilla\src\LexTeX.cxx
        $(CXX) -q -c -P -o$@ $(STCLIB_CXXFLAGS) $**
 
index 9e7fe276dadbc30536dec29debeeefc7c96f7f5a..c534e0b9ede0fa9ed0e42d932b28ff2505b1fcaf 100644 (file)
@@ -36,6 +36,7 @@ STCDLL_OBJECTS =  \
        $(OBJS)\stcdll_AutoComplete.o \
        $(OBJS)\stcdll_CallTip.o \
        $(OBJS)\stcdll_CellBuffer.o \
+       $(OBJS)\stcdll_CharClassify.o \
        $(OBJS)\stcdll_ContractionState.o \
        $(OBJS)\stcdll_Document.o \
        $(OBJS)\stcdll_DocumentAccessor.o \
@@ -70,6 +71,7 @@ STCDLL_OBJECTS =  \
        $(OBJS)\stcdll_LexGui4Cli.o \
        $(OBJS)\stcdll_LexHTML.o \
        $(OBJS)\stcdll_LexHaskell.o \
+       $(OBJS)\stcdll_LexInno.o \
        $(OBJS)\stcdll_LexKix.o \
        $(OBJS)\stcdll_LexLisp.o \
        $(OBJS)\stcdll_LexLout.o \
@@ -80,6 +82,7 @@ STCDLL_OBJECTS =  \
        $(OBJS)\stcdll_LexMatlab.o \
        $(OBJS)\stcdll_LexMetapost.o \
        $(OBJS)\stcdll_LexNsis.o \
+       $(OBJS)\stcdll_LexOpal.o \
        $(OBJS)\stcdll_LexOthers.o \
        $(OBJS)\stcdll_LexPB.o \
        $(OBJS)\stcdll_LexPOV.o \
@@ -94,6 +97,8 @@ STCDLL_OBJECTS =  \
        $(OBJS)\stcdll_LexTADS3.o \
        $(OBJS)\stcdll_LexScriptol.o \
        $(OBJS)\stcdll_LexSpecman.o \
+       $(OBJS)\stcdll_LexSpice.o \
+       $(OBJS)\stcdll_LexTCL.o \
        $(OBJS)\stcdll_LexTeX.o \
        $(OBJS)\stcdll_LexVB.o \
        $(OBJS)\stcdll_LexVHDL.o \
@@ -124,6 +129,7 @@ STCLIB_OBJECTS =  \
        $(OBJS)\stclib_AutoComplete.o \
        $(OBJS)\stclib_CallTip.o \
        $(OBJS)\stclib_CellBuffer.o \
+       $(OBJS)\stclib_CharClassify.o \
        $(OBJS)\stclib_ContractionState.o \
        $(OBJS)\stclib_Document.o \
        $(OBJS)\stclib_DocumentAccessor.o \
@@ -158,6 +164,7 @@ STCLIB_OBJECTS =  \
        $(OBJS)\stclib_LexGui4Cli.o \
        $(OBJS)\stclib_LexHTML.o \
        $(OBJS)\stclib_LexHaskell.o \
+       $(OBJS)\stclib_LexInno.o \
        $(OBJS)\stclib_LexKix.o \
        $(OBJS)\stclib_LexLisp.o \
        $(OBJS)\stclib_LexLout.o \
@@ -168,6 +175,7 @@ STCLIB_OBJECTS =  \
        $(OBJS)\stclib_LexMatlab.o \
        $(OBJS)\stclib_LexMetapost.o \
        $(OBJS)\stclib_LexNsis.o \
+       $(OBJS)\stclib_LexOpal.o \
        $(OBJS)\stclib_LexOthers.o \
        $(OBJS)\stclib_LexPB.o \
        $(OBJS)\stclib_LexPOV.o \
@@ -182,6 +190,8 @@ STCLIB_OBJECTS =  \
        $(OBJS)\stclib_LexTADS3.o \
        $(OBJS)\stclib_LexScriptol.o \
        $(OBJS)\stclib_LexSpecman.o \
+       $(OBJS)\stclib_LexSpice.o \
+       $(OBJS)\stclib_LexTCL.o \
        $(OBJS)\stclib_LexTeX.o \
        $(OBJS)\stclib_LexVB.o \
        $(OBJS)\stclib_LexVHDL.o \
@@ -418,6 +428,9 @@ $(OBJS)\stcdll_CallTip.o: ../../src/stc/scintilla/src/CallTip.cxx
 $(OBJS)\stcdll_CellBuffer.o: ../../src/stc/scintilla/src/CellBuffer.cxx
        $(CXX) -c -o $@ $(STCDLL_CXXFLAGS) $(CPPDEPS) $<
 
+$(OBJS)\stcdll_CharClassify.o: ../../src/stc/scintilla/src/CharClassify.cxx
+       $(CXX) -c -o $@ $(STCDLL_CXXFLAGS) $(CPPDEPS) $<
+
 $(OBJS)\stcdll_ContractionState.o: ../../src/stc/scintilla/src/ContractionState.cxx
        $(CXX) -c -o $@ $(STCDLL_CXXFLAGS) $(CPPDEPS) $<
 
@@ -520,6 +533,9 @@ $(OBJS)\stcdll_LexHTML.o: ../../src/stc/scintilla/src/LexHTML.cxx
 $(OBJS)\stcdll_LexHaskell.o: ../../src/stc/scintilla/src/LexHaskell.cxx
        $(CXX) -c -o $@ $(STCDLL_CXXFLAGS) $(CPPDEPS) $<
 
+$(OBJS)\stcdll_LexInno.o: ../../src/stc/scintilla/src/LexInno.cxx
+       $(CXX) -c -o $@ $(STCDLL_CXXFLAGS) $(CPPDEPS) $<
+
 $(OBJS)\stcdll_LexKix.o: ../../src/stc/scintilla/src/LexKix.cxx
        $(CXX) -c -o $@ $(STCDLL_CXXFLAGS) $(CPPDEPS) $<
 
@@ -550,6 +566,9 @@ $(OBJS)\stcdll_LexMetapost.o: ../../src/stc/scintilla/src/LexMetapost.cxx
 $(OBJS)\stcdll_LexNsis.o: ../../src/stc/scintilla/src/LexNsis.cxx
        $(CXX) -c -o $@ $(STCDLL_CXXFLAGS) $(CPPDEPS) $<
 
+$(OBJS)\stcdll_LexOpal.o: ../../src/stc/scintilla/src/LexOpal.cxx
+       $(CXX) -c -o $@ $(STCDLL_CXXFLAGS) $(CPPDEPS) $<
+
 $(OBJS)\stcdll_LexOthers.o: ../../src/stc/scintilla/src/LexOthers.cxx
        $(CXX) -c -o $@ $(STCDLL_CXXFLAGS) $(CPPDEPS) $<
 
@@ -592,6 +611,12 @@ $(OBJS)\stcdll_LexScriptol.o: ../../src/stc/scintilla/src/LexScriptol.cxx
 $(OBJS)\stcdll_LexSpecman.o: ../../src/stc/scintilla/src/LexSpecman.cxx
        $(CXX) -c -o $@ $(STCDLL_CXXFLAGS) $(CPPDEPS) $<
 
+$(OBJS)\stcdll_LexSpice.o: ../../src/stc/scintilla/src/LexSpice.cxx
+       $(CXX) -c -o $@ $(STCDLL_CXXFLAGS) $(CPPDEPS) $<
+
+$(OBJS)\stcdll_LexTCL.o: ../../src/stc/scintilla/src/LexTCL.cxx
+       $(CXX) -c -o $@ $(STCDLL_CXXFLAGS) $(CPPDEPS) $<
+
 $(OBJS)\stcdll_LexTeX.o: ../../src/stc/scintilla/src/LexTeX.cxx
        $(CXX) -c -o $@ $(STCDLL_CXXFLAGS) $(CPPDEPS) $<
 
@@ -655,6 +680,9 @@ $(OBJS)\stclib_CallTip.o: ../../src/stc/scintilla/src/CallTip.cxx
 $(OBJS)\stclib_CellBuffer.o: ../../src/stc/scintilla/src/CellBuffer.cxx
        $(CXX) -c -o $@ $(STCLIB_CXXFLAGS) $(CPPDEPS) $<
 
+$(OBJS)\stclib_CharClassify.o: ../../src/stc/scintilla/src/CharClassify.cxx
+       $(CXX) -c -o $@ $(STCLIB_CXXFLAGS) $(CPPDEPS) $<
+
 $(OBJS)\stclib_ContractionState.o: ../../src/stc/scintilla/src/ContractionState.cxx
        $(CXX) -c -o $@ $(STCLIB_CXXFLAGS) $(CPPDEPS) $<
 
@@ -757,6 +785,9 @@ $(OBJS)\stclib_LexHTML.o: ../../src/stc/scintilla/src/LexHTML.cxx
 $(OBJS)\stclib_LexHaskell.o: ../../src/stc/scintilla/src/LexHaskell.cxx
        $(CXX) -c -o $@ $(STCLIB_CXXFLAGS) $(CPPDEPS) $<
 
+$(OBJS)\stclib_LexInno.o: ../../src/stc/scintilla/src/LexInno.cxx
+       $(CXX) -c -o $@ $(STCLIB_CXXFLAGS) $(CPPDEPS) $<
+
 $(OBJS)\stclib_LexKix.o: ../../src/stc/scintilla/src/LexKix.cxx
        $(CXX) -c -o $@ $(STCLIB_CXXFLAGS) $(CPPDEPS) $<
 
@@ -787,6 +818,9 @@ $(OBJS)\stclib_LexMetapost.o: ../../src/stc/scintilla/src/LexMetapost.cxx
 $(OBJS)\stclib_LexNsis.o: ../../src/stc/scintilla/src/LexNsis.cxx
        $(CXX) -c -o $@ $(STCLIB_CXXFLAGS) $(CPPDEPS) $<
 
+$(OBJS)\stclib_LexOpal.o: ../../src/stc/scintilla/src/LexOpal.cxx
+       $(CXX) -c -o $@ $(STCLIB_CXXFLAGS) $(CPPDEPS) $<
+
 $(OBJS)\stclib_LexOthers.o: ../../src/stc/scintilla/src/LexOthers.cxx
        $(CXX) -c -o $@ $(STCLIB_CXXFLAGS) $(CPPDEPS) $<
 
@@ -829,6 +863,12 @@ $(OBJS)\stclib_LexScriptol.o: ../../src/stc/scintilla/src/LexScriptol.cxx
 $(OBJS)\stclib_LexSpecman.o: ../../src/stc/scintilla/src/LexSpecman.cxx
        $(CXX) -c -o $@ $(STCLIB_CXXFLAGS) $(CPPDEPS) $<
 
+$(OBJS)\stclib_LexSpice.o: ../../src/stc/scintilla/src/LexSpice.cxx
+       $(CXX) -c -o $@ $(STCLIB_CXXFLAGS) $(CPPDEPS) $<
+
+$(OBJS)\stclib_LexTCL.o: ../../src/stc/scintilla/src/LexTCL.cxx
+       $(CXX) -c -o $@ $(STCLIB_CXXFLAGS) $(CPPDEPS) $<
+
 $(OBJS)\stclib_LexTeX.o: ../../src/stc/scintilla/src/LexTeX.cxx
        $(CXX) -c -o $@ $(STCLIB_CXXFLAGS) $(CPPDEPS) $<
 
index 56b997381eecc7fa43e835be3a61f983991f3c41..4f86cdc24b19c643ddd1bcfc9f28463b6a9ba1fd 100644 (file)
@@ -39,6 +39,7 @@ STCDLL_OBJECTS =  \
        $(OBJS)\stcdll_AutoComplete.obj \
        $(OBJS)\stcdll_CallTip.obj \
        $(OBJS)\stcdll_CellBuffer.obj \
+       $(OBJS)\stcdll_CharClassify.obj \
        $(OBJS)\stcdll_ContractionState.obj \
        $(OBJS)\stcdll_Document.obj \
        $(OBJS)\stcdll_DocumentAccessor.obj \
@@ -73,6 +74,7 @@ STCDLL_OBJECTS =  \
        $(OBJS)\stcdll_LexGui4Cli.obj \
        $(OBJS)\stcdll_LexHTML.obj \
        $(OBJS)\stcdll_LexHaskell.obj \
+       $(OBJS)\stcdll_LexInno.obj \
        $(OBJS)\stcdll_LexKix.obj \
        $(OBJS)\stcdll_LexLisp.obj \
        $(OBJS)\stcdll_LexLout.obj \
@@ -83,6 +85,7 @@ STCDLL_OBJECTS =  \
        $(OBJS)\stcdll_LexMatlab.obj \
        $(OBJS)\stcdll_LexMetapost.obj \
        $(OBJS)\stcdll_LexNsis.obj \
+       $(OBJS)\stcdll_LexOpal.obj \
        $(OBJS)\stcdll_LexOthers.obj \
        $(OBJS)\stcdll_LexPB.obj \
        $(OBJS)\stcdll_LexPOV.obj \
@@ -97,6 +100,8 @@ STCDLL_OBJECTS =  \
        $(OBJS)\stcdll_LexTADS3.obj \
        $(OBJS)\stcdll_LexScriptol.obj \
        $(OBJS)\stcdll_LexSpecman.obj \
+       $(OBJS)\stcdll_LexSpice.obj \
+       $(OBJS)\stcdll_LexTCL.obj \
        $(OBJS)\stcdll_LexTeX.obj \
        $(OBJS)\stcdll_LexVB.obj \
        $(OBJS)\stcdll_LexVHDL.obj \
@@ -129,6 +134,7 @@ STCLIB_OBJECTS =  \
        $(OBJS)\stclib_AutoComplete.obj \
        $(OBJS)\stclib_CallTip.obj \
        $(OBJS)\stclib_CellBuffer.obj \
+       $(OBJS)\stclib_CharClassify.obj \
        $(OBJS)\stclib_ContractionState.obj \
        $(OBJS)\stclib_Document.obj \
        $(OBJS)\stclib_DocumentAccessor.obj \
@@ -163,6 +169,7 @@ STCLIB_OBJECTS =  \
        $(OBJS)\stclib_LexGui4Cli.obj \
        $(OBJS)\stclib_LexHTML.obj \
        $(OBJS)\stclib_LexHaskell.obj \
+       $(OBJS)\stclib_LexInno.obj \
        $(OBJS)\stclib_LexKix.obj \
        $(OBJS)\stclib_LexLisp.obj \
        $(OBJS)\stclib_LexLout.obj \
@@ -173,6 +180,7 @@ STCLIB_OBJECTS =  \
        $(OBJS)\stclib_LexMatlab.obj \
        $(OBJS)\stclib_LexMetapost.obj \
        $(OBJS)\stclib_LexNsis.obj \
+       $(OBJS)\stclib_LexOpal.obj \
        $(OBJS)\stclib_LexOthers.obj \
        $(OBJS)\stclib_LexPB.obj \
        $(OBJS)\stclib_LexPOV.obj \
@@ -187,6 +195,8 @@ STCLIB_OBJECTS =  \
        $(OBJS)\stclib_LexTADS3.obj \
        $(OBJS)\stclib_LexScriptol.obj \
        $(OBJS)\stclib_LexSpecman.obj \
+       $(OBJS)\stclib_LexSpice.obj \
+       $(OBJS)\stclib_LexTCL.obj \
        $(OBJS)\stclib_LexTeX.obj \
        $(OBJS)\stclib_LexVB.obj \
        $(OBJS)\stclib_LexVHDL.obj \
@@ -512,6 +522,9 @@ $(OBJS)\stcdll_CallTip.obj: ../../src/stc\scintilla\src\CallTip.cxx
 $(OBJS)\stcdll_CellBuffer.obj: ../../src/stc\scintilla\src\CellBuffer.cxx
        $(CXX) /c /nologo /TP /Fo$@ $(STCDLL_CXXFLAGS) $**
 
+$(OBJS)\stcdll_CharClassify.obj: ../../src/stc\scintilla\src\CharClassify.cxx
+       $(CXX) /c /nologo /TP /Fo$@ $(STCDLL_CXXFLAGS) $**
+
 $(OBJS)\stcdll_ContractionState.obj: ../../src/stc\scintilla\src\ContractionState.cxx
        $(CXX) /c /nologo /TP /Fo$@ $(STCDLL_CXXFLAGS) $**
 
@@ -614,6 +627,9 @@ $(OBJS)\stcdll_LexHTML.obj: ../../src/stc\scintilla\src\LexHTML.cxx
 $(OBJS)\stcdll_LexHaskell.obj: ../../src/stc\scintilla\src\LexHaskell.cxx
        $(CXX) /c /nologo /TP /Fo$@ $(STCDLL_CXXFLAGS) $**
 
+$(OBJS)\stcdll_LexInno.obj: ../../src/stc\scintilla\src\LexInno.cxx
+       $(CXX) /c /nologo /TP /Fo$@ $(STCDLL_CXXFLAGS) $**
+
 $(OBJS)\stcdll_LexKix.obj: ../../src/stc\scintilla\src\LexKix.cxx
        $(CXX) /c /nologo /TP /Fo$@ $(STCDLL_CXXFLAGS) $**
 
@@ -644,6 +660,9 @@ $(OBJS)\stcdll_LexMetapost.obj: ../../src/stc\scintilla\src\LexMetapost.cxx
 $(OBJS)\stcdll_LexNsis.obj: ../../src/stc\scintilla\src\LexNsis.cxx
        $(CXX) /c /nologo /TP /Fo$@ $(STCDLL_CXXFLAGS) $**
 
+$(OBJS)\stcdll_LexOpal.obj: ../../src/stc\scintilla\src\LexOpal.cxx
+       $(CXX) /c /nologo /TP /Fo$@ $(STCDLL_CXXFLAGS) $**
+
 $(OBJS)\stcdll_LexOthers.obj: ../../src/stc\scintilla\src\LexOthers.cxx
        $(CXX) /c /nologo /TP /Fo$@ $(STCDLL_CXXFLAGS) $**
 
@@ -686,6 +705,12 @@ $(OBJS)\stcdll_LexScriptol.obj: ../../src/stc\scintilla\src\LexScriptol.cxx
 $(OBJS)\stcdll_LexSpecman.obj: ../../src/stc\scintilla\src\LexSpecman.cxx
        $(CXX) /c /nologo /TP /Fo$@ $(STCDLL_CXXFLAGS) $**
 
+$(OBJS)\stcdll_LexSpice.obj: ../../src/stc\scintilla\src\LexSpice.cxx
+       $(CXX) /c /nologo /TP /Fo$@ $(STCDLL_CXXFLAGS) $**
+
+$(OBJS)\stcdll_LexTCL.obj: ../../src/stc\scintilla\src\LexTCL.cxx
+       $(CXX) /c /nologo /TP /Fo$@ $(STCDLL_CXXFLAGS) $**
+
 $(OBJS)\stcdll_LexTeX.obj: ../../src/stc\scintilla\src\LexTeX.cxx
        $(CXX) /c /nologo /TP /Fo$@ $(STCDLL_CXXFLAGS) $**
 
@@ -749,6 +774,9 @@ $(OBJS)\stclib_CallTip.obj: ../../src/stc\scintilla\src\CallTip.cxx
 $(OBJS)\stclib_CellBuffer.obj: ../../src/stc\scintilla\src\CellBuffer.cxx
        $(CXX) /c /nologo /TP /Fo$@ $(STCLIB_CXXFLAGS) $**
 
+$(OBJS)\stclib_CharClassify.obj: ../../src/stc\scintilla\src\CharClassify.cxx
+       $(CXX) /c /nologo /TP /Fo$@ $(STCLIB_CXXFLAGS) $**
+
 $(OBJS)\stclib_ContractionState.obj: ../../src/stc\scintilla\src\ContractionState.cxx
        $(CXX) /c /nologo /TP /Fo$@ $(STCLIB_CXXFLAGS) $**
 
@@ -851,6 +879,9 @@ $(OBJS)\stclib_LexHTML.obj: ../../src/stc\scintilla\src\LexHTML.cxx
 $(OBJS)\stclib_LexHaskell.obj: ../../src/stc\scintilla\src\LexHaskell.cxx
        $(CXX) /c /nologo /TP /Fo$@ $(STCLIB_CXXFLAGS) $**
 
+$(OBJS)\stclib_LexInno.obj: ../../src/stc\scintilla\src\LexInno.cxx
+       $(CXX) /c /nologo /TP /Fo$@ $(STCLIB_CXXFLAGS) $**
+
 $(OBJS)\stclib_LexKix.obj: ../../src/stc\scintilla\src\LexKix.cxx
        $(CXX) /c /nologo /TP /Fo$@ $(STCLIB_CXXFLAGS) $**
 
@@ -881,6 +912,9 @@ $(OBJS)\stclib_LexMetapost.obj: ../../src/stc\scintilla\src\LexMetapost.cxx
 $(OBJS)\stclib_LexNsis.obj: ../../src/stc\scintilla\src\LexNsis.cxx
        $(CXX) /c /nologo /TP /Fo$@ $(STCLIB_CXXFLAGS) $**
 
+$(OBJS)\stclib_LexOpal.obj: ../../src/stc\scintilla\src\LexOpal.cxx
+       $(CXX) /c /nologo /TP /Fo$@ $(STCLIB_CXXFLAGS) $**
+
 $(OBJS)\stclib_LexOthers.obj: ../../src/stc\scintilla\src\LexOthers.cxx
        $(CXX) /c /nologo /TP /Fo$@ $(STCLIB_CXXFLAGS) $**
 
@@ -923,6 +957,12 @@ $(OBJS)\stclib_LexScriptol.obj: ../../src/stc\scintilla\src\LexScriptol.cxx
 $(OBJS)\stclib_LexSpecman.obj: ../../src/stc\scintilla\src\LexSpecman.cxx
        $(CXX) /c /nologo /TP /Fo$@ $(STCLIB_CXXFLAGS) $**
 
+$(OBJS)\stclib_LexSpice.obj: ../../src/stc\scintilla\src\LexSpice.cxx
+       $(CXX) /c /nologo /TP /Fo$@ $(STCLIB_CXXFLAGS) $**
+
+$(OBJS)\stclib_LexTCL.obj: ../../src/stc\scintilla\src\LexTCL.cxx
+       $(CXX) /c /nologo /TP /Fo$@ $(STCLIB_CXXFLAGS) $**
+
 $(OBJS)\stclib_LexTeX.obj: ../../src/stc\scintilla\src\LexTeX.cxx
        $(CXX) /c /nologo /TP /Fo$@ $(STCLIB_CXXFLAGS) $**
 
index d03300ff4b76d265f9903a552dd890aa6d42e03d..5126180bd8af4f49ca491e91ec02afd66b02defa 100644 (file)
@@ -236,6 +236,7 @@ STCDLL_OBJECTS =  &
        $(OBJS)\stcdll_AutoComplete.obj &
        $(OBJS)\stcdll_CallTip.obj &
        $(OBJS)\stcdll_CellBuffer.obj &
+       $(OBJS)\stcdll_CharClassify.obj &
        $(OBJS)\stcdll_ContractionState.obj &
        $(OBJS)\stcdll_Document.obj &
        $(OBJS)\stcdll_DocumentAccessor.obj &
@@ -270,6 +271,7 @@ STCDLL_OBJECTS =  &
        $(OBJS)\stcdll_LexGui4Cli.obj &
        $(OBJS)\stcdll_LexHTML.obj &
        $(OBJS)\stcdll_LexHaskell.obj &
+       $(OBJS)\stcdll_LexInno.obj &
        $(OBJS)\stcdll_LexKix.obj &
        $(OBJS)\stcdll_LexLisp.obj &
        $(OBJS)\stcdll_LexLout.obj &
@@ -280,6 +282,7 @@ STCDLL_OBJECTS =  &
        $(OBJS)\stcdll_LexMatlab.obj &
        $(OBJS)\stcdll_LexMetapost.obj &
        $(OBJS)\stcdll_LexNsis.obj &
+       $(OBJS)\stcdll_LexOpal.obj &
        $(OBJS)\stcdll_LexOthers.obj &
        $(OBJS)\stcdll_LexPB.obj &
        $(OBJS)\stcdll_LexPOV.obj &
@@ -294,6 +297,8 @@ STCDLL_OBJECTS =  &
        $(OBJS)\stcdll_LexTADS3.obj &
        $(OBJS)\stcdll_LexScriptol.obj &
        $(OBJS)\stcdll_LexSpecman.obj &
+       $(OBJS)\stcdll_LexSpice.obj &
+       $(OBJS)\stcdll_LexTCL.obj &
        $(OBJS)\stcdll_LexTeX.obj &
        $(OBJS)\stcdll_LexVB.obj &
        $(OBJS)\stcdll_LexVHDL.obj &
@@ -324,6 +329,7 @@ STCLIB_OBJECTS =  &
        $(OBJS)\stclib_AutoComplete.obj &
        $(OBJS)\stclib_CallTip.obj &
        $(OBJS)\stclib_CellBuffer.obj &
+       $(OBJS)\stclib_CharClassify.obj &
        $(OBJS)\stclib_ContractionState.obj &
        $(OBJS)\stclib_Document.obj &
        $(OBJS)\stclib_DocumentAccessor.obj &
@@ -358,6 +364,7 @@ STCLIB_OBJECTS =  &
        $(OBJS)\stclib_LexGui4Cli.obj &
        $(OBJS)\stclib_LexHTML.obj &
        $(OBJS)\stclib_LexHaskell.obj &
+       $(OBJS)\stclib_LexInno.obj &
        $(OBJS)\stclib_LexKix.obj &
        $(OBJS)\stclib_LexLisp.obj &
        $(OBJS)\stclib_LexLout.obj &
@@ -368,6 +375,7 @@ STCLIB_OBJECTS =  &
        $(OBJS)\stclib_LexMatlab.obj &
        $(OBJS)\stclib_LexMetapost.obj &
        $(OBJS)\stclib_LexNsis.obj &
+       $(OBJS)\stclib_LexOpal.obj &
        $(OBJS)\stclib_LexOthers.obj &
        $(OBJS)\stclib_LexPB.obj &
        $(OBJS)\stclib_LexPOV.obj &
@@ -382,6 +390,8 @@ STCLIB_OBJECTS =  &
        $(OBJS)\stclib_LexTADS3.obj &
        $(OBJS)\stclib_LexScriptol.obj &
        $(OBJS)\stclib_LexSpecman.obj &
+       $(OBJS)\stclib_LexSpice.obj &
+       $(OBJS)\stclib_LexTCL.obj &
        $(OBJS)\stclib_LexTeX.obj &
        $(OBJS)\stclib_LexVB.obj &
        $(OBJS)\stclib_LexVHDL.obj &
@@ -460,6 +470,9 @@ $(OBJS)\stcdll_CallTip.obj :  .AUTODEPEND ../../src/stc\scintilla\src\CallTip.cx
 $(OBJS)\stcdll_CellBuffer.obj :  .AUTODEPEND ../../src/stc\scintilla\src\CellBuffer.cxx
        $(CXX) -bt=nt -zq -fo=$^@ $(STCDLL_CXXFLAGS) $<
 
+$(OBJS)\stcdll_CharClassify.obj :  .AUTODEPEND ../../src/stc\scintilla\src\CharClassify.cxx
+       $(CXX) -bt=nt -zq -fo=$^@ $(STCDLL_CXXFLAGS) $<
+
 $(OBJS)\stcdll_ContractionState.obj :  .AUTODEPEND ../../src/stc\scintilla\src\ContractionState.cxx
        $(CXX) -bt=nt -zq -fo=$^@ $(STCDLL_CXXFLAGS) $<
 
@@ -562,6 +575,9 @@ $(OBJS)\stcdll_LexHTML.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexHTML.cx
 $(OBJS)\stcdll_LexHaskell.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexHaskell.cxx
        $(CXX) -bt=nt -zq -fo=$^@ $(STCDLL_CXXFLAGS) $<
 
+$(OBJS)\stcdll_LexInno.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexInno.cxx
+       $(CXX) -bt=nt -zq -fo=$^@ $(STCDLL_CXXFLAGS) $<
+
 $(OBJS)\stcdll_LexKix.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexKix.cxx
        $(CXX) -bt=nt -zq -fo=$^@ $(STCDLL_CXXFLAGS) $<
 
@@ -592,6 +608,9 @@ $(OBJS)\stcdll_LexMetapost.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexMet
 $(OBJS)\stcdll_LexNsis.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexNsis.cxx
        $(CXX) -bt=nt -zq -fo=$^@ $(STCDLL_CXXFLAGS) $<
 
+$(OBJS)\stcdll_LexOpal.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexOpal.cxx
+       $(CXX) -bt=nt -zq -fo=$^@ $(STCDLL_CXXFLAGS) $<
+
 $(OBJS)\stcdll_LexOthers.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexOthers.cxx
        $(CXX) -bt=nt -zq -fo=$^@ $(STCDLL_CXXFLAGS) $<
 
@@ -634,6 +653,12 @@ $(OBJS)\stcdll_LexScriptol.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexScr
 $(OBJS)\stcdll_LexSpecman.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexSpecman.cxx
        $(CXX) -bt=nt -zq -fo=$^@ $(STCDLL_CXXFLAGS) $<
 
+$(OBJS)\stcdll_LexSpice.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexSpice.cxx
+       $(CXX) -bt=nt -zq -fo=$^@ $(STCDLL_CXXFLAGS) $<
+
+$(OBJS)\stcdll_LexTCL.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexTCL.cxx
+       $(CXX) -bt=nt -zq -fo=$^@ $(STCDLL_CXXFLAGS) $<
+
 $(OBJS)\stcdll_LexTeX.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexTeX.cxx
        $(CXX) -bt=nt -zq -fo=$^@ $(STCDLL_CXXFLAGS) $<
 
@@ -697,6 +722,9 @@ $(OBJS)\stclib_CallTip.obj :  .AUTODEPEND ../../src/stc\scintilla\src\CallTip.cx
 $(OBJS)\stclib_CellBuffer.obj :  .AUTODEPEND ../../src/stc\scintilla\src\CellBuffer.cxx
        $(CXX) -bt=nt -zq -fo=$^@ $(STCLIB_CXXFLAGS) $<
 
+$(OBJS)\stclib_CharClassify.obj :  .AUTODEPEND ../../src/stc\scintilla\src\CharClassify.cxx
+       $(CXX) -bt=nt -zq -fo=$^@ $(STCLIB_CXXFLAGS) $<
+
 $(OBJS)\stclib_ContractionState.obj :  .AUTODEPEND ../../src/stc\scintilla\src\ContractionState.cxx
        $(CXX) -bt=nt -zq -fo=$^@ $(STCLIB_CXXFLAGS) $<
 
@@ -799,6 +827,9 @@ $(OBJS)\stclib_LexHTML.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexHTML.cx
 $(OBJS)\stclib_LexHaskell.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexHaskell.cxx
        $(CXX) -bt=nt -zq -fo=$^@ $(STCLIB_CXXFLAGS) $<
 
+$(OBJS)\stclib_LexInno.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexInno.cxx
+       $(CXX) -bt=nt -zq -fo=$^@ $(STCLIB_CXXFLAGS) $<
+
 $(OBJS)\stclib_LexKix.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexKix.cxx
        $(CXX) -bt=nt -zq -fo=$^@ $(STCLIB_CXXFLAGS) $<
 
@@ -829,6 +860,9 @@ $(OBJS)\stclib_LexMetapost.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexMet
 $(OBJS)\stclib_LexNsis.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexNsis.cxx
        $(CXX) -bt=nt -zq -fo=$^@ $(STCLIB_CXXFLAGS) $<
 
+$(OBJS)\stclib_LexOpal.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexOpal.cxx
+       $(CXX) -bt=nt -zq -fo=$^@ $(STCLIB_CXXFLAGS) $<
+
 $(OBJS)\stclib_LexOthers.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexOthers.cxx
        $(CXX) -bt=nt -zq -fo=$^@ $(STCLIB_CXXFLAGS) $<
 
@@ -871,6 +905,12 @@ $(OBJS)\stclib_LexScriptol.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexScr
 $(OBJS)\stclib_LexSpecman.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexSpecman.cxx
        $(CXX) -bt=nt -zq -fo=$^@ $(STCLIB_CXXFLAGS) $<
 
+$(OBJS)\stclib_LexSpice.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexSpice.cxx
+       $(CXX) -bt=nt -zq -fo=$^@ $(STCLIB_CXXFLAGS) $<
+
+$(OBJS)\stclib_LexTCL.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexTCL.cxx
+       $(CXX) -bt=nt -zq -fo=$^@ $(STCLIB_CXXFLAGS) $<
+
 $(OBJS)\stclib_LexTeX.obj :  .AUTODEPEND ../../src/stc\scintilla\src\LexTeX.cxx
        $(CXX) -bt=nt -zq -fo=$^@ $(STCLIB_CXXFLAGS) $<
 
index 2e98036e0e23ca7f91d15c1693d95327ad0902ae..faba5bb204b40c1dbca4830c6079b8d5b98f80f0 100644 (file)
@@ -15,6 +15,7 @@
         scintilla/src/AutoComplete.cxx
         scintilla/src/CallTip.cxx
         scintilla/src/CellBuffer.cxx
+        scintilla/src/CharClassify.cxx
         scintilla/src/ContractionState.cxx
         scintilla/src/Document.cxx
         scintilla/src/DocumentAccessor.cxx
@@ -49,6 +50,7 @@
         scintilla/src/LexGui4Cli.cxx
         scintilla/src/LexHTML.cxx
         scintilla/src/LexHaskell.cxx
+        scintilla/src/LexInno.cxx
         scintilla/src/LexKix.cxx
         scintilla/src/LexLisp.cxx
         scintilla/src/LexLout.cxx
@@ -59,6 +61,7 @@
         scintilla/src/LexMatlab.cxx
         scintilla/src/LexMetapost.cxx
         scintilla/src/LexNsis.cxx
+        scintilla/src/LexOpal.cxx
         scintilla/src/LexOthers.cxx
         scintilla/src/LexPB.cxx
         scintilla/src/LexPOV.cxx
@@ -73,6 +76,8 @@
         scintilla/src/LexTADS3.cxx
         scintilla/src/LexScriptol.cxx
         scintilla/src/LexSpecman.cxx
+        scintilla/src/LexSpice.cxx
+        scintilla/src/LexTCL.cxx
         scintilla/src/LexTeX.cxx
         scintilla/src/LexVB.cxx
         scintilla/src/LexVHDL.cxx
index dc3e0a8e3f20dafdf7ff8caa479d091f061cdf49..72a0fbaa2a0aafda6b67069e2079f6a966052937 100644 (file)
@@ -464,6 +464,10 @@ SOURCE=../../src/stc\scintilla\src\CellBuffer.cxx
 # End Source File
 # Begin Source File
 
+SOURCE=../../src/stc\scintilla\src\CharClassify.cxx
+# End Source File
+# Begin Source File
+
 SOURCE=../../src/stc\scintilla\src\ContractionState.cxx
 # End Source File
 # Begin Source File
@@ -600,6 +604,10 @@ SOURCE=../../src/stc\scintilla\src\LexHaskell.cxx
 # End Source File
 # Begin Source File
 
+SOURCE=../../src/stc\scintilla\src\LexInno.cxx
+# End Source File
+# Begin Source File
+
 SOURCE=../../src/stc\scintilla\src\LexKix.cxx
 # End Source File
 # Begin Source File
@@ -640,6 +648,10 @@ SOURCE=../../src/stc\scintilla\src\LexNsis.cxx
 # End Source File
 # Begin Source File
 
+SOURCE=../../src/stc\scintilla\src\LexOpal.cxx
+# End Source File
+# Begin Source File
+
 SOURCE=../../src/stc\scintilla\src\LexOthers.cxx
 # End Source File
 # Begin Source File
@@ -692,10 +704,18 @@ SOURCE=../../src/stc\scintilla\src\LexSpecman.cxx
 # End Source File
 # Begin Source File
 
+SOURCE=../../src/stc\scintilla\src\LexSpice.cxx
+# End Source File
+# Begin Source File
+
 SOURCE=../../src/stc\scintilla\src\LexTADS3.cxx
 # End Source File
 # Begin Source File
 
+SOURCE=../../src/stc\scintilla\src\LexTCL.cxx
+# End Source File
+# Begin Source File
+
 SOURCE=../../src/stc\scintilla\src\LexTeX.cxx
 # End Source File
 # Begin Source File
index c4815d274c84d553b035a39107091d6966362dbc..dde5aa02b6bd1f5ea1310a5bff64290d12929636 100644 (file)
 #define wxSTC_MASK_FOLDERS 0xFE000000
 #define wxSTC_MARGIN_SYMBOL 0
 #define wxSTC_MARGIN_NUMBER 1
+#define wxSTC_MARGIN_BACK 2
+#define wxSTC_MARGIN_FORE 3
 
-// Styles in range 32..37 are predefined for parts of the UI and are not used as normal styles.
-// Styles 38 and 39 are for future use.
+// Styles in range 32..38 are predefined for parts of the UI and are not used as normal styles.
+// Style 39 is for future use.
 #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_CALLTIP 38
 #define wxSTC_STYLE_LASTPREDEFINED 39
 #define wxSTC_STYLE_MAX 127
 
 #define wxSTC_INDIC_STRIKE 4
 #define wxSTC_INDIC_HIDDEN 5
 #define wxSTC_INDIC_BOX 6
+#define wxSTC_INDIC_ROUNDBOX 7
 #define wxSTC_INDIC0_MASK 0x20
 #define wxSTC_INDIC1_MASK 0x40
 #define wxSTC_INDIC2_MASK 0x80
 #define wxSTC_SEL_STREAM 0
 #define wxSTC_SEL_RECTANGLE 1
 #define wxSTC_SEL_LINES 2
+#define wxSTC_ALPHA_TRANSPARENT 0
+#define wxSTC_ALPHA_OPAQUE 255
+#define wxSTC_ALPHA_NOALPHA 256
 
 // Maximum value of keywordSet parameter of SetKeyWords.
 #define wxSTC_KEYWORDSET_MAX 8
 #define wxSTC_LEX_FLAGSHIP 73
 #define wxSTC_LEX_CSOUND 74
 #define wxSTC_LEX_FREEBASIC 75
-
-// These are deprecated, STC_LEX_HTML should be used instead.
-#define wxSTC_LEX_ASP 29
-#define wxSTC_LEX_PHP 30
+#define wxSTC_LEX_INNOSETUP 76
+#define wxSTC_LEX_OPAL 77
+#define wxSTC_LEX_SPICE 78
 
 // When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
 // value assigned in sequence from SCLEX_AUTOMATIC+1.
 #define wxSTC_C_COMMENTDOCKEYWORDERROR 18
 #define wxSTC_C_GLOBALCLASS 19
 
+// Lexical states for SCLEX_TCL
+#define wxSTC_TCL_DEFAULT 0
+#define wxSTC_TCL_COMMENT 1
+#define wxSTC_TCL_COMMENTLINE 2
+#define wxSTC_TCL_NUMBER 3
+#define wxSTC_TCL_WORD_IN_QUOTE 4
+#define wxSTC_TCL_IN_QUOTE 5
+#define wxSTC_TCL_OPERATOR 6
+#define wxSTC_TCL_IDENTIFIER 7
+#define wxSTC_TCL_SUBSTITUTION 8
+#define wxSTC_TCL_SUB_BRACE 9
+#define wxSTC_TCL_MODIFIER 10
+#define wxSTC_TCL_EXPAND 11
+#define wxSTC_TCL_WORD 12
+#define wxSTC_TCL_WORD2 13
+#define wxSTC_TCL_WORD3 14
+#define wxSTC_TCL_WORD4 15
+#define wxSTC_TCL_WORD5 16
+#define wxSTC_TCL_WORD6 17
+#define wxSTC_TCL_WORD7 18
+#define wxSTC_TCL_WORD8 19
+#define wxSTC_TCL_COMMENT_BOX 20
+#define wxSTC_TCL_BLOCK_COMMENT 21
+
 // Lexical states for SCLEX_HTML, SCLEX_XML
 #define wxSTC_H_DEFAULT 0
 #define wxSTC_H_TAG 1
 #define wxSTC_PROPS_SECTION 2
 #define wxSTC_PROPS_ASSIGNMENT 3
 #define wxSTC_PROPS_DEFVAL 4
+#define wxSTC_PROPS_KEY 5
 
 // Lexical states for SCLEX_LATEX
 #define wxSTC_L_DEFAULT 0
 #define wxSTC_AU3_SPECIAL 12
 #define wxSTC_AU3_EXPAND 13
 #define wxSTC_AU3_COMOBJ 14
+#define wxSTC_AU3_UDF 15
 
 // Lexical states for SCLEX_APDL
 #define wxSTC_APDL_DEFAULT 0
 #define wxSTC_CSOUND_GLOBAL_VAR 14
 #define wxSTC_CSOUND_STRINGEOL 15
 
+// Lexical states for SCLEX_INNOSETUP
+#define wxSTC_INNO_DEFAULT 0
+#define wxSTC_INNO_COMMENT 1
+#define wxSTC_INNO_KEYWORD 2
+#define wxSTC_INNO_PARAMETER 3
+#define wxSTC_INNO_SECTION 4
+#define wxSTC_INNO_PREPROC 5
+#define wxSTC_INNO_PREPROC_INLINE 6
+#define wxSTC_INNO_COMMENT_PASCAL 7
+#define wxSTC_INNO_KEYWORD_PASCAL 8
+#define wxSTC_INNO_KEYWORD_USER 9
+#define wxSTC_INNO_STRING_DOUBLE 10
+#define wxSTC_INNO_STRING_SINGLE 11
+#define wxSTC_INNO_IDENTIFIER 12
+
+// Lexical states for SCLEX_OPAL
+#define wxSTC_OPAL_SPACE 0
+#define wxSTC_OPAL_COMMENT_BLOCK 1
+#define wxSTC_OPAL_COMMENT_LINE 2
+#define wxSTC_OPAL_INTEGER 3
+#define wxSTC_OPAL_KEYWORD 4
+#define wxSTC_OPAL_SORT 5
+#define wxSTC_OPAL_STRING 6
+#define wxSTC_OPAL_PAR 7
+#define wxSTC_OPAL_BOOL_CONST 8
+#define wxSTC_OPAL_DEFAULT 32
+
+// Lexical states for SCLEX_SPICE
+#define wxSTC_SPICE_DEFAULT 0
+#define wxSTC_SPICE_IDENTIFIER 1
+#define wxSTC_SPICE_KEYWORD 2
+#define wxSTC_SPICE_KEYWORD2 3
+#define wxSTC_SPICE_KEYWORD3 4
+#define wxSTC_SPICE_NUMBER 5
+#define wxSTC_SPICE_DELIMITER 6
+#define wxSTC_SPICE_VALUE 7
+#define wxSTC_SPICE_COMMENTLINE 8
+
 
 //-----------------------------------------
 // Commands that can be bound to keystrokes
@@ -1935,6 +2005,9 @@ public:
     // Add a set of markers to a line.
     void MarkerAddSet(int line, int set);
 
+    // Set the alpha used for a marker that is drawn in the text area, not the margin.
+    void MarkerSetAlpha(int markerNumber, int alpha);
+
     // Set a margin to be either numeric or symbolic.
     void SetMarginType(int margin, int marginType);
 
@@ -2001,6 +2074,12 @@ public:
     // Set the background colour of the selection and whether to use this setting.
     void SetSelBackground(bool useSetting, const wxColour& back);
 
+    // Get the alpha of the selection.
+    int GetSelAlpha();
+
+    // Set the alpha of the selection.
+    void SetSelAlpha(int alpha);
+
     // Set the foreground colour of the caret.
     void SetCaretForeground(const wxColour& fore);
 
@@ -2440,6 +2519,9 @@ public:
     // Set the foreground colour for the highlighted part of the call tip.
     void CallTipSetForegroundHighlight(const wxColour& fore);
 
+    // Enable use of STYLE_CALLTIP and set call tip tab size in pixels.
+    void CallTipUseStyle(int tabSize);
+
     // Find the display line of a document line taking hidden lines into account.
     int VisibleFromDocLine(int line);
 
@@ -3068,6 +3150,12 @@ public:
     // Duplicate the selection. If selection empty duplicate the line containing the caret.
     void SelectionDuplicate();
 
+    // Set background alpha of the caret line.
+    void SetCaretLineBackAlpha(int alpha);
+
+    // Get the background alpha of the caret line.
+    int GetCaretLineBackAlpha();
+
     // Start notifying the container of all key presses and commands.
     void StartRecord();
 
index 6f91459bfc25efef610f486187c9c0c7b82a0895..5dc6c114a3a5d74c35806b09c5deaf34cc2c3d31 100644 (file)
@@ -66,6 +66,7 @@ STCDLL_OBJECTS =  \
        stcdll_AutoComplete.o \
        stcdll_CallTip.o \
        stcdll_CellBuffer.o \
+       stcdll_CharClassify.o \
        stcdll_ContractionState.o \
        stcdll_Document.o \
        stcdll_DocumentAccessor.o \
@@ -100,6 +101,7 @@ STCDLL_OBJECTS =  \
        stcdll_LexGui4Cli.o \
        stcdll_LexHTML.o \
        stcdll_LexHaskell.o \
+       stcdll_LexInno.o \
        stcdll_LexKix.o \
        stcdll_LexLisp.o \
        stcdll_LexLout.o \
@@ -110,6 +112,7 @@ STCDLL_OBJECTS =  \
        stcdll_LexMatlab.o \
        stcdll_LexMetapost.o \
        stcdll_LexNsis.o \
+       stcdll_LexOpal.o \
        stcdll_LexOthers.o \
        stcdll_LexPB.o \
        stcdll_LexPOV.o \
@@ -124,6 +127,8 @@ STCDLL_OBJECTS =  \
        stcdll_LexTADS3.o \
        stcdll_LexScriptol.o \
        stcdll_LexSpecman.o \
+       stcdll_LexSpice.o \
+       stcdll_LexTCL.o \
        stcdll_LexTeX.o \
        stcdll_LexVB.o \
        stcdll_LexVHDL.o \
@@ -151,6 +156,7 @@ STCLIB_OBJECTS =  \
        stclib_AutoComplete.o \
        stclib_CallTip.o \
        stclib_CellBuffer.o \
+       stclib_CharClassify.o \
        stclib_ContractionState.o \
        stclib_Document.o \
        stclib_DocumentAccessor.o \
@@ -185,6 +191,7 @@ STCLIB_OBJECTS =  \
        stclib_LexGui4Cli.o \
        stclib_LexHTML.o \
        stclib_LexHaskell.o \
+       stclib_LexInno.o \
        stclib_LexKix.o \
        stclib_LexLisp.o \
        stclib_LexLout.o \
@@ -195,6 +202,7 @@ STCLIB_OBJECTS =  \
        stclib_LexMatlab.o \
        stclib_LexMetapost.o \
        stclib_LexNsis.o \
+       stclib_LexOpal.o \
        stclib_LexOthers.o \
        stclib_LexPB.o \
        stclib_LexPOV.o \
@@ -209,6 +217,8 @@ STCLIB_OBJECTS =  \
        stclib_LexTADS3.o \
        stclib_LexScriptol.o \
        stclib_LexSpecman.o \
+       stclib_LexSpice.o \
+       stclib_LexTCL.o \
        stclib_LexTeX.o \
        stclib_LexVB.o \
        stclib_LexVHDL.o \
@@ -415,6 +425,9 @@ stcdll_CallTip.o: $(srcdir)/scintilla/src/CallTip.cxx
 stcdll_CellBuffer.o: $(srcdir)/scintilla/src/CellBuffer.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $(srcdir)/scintilla/src/CellBuffer.cxx
 
+stcdll_CharClassify.o: $(srcdir)/scintilla/src/CharClassify.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $(srcdir)/scintilla/src/CharClassify.cxx
+
 stcdll_ContractionState.o: $(srcdir)/scintilla/src/ContractionState.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $(srcdir)/scintilla/src/ContractionState.cxx
 
@@ -517,6 +530,9 @@ stcdll_LexHTML.o: $(srcdir)/scintilla/src/LexHTML.cxx
 stcdll_LexHaskell.o: $(srcdir)/scintilla/src/LexHaskell.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $(srcdir)/scintilla/src/LexHaskell.cxx
 
+stcdll_LexInno.o: $(srcdir)/scintilla/src/LexInno.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $(srcdir)/scintilla/src/LexInno.cxx
+
 stcdll_LexKix.o: $(srcdir)/scintilla/src/LexKix.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $(srcdir)/scintilla/src/LexKix.cxx
 
@@ -547,6 +563,9 @@ stcdll_LexMetapost.o: $(srcdir)/scintilla/src/LexMetapost.cxx
 stcdll_LexNsis.o: $(srcdir)/scintilla/src/LexNsis.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $(srcdir)/scintilla/src/LexNsis.cxx
 
+stcdll_LexOpal.o: $(srcdir)/scintilla/src/LexOpal.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $(srcdir)/scintilla/src/LexOpal.cxx
+
 stcdll_LexOthers.o: $(srcdir)/scintilla/src/LexOthers.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $(srcdir)/scintilla/src/LexOthers.cxx
 
@@ -589,6 +608,12 @@ stcdll_LexScriptol.o: $(srcdir)/scintilla/src/LexScriptol.cxx
 stcdll_LexSpecman.o: $(srcdir)/scintilla/src/LexSpecman.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $(srcdir)/scintilla/src/LexSpecman.cxx
 
+stcdll_LexSpice.o: $(srcdir)/scintilla/src/LexSpice.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $(srcdir)/scintilla/src/LexSpice.cxx
+
+stcdll_LexTCL.o: $(srcdir)/scintilla/src/LexTCL.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $(srcdir)/scintilla/src/LexTCL.cxx
+
 stcdll_LexTeX.o: $(srcdir)/scintilla/src/LexTeX.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $(srcdir)/scintilla/src/LexTeX.cxx
 
@@ -652,6 +677,9 @@ stclib_CallTip.o: $(srcdir)/scintilla/src/CallTip.cxx
 stclib_CellBuffer.o: $(srcdir)/scintilla/src/CellBuffer.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $(srcdir)/scintilla/src/CellBuffer.cxx
 
+stclib_CharClassify.o: $(srcdir)/scintilla/src/CharClassify.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $(srcdir)/scintilla/src/CharClassify.cxx
+
 stclib_ContractionState.o: $(srcdir)/scintilla/src/ContractionState.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $(srcdir)/scintilla/src/ContractionState.cxx
 
@@ -754,6 +782,9 @@ stclib_LexHTML.o: $(srcdir)/scintilla/src/LexHTML.cxx
 stclib_LexHaskell.o: $(srcdir)/scintilla/src/LexHaskell.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $(srcdir)/scintilla/src/LexHaskell.cxx
 
+stclib_LexInno.o: $(srcdir)/scintilla/src/LexInno.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $(srcdir)/scintilla/src/LexInno.cxx
+
 stclib_LexKix.o: $(srcdir)/scintilla/src/LexKix.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $(srcdir)/scintilla/src/LexKix.cxx
 
@@ -784,6 +815,9 @@ stclib_LexMetapost.o: $(srcdir)/scintilla/src/LexMetapost.cxx
 stclib_LexNsis.o: $(srcdir)/scintilla/src/LexNsis.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $(srcdir)/scintilla/src/LexNsis.cxx
 
+stclib_LexOpal.o: $(srcdir)/scintilla/src/LexOpal.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $(srcdir)/scintilla/src/LexOpal.cxx
+
 stclib_LexOthers.o: $(srcdir)/scintilla/src/LexOthers.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $(srcdir)/scintilla/src/LexOthers.cxx
 
@@ -826,6 +860,12 @@ stclib_LexScriptol.o: $(srcdir)/scintilla/src/LexScriptol.cxx
 stclib_LexSpecman.o: $(srcdir)/scintilla/src/LexSpecman.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $(srcdir)/scintilla/src/LexSpecman.cxx
 
+stclib_LexSpice.o: $(srcdir)/scintilla/src/LexSpice.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $(srcdir)/scintilla/src/LexSpice.cxx
+
+stclib_LexTCL.o: $(srcdir)/scintilla/src/LexTCL.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $(srcdir)/scintilla/src/LexTCL.cxx
+
 stclib_LexTeX.o: $(srcdir)/scintilla/src/LexTeX.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $(srcdir)/scintilla/src/LexTeX.cxx
 
index ba0af83d73943225cce4b2a0d7ed511a34c59a93..2e80894a4756f4a23e06a600441eed06567a70dd 100644 (file)
@@ -47,14 +47,21 @@ wxColour wxColourFromCA(const ColourAllocated& ca) {
 Palette::Palette() {
     used = 0;
     allowRealization = false;
+    size = 100;
+    entries = new ColourPair[size];
 }
 
 Palette::~Palette() {
     Release();
+    delete [] entries;
+    entries = 0;
 }
 
 void Palette::Release() {
     used = 0;
+    delete [] entries;
+    size = 100;
+    entries = new ColourPair[size];
 }
 
 // This method either adds a colour to the list of wanted colours (want==true)
@@ -67,11 +74,20 @@ void Palette::WantFind(ColourPair &cp, bool want) {
                 return;
         }
 
-        if (used < numEntries) {
-            entries[used].desired = cp.desired;
-            entries[used].allocated.Set(cp.desired.AsLong());
-            used++;
+        if (used >= size) {
+            int sizeNew = size * 2;
+            ColourPair *entriesNew = new ColourPair[sizeNew];
+            for (int j=0; j<size; j++) {
+                entriesNew[j] = entries[j];
+            }
+            delete []entries;
+            entries = entriesNew;
+            size = sizeNew;
         }
+
+        entries[used].desired = cp.desired;
+        entries[used].allocated.Set(cp.desired.AsLong());
+        used++;
     } else {
         for (int i=0; i < used; i++) {
             if (entries[i].desired == cp.desired) {
@@ -162,6 +178,8 @@ public:
     virtual void FillRectangle(PRectangle rc, ColourAllocated back);
     virtual void FillRectangle(PRectangle rc, Surface &surfacePattern);
     virtual void RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAllocated back);
+    virtual void AlphaRectangle(PRectangle rc, int cornerSize, ColourAllocated fill, int alphaFill,
+                                ColourAllocated outline, int alphaOutline, int flags);
     virtual void Ellipse(PRectangle rc, ColourAllocated fore, ColourAllocated back);
     virtual void Copy(PRectangle rc, Point from, Surface &surfaceSource);
 
@@ -316,6 +334,14 @@ void SurfaceImpl::RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAl
     hdc->DrawRoundedRectangle(wxRectFromPRectangle(rc), 4);
 }
 
+void SurfaceImpl::AlphaRectangle(PRectangle rc, int cornerSize,
+                                 ColourAllocated fill, int alphaFill,
+                                 ColourAllocated outline, int alphaOutline, int flags) {
+// ** TODO
+
+    RectangleDraw(rc, outline, fill);
+}
+
 void SurfaceImpl::Ellipse(PRectangle rc, ColourAllocated fore, ColourAllocated back) {
     PenColour(fore);
     BrushColour(back);
index c945804fce32bc5ffd2ba5d9c74c4ceeb6830325..29cec6479678e4805c093ffba25d0809490199bd 100644 (file)
@@ -27,6 +27,7 @@
 #include "Platform.h"
 
 #include "Scintilla.h"
+#include "CharClassify.h"
 #include "XPM.h"
 #ifdef SCI_LEXER
 #include "SciLexer.h"
@@ -48,7 +49,6 @@
 #include "Editor.h"
 #include "ScintillaBase.h"
 
-
 //----------------------------------------------------------------------
 
 #ifdef WXMAKINGDLL_STC
index 3dfc8698517e4711d3bec7152853bc8f88ad1f39..89ff867d441e96e71cd796bec2eb504ea5e72fba 100644 (file)
@@ -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.67
+The current version of the Scintilla code is 1.70
 
index 88a05272fdc66b0d577e5668c1b5bef4392e8096..9dafa9f7d6e78f9ae274100ecee4e4d827a4475a 100644 (file)
@@ -236,12 +236,15 @@ class Window;     // Forward declaration for Palette
  */
 class Palette {
        int used;
-       enum {numEntries = 100};
-       ColourPair entries[numEntries];
+       int size;
+       ColourPair *entries;
 #if PLAT_GTK
        void *allocatedPalette; // GdkColor *
        int allocatedLen;
 #endif
+       // Private so Palette objects can not be copied
+       Palette(const Palette &) {}
+       Palette &operator=(const Palette &) { return *this; }
 public:
 #if PLAT_WIN
        void *hpal;
@@ -319,6 +322,8 @@ public:
        virtual void FillRectangle(PRectangle rc, ColourAllocated back)=0;
        virtual void FillRectangle(PRectangle rc, Surface &surfacePattern)=0;
        virtual void RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAllocated back)=0;
+       virtual void AlphaRectangle(PRectangle rc, int cornerSize, ColourAllocated fill, int alphaFill,
+               ColourAllocated outline, int alphaOutline, int flags)=0;
        virtual void Ellipse(PRectangle rc, ColourAllocated fore, ColourAllocated back)=0;
        virtual void Copy(PRectangle rc, Point from, Surface &surfaceSource)=0;
 
index 9c7fc8a7ddae27b2abe9c0cb09fab060ec36ab07..22d016d21c4524eabb5acf8a4b80ea2840ae330f 100644 (file)
@@ -88,6 +88,9 @@
 #define SCLEX_FLAGSHIP 73
 #define SCLEX_CSOUND 74
 #define SCLEX_FREEBASIC 75
+#define SCLEX_INNOSETUP 76
+#define SCLEX_OPAL 77
+#define SCLEX_SPICE 78
 #define SCLEX_AUTOMATIC 1000
 #define SCE_P_DEFAULT 0
 #define SCE_P_COMMENTLINE 1
 #define SCE_C_COMMENTDOCKEYWORD 17
 #define SCE_C_COMMENTDOCKEYWORDERROR 18
 #define SCE_C_GLOBALCLASS 19
+#define SCE_TCL_DEFAULT 0
+#define SCE_TCL_COMMENT 1
+#define SCE_TCL_COMMENTLINE 2
+#define SCE_TCL_NUMBER 3
+#define SCE_TCL_WORD_IN_QUOTE 4
+#define SCE_TCL_IN_QUOTE 5
+#define SCE_TCL_OPERATOR 6
+#define SCE_TCL_IDENTIFIER 7
+#define SCE_TCL_SUBSTITUTION 8
+#define SCE_TCL_SUB_BRACE 9
+#define SCE_TCL_MODIFIER 10
+#define SCE_TCL_EXPAND 11
+#define SCE_TCL_WORD 12
+#define SCE_TCL_WORD2 13
+#define SCE_TCL_WORD3 14
+#define SCE_TCL_WORD4 15
+#define SCE_TCL_WORD5 16
+#define SCE_TCL_WORD6 17
+#define SCE_TCL_WORD7 18
+#define SCE_TCL_WORD8 19
+#define SCE_TCL_COMMENT_BOX 20
+#define SCE_TCL_BLOCK_COMMENT 21
 #define SCE_H_DEFAULT 0
 #define SCE_H_TAG 1
 #define SCE_H_TAGUNKNOWN 2
 #define SCE_PROPS_SECTION 2
 #define SCE_PROPS_ASSIGNMENT 3
 #define SCE_PROPS_DEFVAL 4
+#define SCE_PROPS_KEY 5
 #define SCE_L_DEFAULT 0
 #define SCE_L_COMMAND 1
 #define SCE_L_TAG 2
 #define SCE_AU3_SPECIAL 12
 #define SCE_AU3_EXPAND 13
 #define SCE_AU3_COMOBJ 14
+#define SCE_AU3_UDF 15
 #define SCE_APDL_DEFAULT 0
 #define SCE_APDL_COMMENT 1
 #define SCE_APDL_COMMENTBLOCK 2
 #define SCE_CSOUND_IRATE_VAR 13
 #define SCE_CSOUND_GLOBAL_VAR 14
 #define SCE_CSOUND_STRINGEOL 15
+#define SCE_INNO_DEFAULT 0
+#define SCE_INNO_COMMENT 1
+#define SCE_INNO_KEYWORD 2
+#define SCE_INNO_PARAMETER 3
+#define SCE_INNO_SECTION 4
+#define SCE_INNO_PREPROC 5
+#define SCE_INNO_PREPROC_INLINE 6
+#define SCE_INNO_COMMENT_PASCAL 7
+#define SCE_INNO_KEYWORD_PASCAL 8
+#define SCE_INNO_KEYWORD_USER 9
+#define SCE_INNO_STRING_DOUBLE 10
+#define SCE_INNO_STRING_SINGLE 11
+#define SCE_INNO_IDENTIFIER 12
+#define SCE_OPAL_SPACE 0
+#define SCE_OPAL_COMMENT_BLOCK 1
+#define SCE_OPAL_COMMENT_LINE 2
+#define SCE_OPAL_INTEGER 3
+#define SCE_OPAL_KEYWORD 4
+#define SCE_OPAL_SORT 5
+#define SCE_OPAL_STRING 6
+#define SCE_OPAL_PAR 7
+#define SCE_OPAL_BOOL_CONST 8
+#define SCE_OPAL_DEFAULT 32
+#define SCE_SPICE_DEFAULT 0
+#define SCE_SPICE_IDENTIFIER 1
+#define SCE_SPICE_KEYWORD 2
+#define SCE_SPICE_KEYWORD2 3
+#define SCE_SPICE_KEYWORD3 4
+#define SCE_SPICE_NUMBER 5
+#define SCE_SPICE_DELIMITER 6
+#define SCE_SPICE_VALUE 7
+#define SCE_SPICE_COMMENTLINE 8
 #define SCLEX_ASP 29
 #define SCLEX_PHP 30
 //--Autogenerated -- end of section automatically generated from Scintilla.iface
index 4fb9ec338baac9e0079a5352ee3213a227ee7686..3a57da6ae2b13bf548a0ab8ef33fad795e387187 100644 (file)
@@ -138,8 +138,11 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
 #define SCI_MARKERPREVIOUS 2048
 #define SCI_MARKERDEFINEPIXMAP 2049
 #define SCI_MARKERADDSET 2466
+#define SCI_MARKERSETALPHA 2476
 #define SC_MARGIN_SYMBOL 0
 #define SC_MARGIN_NUMBER 1
+#define SC_MARGIN_BACK 2
+#define SC_MARGIN_FORE 3
 #define SCI_SETMARGINTYPEN 2240
 #define SCI_GETMARGINTYPEN 2241
 #define SCI_SETMARGINWIDTHN 2242
@@ -154,6 +157,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
 #define STYLE_BRACEBAD 35
 #define STYLE_CONTROLCHAR 36
 #define STYLE_INDENTGUIDE 37
+#define STYLE_CALLTIP 38
 #define STYLE_LASTPREDEFINED 39
 #define STYLE_MAX 127
 #define SC_CHARSET_ANSI 0
@@ -195,6 +199,8 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
 #define SCI_STYLESETHOTSPOT 2409
 #define SCI_SETSELFORE 2067
 #define SCI_SETSELBACK 2068
+#define SCI_GETSELALPHA 2477
+#define SCI_SETSELALPHA 2478
 #define SCI_SETCARETFORE 2069
 #define SCI_ASSIGNCMDKEY 2070
 #define SCI_CLEARCMDKEY 2071
@@ -214,6 +220,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
 #define INDIC_STRIKE 4
 #define INDIC_HIDDEN 5
 #define INDIC_BOX 6
+#define INDIC_ROUNDBOX 7
 #define INDIC0_MASK 0x20
 #define INDIC1_MASK 0x40
 #define INDIC2_MASK 0x80
@@ -358,6 +365,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
 #define SCI_CALLTIPSETBACK 2205
 #define SCI_CALLTIPSETFORE 2206
 #define SCI_CALLTIPSETFOREHLT 2207
+#define SCI_CALLTIPUSESTYLE 2212
 #define SCI_VISIBLEFROMDOCLINE 2220
 #define SCI_DOCLINEFROMVISIBLE 2221
 #define SCI_WRAPCOUNT 2235
@@ -607,6 +615,11 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
 #define SCI_SETPASTECONVERTENDINGS 2467
 #define SCI_GETPASTECONVERTENDINGS 2468
 #define SCI_SELECTIONDUPLICATE 2469
+#define SC_ALPHA_TRANSPARENT 0
+#define SC_ALPHA_OPAQUE 255
+#define SC_ALPHA_NOALPHA 256
+#define SCI_SETCARETLINEBACKALPHA 2470
+#define SCI_GETCARETLINEBACKALPHA 2471
 #define SCI_STARTRECORD 3001
 #define SCI_STOPRECORD 3002
 #define SCI_SETLEXER 4001
index 9f7e5c01c9cdfd65d099ee73cd49fed44d155252..9540e0de1aaa556c8cdfe24a8110802f076cc229 100644 (file)
@@ -316,9 +316,14 @@ fun void MarkerDefinePixmap=2049(int markerNumber, string pixmap)
 # Add a set of markers to a line.
 fun void MarkerAddSet=2466(int line, int set)
 
+# Set the alpha used for a marker that is drawn in the text area, not the margin.
+fun void MarkerSetAlpha=2476(int markerNumber, int alpha)
+
 enu MarginType=SC_MARGIN_
 val SC_MARGIN_SYMBOL=0
 val SC_MARGIN_NUMBER=1
+val SC_MARGIN_BACK=2
+val SC_MARGIN_FORE=3
 
 # Set a margin to be either numeric or symbolic.
 set void SetMarginTypeN=2240(int margin, int marginType)
@@ -344,8 +349,8 @@ set void SetMarginSensitiveN=2246(int margin, bool sensitive)
 # Retrieve the mouse click sensitivity of a margin.
 get bool GetMarginSensitiveN=2247(int margin,)
 
-# Styles in range 32..37 are predefined for parts of the UI and are not used as normal styles.
-# Styles 38 and 39 are for future use.
+# Styles in range 32..38 are predefined for parts of the UI and are not used as normal styles.
+# Style 39 is for future use.
 enu StylesCommon=STYLE_
 val STYLE_DEFAULT=32
 val STYLE_LINENUMBER=33
@@ -353,6 +358,7 @@ val STYLE_BRACELIGHT=34
 val STYLE_BRACEBAD=35
 val STYLE_CONTROLCHAR=36
 val STYLE_INDENTGUIDE=37
+val STYLE_CALLTIP=38
 val STYLE_LASTPREDEFINED=39
 val STYLE_MAX=127
 
@@ -430,6 +436,12 @@ fun void SetSelFore=2067(bool useSetting, colour fore)
 # Set the background colour of the selection and whether to use this setting.
 fun void SetSelBack=2068(bool useSetting, colour back)
 
+# Get the alpha of the selection.
+get int GetSelAlpha=2477(,)
+
+# Set the alpha of the selection.
+set void SetSelAlpha=2478(int alpha,)
+
 # Set the foreground colour of the caret.
 set void SetCaretFore=2069(colour fore,)
 
@@ -474,6 +486,7 @@ val INDIC_DIAGONAL=3
 val INDIC_STRIKE=4
 val INDIC_HIDDEN=5
 val INDIC_BOX=6
+val INDIC_ROUNDBOX=7
 val INDIC0_MASK=0x20
 val INDIC1_MASK=0x40
 val INDIC2_MASK=0x80
@@ -919,6 +932,9 @@ set void CallTipSetFore=2206(colour fore,)
 # Set the foreground colour for the highlighted part of the call tip.
 set void CallTipSetForeHlt=2207(colour fore,)
 
+# Enable use of STYLE_CALLTIP and set call tip tab size in pixels.
+set void CallTipUseStyle=2212(int tabSize,)
+
 # Find the display line of a document line taking hidden lines into account.
 fun int VisibleFromDocLine=2220(int line,)
 
@@ -1446,7 +1462,6 @@ get int GetXOffset=2398(,)
 fun void ChooseCaretX=2399(,)
 
 # Set the focus to this Scintilla widget.
-# GTK+ Specific.
 fun void GrabFocus=2400(,)
 
 enu CaretPolicy = CARET_
@@ -1642,6 +1657,16 @@ get bool GetPasteConvertEndings=2468(,)
 # Duplicate the selection. If selection empty duplicate the line containing the caret.
 fun void SelectionDuplicate=2469(,)
 
+val SC_ALPHA_TRANSPARENT=0
+val SC_ALPHA_OPAQUE=255
+val SC_ALPHA_NOALPHA=256
+
+# Set background alpha of the caret line.
+set void SetCaretLineBackAlpha=2470(int alpha,)
+
+# Get the background alpha of the caret line.
+get int GetCaretLineBackAlpha=2471(,)
+
 # Start notifying the container of all key presses and commands.
 fun void StartRecord=3001(,)
 
@@ -1820,11 +1845,9 @@ val SCLEX_SMALLTALK=72
 val SCLEX_FLAGSHIP=73
 val SCLEX_CSOUND=74
 val SCLEX_FREEBASIC=75
-
-# These are deprecated, STC_LEX_HTML should be used instead.
-val SCLEX_ASP=29
-val SCLEX_PHP=30
-
+val SCLEX_INNOSETUP=76
+val SCLEX_OPAL=77
+val SCLEX_SPICE=78
 
 # When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
 # value assigned in sequence from SCLEX_AUTOMATIC+1.
@@ -1850,7 +1873,6 @@ val SCE_P_DECORATOR=15
 # Lexical states for SCLEX_CPP
 lex Cpp=SCLEX_CPP SCE_C_
 lex Pascal=SCLEX_PASCAL SCE_C_
-lex TCL=SCLEX_TCL SCE_C_
 lex BullAnt=SCLEX_BULLANT SCE_C_
 val SCE_C_DEFAULT=0
 val SCE_C_COMMENT=1
@@ -1872,6 +1894,30 @@ val SCE_C_WORD2=16
 val SCE_C_COMMENTDOCKEYWORD=17
 val SCE_C_COMMENTDOCKEYWORDERROR=18
 val SCE_C_GLOBALCLASS=19
+# Lexical states for SCLEX_TCL
+lex TCL=SCLEX_TCL SCE_TCL_
+val SCE_TCL_DEFAULT=0
+val SCE_TCL_COMMENT=1
+val SCE_TCL_COMMENTLINE=2
+val SCE_TCL_NUMBER=3
+val SCE_TCL_WORD_IN_QUOTE=4
+val SCE_TCL_IN_QUOTE=5
+val SCE_TCL_OPERATOR=6
+val SCE_TCL_IDENTIFIER=7
+val SCE_TCL_SUBSTITUTION=8
+val SCE_TCL_SUB_BRACE=9
+val SCE_TCL_MODIFIER=10
+val SCE_TCL_EXPAND=11
+val SCE_TCL_WORD=12
+val SCE_TCL_WORD2=13
+val SCE_TCL_WORD3=14
+val SCE_TCL_WORD4=15
+val SCE_TCL_WORD5=16
+val SCE_TCL_WORD6=17
+val SCE_TCL_WORD7=18
+val SCE_TCL_WORD8=19
+val SCE_TCL_COMMENT_BOX=20
+val SCE_TCL_BLOCK_COMMENT=21
 # Lexical states for SCLEX_HTML, SCLEX_XML
 lex HTML=SCLEX_HTML SCE_H
 lex XML=SCLEX_XML SCE_H
@@ -2100,6 +2146,7 @@ val SCE_PROPS_COMMENT=1
 val SCE_PROPS_SECTION=2
 val SCE_PROPS_ASSIGNMENT=3
 val SCE_PROPS_DEFVAL=4
+val SCE_PROPS_KEY=5
 # Lexical states for SCLEX_LATEX
 lex LaTeX=SCLEX_LATEX SCE_L_
 val SCE_L_DEFAULT=0
@@ -2646,6 +2693,7 @@ val SCE_AU3_PREPROCESSOR=11
 val SCE_AU3_SPECIAL=12
 val SCE_AU3_EXPAND=13
 val SCE_AU3_COMOBJ=14
+val SCE_AU3_UDF=15
 # Lexical states for SCLEX_APDL
 lex APDL=SCLEX_APDL SCE_APDL_
 val SCE_APDL_DEFAULT=0
@@ -2883,6 +2931,44 @@ val SCE_CSOUND_KRATE_VAR=12
 val SCE_CSOUND_IRATE_VAR=13
 val SCE_CSOUND_GLOBAL_VAR=14
 val SCE_CSOUND_STRINGEOL=15
+# Lexical states for SCLEX_INNOSETUP
+lex Inno=SCLEX_INNOSETUP SCE_INNO_
+val SCE_INNO_DEFAULT=0
+val SCE_INNO_COMMENT=1
+val SCE_INNO_KEYWORD=2
+val SCE_INNO_PARAMETER=3
+val SCE_INNO_SECTION=4
+val SCE_INNO_PREPROC=5
+val SCE_INNO_PREPROC_INLINE=6
+val SCE_INNO_COMMENT_PASCAL=7
+val SCE_INNO_KEYWORD_PASCAL=8
+val SCE_INNO_KEYWORD_USER=9
+val SCE_INNO_STRING_DOUBLE=10
+val SCE_INNO_STRING_SINGLE=11
+val SCE_INNO_IDENTIFIER=12
+# Lexical states for SCLEX_OPAL
+lex Opal=SCLEX_OPAL SCE_OPAL_
+val SCE_OPAL_SPACE=0
+val SCE_OPAL_COMMENT_BLOCK=1
+val SCE_OPAL_COMMENT_LINE=2
+val SCE_OPAL_INTEGER=3
+val SCE_OPAL_KEYWORD=4
+val SCE_OPAL_SORT=5
+val SCE_OPAL_STRING=6
+val SCE_OPAL_PAR=7
+val SCE_OPAL_BOOL_CONST=8
+val SCE_OPAL_DEFAULT=32
+# Lexical states for SCLEX_SPICE
+lex Spice=SCLEX_SPICE SCE_SPICE_
+val SCE_SPICE_DEFAULT=0
+val SCE_SPICE_IDENTIFIER=1
+val SCE_SPICE_KEYWORD=2
+val SCE_SPICE_KEYWORD2=3
+val SCE_SPICE_KEYWORD3=4
+val SCE_SPICE_NUMBER=5
+val SCE_SPICE_DELIMITER=6
+val SCE_SPICE_VALUE=7
+val SCE_SPICE_COMMENTLINE=8
 
 # Events
 
index 7f47de7e13c33fd31b7aec0bb10a8ad12a703d50..9d23ce2a9180759f56d7889397d1ab5d972e5e0e 100644 (file)
@@ -34,7 +34,11 @@ struct _ScintillaClass {
        void (* notify) (ScintillaObject *ttt);
 };
 
+#if GLIB_MAJOR_VERSION < 2
 GtkType                scintilla_get_type      (void);
+#else
+GType          scintilla_get_type      (void);
+#endif
 GtkWidget*     scintilla_new           (void);
 void           scintilla_set_id        (ScintillaObject *sci, uptr_t id);
 sptr_t         scintilla_send_message  (ScintillaObject *sci,unsigned int iMessage, uptr_t wParam, sptr_t lParam);
index 80fd55d7b85dc9cdd178cf42fb4203fe065116b2..f4bc5f83c42e0c93e00db9c0ea4ddd4f16e7e788 100644 (file)
@@ -13,6 +13,9 @@
 #include "Scintilla.h"
 #include "CallTip.h"
 
+static const int insetX = 5;    // text inset in x from calltip border
+static const int widthArrow = 14;
+
 CallTip::CallTip() {
        wCallTip = 0;
        inCallTipMode = false;
@@ -23,6 +26,8 @@ CallTip::CallTip() {
        lineHeight = 1;
        startHighlight = 0;
        endHighlight = 0;
+       tabSize = 0;
+       useStyleCallTip = false;    // for backwards compatibility
 
        colourBG.desired = ColourDesired(0xff, 0xff, 0xff);
        colourUnSel.desired = ColourDesired(0x80, 0x80, 0x80);
@@ -38,8 +43,6 @@ CallTip::~CallTip() {
        val = 0;
 }
 
-const int widthArrow = 14;
-
 void CallTip::RefreshColourPalette(Palette &pal, bool want) {
        pal.WantFind(colourBG, want);
        pal.WantFind(colourUnSel, want);
@@ -48,19 +51,42 @@ void CallTip::RefreshColourPalette(Palette &pal, bool want) {
        pal.WantFind(colourLight, want);
 }
 
+// Although this test includes 0, we should never see a \0 character.
 static bool IsArrowCharacter(char ch) {
        return (ch == 0) || (ch == '\001') || (ch == '\002');
 }
 
+// We ignore tabs unless a tab width has been set.
+bool CallTip::IsTabCharacter(char ch) {
+       return (tabSize > 0) && (ch == '\t');
+}
+
+int CallTip::NextTabPos(int x) {
+       if (tabSize > 0) {              // paranoia... not called unless this is true
+               x -= insetX;                // position relative to text
+               x = (x + tabSize) / tabSize;  // tab "number"
+               return tabSize*x + insetX;  // position of next tab
+       } else {
+               return x + 1;                 // arbitrary
+       }
+}
+
+// Draw a section of the call tip that does not include \n in one colour.
+// The text may include up to numEnds tabs or arrow characters.
 void CallTip::DrawChunk(Surface *surface, int &x, const char *s,
        int posStart, int posEnd, int ytext, PRectangle rcClient,
        bool highlight, bool draw) {
        s += posStart;
        int len = posEnd - posStart;
+
+       // Divide the text into sections that are all text, or that are
+       // single arrows or single tab characters (if tabSize > 0).
        int maxEnd = 0;
-       int ends[10];
+       const int numEnds = 10;
+       int ends[numEnds + 2];
        for (int i=0;i<len;i++) {
-               if (IsArrowCharacter(s[i])) {
+               if ((maxEnd < numEnds) &&
+                       (IsArrowCharacter(s[i]) || IsTabCharacter(s[i])) ) {
                        if (i > 0)
                                ends[maxEnd++] = i;
                        ends[maxEnd++] = i+1;
@@ -73,20 +99,19 @@ void CallTip::DrawChunk(Surface *surface, int &x, const char *s,
                int endSeg = ends[seg];
                if (endSeg > startSeg) {
                        if (IsArrowCharacter(s[startSeg])) {
-                               xEnd = x + widthArrow;
-                               offsetMain = xEnd;
+                               bool upArrow = s[startSeg] == '\001';
                                rcClient.left = x;
-                               rcClient.right = xEnd;
+                               rcClient.right = rcClient.left + widthArrow;
                                if (draw) {
                                        const int halfWidth = widthArrow / 2 - 3;
-                                       const int centreX = x + widthArrow / 2 - 1;
+                                       const int centreX = rcClient.left + widthArrow / 2 - 1;
                                        const int centreY = (rcClient.top + rcClient.bottom) / 2;
                                        surface->FillRectangle(rcClient, colourBG.allocated);
-                                       PRectangle rcClientInner(rcClient.left+1, rcClient.top+1, rcClient.right-2, rcClient.bottom-1);
+                                       PRectangle rcClientInner(rcClient.left + 1, rcClient.top + 1,
+                                                                rcClient.right - 2, rcClient.bottom - 1);
                                        surface->FillRectangle(rcClientInner, colourUnSel.allocated);
 
-                                       if (s[startSeg] == '\001') {
-                                               // Up arrow
+                                       if (upArrow) {      // Up arrow
                                                Point pts[] = {
                                                Point(centreX - halfWidth, centreY + halfWidth / 2),
                                                Point(centreX + halfWidth, centreY + halfWidth / 2),
@@ -94,8 +119,7 @@ void CallTip::DrawChunk(Surface *surface, int &x, const char *s,
                                                };
                                                surface->Polygon(pts, sizeof(pts) / sizeof(pts[0]),
                                                                colourBG.allocated, colourBG.allocated);
-                                       } else {
-                                               // Down arrow
+                                       } else {            // Down arrow
                                                Point pts[] = {
                                                Point(centreX - halfWidth, centreY - halfWidth / 2),
                                                Point(centreX + halfWidth, centreY - halfWidth / 2),
@@ -105,20 +129,23 @@ void CallTip::DrawChunk(Surface *surface, int &x, const char *s,
                                                                colourBG.allocated, colourBG.allocated);
                                        }
                                }
-                               if (s[startSeg] == '\001') {
+                               xEnd = rcClient.right;
+                               offsetMain = xEnd;
+                               if (upArrow) {
                                        rectUp = rcClient;
-                               } else if (s[startSeg] == '\002') {
+                               } else {
                                        rectDown = rcClient;
                                }
+                       } else if (IsTabCharacter(s[startSeg])) {
+                               xEnd = NextTabPos(x);
                        } else {
-                               xEnd = x + surface->WidthText(font, s+startSeg, endSeg - startSeg);
+                               xEnd = x + surface->WidthText(font, s + startSeg, endSeg - startSeg);
                                if (draw) {
                                        rcClient.left = x;
                                        rcClient.right = xEnd;
-                                       surface->DrawTextNoClip(rcClient, font, ytext,
+                                       surface->DrawTextTransparent(rcClient, font, ytext,
                                                                                s+startSeg, endSeg - startSeg,
-                                                                               highlight ? colourSel.allocated : colourUnSel.allocated,
-                                                                               colourBG.allocated);
+                                                                    highlight ? colourSel.allocated : colourUnSel.allocated);
                                }
                        }
                        x = xEnd;
@@ -160,7 +187,7 @@ int CallTip::PaintContents(Surface *surfaceWindow, bool draw) {
                thisEndHighlight -= chunkOffset;
                rcClient.top = ytext - ascent - 1;
 
-               int x = 5;
+               int x = insetX;     // start each line at this inset
 
                DrawChunk(surfaceWindow, x, chunkVal, 0, thisStartHighlight,
                        ytext, rcClient, false, draw);
@@ -187,7 +214,7 @@ void CallTip::PaintCT(Surface *surfaceWindow) {
 
        surfaceWindow->FillRectangle(rcClient, colourBG.allocated);
 
-       offsetMain = 5;
+       offsetMain = insetX;    // initial alignment assuming no arrows
        PaintContents(surfaceWindow, true);
 
        // Draw a raised border around the edges of the window
@@ -238,14 +265,17 @@ PRectangle CallTip::CallTipStart(int pos, Point pt, const char *defn,
        const char *look = val;
        rectUp = PRectangle(0,0,0,0);
        rectDown = PRectangle(0,0,0,0);
-       offsetMain = 5;
-       int width = PaintContents(surfaceMeasure, false) + 5;
+       offsetMain = insetX;            // changed to right edge of any arrows
+       int width = PaintContents(surfaceMeasure, false) + insetX;
        while ((newline = strchr(look, '\n')) != NULL) {
                look = newline + 1;
                numLines++;
        }
        lineHeight = surfaceMeasure->Height(font);
-       // Extra line for border and an empty line at top and bottom
+
+       // Extra line for border and an empty line at top and bottom. The returned
+       // rectangle is aligned to the right edge of the last arrow encountered in
+       // the tip text, else to the tip text left edge.
        int height = lineHeight * numLines - surfaceMeasure->InternalLeading(font) + 2 + 2;
        delete surfaceMeasure;
        return PRectangle(pt.x - offsetMain, pt.y + 1, pt.x + width - offsetMain, pt.y + 1 + height);
@@ -268,3 +298,17 @@ void CallTip::SetHighlight(int start, int end) {
                }
        }
 }
+
+// Set the tab size (sizes > 0 enable the use of tabs). This also enables the
+// use of the STYLE_CALLTIP.
+void CallTip::SetTabSize(int tabSz) {
+       tabSize = tabSz;
+       useStyleCallTip = true;
+}
+
+// It might be better to have two access functions for this and to use
+// them for all settings of colours.
+void CallTip::SetForeBack(const ColourPair &fore, const ColourPair &back) {
+       colourBG = back;
+       colourUnSel = fore;
+}
index 53eec832a25e3a48128f8ffeebd650aff97b17e1..9848a10af989e89d5068acb4ec45a1d0b5d09311 100644 (file)
 /**
  */
 class CallTip {
-       int startHighlight;
-       int endHighlight;
+       int startHighlight;    // character offset to start and...
+       int endHighlight;      // ...end of highlighted text
        char *val;
        Font font;
-       PRectangle rectUp;
-       PRectangle rectDown;
-       int lineHeight;
-       int offsetMain;
+       PRectangle rectUp;      // rectangle of last up angle in the tip
+       PRectangle rectDown;    // rectangle of last down arrow in the tip
+       int lineHeight;         // vertical line spacing
+       int offsetMain;         // The alignment point of the call tip
+       int tabSize;            // Tab size in pixels, <=0 no TAB expand
+       bool useStyleCallTip;   // if true, STYLE_CALLTIP should be used
+
        // Private so CallTip objects can not be copied
        CallTip(const CallTip &) {}
        CallTip &operator=(const CallTip &) { return *this; }
@@ -26,6 +29,8 @@ class CallTip {
                int posStart, int posEnd, int ytext, PRectangle rcClient,
                bool highlight, bool draw);
        int PaintContents(Surface *surfaceWindow, bool draw);
+       bool IsTabCharacter(char c);
+       int NextTabPos(int x);
 
 public:
        Window wCallTip;
@@ -60,6 +65,15 @@ public:
        /// Set a range of characters to be displayed in a highlight style.
        /// Commonly used to highlight the current parameter.
        void SetHighlight(int start, int end);
+
+       /// Set the tab size in pixels for the call tip. 0 or -ve means no tab expand.
+       void SetTabSize(int tabSz);
+
+       /// Used to determine which STYLE_xxxx to use for call tip information
+       bool UseStyleCallTip() const { return useStyleCallTip;}
+
+       // Modify foreground and background colours
+       void SetForeBack(const ColourPair &fore, const ColourPair &back);
 };
 
 #endif
diff --git a/contrib/src/stc/scintilla/src/CharClassify.cxx b/contrib/src/stc/scintilla/src/CharClassify.cxx
new file mode 100644 (file)
index 0000000..acab4b2
--- /dev/null
@@ -0,0 +1,43 @@
+// Scintilla source code edit control
+/** @file CharClassify.cxx
+ ** Character classifications used by Document and RESearch.
+ **/
+// Copyright 2006 by Neil Hodgson <neilh@scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#include <ctype.h>
+
+#include "CharClassify.h"
+
+// Shut up annoying Visual C++ warnings:
+#ifdef _MSC_VER
+#pragma warning(disable: 4514)
+#endif
+
+CharClassify::CharClassify() {
+       SetDefaultCharClasses(true);
+}
+
+void CharClassify::SetDefaultCharClasses(bool includeWordClass) {
+       // Initialize all char classes to default values
+       for (int ch = 0; ch < 256; ch++) {
+               if (ch == '\r' || ch == '\n')
+                       charClass[ch] = ccNewLine;
+               else if (ch < 0x20 || ch == ' ')
+                       charClass[ch] = ccSpace;
+               else if (includeWordClass && (ch >= 0x80 || isalnum(ch) || ch == '_'))
+                       charClass[ch] = ccWord;
+               else
+                       charClass[ch] = ccPunctuation;
+       }
+}
+
+void CharClassify::SetCharClasses(const unsigned char *chars, cc newCharClass) {
+       // Apply the newCharClass to the specifed chars
+       if (chars) {
+               while (*chars) {
+                       charClass[*chars] = static_cast<unsigned char>(newCharClass);
+                       chars++;
+               }
+       }
+}
diff --git a/contrib/src/stc/scintilla/src/CharClassify.h b/contrib/src/stc/scintilla/src/CharClassify.h
new file mode 100644 (file)
index 0000000..881d3a1
--- /dev/null
@@ -0,0 +1,25 @@
+// Scintilla source code edit control
+/** @file CharClassify.h
+ ** Character classifications used by Document and RESearch.
+ **/
+// Copyright 2006 by Neil Hodgson <neilh@scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#ifndef CHARCLASSIFY_H
+#define CHARCLASSIFY_H
+
+class CharClassify {
+public:
+       CharClassify();
+
+       enum cc { ccSpace, ccNewLine, ccWord, ccPunctuation };
+       void SetDefaultCharClasses(bool includeWordClass);
+       void SetCharClasses(const unsigned char *chars, cc newCharClass);
+       cc GetClass(unsigned char ch) const { return static_cast<cc>(charClass[ch]);}
+       bool IsWord(unsigned char ch) const { return static_cast<cc>(charClass[ch]) == ccWord;}
+
+private:
+       enum { maxChar=256 };
+       unsigned char charClass[maxChar];    // not type cc to save space
+};
+#endif
index 8833b07bc0e7c72a97c042737b005c4cb56c80ff..3d021b080b2f6d46133833722001c9eeccb2b619 100644 (file)
@@ -280,4 +280,10 @@ void ContractionState::ShowAll() {
        delete []lines;
        lines = 0;
        size = 0;
+
+       delete []docLines;
+       docLines = 0;
+       sizeDocLines = 0;
+
+       linesInDisplay = linesInDoc;
 }
index a88468cb1a8b26431c99864764564e68a43a1bcf..92be92691c0a117dcfc8b8a0ca3828276dcfa2b6 100644 (file)
@@ -15,6 +15,7 @@
 #include "Scintilla.h"
 #include "SVector.h"
 #include "CellBuffer.h"
+#include "CharClassify.h"
 #include "Document.h"
 #include "RESearch.h"
 
@@ -50,7 +51,6 @@ Document::Document() {
        stylingBits = 5;
        stylingBitsMask = 0x1F;
        stylingMask = 0;
-       SetDefaultCharClasses(true);
        endStyled = 0;
        styleClock = 0;
        enteredCount = 0;
@@ -836,10 +836,10 @@ int Document::ParaDown(int pos) {
                return LineEnd(line-1);
 }
 
-Document::charClassification Document::WordCharClass(unsigned char ch) {
+CharClassify::cc Document::WordCharClass(unsigned char ch) {
        if ((SC_CP_UTF8 == dbcsCodePage) && (ch >= 0x80))
-               return ccWord;
-       return charClass[ch];
+               return CharClassify::ccWord;
+       return charClass.GetClass(ch);
 }
 
 /**
@@ -847,7 +847,7 @@ Document::charClassification Document::WordCharClass(unsigned char ch) {
  * Finds the start of word at pos when delta < 0 or the end of the word when delta >= 0.
  */
 int Document::ExtendWordSelect(int pos, int delta, bool onlyWordCharacters) {
-       charClassification ccStart = ccWord;
+       CharClassify::cc ccStart = CharClassify::ccWord;
        if (delta < 0) {
                if (!onlyWordCharacters)
                        ccStart = WordCharClass(cb.CharAt(pos-1));
@@ -871,19 +871,19 @@ int Document::ExtendWordSelect(int pos, int delta, bool onlyWordCharacters) {
  */
 int Document::NextWordStart(int pos, int delta) {
        if (delta < 0) {
-               while (pos > 0 && (WordCharClass(cb.CharAt(pos - 1)) == ccSpace))
+               while (pos > 0 && (WordCharClass(cb.CharAt(pos - 1)) == CharClassify::ccSpace))
                        pos--;
                if (pos > 0) {
-                       charClassification ccStart = WordCharClass(cb.CharAt(pos-1));
+                       CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos-1));
                        while (pos > 0 && (WordCharClass(cb.CharAt(pos - 1)) == ccStart)) {
                                pos--;
                        }
                }
        } else {
-               charClassification ccStart = WordCharClass(cb.CharAt(pos));
+               CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos));
                while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == ccStart))
                        pos++;
-               while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == ccSpace))
+               while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == CharClassify::ccSpace))
                        pos++;
        }
        return pos;
@@ -899,22 +899,22 @@ int Document::NextWordStart(int pos, int delta) {
 int Document::NextWordEnd(int pos, int delta) {
        if (delta < 0) {
                if (pos > 0) {
-                       charClassification ccStart = WordCharClass(cb.CharAt(pos-1));
-                       if (ccStart != ccSpace) {
+                       CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos-1));
+                       if (ccStart != CharClassify::ccSpace) {
                                while (pos > 0 && WordCharClass(cb.CharAt(pos - 1)) == ccStart) {
                                        pos--;
                                }
                        }
-                       while (pos > 0 && WordCharClass(cb.CharAt(pos - 1)) == ccSpace) {
+                       while (pos > 0 && WordCharClass(cb.CharAt(pos - 1)) == CharClassify::ccSpace) {
                                pos--;
                        }
                }
        } else {
-               while (pos < Length() && WordCharClass(cb.CharAt(pos)) == ccSpace) {
+               while (pos < Length() && WordCharClass(cb.CharAt(pos)) == CharClassify::ccSpace) {
                        pos++;
                }
                if (pos < Length()) {
-                       charClassification ccStart = WordCharClass(cb.CharAt(pos));
+                       CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos));
                        while (pos < Length() && WordCharClass(cb.CharAt(pos)) == ccStart) {
                                pos++;
                        }
@@ -929,8 +929,8 @@ int Document::NextWordEnd(int pos, int delta) {
  */
 bool Document::IsWordStartAt(int pos) {
        if (pos > 0) {
-               charClassification ccPos = WordCharClass(CharAt(pos));
-               return (ccPos == ccWord || ccPos == ccPunctuation) &&
+               CharClassify::cc ccPos = WordCharClass(CharAt(pos));
+               return (ccPos == CharClassify::ccWord || ccPos == CharClassify::ccPunctuation) &&
                        (ccPos != WordCharClass(CharAt(pos - 1)));
        }
        return true;
@@ -942,8 +942,8 @@ bool Document::IsWordStartAt(int pos) {
  */
 bool Document::IsWordEndAt(int pos) {
        if (pos < Length()) {
-               charClassification ccPrev = WordCharClass(CharAt(pos-1));
-               return (ccPrev == ccWord || ccPrev == ccPunctuation) &&
+               CharClassify::cc ccPrev = WordCharClass(CharAt(pos-1));
+               return (ccPrev == CharClassify::ccWord || ccPrev == CharClassify::ccPunctuation) &&
                        (ccPrev != WordCharClass(CharAt(pos)));
        }
        return true;
@@ -1004,7 +1004,7 @@ long Document::FindText(int minPos, int maxPos, const char *s,
                         int *length) {
        if (regExp) {
                if (!pre)
-                       pre = new RESearch();
+                       pre = new RESearch(&charClass);
                if (!pre)
                        return -1;
 
@@ -1266,27 +1266,11 @@ void Document::ChangeCase(Range r, bool makeUpperCase) {
 }
 
 void Document::SetDefaultCharClasses(bool includeWordClass) {
-       // Initialize all char classes to default values
-       for (int ch = 0; ch < 256; ch++) {
-               if (ch == '\r' || ch == '\n')
-                       charClass[ch] = ccNewLine;
-               else if (ch < 0x20 || ch == ' ')
-                       charClass[ch] = ccSpace;
-               else if (includeWordClass && (ch >= 0x80 || isalnum(ch) || ch == '_'))
-                       charClass[ch] = ccWord;
-               else
-                       charClass[ch] = ccPunctuation;
-       }
+    charClass.SetDefaultCharClasses(includeWordClass);
 }
 
-void Document::SetCharClasses(const unsigned char *chars, charClassification newCharClass) {
-       // Apply the newCharClass to the specifed chars
-       if (chars) {
-               while (*chars) {
-                       charClass[*chars] = newCharClass;
-                       chars++;
-               }
-       }
+void Document::SetCharClasses(const unsigned char *chars, CharClassify::cc newCharClass) {
+    charClass.SetCharClasses(chars, newCharClass);
 }
 
 void Document::SetStylingBits(int bits) {
@@ -1430,7 +1414,7 @@ void Document::NotifyModified(DocModification mh) {
 }
 
 bool Document::IsWordPartSeparator(char ch) {
-       return (WordCharClass(ch) == ccWord) && IsPunctuation(ch);
+       return (WordCharClass(ch) == CharClassify::ccWord) && IsPunctuation(ch);
 }
 
 int Document::WordPartLeft(int pos) {
index 6ff858b9238b517fb90b438e3e3425f016685c2c..d774d5664e33f1f012094ec8a8c8b72fc3c59037 100644 (file)
@@ -93,7 +93,7 @@ public:
 private:
        int refCount;
        CellBuffer cb;
-       charClassification charClass[256];
+       CharClassify charClass;
        char stylingMask;
        int endStyled;
        int styleClock;
@@ -207,7 +207,7 @@ public:
        void ChangeCase(Range r, bool makeUpperCase);
 
        void SetDefaultCharClasses(bool includeWordClass);
-       void SetCharClasses(const unsigned char *chars, charClassification newCharClass);
+       void SetCharClasses(const unsigned char *chars, CharClassify::cc newCharClass);
        void SetStylingBits(int bits);
        void StartStyling(int position, char mask);
        bool SetStyleFor(int length, char style);
@@ -239,7 +239,7 @@ public:
 private:
        void CheckReadOnly();
 
-       charClassification WordCharClass(unsigned char ch);
+       CharClassify::cc WordCharClass(unsigned char ch);
        bool IsWordStartAt(int pos);
        bool IsWordEndAt(int pos);
        bool IsWordAt(int start, int end);
index f479ce0259258fe9d668a32c6efb3558c628721b..c695c5f510e510131f0b496cc9eae95efddb7b7b 100644 (file)
@@ -18,6 +18,7 @@
 #include "DocumentAccessor.h"
 #include "CellBuffer.h"
 #include "Scintilla.h"
+#include "CharClassify.h"
 #include "Document.h"
 
 DocumentAccessor::~DocumentAccessor() {
index 2c0615e15012422d02230c6dec9086659179e236..87a0391b487ff2a951052f0871aa8868adf9e7aa 100644 (file)
@@ -26,6 +26,7 @@
 #include "LineMarker.h"
 #include "Style.h"
 #include "ViewStyle.h"
+#include "CharClassify.h"
 #include "Document.h"
 #include "Editor.h"
 
@@ -213,7 +214,7 @@ void LineLayoutCache::Allocate(int length_) {
 }
 
 void LineLayoutCache::AllocateForLevel(int linesOnScreen, int linesInDoc) {
-//     PLATFORM_ASSERT(useCount == 0);
+       PLATFORM_ASSERT(useCount == 0);
        int lengthForLevel = 0;
        if (level == llcCaret) {
                lengthForLevel = 1;
@@ -239,7 +240,7 @@ void LineLayoutCache::AllocateForLevel(int linesOnScreen, int linesInDoc) {
 }
 
 void LineLayoutCache::Deallocate() {
-//     PLATFORM_ASSERT(useCount == 0);
+       PLATFORM_ASSERT(useCount == 0);
        for (int i = 0; i < length; i++)
                delete cache[i];
        delete []cache;
@@ -284,7 +285,7 @@ LineLayout *LineLayoutCache::Retrieve(int lineNumber, int lineCaret, int maxChar
        } else if (level == llcPage) {
                if (lineNumber == lineCaret) {
                        pos = 0;
-               } else {
+               } else if (length > 1) {
                        pos = 1 + (lineNumber % (length - 1));
                }
        } else if (level == llcDocument) {
@@ -327,7 +328,7 @@ void LineLayoutCache::Dispose(LineLayout *ll) {
                        delete ll;
                } else {
                        useCount--;
-               }
+               }
        }
 }
 
@@ -428,9 +429,8 @@ Editor::Editor() {
 
        wrapState = eWrapNone;
        wrapWidth = LineLayout::wrapWidthInfinite;
-       docLineLastWrapped = -1;
-       docLastLineToWrap = -1;
-       backgroundWrapEnabled = true;
+       wrapStart = wrapLineLarge;
+       wrapEnd = wrapLineLarge;
        wrapVisualFlags = 0;
        wrapVisualFlagsLocation = 0;
        wrapVisualStartIndent = 0;
@@ -810,6 +810,9 @@ int Editor::PositionFromLocationClose(Point pt) {
                                        return pdoc->MovePositionOutsideChar(i + posLineStart, 1);
                                }
                        }
+                       if (pt.x < (ll->positions[lineEnd] - subLineStart)) {
+                               return pdoc->MovePositionOutsideChar(lineEnd + posLineStart, 1);
+                       }
                }
        }
 
@@ -1483,29 +1486,18 @@ void Editor::InvalidateCaret() {
 void Editor::UpdateSystemCaret() {
 }
 
-void Editor::NeedWrapping(int docLineStartWrapping, int docLineEndWrapping) {
-       docLineStartWrapping = Platform::Minimum(docLineStartWrapping, pdoc->LinesTotal()-1);
-       docLineEndWrapping = Platform::Minimum(docLineEndWrapping, pdoc->LinesTotal()-1);
-       bool noWrap = (docLastLineToWrap == docLineLastWrapped);
-       if (docLineLastWrapped > (docLineStartWrapping - 1)) {
-               docLineLastWrapped = docLineStartWrapping - 1;
-               if (docLineLastWrapped < -1)
-                       docLineLastWrapped = -1;
+void Editor::NeedWrapping(int docLineStart, int docLineEnd) {
+       docLineStart = Platform::Clamp(docLineStart, 0, pdoc->LinesTotal());
+       if (wrapStart > docLineStart) {
+               wrapStart = docLineStart;
                llc.Invalidate(LineLayout::llPositions);
        }
-       if (noWrap) {
-               docLastLineToWrap = docLineEndWrapping;
-       } else if (docLastLineToWrap < docLineEndWrapping) {
-               docLastLineToWrap = docLineEndWrapping + 1;
+       if (wrapEnd < docLineEnd) {
+               wrapEnd = docLineEnd;
        }
-       if (docLastLineToWrap < -1)
-               docLastLineToWrap = -1;
-       if (docLastLineToWrap >= pdoc->LinesTotal())
-               docLastLineToWrap = pdoc->LinesTotal()-1;
+       wrapEnd = Platform::Clamp(wrapEnd, 0, pdoc->LinesTotal());
        // Wrap lines during idle.
-       if ((wrapState != eWrapNone) &&
-               backgroundWrapEnabled &&
-               (docLastLineToWrap != docLineLastWrapped)) {
+       if ((wrapState != eWrapNone) && (wrapEnd != wrapStart)) {
                SetIdle(true);
        }
 }
@@ -1514,33 +1506,33 @@ void Editor::NeedWrapping(int docLineStartWrapping, int docLineEndWrapping) {
 // fullwrap: if true, all lines which need wrapping will be done,
 //           in this single call.
 // priorityWrapLineStart: If greater than zero, all lines starting from
-//           here to 100 lines past will be wrapped (even if there are
+//           here to 1 page + 100 lines past will be wrapped (even if there are
 //           more lines under wrapping process in idle).
-// If it is neither fullwrap, nor priorityWrap, then 100 lines will be
+// If it is neither fullwrap, nor priorityWrap, then 1 page + 100 lines will be
 // wrapped, if there are any wrapping going on in idle. (Generally this
 // condition is called only from idler).
 // Return true if wrapping occurred.
 bool Editor::WrapLines(bool fullWrap, int priorityWrapLineStart) {
        // If there are any pending wraps, do them during idle if possible.
+       int linesInOneCall = LinesOnScreen() + 100;
        if (wrapState != eWrapNone) {
-               if (docLineLastWrapped < docLastLineToWrap) {
-                       if (!(backgroundWrapEnabled && SetIdle(true))) {
-                               // Background wrapping is disabled, or idle processing
-                               // not supported.  A full wrap is required.
+               if (wrapStart < wrapEnd) {
+                       if (!SetIdle(true)) {
+                               // Idle processing not supported so full wrap required.
                                fullWrap = true;
                        }
                }
                if (!fullWrap && priorityWrapLineStart >= 0 &&
                        // .. and if the paint window is outside pending wraps
-                       (((priorityWrapLineStart + 100) < docLineLastWrapped) ||
-                        (priorityWrapLineStart > docLastLineToWrap))) {
+                       (((priorityWrapLineStart + linesInOneCall) < wrapStart) ||
+                        (priorityWrapLineStart > wrapEnd))) {
                        // No priority wrap pending
                        return false;
                }
        }
        int goodTopLine = topLine;
        bool wrapOccurred = false;
-       if (docLineLastWrapped < pdoc->LinesTotal()) {
+       if (wrapStart <= pdoc->LinesTotal()) {
                if (wrapState == eWrapNone) {
                        if (wrapWidth != LineLayout::wrapWidthInfinite) {
                                wrapWidth = LineLayout::wrapWidthInfinite;
@@ -1549,8 +1541,11 @@ bool Editor::WrapLines(bool fullWrap, int priorityWrapLineStart) {
                                }
                                wrapOccurred = true;
                        }
-                       docLineLastWrapped = 0x7ffffff;
+                       wrapStart = wrapLineLarge;
+                       wrapEnd = wrapLineLarge;
                } else {
+                       if (wrapEnd >= pdoc->LinesTotal())
+                               wrapEnd = pdoc->LinesTotal();
                        //ElapsedTime et;
                        int lineDocTop = cs.DocFromDisplay(topLine);
                        int subLineTop = topLine - cs.DisplayFromDoc(lineDocTop);
@@ -1564,44 +1559,42 @@ bool Editor::WrapLines(bool fullWrap, int priorityWrapLineStart) {
                        AutoSurface surface(this);
                        if (surface) {
                                bool priorityWrap = false;
-                               int lastLineToWrap = docLastLineToWrap;
-                               int firstLineToWrap = docLineLastWrapped;
+                               int lastLineToWrap = wrapEnd;
+                               int lineToWrap = wrapStart;
                                if (!fullWrap) {
                                        if (priorityWrapLineStart >= 0) {
                                                // This is a priority wrap.
-                                               firstLineToWrap = priorityWrapLineStart;
-                                               lastLineToWrap = firstLineToWrap + 100;
+                                               lineToWrap = priorityWrapLineStart;
+                                               lastLineToWrap = priorityWrapLineStart + linesInOneCall;
                                                priorityWrap = true;
                                        } else {
                                                // This is idle wrap.
-                                               lastLineToWrap = docLineLastWrapped + 100;
+                                               lastLineToWrap = wrapStart + linesInOneCall;
                                        }
-                                       if (lastLineToWrap >= docLastLineToWrap)
-                                               lastLineToWrap = docLastLineToWrap;
+                                       if (lastLineToWrap >= wrapEnd)
+                                               lastLineToWrap = wrapEnd;
                                } // else do a fullWrap.
 
-                               // printf("Wraplines: full = %d, priorityStart = %d (wrapping: %d to %d)\n", fullWrap, priorityWrapLineStart, firstLineToWrap, lastLineToWrap);
-                               // printf("Pending wraps: %d to %d\n", docLineLastWrapped, docLastLineToWrap);
-                               while (firstLineToWrap < lastLineToWrap) {
-                                       firstLineToWrap++;
-                                       if (!priorityWrap)
-                                               docLineLastWrapped++;
-                                       if (firstLineToWrap < pdoc->LinesTotal()) {
-                                       AutoLineLayout ll(llc, RetrieveLineLayout(firstLineToWrap));
+                               // Platform::DebugPrintf("Wraplines: full = %d, priorityStart = %d (wrapping: %d to %d)\n", fullWrap, priorityWrapLineStart, lineToWrap, lastLineToWrap);
+                               // Platform::DebugPrintf("Pending wraps: %d to %d\n", wrapStart, wrapEnd);
+                               while (lineToWrap < lastLineToWrap) {
+                                       AutoLineLayout ll(llc, RetrieveLineLayout(lineToWrap));
                                        int linesWrapped = 1;
                                        if (ll) {
-                                               LayoutLine(firstLineToWrap, surface, vs, ll, wrapWidth);
+                                               LayoutLine(lineToWrap, surface, vs, ll, wrapWidth);
                                                linesWrapped = ll->lines;
                                        }
-                                       if (cs.SetHeight(firstLineToWrap, linesWrapped)) {
+                                       if (cs.SetHeight(lineToWrap, linesWrapped)) {
                                                wrapOccurred = true;
-                                               }
                                        }
+                                       lineToWrap++;
                                }
+                               if (!priorityWrap)
+                                       wrapStart = lineToWrap;
                                // If wrapping is done, bring it to resting position
-                               if (docLineLastWrapped > docLastLineToWrap) {
-                                       docLineLastWrapped = -1;
-                                       docLastLineToWrap = -1;
+                               if (wrapStart >= wrapEnd) {
+                                       wrapStart = wrapLineLarge;
+                                       wrapEnd = wrapLineLarge;
                                }
                        }
                        goodTopLine = cs.DisplayFromDoc(lineDocTop);
@@ -1673,6 +1666,7 @@ void Editor::LinesSplit(int pixelWidth) {
                                        targetEnd += static_cast<int>(strlen(eol));
                                }
                        }
+                       lineEnd = pdoc->LineFromPosition(targetEnd);
                }
                pdoc->EndUndoAction();
        }
@@ -1716,7 +1710,7 @@ void Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) {
                        rcSelMargin.left = rcSelMargin.right;
                        rcSelMargin.right = rcSelMargin.left + vs.ms[margin].width;
 
-                       if (vs.ms[margin].symbol) {
+                       if (vs.ms[margin].style != SC_MARGIN_NUMBER) {
                                /* alternate scheme:
                                if (vs.ms[margin].mask & SC_MASK_FOLDERS)
                                        surface->FillRectangle(rcSelMargin, vs.styles[STYLE_DEFAULT].back.allocated);
@@ -1727,8 +1721,21 @@ void Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) {
                                if (vs.ms[margin].mask & SC_MASK_FOLDERS)
                                        // Required because of special way brush is created for selection margin
                                        surface->FillRectangle(rcSelMargin, *pixmapSelPattern);
-                               else
-                                       surface->FillRectangle(rcSelMargin, vs.styles[STYLE_LINENUMBER].back.allocated);
+                               else {
+                                       ColourAllocated colour;
+                                       switch (vs.ms[margin].style) {
+                                       case SC_MARGIN_BACK:
+                                               colour = vs.styles[STYLE_DEFAULT].back.allocated;
+                                               break;
+                                       case SC_MARGIN_FORE:
+                                               colour = vs.styles[STYLE_DEFAULT].fore.allocated;
+                                               break;
+                                       default:
+                                               colour = vs.styles[STYLE_LINENUMBER].back.allocated;
+                                               break;
+                                       }
+                                       surface->FillRectangle(rcSelMargin, colour);
+                               }
                        } else {
                                surface->FillRectangle(rcSelMargin, vs.styles[STYLE_LINENUMBER].back.allocated);
                        }
@@ -1835,7 +1842,7 @@ void Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) {
                                PRectangle rcMarker = rcSelMargin;
                                rcMarker.top = yposScreen;
                                rcMarker.bottom = yposScreen + vs.lineHeight;
-                               if (!vs.ms[margin].symbol) {
+                               if (vs.ms[margin].style == SC_MARGIN_NUMBER) {
                                        char number[100];
                                        number[0] = '\0';
                                        if (firstSubLine)
@@ -2126,7 +2133,7 @@ void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayou
                                        continue;
                                }
                                if (p > 0) {
-                                       if (wrapState == eWrapChar){
+                                       if (wrapState == eWrapChar) {
                                                lastGoodBreak = pdoc->MovePositionOutsideChar(p + posLineStart, -1)
                                                                                                - posLineStart;
                                                p = pdoc->MovePositionOutsideChar(p + 1 + posLineStart, 1) - posLineStart;
@@ -2145,14 +2152,15 @@ void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayou
        }
 }
 
+ColourAllocated Editor::SelectionBackground(ViewStyle &vsDraw) {
+       return primarySelection ? vsDraw.selbackground.allocated : vsDraw.selbackground2.allocated;
+}
+
 ColourAllocated Editor::TextBackground(ViewStyle &vsDraw, bool overrideBackground,
                                        ColourAllocated background, bool inSelection, bool inHotspot, int styleMain, int i, LineLayout *ll) {
        if (inSelection) {
-               if (vsDraw.selbackset) {
-                       if (primarySelection)
-                               return vsDraw.selbackground.allocated;
-                       else
-                               return vsDraw.selbackground2.allocated;
+               if (vsDraw.selbackset && (vsDraw.selAlpha == SC_ALPHA_NOALPHA)) {
+                       return SelectionBackground(vsDraw);
                }
        } else {
                if ((vsDraw.edgeState == EDGE_BACKGROUND) &&
@@ -2204,7 +2212,7 @@ void Editor::DrawWrapMarker(Surface *surface, PRectangle rcPlace,
                    surface->LineTo(xBase + xDir * xRelative, yBase + yDir * yRelative);
                }
        };
-       Relative rel = {surface, x0, xStraight?1:-1, y0, yStraight?1:-1};
+       Relative rel = {surface, x0, xStraight ? 1 : -1, y0, yStraight ? 1 : -1};
 
        // arrow head
        rel.MoveTo(xa, y);
@@ -2220,6 +2228,12 @@ void Editor::DrawWrapMarker(Surface *surface, PRectangle rcPlace,
                        y - 2 * dy);
 }
 
+static void SimpleAlphaRectangle(Surface *surface, PRectangle rc, ColourAllocated fill, int alpha) {
+       if (alpha != SC_ALPHA_NOALPHA) {
+               surface->AlphaRectangle(rc, 0, fill, alpha, fill, alpha, 0);
+       }
+}
+
 void Editor::DrawEOL(Surface *surface, ViewStyle &vsDraw, PRectangle rcLine, LineLayout *ll,
                      int line, int lineEnd, int xStart, int subLine, int subLineStart,
                      bool overrideBackground, ColourAllocated background,
@@ -2236,15 +2250,17 @@ void Editor::DrawEOL(Surface *surface, ViewStyle &vsDraw, PRectangle rcLine, Lin
        bool eolInSelection = (subLine == (ll->lines - 1)) &&
                              (posLineEnd > ll->selStart) && (posLineEnd <= ll->selEnd) && (ll->selStart != ll->selEnd);
 
-       if (eolInSelection && vsDraw.selbackset && (line < pdoc->LinesTotal() - 1)) {
-               if (primarySelection)
-                       surface->FillRectangle(rcSegment, vsDraw.selbackground.allocated);
-               else
-                       surface->FillRectangle(rcSegment, vsDraw.selbackground2.allocated);
-       } else if (overrideBackground) {
-               surface->FillRectangle(rcSegment, background);
+       if (eolInSelection && vsDraw.selbackset && (line < pdoc->LinesTotal() - 1) && (vsDraw.selAlpha == SC_ALPHA_NOALPHA)) {
+               surface->FillRectangle(rcSegment, SelectionBackground(vsDraw));
        } else {
-               surface->FillRectangle(rcSegment, vsDraw.styles[ll->styles[ll->numCharsInLine] & styleMask].back.allocated);
+               if (overrideBackground) {
+                       surface->FillRectangle(rcSegment, background);
+               } else {
+                       surface->FillRectangle(rcSegment, vsDraw.styles[ll->styles[ll->numCharsInLine] & styleMask].back.allocated);
+               }
+               if (eolInSelection && vsDraw.selbackset && (line < pdoc->LinesTotal() - 1) && (vsDraw.selAlpha != SC_ALPHA_NOALPHA)) {
+                       SimpleAlphaRectangle(surface, rcSegment, SelectionBackground(vsDraw), vsDraw.selAlpha);
+               }
        }
 
        rcSegment.left = xEol + vsDraw.aveCharWidth + xStart;
@@ -2290,14 +2306,15 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis
        // the color for the highest numbered one is used.
        bool overrideBackground = false;
        ColourAllocated background;
-       if (caret.active && vsDraw.showCaretLineBackground && ll->containsCaret) {
+       if (caret.active && vsDraw.showCaretLineBackground && (vsDraw.caretLineAlpha == SC_ALPHA_NOALPHA) && ll->containsCaret) {
                overrideBackground = true;
                background = vsDraw.caretLineBackground.allocated;
        }
        if (!overrideBackground) {
                int marks = pdoc->GetMark(line);
                for (int markBit = 0; (markBit < 32) && marks; markBit++) {
-                       if ((marks & 1) && vsDraw.markers[markBit].markType == SC_MARK_BACKGROUND) {
+                       if ((marks & 1) && (vsDraw.markers[markBit].markType == SC_MARK_BACKGROUND) &&
+                               (vsDraw.markers[markBit].alpha == SC_ALPHA_NOALPHA)) {
                                background = vsDraw.markers[markBit].back.allocated;
                                overrideBackground = true;
                        }
@@ -2306,14 +2323,15 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis
        }
        if (!overrideBackground) {
                if (vsDraw.maskInLine) {
-                       int marks = pdoc->GetMark(line) & vsDraw.maskInLine;
-                       if (marks) {
-                               for (int markBit = 0; (markBit < 32) && marks; markBit++) {
-                                       if ((marks & 1) && (vsDraw.markers[markBit].markType != SC_MARK_EMPTY)) {
+                       int marksMasked = pdoc->GetMark(line) & vsDraw.maskInLine;
+                       if (marksMasked) {
+                               for (int markBit = 0; (markBit < 32) && marksMasked; markBit++) {
+                                       if ((marksMasked & 1) && (vsDraw.markers[markBit].markType != SC_MARK_EMPTY) &&
+                                               (vsDraw.markers[markBit].alpha == SC_ALPHA_NOALPHA)) {
                                                overrideBackground = true;
                                                background = vsDraw.markers[markBit].back.allocated;
                                        }
-                                       marks >>= 1;
+                                       marksMasked >>= 1;
                                }
                        }
                }
@@ -2641,6 +2659,15 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis
                        xStart, subLine, subLineStart, overrideBackground, background,
                        drawWrapMarkEnd, vsDraw.whitespaceForeground.allocated);
        }
+       if ((vsDraw.selAlpha != SC_ALPHA_NOALPHA) && (ll->selStart >= 0) && (ll->selEnd >= 0)) {
+               int startPosSel = (ll->selStart < posLineStart) ? posLineStart : ll->selStart;
+               int endPosSel = (ll->selEnd < (lineEnd + posLineStart)) ? ll->selEnd : (lineEnd + posLineStart);
+               if (startPosSel < endPosSel) {
+                       rcSegment.left = xStart + ll->positions[startPosSel - posLineStart] - subLineStart;
+                       rcSegment.right = xStart + ll->positions[endPosSel - posLineStart] - subLineStart;
+                       SimpleAlphaRectangle(surface, rcSegment, SelectionBackground(vsDraw), vsDraw.selAlpha);
+               }
+       }
 
        if (vsDraw.edgeState == EDGE_LINE) {
                int edgeX = theEdge * vsDraw.spaceWidth;
@@ -2648,6 +2675,31 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis
                rcSegment.right = rcSegment.left + 1;
                surface->FillRectangle(rcSegment, vsDraw.edgecolour.allocated);
        }
+
+       // Draw any translucent whole line states
+       rcSegment.left = xStart;
+       rcSegment.right = rcLine.right - 1;
+       if (caret.active && vsDraw.showCaretLineBackground && ll->containsCaret) {
+               SimpleAlphaRectangle(surface, rcSegment, vsDraw.caretLineBackground.allocated, vsDraw.caretLineAlpha);
+       }
+       int marks = pdoc->GetMark(line);
+       for (int markBit = 0; (markBit < 32) && marks; markBit++) {
+               if ((marks & 1) && (vsDraw.markers[markBit].markType == SC_MARK_BACKGROUND)) {
+                       SimpleAlphaRectangle(surface, rcSegment, vsDraw.markers[markBit].back.allocated, vsDraw.markers[markBit].alpha);
+               }
+               marks >>= 1;
+       }
+       if (vsDraw.maskInLine) {
+               int marksMasked = pdoc->GetMark(line) & vsDraw.maskInLine;
+               if (marksMasked) {
+                       for (int markBit = 0; (markBit < 32) && marksMasked; markBit++) {
+                               if ((marksMasked & 1) && (vsDraw.markers[markBit].markType != SC_MARK_EMPTY)) {
+                                       SimpleAlphaRectangle(surface, rcSegment, vsDraw.markers[markBit].back.allocated, vsDraw.markers[markBit].alpha);
+                               }
+                               marksMasked >>= 1;
+                       }
+               }
+       }
 }
 
 void Editor::RefreshPixMaps(Surface *surfaceWindow) {
@@ -2721,7 +2773,6 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
        //      paintingAllText, rcArea.left, rcArea.top, rcArea.right, rcArea.bottom);
 
        RefreshStyleData();
-
        RefreshPixMaps(surfaceWindow);
 
        PRectangle rcClient = GetClientRectangle();
@@ -2752,6 +2803,8 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
        if (needUpdateUI) {
                NotifyUpdateUI();
                needUpdateUI = false;
+               RefreshStyleData();
+               RefreshPixMaps(surfaceWindow);
        }
 
        // Call priority lines wrap on a window of lines which are likely
@@ -3063,7 +3116,7 @@ long Editor::FormatRange(bool draw, RangeToFormat *pfr) {
        // Printing supports only the line number margin.
        int lineNumberIndex = -1;
        for (int margin = 0; margin < ViewStyle::margins; margin++) {
-               if ((!vsPrint.ms[margin].symbol) && (vsPrint.ms[margin].width > 0)) {
+               if ((vsPrint.ms[margin].style == SC_MARGIN_NUMBER) && (vsPrint.ms[margin].width > 0)) {
                        lineNumberIndex = margin;
                } else {
                        vsPrint.ms[margin].width = 0;
@@ -3076,6 +3129,7 @@ long Editor::FormatRange(bool draw, RangeToFormat *pfr) {
        // Don't show the selection when printing
        vsPrint.selbackset = false;
        vsPrint.selforeset = false;
+       vsPrint.selAlpha = SC_ALPHA_NOALPHA;
        vsPrint.whitespaceBackgroundSet = false;
        vsPrint.whitespaceForegroundSet = false;
        vsPrint.showCaretLineBackground = false;
@@ -3662,19 +3716,8 @@ void Editor::CheckModificationForWrap(DocModification mh) {
                llc.Invalidate(LineLayout::llCheckTextAndStyle);
                if (wrapState != eWrapNone) {
                        int lineDoc = pdoc->LineFromPosition(mh.position);
-                       if (mh.linesAdded <= 0) {
-                               AutoSurface surface(this);
-                               AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc));
-                               if (surface && ll) {
-                                       LayoutLine(lineDoc, surface, vs, ll, wrapWidth);
-                                       if (cs.GetHeight(lineDoc) != ll->lines) {
-                                               NeedWrapping(lineDoc - 1, lineDoc + 1);
-                                               Redraw();
-                                       }
-                               }
-                       } else {
-                               NeedWrapping(lineDoc, lineDoc + 1 + mh.linesAdded);
-                       }
+                       int lines = Platform::Maximum(0, mh.linesAdded);
+                       NeedWrapping(lineDoc, lineDoc + lines + 1);
                }
        }
 }
@@ -3717,6 +3760,7 @@ void Editor::NotifyModified(Document*, DocModification mh, void *) {
                                InvalidateRange(mh.position, mh.position + mh.length);
                        }
                }
+               llc.Invalidate(LineLayout::llCheckTextAndStyle);
        } else {
                // Move selection and brace highlights
                if (mh.modificationType & SC_MOD_INSERTTEXT) {
@@ -4833,7 +4877,7 @@ void Editor::CopySelectionRange(SelectionText *ss) {
                                text[size] = '\0';
                        }
                }
-               ss->Set(text, size + 1, pdoc->dbcsCodePage,
+               ss->Set(text, size + 1, pdoc->dbcsCodePage,
                        vs.styles[STYLE_DEFAULT].characterSet, selType == selRectangle);
        }
 }
@@ -4849,7 +4893,7 @@ void Editor::CopyRangeToClipboard(int start, int end) {
 
 void Editor::CopyText(int length, const char *text) {
        SelectionText selectedText;
-       selectedText.Copy(text, length,
+       selectedText.Copy(text, length + 1,
                pdoc->dbcsCodePage, vs.styles[STYLE_DEFAULT].characterSet, false);
        CopyToClipboard(selectedText);
 }
@@ -5289,7 +5333,7 @@ void Editor::ButtonMove(Point pt) {
 }
 
 void Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) {
-        //Platform::DebugPrintf("ButtonUp %d\n", HaveMouseCapture());
+       //Platform::DebugPrintf("ButtonUp %d\n", HaveMouseCapture());
        if (HaveMouseCapture()) {
                if (PointInSelMargin(pt)) {
                        DisplayCursor(Window::cursorReverseArrow);
@@ -5377,13 +5421,13 @@ bool Editor::Idle() {
 
        bool idleDone;
 
-       bool wrappingDone = (wrapState == eWrapNone) || (!backgroundWrapEnabled);
+       bool wrappingDone = wrapState == eWrapNone;
 
        if (!wrappingDone) {
                // Wrap lines during idle.
                WrapLines(false, -1);
                // No more wrapping
-               if (docLineLastWrapped == docLastLineToWrap)
+               if (wrapStart == wrapEnd)
                        wrappingDone = true;
        }
 
@@ -6038,14 +6082,14 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                        pdoc->SetDefaultCharClasses(false);
                        if (lParam == 0)
                                return 0;
-                       pdoc->SetCharClasses(reinterpret_cast<unsigned char *>(lParam), Document::ccWord);
+                       pdoc->SetCharClasses(reinterpret_cast<unsigned char *>(lParam), CharClassify::ccWord);
                }
                break;
 
        case SCI_SETWHITESPACECHARS: {
                        if (lParam == 0)
                                return 0;
-                       pdoc->SetCharClasses(reinterpret_cast<unsigned char *>(lParam), Document::ccSpace);
+                       pdoc->SetCharClasses(reinterpret_cast<unsigned char *>(lParam), CharClassify::ccSpace);
                }
                break;
 
@@ -6305,16 +6349,16 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                return pdoc->ExtendWordSelect(wParam, 1, lParam != 0);
 
        case SCI_SETWRAPMODE:
-               switch(wParam){
-                       case SC_WRAP_WORD:
-                               wrapState = eWrapWord;
-                               break;
-                       case SC_WRAP_CHAR:
-                               wrapState = eWrapChar;
-                               break;
-                       default:
-                               wrapState = eWrapNone;
-                               break;
+               switch (wParam) {
+               case SC_WRAP_WORD:
+                       wrapState = eWrapWord;
+                       break;
+               case SC_WRAP_CHAR:
+                       wrapState = eWrapChar;
+                       break;
+               default:
+                       wrapState = eWrapNone;
+                       break;
                }
                xOffset = 0;
                InvalidateStyleRedraw();
@@ -6465,8 +6509,10 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                return pdoc->LineEnd(wParam);
 
        case SCI_SETCODEPAGE:
-               pdoc->dbcsCodePage = wParam;
-               InvalidateStyleRedraw();
+               if (ValidCodePage(wParam)) {
+                       pdoc->dbcsCodePage = wParam;
+                       InvalidateStyleRedraw();
+               }
                break;
 
        case SCI_GETCODEPAGE:
@@ -6499,6 +6545,11 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                InvalidateStyleData();
                RedrawSelMargin();
                break;
+       case SCI_MARKERSETALPHA:
+               if (wParam <= MARKER_MAX)
+                       vs.markers[wParam].alpha = lParam;
+               InvalidateStyleRedraw();
+               break;
        case SCI_MARKERADD: {
                        int markerID = pdoc->AddMark(wParam, lParam);
                        return markerID;
@@ -6546,14 +6597,14 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
 
        case SCI_SETMARGINTYPEN:
                if (ValidMargin(wParam)) {
-                       vs.ms[wParam].symbol = (lParam == SC_MARGIN_SYMBOL);
+                       vs.ms[wParam].style = lParam;
                        InvalidateStyleRedraw();
                }
                break;
 
        case SCI_GETMARGINTYPEN:
                if (ValidMargin(wParam))
-                       return vs.ms[wParam].symbol ? SC_MARGIN_SYMBOL : SC_MARGIN_NUMBER;
+                       return vs.ms[wParam].style;
                else
                        return 0;
 
@@ -6717,6 +6768,12 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                vs.caretLineBackground.desired = wParam;
                InvalidateStyleRedraw();
                break;
+       case SCI_GETCARETLINEBACKALPHA:
+               return vs.caretLineAlpha;
+       case SCI_SETCARETLINEBACKALPHA:
+               vs.caretLineAlpha = wParam;
+               InvalidateStyleRedraw();
+               break;
 
                // Folding messages
 
@@ -6831,6 +6888,14 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                InvalidateStyleRedraw();
                break;
 
+       case SCI_SETSELALPHA:
+               vs.selAlpha = wParam;
+               InvalidateStyleRedraw();
+               break;
+
+       case SCI_GETSELALPHA:
+               return vs.selAlpha;
+
        case SCI_SETWHITESPACEFORE:
                vs.whitespaceForegroundSet = wParam != 0;
                vs.whitespaceForeground.desired = ColourDesired(lParam);
index 9243d3a2f42cf433ade40a24c2b170208b0c975d..fe7be268ae43ad8c169c117f0e2e7a9d306d6990 100644 (file)
@@ -305,10 +305,10 @@ protected:        // ScintillaBase subclass needs access to much of Editor
 
        // Wrapping support
        enum { eWrapNone, eWrapWord, eWrapChar } wrapState;
-       bool backgroundWrapEnabled;
+       enum { wrapLineLarge = 0x7ffffff };
        int wrapWidth;
-       int docLineLastWrapped;
-       int docLastLineToWrap;
+       int wrapStart;
+       int wrapEnd;
        int wrapVisualFlags;
        int wrapVisualFlagsLocation;
        int wrapVisualStartIndent;
@@ -377,7 +377,7 @@ protected:  // ScintillaBase subclass needs access to much of Editor
        void InvalidateCaret();
        virtual void UpdateSystemCaret();
 
-       void NeedWrapping(int docLineStartWrapping = 0, int docLineEndWrapping = 0x7ffffff);
+       void NeedWrapping(int docLineStart = 0, int docLineEnd = wrapLineLarge);
        bool WrapLines(bool fullWrap, int priorityWrapLineStart);
        void LinesJoin();
        void LinesSplit(int pixelWidth);
@@ -387,6 +387,7 @@ protected:  // ScintillaBase subclass needs access to much of Editor
        LineLayout *RetrieveLineLayout(int lineNumber);
        void LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayout *ll,
                int width=LineLayout::wrapWidthInfinite);
+       ColourAllocated SelectionBackground(ViewStyle &vsDraw);
        ColourAllocated TextBackground(ViewStyle &vsDraw, bool overrideBackground, ColourAllocated background, bool inSelection, bool inHotspot, int styleMain, int i, LineLayout *ll);
        void DrawIndentGuide(Surface *surface, int lineVisible, int lineHeight, int start, PRectangle rcSegment, bool highlight);
        void DrawWrapMarker(Surface *surface, PRectangle rcPlace, bool isEndMarker, ColourAllocated wrapColour);
@@ -524,6 +525,7 @@ protected:  // ScintillaBase subclass needs access to much of Editor
        void GetHotSpotRange(int& hsStart, int& hsEnd);
 
        int CodePage() const;
+       virtual bool ValidCodePage(int /* codePage */) const { return true; }
        int WrapCount(int line);
 
        virtual sptr_t DefWndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) = 0;
index 752118b7706251c005894feadf34d9ef5120b064..acf45bc2d53ae23b7a23c7364e78d8a5bd92319a 100644 (file)
@@ -12,6 +12,8 @@
 
 #include "Platform.h"
 
+#include "Scintilla.h"
+
 #include "SciLexer.h"
 #include "PropSet.h"
 #include "Accessor.h"
@@ -116,16 +118,16 @@ LexerLibrary::LexerLibrary(const char* ModuleName) {
        if (lib->IsValid()) {
                m_sModuleName = ModuleName;
                //Cannot use reinterpret_cast because: ANSI C++ forbids casting between pointers to functions and objects
-               GetLexerCountFn GetLexerCount = (GetLexerCountFn)lib->FindFunction("GetLexerCount");
+               GetLexerCountFn GetLexerCount = (GetLexerCountFn)(sptr_t)lib->FindFunction("GetLexerCount");
 
                if (GetLexerCount) {
                        ExternalLexerModule *lex;
                        LexerMinder *lm;
 
                        // Find functions in the DLL
-                       GetLexerNameFn GetLexerName = (GetLexerNameFn)lib->FindFunction("GetLexerName");
-                       ExtLexerFunction Lexer = (ExtLexerFunction)lib->FindFunction("Lex");
-                       ExtFoldFunction Folder = (ExtFoldFunction)lib->FindFunction("Fold");
+                       GetLexerNameFn GetLexerName = (GetLexerNameFn)(sptr_t)lib->FindFunction("GetLexerName");
+                       ExtLexerFunction Lexer = (ExtLexerFunction)(sptr_t)lib->FindFunction("Lex");
+                       ExtFoldFunction Folder = (ExtFoldFunction)(sptr_t)lib->FindFunction("Fold");
 
                        // Assign a buffer for the lexer name.
                        char lexname[100];
index a42abb2037de1583aec37833bad773f3f1bd17f0..7624a4a5255ed53e2284b703d3be5a1ca8f0e8cb 100644 (file)
@@ -63,6 +63,12 @@ void Indicator::Draw(Surface *surface, const PRectangle &rc, const PRectangle &r
                surface->LineTo(rc.right, rcLine.top+1);
                surface->LineTo(rc.left, rcLine.top+1);
                surface->LineTo(rc.left, ymid+1);
+       } else if (style == INDIC_ROUNDBOX) {
+               PRectangle rcBox = rcLine;
+               rcBox.top = rcLine.top + 1;
+               rcBox.left = rc.left;
+               rcBox.right = rc.right;
+               surface->AlphaRectangle(rcBox, 1, fore.allocated, 30, fore.allocated, 50, 0);
        } else {        // Either INDIC_PLAIN or unknown
                surface->MoveTo(rc.left, ymid);
                surface->LineTo(rc.right, ymid);
index 1ffc4fb5f89e73cb59b1c917c840481d46f48b12..f82eb7df6775fc05ef4eae5578636fee0fca480d 100644 (file)
@@ -171,6 +171,7 @@ int Scintilla_LinkLexers() {
        LINK_LEXER(lmGui4Cli);
        LINK_LEXER(lmHaskell);
        LINK_LEXER(lmHTML);
+       LINK_LEXER(lmInno);
        LINK_LEXER(lmKix);
        LINK_LEXER(lmLatex);
        LINK_LEXER(lmLISP);
@@ -186,6 +187,7 @@ int Scintilla_LinkLexers() {
        LINK_LEXER(lmNsis);
        LINK_LEXER(lmNull);
        LINK_LEXER(lmOctave);
+       LINK_LEXER(lmOpal);
        LINK_LEXER(lmPascal);
        LINK_LEXER(lmPB);
        LINK_LEXER(lmPerl);
@@ -201,6 +203,7 @@ int Scintilla_LinkLexers() {
        LINK_LEXER(lmScriptol);
        LINK_LEXER(lmSmalltalk);
        LINK_LEXER(lmSpecman);
+       LINK_LEXER(lmSpice);
        LINK_LEXER(lmSQL);
        LINK_LEXER(lmTADS3);
        LINK_LEXER(lmTCL);
index ee547f497fb0665a0fa1bf1ce1b746356b8b0899..2bc2e0f4bc1f4768d6ec9818d353df3fe63b7a20 100644 (file)
@@ -39,6 +39,9 @@
 // May 23, 2005   - Fixed the SentKey lexing in case of a missing }
 // Aug 11, 2005   - Fixed possible bug with s_save length > 100.
 // Aug 23, 2005   - Added Switch/endswitch support to the folding logic.
+// Sep 27, 2005   - Fixed the SentKey lexing logic in case of multiple sentkeys.
+// Mar 12, 2006   - Fixed issue with <> coloring as String in stead of Operator in rare occasions.
+// Apr  8, 2006   - Added support for AutoIt3 Standard UDF library (SCE_AU3_UDF)
 //
 // Copyright for Scintilla: 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
@@ -92,6 +95,7 @@ static inline bool IsAOperator(char ch) {
 static int GetSendKey(const char *szLine, char *szKey)
 {
        int             nFlag   = 0;
+       int             nStartFound     = 0;
        int             nKeyPos = 0;
        int             nSpecPos= 0;
        int             nSpecNum= 1;
@@ -102,31 +106,34 @@ static int GetSendKey(const char *szLine, char *szKey)
        // split the portion of the sendkey in the part before and after the spaces
        while ( ( (cTemp = szLine[nPos]) != '\0'))
        {
-               // skip leading Ctrl/Shift/ALt state
-               if ((cTemp == '#' || cTemp == '!' || cTemp == '^') && (szLine[nPos+1] == '{') ) 
-               {
-               }       
-               else if ((cTemp == ' ') && (nFlag == 0) ) // get the stuff till first space
-               {
-                       nFlag = 1;
-                       // Add } to the end of the first bit for table lookup later.
-                       szKey[nKeyPos++] = '}';
-               }
-               else if (cTemp == ' ')
-               {
-                       // skip other spaces 
+               // skip leading Ctrl/Shift/Alt state
+               if (cTemp == '{') {
+                       nStartFound = 1;
                }
-               else if (nFlag == 0)
-               {
-                       // save first portion into var till space or } is hit
-                       szKey[nKeyPos++] = cTemp;
-               }
-               else if ((nFlag == 1) && (cTemp != '}'))
-               {
-                       // Save second portion into var...
-                       szSpecial[nSpecPos++] = cTemp;
-                       // check if Second portion is all numbers for repeat fuction
-                       if (isdigit(cTemp) == false) {nSpecNum = 0;} 
+               //
+               if (nStartFound == 1) {
+                       if ((cTemp == ' ') && (nFlag == 0) ) // get the stuff till first space
+                       {
+                               nFlag = 1;
+                               // Add } to the end of the first bit for table lookup later.
+                               szKey[nKeyPos++] = '}';
+                       }
+                       else if (cTemp == ' ')
+                       {
+                               // skip other spaces 
+                       }
+                       else if (nFlag == 0)
+                       {
+                               // save first portion into var till space or } is hit
+                               szKey[nKeyPos++] = cTemp;
+                       }
+                       else if ((nFlag == 1) && (cTemp != '}'))
+                       {
+                               // Save second portion into var...
+                               szSpecial[nSpecPos++] = cTemp;
+                               // check if Second portion is all numbers for repeat fuction
+                               if (isdigit(cTemp) == false) {nSpecNum = 0;} 
+                       }
                }
                nPos++;                                                                 // skip to next char
 
@@ -190,6 +197,7 @@ static void ColouriseAU3Doc(unsigned int startPos,
     WordList &keywords5 = *keywordlists[4];
     WordList &keywords6 = *keywordlists[5];
     WordList &keywords7 = *keywordlists[6];
+    WordList &keywords8 = *keywordlists[7];
        // find the first previous line without continuation character at the end
        int lineCurrent = styler.GetLine(startPos);
        int s_startPos = startPos;
@@ -325,6 +333,10 @@ static void ColouriseAU3Doc(unsigned int startPos,
                                                        sc.ChangeState(SCE_AU3_EXPAND);
                                                        sc.SetState(SCE_AU3_DEFAULT);
                                                }
+                                               else if (keywords8.InList(s)) {
+                                                       sc.ChangeState(SCE_AU3_UDF);
+                                                       sc.SetState(SCE_AU3_DEFAULT);
+                                               }
                                                else if (strcmp(s, "_") == 0) {
                                                        sc.ChangeState(SCE_AU3_OPERATOR);
                                                        sc.SetState(SCE_AU3_DEFAULT);
@@ -411,9 +423,11 @@ static void ColouriseAU3Doc(unsigned int startPos,
                    if ((si == 1 && sc.ch == '\"') || (si == 2 && sc.ch == '\'') || (si == 3 && sc.ch == '>'))
                                {
                                        sc.ForwardSetState(SCE_AU3_DEFAULT);
+                                       si=0;
                                }
                 if (sc.atLineEnd)
                                {
+                                       si=0;
                                        // at line end and not found a continuation char then reset to default
                                        int lineCurrent = styler.GetLine(sc.currentPos);
                                        if (!IsContinuationLine(lineCurrent,styler)) 
@@ -422,11 +436,8 @@ static void ColouriseAU3Doc(unsigned int startPos,
                                        }
                                }
                                // find Sendkeys in a STRING
-                               if (sc.ch == '{') {sc.SetState(SCE_AU3_SENT);}
-                               if (sc.ch == '+' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
-                               if (sc.ch == '!' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
-                               if (sc.ch == '^' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
-                               if (sc.ch == '#' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
+                               if (sc.ch == '{' || sc.ch == '+' || sc.ch == '!' || sc.ch == '^' || sc.ch == '#' ) {
+                                       sc.SetState(SCE_AU3_SENT);}
                                break;
             }
             
@@ -459,6 +470,35 @@ static void ColouriseAU3Doc(unsigned int startPos,
                                        }
                                        sc.SetState(SCE_AU3_STRING);
                                }
+                               else
+                               {
+                                       // check if the start is a valid SendKey start
+                                       int             nPos    = 0;
+                                       int             nState  = 1;
+                                       char    cTemp;
+                                       while (!(nState == 2) && ((cTemp = s[nPos]) != '\0')) 
+                                       {
+                                               if (cTemp == '{' && nState == 1) 
+                                               {
+                                                       nState = 2;
+                                               }
+                                               if (nState == 1 && !(cTemp == '+' || cTemp == '!' || cTemp == '^' || cTemp == '#' ))
+                                               {
+                                                       nState = 0;
+                                               }
+                                               nPos++;
+                                       }
+                                       //Verify characters infront of { ... if not assume  regular string
+                                       if (nState == 1 && (!(sc.ch == '{' || sc.ch == '+' || sc.ch == '!' || sc.ch == '^' || sc.ch == '#' ))) {
+                                               sc.ChangeState(SCE_AU3_STRING);
+                                               sc.SetState(SCE_AU3_STRING);
+                                       }
+                                       // If invalid character found then assume its a regular string  
+                                       if (nState == 0) {
+                                               sc.ChangeState(SCE_AU3_STRING);
+                                               sc.SetState(SCE_AU3_STRING);
+                                       }
+                               }
                                // check if next portion is again a sendkey
                                if (sc.atLineEnd) 
                                {
@@ -466,13 +506,12 @@ static void ColouriseAU3Doc(unsigned int startPos,
                                        sc.SetState(SCE_AU3_DEFAULT);
                                        si = 0;  // reset string indicator
                                }
-                               //if (sc.ch == '{' && sc.chPrev != '{') {sc.SetState(SCE_AU3_SENT);}
-                               if (sc.ch == '+' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
-                               if (sc.ch == '!' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
-                               if (sc.ch == '^' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
-                               if (sc.ch == '#' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
+                               //* check in next characters following a sentkey are again a sent key
+                               // Need this test incase of 2 sentkeys like {F1}{ENTER} but not detect {{}
+                               if (sc.state == SCE_AU3_STRING && (sc.ch == '{' || sc.ch == '+' || sc.ch == '!' || sc.ch == '^' || sc.ch == '#' )) {
+                                       sc.SetState(SCE_AU3_SENT);}
                                // check to see if the string ended...
-                               // Sentkey string isn't complete but the string ended....
+                               // Sendkey string isn't complete but the string ended....
                                if ((si == 1 && sc.ch == '\"') || (si == 2 && sc.ch == '\''))
                                {
                                        sc.ChangeState(SCE_AU3_STRING);
@@ -491,6 +530,7 @@ static void ColouriseAU3Doc(unsigned int startPos,
             else if (sc.ch == '$') {sc.SetState(SCE_AU3_VARIABLE);}
             else if (sc.ch == '.' && !IsADigit(sc.chNext)) {sc.SetState(SCE_AU3_OPERATOR);}
             else if (sc.ch == '@') {sc.SetState(SCE_AU3_KEYWORD);}
+            //else if (sc.ch == '_') {sc.SetState(SCE_AU3_KEYWORD);}
             else if (sc.ch == '<' && si==3) {sc.SetState(SCE_AU3_STRING);}  // string after #include 
             else if (sc.ch == '\"') {
                                sc.SetState(SCE_AU3_STRING);
@@ -543,6 +583,10 @@ static void ColouriseAU3Doc(unsigned int startPos,
                        sc.ChangeState(SCE_AU3_EXPAND);
                        sc.SetState(SCE_AU3_EXPAND);
                }
+               else if (keywords8.InList(s_save)) {
+                       sc.ChangeState(SCE_AU3_UDF);
+                       sc.SetState(SCE_AU3_UDF);
+               }
                else {
                        sc.ChangeState(SCE_AU3_DEFAULT);
                        sc.SetState(SCE_AU3_DEFAULT);
@@ -841,6 +885,7 @@ static const char * const AU3WordLists[] = {
     "#autoit Pre-processors",
     "#autoit Special",
     "#autoit Expand",
+    "#autoit UDF",
     0
 };
 LexerModule lmAU3(SCLEX_AU3, ColouriseAU3Doc, "au3", FoldAU3Doc , AU3WordLists);
index 903d793bb0b7b5551cbbcabe39eda665ffb083f1..e9c31d6b38fad7f73ec121ac1bf8c2cee4eff234 100644 (file)
@@ -258,7 +258,8 @@ static void ColouriseBashDoc(unsigned int startPos, int length, int initStyle,
 
                if (state == SCE_SH_DEFAULT) {
                        if (ch == '\\') {       // escaped character
-                               i++;
+                               if (i < lengthDoc - 1)
+                                       i++;
                                ch = chNext;
                                chNext = chNext2;
                                styler.ColourTo(i, SCE_SH_IDENTIFIER);
@@ -626,7 +627,7 @@ static void FoldBashDoc(unsigned int startPos, int length, int, WordList *[],
                      && !IsCommentLine(lineCurrent+1, styler))
                 levelCurrent--;
         }
-               if (style == SCE_C_OPERATOR) {
+               if (style == SCE_SH_OPERATOR) {
                        if (ch == '{') {
                                levelCurrent++;
                        } else if (ch == '}') {
index 4a1843aa0d05805a9fa203707549ff5a710cdbce..79ba2b89116bc5199f7ed385d524204f6b6d31c4 100644 (file)
@@ -147,7 +147,7 @@ static void ColouriseBasicDoc(unsigned int startPos, int length, int initStyle,
                                sc.ChangeState(SCE_B_ERROR);
                                sc.SetState(SCE_B_DEFAULT);
                        }
-               } else if (sc.state == SCE_B_COMMENT) {
+               } else if (sc.state == SCE_B_COMMENT || sc.state == SCE_B_PREPROCESSOR) {
                        if (sc.atLineEnd) {
                                sc.SetState(SCE_B_DEFAULT);
                        }
@@ -163,7 +163,12 @@ static void ColouriseBasicDoc(unsigned int startPos, int length, int initStyle,
                                wasfirst = isfirst;
                                sc.SetState(SCE_B_IDENTIFIER);
                        } else if (sc.Match(comment_char)) {
-                               sc.SetState(SCE_B_COMMENT);
+                               // Hack to make deprecated QBASIC '$Include show
+                               // up in freebasic with SCE_B_PREPROCESSOR.
+                               if (comment_char == '\'' && sc.Match(comment_char, '$'))
+                                       sc.SetState(SCE_B_PREPROCESSOR);
+                               else
+                                       sc.SetState(SCE_B_COMMENT);
                        } else if (sc.Match('"')) {
                                sc.SetState(SCE_B_STRING);
                        } else if (IsDigit(sc.ch)) {
index 40f3a60bd37a4f3451cd3211d8acff13dd8e2f3c..bf089d6cff1110712df160df04203c4be8c9cdf7 100644 (file)
@@ -459,4 +459,3 @@ static void ColouriseCppDocInsensitive(unsigned int startPos, int length, int in
 
 LexerModule lmCPP(SCLEX_CPP, ColouriseCppDocSensitive, "cpp", FoldCppDoc, cppWordLists);
 LexerModule lmCPPNoCase(SCLEX_CPPNOCASE, ColouriseCppDocInsensitive, "cppnocase", FoldCppDoc, cppWordLists);
-LexerModule lmTCL(SCLEX_TCL, ColouriseCppDocSensitive, "tcl", FoldCppDoc, cppWordLists);
index e9e154cd5f64b8eb8051aa11c7ccbf8ad08a0cda..4aed7c6af1aaa768e0c76fb727fbbf66e02cb02e 100644 (file)
@@ -32,7 +32,7 @@ static inline bool isEiffelOperator(unsigned int ch) {
 }
 
 static inline bool IsAWordChar(unsigned int  ch) {
-       return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
+       return (ch < 0x80) && (isalnum(ch) || ch == '_');
 }
 
 static inline bool IsAWordStart(unsigned int ch) {
index d830a46439e822b5a0704ccbd29d27152a618b81..dad8fce46fcb99ce5502185e324c3a0a05dee32b 100644 (file)
@@ -149,7 +149,13 @@ static inline bool isStringState(int state) {
        case SCE_HB_STRING:
        case SCE_HBA_STRING:
        case SCE_HP_STRING:
+       case SCE_HP_CHARACTER:
+       case SCE_HP_TRIPLE:
+       case SCE_HP_TRIPLEDOUBLE:
        case SCE_HPA_STRING:
+       case SCE_HPA_CHARACTER:
+       case SCE_HPA_TRIPLE:
+       case SCE_HPA_TRIPLEDOUBLE:
        case SCE_HPHP_HSTRING:
        case SCE_HPHP_SIMPLESTRING:
        case SCE_HPHP_HSTRING_VARIABLE:
@@ -163,6 +169,19 @@ static inline bool isStringState(int state) {
        return bResult;
 }
 
+static inline bool stateAllowsTermination(int state) {
+       bool allowTermination = !isStringState(state);
+       if (allowTermination) {
+               switch (state) {
+               case SCE_HPHP_COMMENT:
+               case SCE_HP_COMMENTLINE:
+               case SCE_HPA_COMMENTLINE:
+                       allowTermination = false;
+               }
+       }
+       return allowTermination;
+}
+
 // not really well done, since it's only comments that should lex the %> and <%
 static inline bool isCommentASPState(int state) {
        bool bResult;
@@ -668,7 +687,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
                         (ch == '<') &&
                         (chNext == '?') &&
                                 !IsScriptCommentState(state) ) {
-                       scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment() + 2, i + 10, eScriptPHP);
+                       scriptLanguage = segIsScriptingIndicator(styler, i + 2, i + 10, eScriptPHP);
                        if (scriptLanguage != eScriptPHP && isStringState(state)) continue;
                        styler.ColourTo(i - 1, StateToPrint);
                        beforePreProc = state;
@@ -763,9 +782,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
                else if ((
                             ((inScriptType == eNonHtmlPreProc)
                              || (inScriptType == eNonHtmlScriptPreProc)) && (
-                                ((scriptLanguage == eScriptPHP) && (ch == '?') && !isPHPStringState(state) && (state != SCE_HPHP_COMMENT)) ||
-                                ((scriptLanguage != eScriptNone) && !isStringState(state) &&
-                                 ((ch == '%') || (ch == '?')))
+                                ((scriptLanguage != eScriptNone) && stateAllowsTermination(state) && ((ch == '%') || (ch == '?')))
                             ) && (chNext == '>')) ||
                         ((scriptLanguage == eScriptSGML) && (ch == '>') && (state != SCE_H_SGML_COMMENT))) {
                        if (state == SCE_H_ASPAT) {
diff --git a/contrib/src/stc/scintilla/src/LexInno.cxx b/contrib/src/stc/scintilla/src/LexInno.cxx
new file mode 100644 (file)
index 0000000..ff99da7
--- /dev/null
@@ -0,0 +1,290 @@
+// Scintilla source code edit control
+/** @file LexInno.cxx
+ ** Lexer for Inno Setup scripts.
+ **/
+// Written by Friedrich Vedder <fvedd@t-online.de>, using code from LexOthers.cxx.
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+static void ColouriseInnoDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler) {
+       int state = SCE_INNO_DEFAULT;
+       char chPrev;
+       char ch = 0;
+       char chNext = styler[startPos];
+       int lengthDoc = startPos + length;
+       char *buffer = new char[length];
+       int bufferCount = 0;
+       bool isBOL, isEOL, isWS, isBOLWS = 0;
+
+       WordList &sectionKeywords = *keywordLists[0];
+       WordList &standardKeywords = *keywordLists[1];
+       WordList &parameterKeywords = *keywordLists[2];
+       WordList &preprocessorKeywords = *keywordLists[3];
+       WordList &pascalKeywords = *keywordLists[4];
+       WordList &userKeywords = *keywordLists[5];
+
+       // 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++) {
+               chPrev = ch;
+               ch = chNext;
+               chNext = styler.SafeGetCharAt(i + 1);
+
+               if (styler.IsLeadByte(ch)) {
+                       chNext = styler.SafeGetCharAt(i + 2);
+                       i++;
+                       continue;
+               }
+
+               isBOL = (chPrev == 0) || (chPrev == '\n') || (chPrev == '\r' && ch != '\n');
+               isBOLWS = (isBOL) ? 1 : (isBOLWS && (chPrev == ' ' || chPrev == '\t'));
+               isEOL = (ch == '\n' || ch == '\r');
+               isWS = (ch == ' ' || ch == '\t');
+
+               switch(state) {
+                       case SCE_INNO_DEFAULT:
+                               if (ch == ';' && isBOLWS) {
+                                       // Start of a comment
+                                       state = SCE_INNO_COMMENT;
+                               } else if (ch == '[' && isBOLWS) {
+                                       // Start of a section name
+                                       bufferCount = 0;
+                                       state = SCE_INNO_SECTION;
+                               } else if (ch == '#' && isBOLWS) {
+                                       // Start of a preprocessor directive
+                                       state = SCE_INNO_PREPROC;
+                               } else if (ch == '{' && chNext == '#') {
+                                       // Start of a preprocessor inline directive
+                                       state = SCE_INNO_PREPROC_INLINE;
+                               } else if ((ch == '{' && (chNext == ' ' || chNext == '\t'))
+                                          || (ch == '(' && chNext == '*')) {
+                                       // Start of a Pascal comment
+                                       state = SCE_INNO_COMMENT_PASCAL;
+                               } else if (ch == '"') {
+                                       // Start of a double-quote string
+                                       state = SCE_INNO_STRING_DOUBLE;
+                               } else if (ch == '\'') {
+                                       // Start of a single-quote string
+                                       state = SCE_INNO_STRING_SINGLE;
+                               } else if (isascii(ch) && (isalpha(ch) || (ch == '_'))) {
+                                       // Start of an identifier
+                                       bufferCount = 0;
+                                       buffer[bufferCount++] = static_cast<char>(tolower(ch));
+                                       state = SCE_INNO_IDENTIFIER;
+                               } else {
+                                       // Style it the default style
+                                       styler.ColourTo(i,SCE_INNO_DEFAULT);
+                               }
+                               break;
+
+                       case SCE_INNO_COMMENT:
+                               if (isEOL) {
+                                       state = SCE_INNO_DEFAULT;
+                                       styler.ColourTo(i,SCE_INNO_COMMENT);
+                               }
+                               break;
+
+                       case SCE_INNO_IDENTIFIER:
+                               if (isascii(ch) && (isalnum(ch) || (ch == '_'))) {
+                                       buffer[bufferCount++] = static_cast<char>(tolower(ch));
+                               } else {
+                                       state = SCE_INNO_DEFAULT;
+                                       buffer[bufferCount] = '\0';
+
+                                       // Check if the buffer contains a keyword
+                                       if (standardKeywords.InList(buffer)) {
+                                               styler.ColourTo(i-1,SCE_INNO_KEYWORD);
+                                       } else if (parameterKeywords.InList(buffer)) {
+                                               styler.ColourTo(i-1,SCE_INNO_PARAMETER);
+                                       } else if (pascalKeywords.InList(buffer)) {
+                                               styler.ColourTo(i-1,SCE_INNO_KEYWORD_PASCAL);
+                                       } else if (userKeywords.InList(buffer)) {
+                                               styler.ColourTo(i-1,SCE_INNO_KEYWORD_USER);
+                                       } else {
+                                               styler.ColourTo(i-1,SCE_INNO_DEFAULT);
+                                       }
+
+                                       // Push back the faulty character
+                                       chNext = styler[i--];
+                                       ch = chPrev;
+                               }
+                               break;
+
+                       case SCE_INNO_SECTION:
+                               if (ch == ']') {
+                                       state = SCE_INNO_DEFAULT;
+                                       buffer[bufferCount] = '\0';
+
+                                       // Check if the buffer contains a section name
+                                       if (sectionKeywords.InList(buffer)) {
+                                               styler.ColourTo(i,SCE_INNO_SECTION);
+                                       } else {
+                                               styler.ColourTo(i,SCE_INNO_DEFAULT);
+                                       }
+                               } else if (isascii(ch) && (isalnum(ch) || (ch == '_'))) {
+                                       buffer[bufferCount++] = static_cast<char>(tolower(ch));
+                               } else {
+                                       state = SCE_INNO_DEFAULT;
+                                       styler.ColourTo(i,SCE_INNO_DEFAULT);
+                               }
+                               break;
+
+                       case SCE_INNO_PREPROC:
+                               if (isWS || isEOL) {
+                                       if (isascii(chPrev) && isalpha(chPrev)) {
+                                               state = SCE_INNO_DEFAULT;
+                                               buffer[bufferCount] = '\0';
+
+                                               // Check if the buffer contains a preprocessor directive
+                                               if (preprocessorKeywords.InList(buffer)) {
+                                                       styler.ColourTo(i-1,SCE_INNO_PREPROC);
+                                               } else {
+                                                       styler.ColourTo(i-1,SCE_INNO_DEFAULT);
+                                               }
+
+                                               // Push back the faulty character
+                                               chNext = styler[i--];
+                                               ch = chPrev;
+                                       }
+                               } else if (isascii(ch) && isalpha(ch)) {
+                                       if (chPrev == '#' || chPrev == ' ' || chPrev == '\t')
+                                               bufferCount = 0;
+                                       buffer[bufferCount++] = static_cast<char>(tolower(ch));
+                               }
+                               break;
+
+                       case SCE_INNO_STRING_DOUBLE:
+                               if (ch == '"' || isEOL) {
+                                       state = SCE_INNO_DEFAULT;
+                                       styler.ColourTo(i,SCE_INNO_DEFAULT);
+                               }
+                               break;
+
+                       case SCE_INNO_STRING_SINGLE:
+                               if (ch == '\'' || isEOL) {
+                                       state = SCE_INNO_DEFAULT;
+                                       styler.ColourTo(i,SCE_INNO_DEFAULT);
+                               }
+                               break;
+
+                       case SCE_INNO_PREPROC_INLINE:
+                               if (ch == '}') {
+                                       state = SCE_INNO_DEFAULT;
+                                       styler.ColourTo(i,SCE_INNO_PREPROC_INLINE);
+                               } else if (isEOL) {
+                                       state = SCE_INNO_DEFAULT;
+                                       styler.ColourTo(i,SCE_INNO_DEFAULT);
+                               }
+                               break;
+
+                       case SCE_INNO_COMMENT_PASCAL:
+                               if (ch == '}' || (ch == ')' && chPrev == '*')) {
+                                       state = SCE_INNO_DEFAULT;
+                                       styler.ColourTo(i,SCE_INNO_COMMENT_PASCAL);
+                               } else if (isEOL) {
+                                       state = SCE_INNO_DEFAULT;
+                                       styler.ColourTo(i,SCE_INNO_DEFAULT);
+                               }
+                               break;
+
+               }
+       }
+       delete []buffer;
+}
+
+static const char * const innoWordListDesc[] = {
+       "Sections",
+       "Keywords",
+       "Parameters",
+       "Preprocessor directives",
+       "Pascal keywords",
+       "User defined keywords",
+       0
+};
+
+static void FoldInnoDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {
+       bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
+
+       unsigned int endPos = startPos + length;
+       int visibleChars = 0;
+       int lineCurrent = styler.GetLine(startPos);
+
+       char chNext = styler[startPos];
+       int styleNext = styler.StyleAt(startPos);
+       bool headerPoint = false;
+       int lev;
+
+       for (unsigned int i = startPos; i < endPos; i++) {
+               char ch = chNext;
+               chNext = styler[i+1];
+
+               int style = styleNext;
+               styleNext = styler.StyleAt(i + 1);
+               bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
+
+               if (style == SCE_INNO_SECTION)
+                       headerPoint = true;
+
+               if (atEOL) {
+                       lev = SC_FOLDLEVELBASE;
+
+                       if (lineCurrent > 0) {
+                               int levelPrevious = styler.LevelAt(lineCurrent - 1);
+
+                               if (levelPrevious & SC_FOLDLEVELHEADERFLAG)
+                                       lev = SC_FOLDLEVELBASE + 1;
+                               else
+                                       lev = levelPrevious & SC_FOLDLEVELNUMBERMASK;
+                       }
+
+                       if (headerPoint)
+                               lev = SC_FOLDLEVELBASE;
+
+                       if (visibleChars == 0 && foldCompact)
+                               lev |= SC_FOLDLEVELWHITEFLAG;
+
+                       if (headerPoint)
+                               lev |= SC_FOLDLEVELHEADERFLAG;
+
+                       if (lev != styler.LevelAt(lineCurrent))
+                               styler.SetLevel(lineCurrent, lev);
+
+                       lineCurrent++;
+                       visibleChars = 0;
+                       headerPoint = false;
+               }
+               if (!isspacechar(ch))
+                       visibleChars++;
+       }
+
+       if (lineCurrent > 0) {
+               int levelPrevious = styler.LevelAt(lineCurrent - 1);
+
+               if (levelPrevious & SC_FOLDLEVELHEADERFLAG)
+                       lev = SC_FOLDLEVELBASE + 1;
+               else
+                       lev = levelPrevious & SC_FOLDLEVELNUMBERMASK;
+       } else {
+               lev = SC_FOLDLEVELBASE;
+       }
+       int flagsNext = styler.LevelAt(lineCurrent);
+       styler.SetLevel(lineCurrent, lev | flagsNext & ~SC_FOLDLEVELNUMBERMASK);
+}
+
+LexerModule lmInno(SCLEX_INNOSETUP, ColouriseInnoDoc, "inno", FoldInnoDoc, innoWordListDesc);
index 7f6df070acb081cb97d95962d2df1d7f2defb54d..b3a46ad34188cc2f3b253422ef900d1cf24314fe 100644 (file)
@@ -38,7 +38,8 @@ static inline bool IsANumberChar(int ch) {
        // but probably enough in most cases.
        return (ch < 0x80) &&
                (isdigit(ch) || toupper(ch) == 'E' ||
-             ch == '.' || ch == '-' || ch == '+');
+               ch == '.' || ch == '-' || ch == '+' ||
+               (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F'));
 }
 
 static inline bool IsLuaOperator(int ch) {
@@ -51,7 +52,8 @@ static inline bool IsLuaOperator(int ch) {
                ch == '{' || ch == '}' || ch == '~' ||
                ch == '[' || ch == ']' || ch == ';' ||
                ch == '<' || ch == '>' || ch == ',' ||
-               ch == '.' || ch == '^' || ch == '%' || ch == ':') {
+               ch == '.' || ch == '^' || ch == '%' || ch == ':' ||
+               ch == '#') {
                return true;
        }
        return false;
@@ -144,7 +146,7 @@ static void ColouriseLuaDoc(
                if (sc.state == SCE_LUA_OPERATOR) {
                        sc.SetState(SCE_LUA_DEFAULT);
                } else if (sc.state == SCE_LUA_NUMBER) {
-                       // We stop the number definition on non-numerical non-dot non-eE non-sign char
+                       // We stop the number definition on non-numerical non-dot non-eE non-sign non-hexdigit char
                        if (!IsANumberChar(sc.ch)) {
                                sc.SetState(SCE_LUA_DEFAULT);
                        }
@@ -225,6 +227,9 @@ static void ColouriseLuaDoc(
                if (sc.state == SCE_LUA_DEFAULT) {
                        if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
                                sc.SetState(SCE_LUA_NUMBER);
+                               if (sc.ch == '0' && toupper(sc.chNext) == 'X') {
+                                       sc.Forward(1);
+                               }
                        } else if (IsAWordStart(sc.ch)) {
                                sc.SetState(SCE_LUA_IDENTIFIER);
                        } else if (sc.ch == '\"') {
index 0c54ce670153033c7a6d3138a35d88207173b221..a94666822b871b86aa4d5df6739b0222600618b0 100644 (file)
@@ -3,7 +3,7 @@
  ** Lexer for MSSQL.
  **/
 // By Filip Yaghob <fyaghob@gmail.com>
-
+// The License.txt file describes the conditions under which this software may be distributed.
 
 #include <stdlib.h>
 #include <string.h>
diff --git a/contrib/src/stc/scintilla/src/LexOpal.cxx b/contrib/src/stc/scintilla/src/LexOpal.cxx
new file mode 100644 (file)
index 0000000..d1d1889
--- /dev/null
@@ -0,0 +1,518 @@
+// Scintilla source code edit control
+/** @file LexOpal.cxx
+ ** Lexer for OPAL (functional language similar to Haskell)
+ ** Written by Sebastian Pipping <webmaster@hartwork.org>
+ **/
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+#include "StyleContext.h"
+
+inline 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] = static_cast<char>( styler[ start + i ] );
+               i++;
+       }
+       s[ i ] = '\0';
+}
+
+inline bool HandleString( unsigned int & cur, unsigned int one_too_much, Accessor & styler )
+{
+       char ch;
+
+       // Wait for string to close
+       bool even_backslash_count = true; // Without gaps in between
+       cur++; // Skip initial quote
+       for( ; ; )
+       {
+               if( cur >= one_too_much )
+               {
+                       styler.ColourTo( cur - 1, SCE_OPAL_STRING );
+                       return false; // STOP
+               }
+
+               ch = styler.SafeGetCharAt( cur );
+               if( ( ch == '\015' ) || ( ch == '\012' ) ) // Deny multi-line strings
+               {
+                       styler.ColourTo( cur - 1, SCE_OPAL_STRING );
+                       styler.StartSegment( cur );
+                       return true;
+               }
+               else
+               {
+                       if( even_backslash_count )
+                       {
+                               if( ch == '"' )
+                               {
+                                       styler.ColourTo( cur, SCE_OPAL_STRING );
+                                       cur++;
+                                       if( cur >= one_too_much )
+                                       {
+                                               return false; // STOP
+                                       }
+                                       else
+                                       {
+                                               styler.StartSegment( cur );
+                                               return true;
+                                       }
+                               }
+                               else if( ch == '\\' )
+                               {
+                                       even_backslash_count = false;
+                               }
+                       }
+                       else
+                       {
+                               even_backslash_count = true;
+                       }
+               }
+
+               cur++;
+       }
+}
+
+inline bool HandleCommentBlock( unsigned int & cur, unsigned int one_too_much, Accessor & styler, bool could_fail )
+{
+       char ch;
+       
+       if( could_fail )
+       {
+               cur++;
+               if( cur >= one_too_much )
+               {
+                       styler.ColourTo( cur - 1, SCE_OPAL_DEFAULT );
+                       return false; // STOP
+               }
+               
+               ch = styler.SafeGetCharAt( cur );
+               if( ch != '*' )
+               {
+                       styler.ColourTo( cur - 1, SCE_OPAL_DEFAULT );
+                       styler.StartSegment( cur );
+                       return true;
+               }
+       }
+       
+       // Wait for comment close
+       cur++;
+       bool star_found = false;
+       for( ; ; )
+       {
+               if( cur >= one_too_much )
+               {
+                       styler.ColourTo( cur - 1, SCE_OPAL_COMMENT_BLOCK );
+                       return false; // STOP
+               }
+               
+               ch = styler.SafeGetCharAt( cur );
+               if( star_found )
+               {
+                       if( ch == '/' )
+                       {
+                               styler.ColourTo( cur, SCE_OPAL_COMMENT_BLOCK );
+                               cur++;
+                               if( cur >= one_too_much )
+                               {
+                                       return false; // STOP
+                               }
+                               else
+                               {
+                                       styler.StartSegment( cur );
+                                       return true;
+                               }
+                       }
+                       else if( ch != '*' )
+                       {
+                               star_found = false;
+                       }
+               }
+               else if( ch == '*' )
+               {
+                       star_found = true;
+               }
+               cur++;
+       }
+}
+
+inline bool HandleCommentLine( unsigned int & cur, unsigned int one_too_much, Accessor & styler, bool could_fail )
+{
+       char ch;
+       
+       if( could_fail )
+       {
+               cur++;
+               if( cur >= one_too_much )
+               {
+                       styler.ColourTo( cur - 1, SCE_OPAL_DEFAULT );
+                       return false; // STOP
+               }
+               
+               ch = styler.SafeGetCharAt( cur );
+               if( ch != '-' )
+               {
+                       styler.ColourTo( cur - 1, SCE_OPAL_DEFAULT );
+                       styler.StartSegment( cur );
+                       return true;
+               }
+
+               cur++;
+               if( cur >= one_too_much )
+               {
+                       styler.ColourTo( cur - 1, SCE_OPAL_DEFAULT );
+                       return false; // STOP
+               }
+               
+               ch = styler.SafeGetCharAt( cur );
+               if( ( ch != ' ' ) && ( ch != '\t' ) )
+               {
+                       styler.ColourTo( cur - 1, SCE_OPAL_DEFAULT );
+                       styler.StartSegment( cur );
+                       return true;
+               }
+       }
+
+       // Wait for end of line
+       bool fifteen_found = false;
+
+       for( ; ; )
+       {
+               cur++;
+
+               if( cur >= one_too_much )
+               {
+                       styler.ColourTo( cur - 1, SCE_OPAL_COMMENT_LINE );
+                       return false; // STOP
+               }
+
+               ch = styler.SafeGetCharAt( cur );
+               if( fifteen_found )
+               {
+/*
+                       if( ch == '\012' )
+                       {
+                               // One newline on Windows (015, 012)
+                       }
+                       else
+                       {
+                               // One newline on MAC (015) and another char
+                       }
+*/
+                       cur--;
+                       styler.ColourTo( cur - 1, SCE_OPAL_COMMENT_LINE );
+                       styler.StartSegment( cur );
+                       return true;
+               }
+               else
+               {
+                       if( ch == '\015' )
+                       {
+                               fifteen_found = true;   
+                       }
+                       else if( ch == '\012' )
+                       {
+                               // One newline on Linux (012)
+                               styler.ColourTo( cur - 1, SCE_OPAL_COMMENT_LINE );
+                               styler.StartSegment( cur );
+                               return true;
+                       }
+               }
+       }
+}
+
+inline bool HandlePar( unsigned int & cur, Accessor & styler )
+{
+       styler.ColourTo( cur, SCE_OPAL_PAR );
+
+       cur++;
+
+       styler.StartSegment( cur );
+       return true;
+}
+
+inline bool HandleSpace( unsigned int & cur, unsigned int one_too_much, Accessor & styler )
+{
+       char ch;
+
+       cur++;
+       for( ; ; )
+       {
+               if( cur >= one_too_much )
+               {
+                       styler.ColourTo( cur - 1, SCE_OPAL_SPACE );
+                       return false;
+               }
+               
+               ch = styler.SafeGetCharAt( cur );
+               switch( ch )
+               {
+               case ' ':
+               case '\t':
+               case '\015':
+               case '\012':
+                       cur++;
+                       break;
+               
+               default:
+                       styler.ColourTo( cur - 1, SCE_OPAL_SPACE );
+                       styler.StartSegment( cur );
+                       return true;
+               }
+       }
+}
+
+inline bool HandleInteger( unsigned int & cur, unsigned int one_too_much, Accessor & styler )
+{
+       char ch;
+
+       for( ; ; )
+       {
+               cur++;
+               if( cur >= one_too_much )
+               {
+                       styler.ColourTo( cur - 1, SCE_OPAL_INTEGER );
+                       return false; // STOP
+               }
+
+               ch = styler.SafeGetCharAt( cur );
+               if( !isdigit( ch ) )
+               {
+                       styler.ColourTo( cur - 1, SCE_OPAL_INTEGER );
+                       styler.StartSegment( cur );
+                       return true;
+               }
+       }
+}
+
+inline bool HandleWord( unsigned int & cur, unsigned int one_too_much, Accessor & styler, WordList * keywordlists[] )
+{
+       char ch;
+       const unsigned int beg = cur;
+
+       cur++;
+       for( ; ; )
+       {
+               ch = styler.SafeGetCharAt( cur );
+               if( ( ch != '_' ) && ( ch != '-' ) &&
+                       !islower( ch ) && !isupper( ch ) && !isdigit( ch ) ) break;
+
+               cur++;
+               if( cur >= one_too_much ) 
+               {
+                       break;
+               }
+       }
+
+       const int ide_len = cur - beg + 1;
+       char * ide = new char[ ide_len ];
+       getRange( beg, cur, styler, ide, ide_len );
+       
+       WordList & keywords    = *keywordlists[ 0 ];
+       WordList & classwords  = *keywordlists[ 1 ];
+
+       if( keywords.InList( ide ) ) // Keyword
+       {
+               delete [] ide;
+
+               styler.ColourTo( cur - 1, SCE_OPAL_KEYWORD );
+               if( cur >= one_too_much )
+               {
+                       return false; // STOP
+               }
+               else
+               {
+                       styler.StartSegment( cur );     
+                       return true;                    
+               }
+       }
+       else if( classwords.InList( ide ) ) // Sort
+       {
+               delete [] ide;
+
+               styler.ColourTo( cur - 1, SCE_OPAL_SORT );
+               if( cur >= one_too_much )
+               {
+                       return false; // STOP
+               }
+               else
+               {
+                       styler.StartSegment( cur );     
+                       return true;                    
+               }
+       }
+       else if( !strcmp( ide, "true" ) || !strcmp( ide, "false" ) ) // Bool const
+       {
+               delete [] ide;
+
+               styler.ColourTo( cur - 1, SCE_OPAL_BOOL_CONST );
+               if( cur >= one_too_much )
+               {
+                       return false; // STOP
+               }
+               else
+               {
+                       styler.StartSegment( cur );     
+                       return true;                    
+               }
+       }
+       else // Unknown keyword
+       {
+               delete [] ide;
+
+               styler.ColourTo( cur - 1, SCE_OPAL_DEFAULT );
+               if( cur >= one_too_much )
+               {
+                       return false; // STOP
+               }
+               else
+               {
+                       styler.StartSegment( cur );
+                       return true;                    
+               }
+       }
+
+}
+
+inline bool HandleSkip( unsigned int & cur, unsigned int one_too_much, Accessor & styler )
+{
+       cur++;
+       styler.ColourTo( cur - 1, SCE_OPAL_DEFAULT );
+       if( cur >= one_too_much )
+       {
+               return false; // STOP
+       }
+       else
+       {
+               styler.StartSegment( cur );     
+               return true;
+       }
+}
+
+static void ColouriseOpalDoc( unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor & styler )
+{
+       styler.StartAt( startPos );
+       styler.StartSegment( startPos );
+
+       unsigned int & cur = startPos;
+       const unsigned int one_too_much = startPos + length;
+
+       int state = initStyle;
+
+       for( ; ; )
+       {
+               switch( state )
+               {
+               case SCE_OPAL_KEYWORD:
+               case SCE_OPAL_SORT:
+                       if( !HandleWord( cur, one_too_much, styler, keywordlists ) ) return;
+                       state = SCE_OPAL_DEFAULT;
+                       break;
+
+               case SCE_OPAL_INTEGER:
+                       if( !HandleInteger( cur, one_too_much, styler ) ) return;
+                       state = SCE_OPAL_DEFAULT;
+                       break;
+
+               case SCE_OPAL_COMMENT_BLOCK:
+                       if( !HandleCommentBlock( cur, one_too_much, styler, false ) ) return;
+                       state = SCE_OPAL_DEFAULT;
+                       break;
+
+               case SCE_OPAL_COMMENT_LINE:
+                       if( !HandleCommentLine( cur, one_too_much, styler, false ) ) return;
+                       state = SCE_OPAL_DEFAULT;
+                       break;
+
+               case SCE_OPAL_STRING:
+                       if( !HandleString( cur, one_too_much, styler ) ) return;
+                       state = SCE_OPAL_DEFAULT;
+                       break;
+                       
+               default: // SCE_OPAL_DEFAULT:
+                       {
+                               char ch = styler.SafeGetCharAt( cur );
+                               
+                               switch( ch )
+                               {
+                               // String
+                               case '"':
+                                       if( !HandleString( cur, one_too_much, styler ) ) return;
+                                       break;
+
+                               // Comment block
+                               case '/':
+                                       if( !HandleCommentBlock( cur, one_too_much, styler, true ) ) return;
+                                       break;
+
+                               // Comment line
+                               case '-':
+                                       if( !HandleCommentLine( cur, one_too_much, styler, true ) ) return;
+                                       break;
+
+                               // Par
+                               case '(':
+                               case ')':
+                               case '[':
+                               case ']':
+                               case '{':
+                               case '}':
+                                       if( !HandlePar( cur, styler ) ) return;
+                                       break;
+
+                               // Whitespace
+                               case ' ':
+                               case '\t':
+                               case '\015':
+                               case '\012':
+                                       if( !HandleSpace( cur, one_too_much, styler ) ) return;
+                                       break;
+                               
+                               default:
+                                       {
+                                               // Integer
+                                               if( isdigit( ch ) )
+                                               {
+                                                       if( !HandleInteger( cur, one_too_much, styler ) ) return;
+                                               }
+
+                                               // Keyword
+                                               else if( islower( ch ) || isupper( ch ) )
+                                               {
+                                                       if( !HandleWord( cur, one_too_much, styler, keywordlists ) ) return;
+                                                       
+                                               }
+
+                                               // Skip
+                                               else
+                                               {
+                                                       if( !HandleSkip( cur, one_too_much, styler ) ) return;
+                                               }
+                                       }
+                               }
+
+                               break;
+                       }
+               }
+       }
+}
+
+static const char * const opalWordListDesc[] = {
+       "Keywords",
+       "Sorts",
+       0
+};
+
+LexerModule lmOpal(SCLEX_OPAL, ColouriseOpalDoc, "opal", NULL, opalWordListDesc);
index 4f4c1e3258fcabf2c106f7813c12bb48d2c11511..5f6e7e404152f53182fb7cd6c53e825d674bdfd6 100644 (file)
@@ -41,7 +41,7 @@ static bool IsBOperator(char ch) {
 
 // Tests for BATCH Separators
 static bool IsBSeparator(char ch) {
-       return (ch == ':') || (ch == '\\') || (ch == '.') || (ch == ';') ||
+       return (ch == '\\') || (ch == '.') || (ch == ';') ||
                (ch == '\"') || (ch == '\'') || (ch == '/') || (ch == ')');
 }
 
@@ -50,7 +50,7 @@ static void ColouriseBatchLine(
     unsigned int lengthLine,
     unsigned int startLine,
     unsigned int endPos,
-    WordList &keywords,
+    WordList *keywordlists[],
     Accessor &styler) {
 
        unsigned int offset = 0;        // Line Buffer Offset
@@ -59,7 +59,9 @@ static void ColouriseBatchLine(
        char wordBuffer[81];            // Word Buffer - large to catch long paths
        unsigned int wbl;               // Word Buffer Length
        unsigned int wbo;               // Word Buffer Offset - also Special Keyword Buffer Length
-       bool forFound = false;          // No Local Variable without FOR statement
+       WordList &keywords = *keywordlists[0];      // Internal Commands
+       WordList &keywords2 = *keywordlists[1];     // External Commands (optional)
+
        // CHOICE, ECHO, GOTO, PROMPT and SET have Default Text that may contain Regular Keywords
        //   Toggling Regular Keyword Checking off improves readability
        // Other Regular Keywords and External Commands / Programs might also benefit from toggling
@@ -174,7 +176,13 @@ static void ColouriseBatchLine(
                                // Reset Offset to re-process remainder of word
                                offset -= (wbl - 1);
                                // Colorize External Command / Program
-                               styler.ColourTo(startLine + offset - 1, SCE_BAT_COMMAND);
+                               if (!keywords2) {
+                                       styler.ColourTo(startLine + offset - 1, SCE_BAT_COMMAND);
+                               } else if (keywords2.InList(wordBuffer)) {
+                                       styler.ColourTo(startLine + offset - 1, SCE_BAT_COMMAND);
+                               } else {
+                                       styler.ColourTo(startLine + offset - 1, SCE_BAT_DEFAULT);
+                               }
                                // Reset External Command / Program Location
                                cmdLoc = offset;
                        } else {
@@ -186,10 +194,6 @@ static void ColouriseBatchLine(
                // Check for Regular Keyword in list
                } else if ((keywords.InList(wordBuffer)) &&
                        (continueProcessing)) {
-                       // Local Variables do not exist if no FOR statement
-                       if (CompareCaseInsensitive(wordBuffer, "for") == 0) {
-                               forFound = true;
-                       }
                        // ECHO, GOTO, PROMPT and SET require no further Regular Keyword Checking
                        if ((CompareCaseInsensitive(wordBuffer, "echo") == 0) ||
                                (CompareCaseInsensitive(wordBuffer, "goto") == 0) ||
@@ -261,8 +265,8 @@ static void ColouriseBatchLine(
                                        styler.ColourTo(startLine + offset - 1 - (wbl - wbo), SCE_BAT_WORD);
                                        // Reset Offset to re-process remainder of word
                                        offset -= (wbl - wbo);
+                               }
                        }
-               }
                        // Check for External Command / Program or Default Text
                        if (!sKeywordFound) {
                                wbo = 0;
@@ -306,8 +310,14 @@ static void ColouriseBatchLine(
                                                        }
                                                }
                                        }
-                                       // Colorize External command / program
-                                       styler.ColourTo(startLine + offset - 1, SCE_BAT_COMMAND);
+                                       // Colorize External Command / Program
+                                       if (!keywords2) {
+                                               styler.ColourTo(startLine + offset - 1, SCE_BAT_COMMAND);
+                                       } else if (keywords2.InList(wordBuffer)) {
+                                               styler.ColourTo(startLine + offset - 1, SCE_BAT_COMMAND);
+                                       } else {
+                                               styler.ColourTo(startLine + offset - 1, SCE_BAT_DEFAULT);
+                                       }
                                        // No need to Reset Offset
                                // Check for Default Text
                                } else {
@@ -354,13 +364,13 @@ static void ColouriseBatchLine(
                                // Check for External Command / Program
                                if (cmdLoc == offset - wbl) {
                                        cmdLoc = offset - (wbl - wbo);
-                       }
+                               }
                                // Colorize Environment Variable
                                styler.ColourTo(startLine + offset - 1 - (wbl - wbo), SCE_BAT_IDENTIFIER);
                                // Reset Offset to re-process remainder of word
                                offset -= (wbl - wbo);
                        // Check for Local Variable (%%a)
-                       } else if ((forFound) &&
+                       } else if (
                                (wordBuffer[1] == '%') &&
                                (wordBuffer[2] != '%') &&
                                (!IsBOperator(wordBuffer[2])) &&
@@ -447,7 +457,6 @@ static void ColouriseBatchDoc(
     Accessor &styler) {
 
        char lineBuffer[1024];
-       WordList &keywords = *keywordlists[0];
 
        styler.StartAt(startPos);
        styler.StartSegment(startPos);
@@ -458,14 +467,14 @@ static void ColouriseBatchDoc(
                if (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {
                        // End of line (or of line buffer) met, colourise it
                        lineBuffer[linePos] = '\0';
-                       ColouriseBatchLine(lineBuffer, linePos, startLine, i, keywords, styler);
+                       ColouriseBatchLine(lineBuffer, linePos, startLine, i, keywordlists, styler);
                        linePos = 0;
                        startLine = i + 1;
                }
        }
        if (linePos > 0) {      // Last line does not have ending characters
                ColouriseBatchLine(lineBuffer, linePos, startLine, startPos + length - 1,
-                                  keywords, styler);
+                                  keywordlists, styler);
        }
 }
 
@@ -593,8 +602,8 @@ static void ColourisePropsLine(
                        while ((i < lengthLine) && (lineBuffer[i] != '='))
                                i++;
                        if ((i < lengthLine) && (lineBuffer[i] == '=')) {
-                               styler.ColourTo(startLine + i - 1, SCE_PROPS_DEFAULT);
-                               styler.ColourTo(startLine + i, 3);
+                               styler.ColourTo(startLine + i - 1, SCE_PROPS_KEY);
+                               styler.ColourTo(startLine + i, SCE_PROPS_ASSIGNMENT);
                                styler.ColourTo(endPos, SCE_PROPS_DEFAULT);
                        } else {
                                styler.ColourTo(endPos, SCE_PROPS_DEFAULT);
@@ -871,7 +880,7 @@ static int RecogniseErrorListLine(const char *lineBuffer, unsigned int lengthLin
                // CTags: \t<message>
                // Lua 5 traceback: \t<filename>:<line>:<message>
                bool initialTab = (lineBuffer[0] == '\t');
-               enum { stInitial, 
+               enum { stInitial,
                        stGccStart, stGccDigit, stGcc,
                        stMsStart, stMsDigit, stMsBracket, stMsVc, stMsDigitComma, stMsDotNet,
                        stCtagsStart, stCtagsStartString, stCtagsStringDollar, stCtags,
@@ -933,8 +942,8 @@ static int RecogniseErrorListLine(const char *lineBuffer, unsigned int lengthLin
                                        for (j = i + numstep; j < lengthLine && isalpha(lineBuffer[j]) && chPos < sizeof(word) - 1; j++)
                                                word[chPos++] = lineBuffer[j];
                                        word[chPos] = 0;
-                                       if (!CompareCaseInsensitive(word, "error") || !CompareCaseInsensitive(word, "warning") || 
-                                               !CompareCaseInsensitive(word, "fatal") || !CompareCaseInsensitive(word, "catastrophic") || 
+                                       if (!CompareCaseInsensitive(word, "error") || !CompareCaseInsensitive(word, "warning") ||
+                                               !CompareCaseInsensitive(word, "fatal") || !CompareCaseInsensitive(word, "catastrophic") ||
                                                !CompareCaseInsensitive(word, "note") || !CompareCaseInsensitive(word, "remark")) {
                                                state = stMsVc;
                                        } else
@@ -1103,7 +1112,8 @@ static void ColouriseLatexDoc(unsigned int startPos, int length, int initStyle,
 }
 
 static const char * const batchWordListDesc[] = {
-       "Keywords",
+       "Internal Commands",
+       "External Commands",
        0
 };
 
index c1397b79130979b6390e9bb49357f2a66d1df17e..1bdebf6deda620c874d25d4f3436a5571902355d 100644 (file)
@@ -212,6 +212,8 @@ static void ColourisePyDoc(unsigned int startPos, int length, int initStyle,
                } else if (sc.state == SCE_P_DECORATOR) {
                        if (sc.ch == '\r' || sc.ch == '\n') {
                                sc.SetState(SCE_P_DEFAULT);
+                       } else if (sc.ch == '#') {
+                               sc.SetState((sc.chNext == '#') ? SCE_P_COMMENTBLOCK  :  SCE_P_COMMENTLINE);
                        }
                } else if ((sc.state == SCE_P_STRING) || (sc.state == SCE_P_CHARACTER)) {
                        if (sc.ch == '\\') {
index 75a958cb60009664592d9871cd57feb311d59e24..d8e14b9eb104c46a8d9c5ca4c6d5c8f902500dc4 100644 (file)
@@ -43,7 +43,6 @@ static inline bool IsANumberChar(int ch) {
              ch == '.' || ch == '-' || ch == '+');
 }
 
-
 static void ColouriseSQLDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
                             Accessor &styler) {
 
@@ -60,28 +59,8 @@ static void ColouriseSQLDoc(unsigned int startPos, int length, int initStyle, Wo
 
        bool sqlBackslashEscapes = styler.GetPropertyInt("sql.backslash.escapes", 0) != 0;
        bool sqlBackticksIdentifier = styler.GetPropertyInt("lexer.sql.backticks.identifier", 0) != 0;
-       int styleBeforeDCKeyword = SCE_C_DEFAULT;
-       bool fold = styler.GetPropertyInt("fold") != 0;
-       int lineCurrent = styler.GetLine(startPos);
-
+       int styleBeforeDCKeyword = SCE_SQL_DEFAULT;
        for (; sc.More(); sc.Forward()) {
-               // Fold based on indentation
-               if (sc.atLineStart) {
-                       int spaceFlags = 0;
-                       int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags);
-                       int level = indentCurrent;
-                       if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {
-                               // Only non whitespace lines can be headers
-                               int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags);
-                               if (indentCurrent < (indentNext & ~SC_FOLDLEVELWHITEFLAG)) {
-                                       level |= SC_FOLDLEVELHEADERFLAG;
-                               }
-                       }
-                       if (fold) {
-                               styler.SetLevel(lineCurrent, level);
-                       }
-               }
-
                // Determine if the current state should terminate.
                switch (sc.state) {
                case SCE_SQL_OPERATOR:
@@ -243,12 +222,14 @@ static void FoldSQLDoc(unsigned int startPos, int length, int initStyle,
                             WordList *[], Accessor &styler) {
        bool foldComment = styler.GetPropertyInt("fold.comment") != 0;
        bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
+       bool foldOnlyBegin = styler.GetPropertyInt("fold.sql.only.begin", 0) != 0;
+
        unsigned int endPos = startPos + length;
        int visibleChars = 0;
        int lineCurrent = styler.GetLine(startPos);
        int levelCurrent = SC_FOLDLEVELBASE;
        if (lineCurrent > 0) {
-               levelCurrent = styler.LevelAt(lineCurrent - 1) & SC_FOLDLEVELNUMBERMASK;
+               levelCurrent = styler.LevelAt(lineCurrent - 1) >> 16;
        }
        int levelNext = levelCurrent;
        char chNext = styler[startPos];
@@ -306,7 +287,7 @@ static void FoldSQLDoc(unsigned int startPos, int length, int initStyle,
                        } else {
                                s[j] = '\0';
                        }
-                       if (strcmp(s, "if") == 0 || strcmp(s, "loop") == 0) {
+                       if ((!foldOnlyBegin) && (strcmp(s, "if") == 0 || strcmp(s, "loop") == 0)) {
                                if (endFound) {
                                        // ignore
                                        endFound = false;
@@ -326,16 +307,14 @@ static void FoldSQLDoc(unsigned int startPos, int length, int initStyle,
                        }
                }
                if (atEOL) {
-                       int level = levelCurrent;
-                       if (visibleChars == 0 && foldCompact) {
-                               // Empty line
-                               level |= SC_FOLDLEVELWHITEFLAG;
-                       }
-                       if (visibleChars > 0 && levelNext > levelCurrent) {
-                               level |= SC_FOLDLEVELHEADERFLAG;
-                       }
-                       if (level != styler.LevelAt(lineCurrent)) {
-                               styler.SetLevel(lineCurrent, level);
+                       int levelUse = levelCurrent;
+                       int lev = levelUse | levelNext << 16;
+                       if (visibleChars == 0 && foldCompact)
+                               lev |= SC_FOLDLEVELWHITEFLAG;
+                       if (levelUse < levelNext)
+                               lev |= SC_FOLDLEVELHEADERFLAG;
+                       if (lev != styler.LevelAt(lineCurrent)) {
+                               styler.SetLevel(lineCurrent, lev);
                        }
                        lineCurrent++;
                        levelCurrent = levelNext;
diff --git a/contrib/src/stc/scintilla/src/LexSpice.cxx b/contrib/src/stc/scintilla/src/LexSpice.cxx
new file mode 100644 (file)
index 0000000..8a1683f
--- /dev/null
@@ -0,0 +1,221 @@
+// Scintilla source code edit control
+/** @file LexSpice.cxx
+ ** Lexer for Spice
+ **/
+// Copyright 2006 by Fabien Proriol
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "Platform.h"
+
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "PropSet.h"
+#include "KeyWords.h"
+#include "SciLexer.h"
+#include "SString.h"
+
+/*
+ * Interface
+ */
+
+static void ColouriseDocument(
+    unsigned int startPos,
+    int length,
+    int initStyle,
+    WordList *keywordlists[],
+    Accessor &styler);
+
+static const char * const spiceWordListDesc[] = {
+    "Keywords",        // SPICE command
+    "Keywords2",    // SPICE functions
+    "Keywords3",    // SPICE params
+    0
+};
+
+LexerModule lmSpice(SCLEX_SPICE, ColouriseDocument, "spice", NULL, spiceWordListDesc);
+
+/*
+ * Implementation
+ */
+
+static void ColouriseComment(StyleContext& sc, bool& apostropheStartsAttribute);
+static void ColouriseDelimiter(StyleContext& sc, bool& apostropheStartsAttribute);
+static void ColouriseNumber(StyleContext& sc, bool& apostropheStartsAttribute);
+static void ColouriseWhiteSpace(StyleContext& sc, bool& apostropheStartsAttribute);
+static void ColouriseWord(StyleContext& sc, WordList& keywords, WordList& keywords2, WordList& keywords3, bool& apostropheStartsAttribute);
+
+static inline bool IsDelimiterCharacter(int ch);
+static inline bool IsNumberStartCharacter(int ch);
+static inline bool IsNumberCharacter(int ch);
+static inline bool IsSeparatorOrDelimiterCharacter(int ch);
+static inline bool IsWordStartCharacter(int ch);
+static inline bool IsWordCharacter(int ch);
+
+static void ColouriseComment(StyleContext& sc, bool&) {
+    sc.SetState(SCE_SPICE_COMMENTLINE);
+    while (!sc.atLineEnd) {
+        sc.Forward();
+    }
+}
+
+static void ColouriseDelimiter(StyleContext& sc, bool& apostropheStartsAttribute) {
+    apostropheStartsAttribute = sc.Match (')');
+    sc.SetState(SCE_SPICE_DELIMITER);
+    sc.ForwardSetState(SCE_SPICE_DEFAULT);
+}
+
+static void ColouriseNumber(StyleContext& sc, bool& apostropheStartsAttribute) {
+    apostropheStartsAttribute = true;
+    SString number;
+    sc.SetState(SCE_SPICE_NUMBER);
+    // Get all characters up to a delimiter or a separator, including points, but excluding
+    // double points (ranges).
+    while (!IsSeparatorOrDelimiterCharacter(sc.ch) || (sc.ch == '.' && sc.chNext != '.')) {
+        number += static_cast<char>(sc.ch);
+        sc.Forward();
+    }
+    // Special case: exponent with sign
+    if ((sc.chPrev == 'e' || sc.chPrev == 'E') &&
+            (sc.ch == '+' || sc.ch == '-')) {
+        number += static_cast<char>(sc.ch);
+        sc.Forward ();
+        while (!IsSeparatorOrDelimiterCharacter(sc.ch)) {
+            number += static_cast<char>(sc.ch);
+            sc.Forward();
+        }
+    }
+    sc.SetState(SCE_SPICE_DEFAULT);
+}
+
+static void ColouriseWhiteSpace(StyleContext& sc, bool& ) {
+    sc.SetState(SCE_SPICE_DEFAULT);
+    sc.ForwardSetState(SCE_SPICE_DEFAULT);
+}
+
+static void ColouriseWord(StyleContext& sc, WordList& keywords, WordList& keywords2, WordList& keywords3, bool& apostropheStartsAttribute) {
+    apostropheStartsAttribute = true;
+    sc.SetState(SCE_SPICE_IDENTIFIER);
+    SString word;
+    while (!sc.atLineEnd && !IsSeparatorOrDelimiterCharacter(sc.ch)) {
+        word += static_cast<char>(tolower(sc.ch));
+        sc.Forward();
+    }
+    if (keywords.InList(word.c_str())) {
+        sc.ChangeState(SCE_SPICE_KEYWORD);
+        if (word != "all") {
+            apostropheStartsAttribute = false;
+        }
+    }
+    else if (keywords2.InList(word.c_str())) {
+        sc.ChangeState(SCE_SPICE_KEYWORD2);
+        if (word != "all") {
+            apostropheStartsAttribute = false;
+        }
+    }
+    else if (keywords3.InList(word.c_str())) {
+        sc.ChangeState(SCE_SPICE_KEYWORD3);
+        if (word != "all") {
+            apostropheStartsAttribute = false;
+        }
+    }
+    sc.SetState(SCE_SPICE_DEFAULT);
+}
+
+//
+// ColouriseDocument
+//
+static void ColouriseDocument(
+    unsigned int startPos,
+    int length,
+    int initStyle,
+    WordList *keywordlists[],
+    Accessor &styler) {
+    WordList &keywords = *keywordlists[0];
+    WordList &keywords2 = *keywordlists[1];
+    WordList &keywords3 = *keywordlists[2];
+    StyleContext sc(startPos, length, initStyle, styler);
+    int lineCurrent = styler.GetLine(startPos);
+    bool apostropheStartsAttribute = (styler.GetLineState(lineCurrent) & 1) != 0;
+    while (sc.More()) {
+        if (sc.atLineEnd) {
+            // Go to the next line
+            sc.Forward();
+            lineCurrent++;
+            // Remember the line state for future incremental lexing
+            styler.SetLineState(lineCurrent, apostropheStartsAttribute);
+            // Don't continue any styles on the next line
+            sc.SetState(SCE_SPICE_DEFAULT);
+        }
+        // Comments
+        if ((sc.Match('*') && sc.atLineStart) || sc.Match('*','~')) {
+            ColouriseComment(sc, apostropheStartsAttribute);
+        // Whitespace
+        } else if (IsASpace(sc.ch)) {
+            ColouriseWhiteSpace(sc, apostropheStartsAttribute);
+        // Delimiters
+        } else if (IsDelimiterCharacter(sc.ch)) {
+            ColouriseDelimiter(sc, apostropheStartsAttribute);
+        // Numbers
+        } else if (IsADigit(sc.ch) || sc.ch == '#') {
+            ColouriseNumber(sc, apostropheStartsAttribute);
+        // Keywords or identifiers
+        } else {
+            ColouriseWord(sc, keywords, keywords2, keywords3, apostropheStartsAttribute);
+        }
+    }
+    sc.Complete();
+}
+
+static inline bool IsDelimiterCharacter(int ch) {
+    switch (ch) {
+    case '&':
+    case '\'':
+    case '(':
+    case ')':
+    case '*':
+    case '+':
+    case ',':
+    case '-':
+    case '.':
+    case '/':
+    case ':':
+    case ';':
+    case '<':
+    case '=':
+    case '>':
+    case '|':
+        return true;
+    default:
+        return false;
+    }
+}
+
+static inline bool IsNumberCharacter(int ch) {
+    return IsNumberStartCharacter(ch) ||
+           ch == '_' ||
+           ch == '.' ||
+           ch == '#' ||
+           (ch >= 'a' && ch <= 'f') ||
+           (ch >= 'A' && ch <= 'F');
+}
+
+static inline bool IsNumberStartCharacter(int ch) {
+    return IsADigit(ch);
+}
+
+static inline bool IsSeparatorOrDelimiterCharacter(int ch) {
+    return IsASpace(ch) || IsDelimiterCharacter(ch);
+}
+
+static inline bool IsWordCharacter(int ch) {
+    return IsWordStartCharacter(ch) || IsADigit(ch);
+}
+
+static inline bool IsWordStartCharacter(int ch) {
+    return (isascii(ch) && isalpha(ch)) || ch == '_';
+}
diff --git a/contrib/src/stc/scintilla/src/LexTCL.cxx b/contrib/src/stc/scintilla/src/LexTCL.cxx
new file mode 100644 (file)
index 0000000..c782141
--- /dev/null
@@ -0,0 +1,362 @@
+// Scintilla source code edit control
+/** @file LexTCL.cxx
+ ** Lexer for TCL language.
+ **/
+// Copyright 1998-2001 by Andre Arpin <arpin@kingston.net>
+// 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 "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+// Extended to accept accented characters
+static inline bool IsAWordChar(int ch) {
+       return ch >= 0x80 ||
+        (isalnum(ch) || ch == '_' || ch ==':' || ch=='.'); // : name space separator
+}
+
+static inline bool IsAWordStart(int ch) {
+       return ch >= 0x80 || (ch ==':' || isalpha(ch) || ch == '_');
+}
+
+static inline bool IsANumberChar(int ch) {
+       // Not exactly following number definition (several dots are seen as OK, etc.)
+       // but probably enough in most cases.
+       return (ch < 0x80) &&
+              (IsADigit(ch, 0x10) || toupper(ch) == 'E' ||
+               ch == '.' || ch == '-' || ch == '+');
+}
+
+static void ColouriseTCLDoc(unsigned int startPos, int length, int , WordList *keywordlists[], Accessor &styler) {
+#define  isComment(s) (s==SCE_TCL_COMMENT || s==SCE_TCL_COMMENTLINE || s==SCE_TCL_COMMENT_BOX || s==SCE_TCL_BLOCK_COMMENT)
+       bool foldComment = styler.GetPropertyInt("fold.comment") != 0;
+       bool commentLevel = false;
+    bool subBrace = false; // substitution begin with a brace ${.....}
+       enum tLineState {LS_DEFAULT, LS_OPEN_COMMENT, LS_OPEN_DOUBLE_QUOTE, LS_COMMENT_BOX, LS_MASK_STATE = 0xf, 
+        LS_COMMAND_EXPECTED = 16, LS_BRACE_ONLY = 32 } lineState = LS_DEFAULT;
+       bool prevSlash = false;
+       int currentLevel = 0;
+    bool expected = 0;
+    bool subParen = 0;
+
+       int currentLine = styler.GetLine(startPos);
+    if (currentLine > 0)
+        currentLine--;
+       length += startPos - styler.LineStart(currentLine);
+       // make sure lines overlap
+       startPos = styler.LineStart(currentLine);
+
+       WordList &keywords = *keywordlists[0];
+       WordList &keywords2 = *keywordlists[1];
+       WordList &keywords3 = *keywordlists[2];
+       WordList &keywords4 = *keywordlists[3];
+       WordList &keywords5 = *keywordlists[4];
+       WordList &keywords6 = *keywordlists[5];
+       WordList &keywords7 = *keywordlists[6];
+    WordList &keywords8 = *keywordlists[7];
+    WordList &keywords9 = *keywordlists[8];
+
+       if (currentLine > 0) {
+        int ls = styler.GetLineState(currentLine - 1);
+               lineState = tLineState(ls & LS_MASK_STATE);
+               expected = LS_COMMAND_EXPECTED == tLineState(ls & LS_COMMAND_EXPECTED);
+        subBrace = LS_BRACE_ONLY == tLineState(ls & LS_BRACE_ONLY);
+               currentLevel = styler.LevelAt(currentLine - 1) >> 17;
+               commentLevel = (styler.LevelAt(currentLine - 1) >> 16) & 1;
+       } else
+               styler.SetLevel(0, SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG);
+       bool visibleChars = false;
+
+       int previousLevel = currentLevel;
+    StyleContext sc(startPos, length, SCE_TCL_DEFAULT, styler);
+       for (; ; sc.Forward()) {
+next:
+        if (sc.ch=='\r' && sc.chNext == '\n') // only ignore \r on PC process on the mac 
+            continue;
+        bool atEnd = !sc.More();  // make sure we coloured the last word
+        if (lineState != LS_DEFAULT) {
+            sc.SetState(SCE_TCL_DEFAULT);
+            if (lineState == LS_OPEN_COMMENT)
+                sc.SetState(SCE_TCL_COMMENTLINE);
+            else if (lineState == LS_OPEN_DOUBLE_QUOTE)
+                sc.SetState(SCE_TCL_IN_QUOTE);
+            else if (lineState == LS_COMMENT_BOX && (sc.ch == '#' || (sc.ch == ' ' && sc.chNext=='#')))
+                sc.SetState(SCE_TCL_COMMENT_BOX);
+            lineState = LS_DEFAULT;
+        }
+        if (subBrace) { // ${ overrides every thing even \ except }
+            if (sc.ch == '}') {
+                subBrace = false;
+                sc.SetState(SCE_TCL_OPERATOR);
+                sc.ForwardSetState(SCE_TCL_DEFAULT);
+                goto next;
+            }
+            else
+                sc.SetState(SCE_TCL_SUB_BRACE);
+            if (!sc.atLineEnd)
+                continue;
+        } else if (sc.state == SCE_TCL_DEFAULT || sc.state ==SCE_TCL_OPERATOR) {
+            expected &= isspacechar(static_cast<unsigned char>(sc.ch)) || IsAWordStart(sc.ch) || sc.ch =='#';
+        } else if (sc.state == SCE_TCL_SUBSTITUTION) {
+            switch(sc.ch) {
+            case '(':
+                subParen=true;
+                sc.SetState(SCE_TCL_OPERATOR);
+                sc.ForwardSetState(SCE_TCL_SUBSTITUTION);
+                continue;
+            case ')':
+                sc.SetState(SCE_TCL_OPERATOR);
+                subParen=false;
+                continue;
+            case '$':
+                continue;
+            case ',':
+                sc.SetState(SCE_TCL_OPERATOR);
+                if (subParen)
+                    sc.ForwardSetState(SCE_TCL_SUBSTITUTION);
+                continue;
+            default :
+                // maybe spaces should be allowed ???
+                if (!IsAWordChar(sc.ch)) { // probably the code is wrong
+                    sc.SetState(SCE_TCL_DEFAULT);
+                    subParen = 0;
+                }
+                break;
+            }
+        } else if (isComment(sc.state)) {
+        } else if (!IsAWordChar(sc.ch)) {
+            if ((sc.state == SCE_TCL_IDENTIFIER && expected) ||  sc.state == SCE_TCL_MODIFIER) {
+                char w[100];
+                char *s=w;
+                sc.GetCurrent(w, sizeof(w));
+                if (w[strlen(w)-1]=='\r')
+                    w[strlen(w)-1]=0;
+                while(*s == ':') // ignore leading : like in ::set a 10
+                    ++s;
+                bool quote = sc.state == SCE_TCL_IN_QUOTE;
+                if (commentLevel  || expected) {
+                    if (keywords.InList(s)) {
+                        sc.ChangeState(quote ? SCE_TCL_WORD_IN_QUOTE : SCE_TCL_WORD);
+                    } else if (keywords2.InList(s)) {
+                        sc.ChangeState(quote ? SCE_TCL_WORD_IN_QUOTE : SCE_TCL_WORD2);
+                    } else if (keywords3.InList(s)) {
+                        sc.ChangeState(quote ? SCE_TCL_WORD_IN_QUOTE : SCE_TCL_WORD3);
+                    } else if (keywords4.InList(s)) {
+                        sc.ChangeState(quote ? SCE_TCL_WORD_IN_QUOTE : SCE_TCL_WORD4);
+                    } else if (sc.GetRelative(-static_cast<int>(strlen(s))-1) == '{' &&
+                        keywords5.InList(s) && sc.ch == '}') { // {keyword} exactly no spaces
+                            sc.ChangeState(SCE_TCL_EXPAND);
+                    }
+                    if (keywords6.InList(s)) {
+                        sc.ChangeState(SCE_TCL_WORD5);
+                    } else if (keywords7.InList(s)) {
+                        sc.ChangeState(SCE_TCL_WORD6);
+                    } else if (keywords8.InList(s)) {
+                        sc.ChangeState(SCE_TCL_WORD7);
+                    } else if (keywords9.InList(s)) {
+                        sc.ChangeState(SCE_TCL_WORD8);
+                    } 
+                }
+                expected = false;
+                sc.SetState(quote ? SCE_TCL_IN_QUOTE : SCE_TCL_DEFAULT);
+            } else if (sc.state == SCE_TCL_MODIFIER || sc.state == SCE_TCL_IDENTIFIER) {
+                sc.SetState(SCE_TCL_DEFAULT);
+            }
+        }
+               if (atEnd)
+                       break;
+        if (sc.atLineEnd) {
+            lineState = LS_DEFAULT;
+                       currentLine = styler.GetLine(sc.currentPos);
+                       if (foldComment && sc.state!=SCE_TCL_COMMENT && isComment(sc.state)) {
+                               if (currentLevel == 0) {
+                                       ++currentLevel;
+                                       commentLevel = true;
+                               }
+                       } else {
+                               if (visibleChars && commentLevel) {
+                                       --currentLevel;
+                                       --previousLevel;
+                                       commentLevel = false;
+                               }
+                       }
+                       int flag = 0;
+                       if (!visibleChars)
+                               flag = SC_FOLDLEVELWHITEFLAG;
+                       if (currentLevel > previousLevel)
+                               flag = SC_FOLDLEVELHEADERFLAG;
+                       styler.SetLevel(currentLine, flag + previousLevel + SC_FOLDLEVELBASE + (currentLevel << 17) + (commentLevel << 16));
+
+                       // Update the line state, so it can be seen by next line
+                       if (sc.state == SCE_TCL_IN_QUOTE)
+                               lineState = LS_OPEN_DOUBLE_QUOTE;
+                       else {
+                            if (prevSlash) {
+                                   if (isComment(sc.state))
+                                           lineState = LS_OPEN_COMMENT;
+                } else if (sc.state == SCE_TCL_COMMENT_BOX)
+                    lineState = LS_COMMENT_BOX;
+                       }
+            styler.SetLineState(currentLine, 
+                (subBrace ? LS_BRACE_ONLY : 0) |
+                (expected ? LS_COMMAND_EXPECTED : 0)  | lineState);
+            if (lineState == LS_COMMENT_BOX)
+                sc.ForwardSetState(SCE_TCL_COMMENT_BOX);
+            else if (lineState == LS_OPEN_DOUBLE_QUOTE)
+                sc.ForwardSetState(SCE_TCL_IN_QUOTE);
+            else
+                sc.ForwardSetState(SCE_TCL_DEFAULT);
+                       prevSlash = false;
+                       previousLevel = currentLevel;
+                       goto next;
+               }
+
+               if (prevSlash) {
+            prevSlash = false;
+            if (sc.ch == '#' && IsANumberChar(sc.chNext))
+                sc.ForwardSetState(SCE_TCL_NUMBER);
+            continue;
+               }
+        prevSlash = sc.ch == '\\';
+        if (isComment(sc.state))
+            continue;
+               if (sc.atLineStart) {
+                       visibleChars = false;
+                       if (sc.state!=SCE_TCL_IN_QUOTE && !isComment(sc.state))
+            {
+                               sc.SetState(SCE_TCL_DEFAULT);
+                expected = IsAWordStart(sc.ch)|| isspacechar(static_cast<unsigned char>(sc.ch));
+            }
+               }
+
+               switch (sc.state) {
+               case SCE_TCL_NUMBER:
+                       if (!IsANumberChar(sc.ch))
+                               sc.SetState(SCE_TCL_DEFAULT);
+                       break;
+               case SCE_TCL_IN_QUOTE:
+                       if (sc.ch == '"') {
+                               sc.ForwardSetState(SCE_TCL_DEFAULT);
+                               visibleChars = true; // necessary if a " is the first and only character on a line
+                               goto next;
+                       } else if (sc.ch == '[' || sc.ch == ']' || sc.ch == '$') {
+                               sc.SetState(SCE_TCL_OPERATOR);
+                expected = sc.ch == '[';
+                sc.ForwardSetState(SCE_TCL_IN_QUOTE);
+                               goto next;
+                       }
+            continue;
+        case SCE_TCL_OPERATOR:
+                       sc.SetState(SCE_TCL_DEFAULT);
+                       break;
+               }
+
+               if (sc.ch == '#') {
+                       if (visibleChars) {
+                if (sc.state != SCE_TCL_IN_QUOTE && expected)
+                                       sc.SetState(SCE_TCL_COMMENT);
+                       } else {
+                sc.SetState(SCE_TCL_COMMENTLINE);
+                if (sc.chNext == '~')
+                    sc.SetState(SCE_TCL_BLOCK_COMMENT);
+                if (sc.atLineStart && (sc.chNext == '#' || sc.chNext == '-'))
+                        sc.SetState(SCE_TCL_COMMENT_BOX);
+            }
+        }
+
+               if (!isspacechar(static_cast<unsigned char>(sc.ch))) {
+                       visibleChars = true;
+               }
+
+               if (sc.ch == '\\') {
+                       prevSlash = true;
+                       continue;               
+               }
+
+               // Determine if a new state should be entered.
+               if (sc.state == SCE_TCL_DEFAULT) {
+            if (IsAWordStart(sc.ch)) {
+                               sc.SetState(SCE_TCL_IDENTIFIER);
+                       } else if (IsADigit(sc.ch) && !IsAWordChar(sc.chPrev)) {
+                               sc.SetState(SCE_TCL_NUMBER);
+                       } else {
+                               switch (sc.ch) {
+                               case '\"':
+                                       sc.SetState(SCE_TCL_IN_QUOTE);
+                                       break;
+                               case '{':
+                                       sc.SetState(SCE_TCL_OPERATOR);
+                                       expected = true;
+                                       ++currentLevel;
+                                       break;
+                               case '}':
+                                       sc.SetState(SCE_TCL_OPERATOR);
+                                       --currentLevel;
+                                       break;
+                               case '[':
+                    expected = true;
+                               case ']':
+                               case '(':
+                               case ')':
+                                       sc.SetState(SCE_TCL_OPERATOR);
+                                       break;
+                               case ';':
+                    expected = true;
+                                       break;
+                case '$':
+                    subParen = 0;
+                    if (sc.chNext != '{') {
+                        sc.SetState(SCE_TCL_SUBSTITUTION);
+                    } 
+                    else {
+                        sc.SetState(SCE_TCL_OPERATOR);  // $
+                        sc.Forward();  // {
+                        sc.ForwardSetState(SCE_TCL_SUB_BRACE);
+                        subBrace = true;
+                    }
+                    break;
+                case '#':
+                    if ((isspacechar(static_cast<unsigned char>(sc.chPrev))||
+                            isoperator(static_cast<char>(sc.chPrev))) && IsADigit(sc.chNext,0x10))
+                        sc.SetState(SCE_TCL_NUMBER);
+                    break;
+                case '-':
+                    sc.SetState(IsADigit(sc.chNext)? SCE_TCL_NUMBER: SCE_TCL_MODIFIER);
+                    break;
+                default:
+                    if (isoperator(static_cast<char>(sc.ch))) {
+                        sc.SetState(SCE_TCL_OPERATOR);
+                    }
+                               }
+                       }
+               }
+       }
+       sc.Complete();
+}
+
+static const char * const tclWordListDesc[] = {
+            "TCL Keywords",
+            "TK Keywords",
+            "iTCL Keywords",
+            "tkCommands",
+            "expand"
+            "user1",
+            "user2",
+            "user3",
+            "user4",
+            0
+        };
+
+// this code supports folding in the colourizer
+LexerModule lmTCL(SCLEX_TCL, ColouriseTCLDoc, "tcl", 0, tclWordListDesc);
index ef5924f7511e1207fce82854915880125fef8125..8ebdce491831105ba331da610a90c3898442b025 100644 (file)
@@ -15,11 +15,13 @@ public:
        int markType;
        ColourPair fore;
        ColourPair back;
+       int alpha;
        XPM *pxpm;
        LineMarker() {
                markType = SC_MARK_CIRCLE;
                fore = ColourDesired(0,0,0);
                back = ColourDesired(0xff,0xff,0xff);
+               alpha = SC_ALPHA_NOALPHA;
                pxpm = NULL;
        }
        LineMarker(const LineMarker &) {
@@ -27,6 +29,7 @@ public:
                markType = SC_MARK_CIRCLE;
                fore = ColourDesired(0,0,0);
                back = ColourDesired(0xff,0xff,0xff);
+               alpha = SC_ALPHA_NOALPHA;
                pxpm = NULL;
        }
        ~LineMarker() {
@@ -37,6 +40,7 @@ public:
                markType = SC_MARK_CIRCLE;
                fore = ColourDesired(0,0,0);
                back = ColourDesired(0xff,0xff,0xff);
+               alpha = SC_ALPHA_NOALPHA;
                delete pxpm;
                pxpm = NULL;
                return *this;
index b7ea71bfb9631d81d3b92743c6626b2dfda35cee..00e183060af654a4d2b644026abf97e7ca7f2f1f 100644 (file)
@@ -4,7 +4,7 @@
  **/
 
 /*
- * regex - Regular expression pattern matching  and replacement
+ * regex - Regular expression pattern matching and replacement
  *
  * By:  Ozan S. Yigit (oz)
  *      Dept. of Computer Science
@@ -15,7 +15,7 @@
  * 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.
+ * 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.
  * Modification history removed.
  *
  * Interfaces:
- *      RESearch::Compile:        compile a regular expression into a NFA.
+ *  RESearch::Compile:      compile a regular expression into a NFA.
  *
- *                     char *RESearch::Compile(s)
- *                     char *s;
+ *          const char *RESearch::Compile(const char *pat, int length,
+ *                                        bool caseSensitive, bool posix)
  *
- *      RESearch::Execute:        execute the NFA to match a pattern.
+ * Returns a short error string if they fail.
  *
- *                     int RESearch::Execute(s)
- *                     char *s;
+ *  RESearch::Execute:      execute the NFA to match a pattern.
  *
- *     RESearch::ModifyWord            change RESearch::Execute's understanding of what a "word"
- *                     looks like (for \< and \>) by adding into the
- *                     hidden word-syntax table.
+ *          int RESearch::Execute(characterIndexer &ci, int lp, int endp)
  *
- *                     void RESearch::ModifyWord(s)
- *                     char *s;
+ *  RESearch::Substitute:   substitute the matched portions in a new string.
  *
- *      RESearch::Substitute:  substitute the matched portions in a new string.
+ *          int RESearch::Substitute(CharacterIndexer &ci, char *src, char *dst)
  *
- *                     int RESearch::Substitute(src, dst)
- *                     char *src;
- *                     char *dst;
+ *  re_fail:                failure routine for RESearch::Execute. (no longer used)
  *
- *     re_fail:        failure routine for RESearch::Execute.
- *
- *                     void re_fail(msg, op)
- *                     char *msg;
- *                     char op;
+ *          void re_fail(char *msg, char op)
  *
  * Regular Expressions:
  *
  *      [1]     char    matches itself, unless it is a special
  *                      character (metachar): . \ [ ] * + ^ $
+ *                      and ( ) if posix option.
  *
  *      [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.
+ *      [3]     \       matches the character following it, except:
+ *                      - \a, \b, \f, \n, \t, \v match the
+ *                      corresponding C escape char;
+ *                      - if not in posix mode, when followed by a
+ *                      left or right round bracket (see [7]);
+ *                      - when followed by a digit 1 to 9 (see [8]);
+ *                      - when followed by a left or right angle bracket
+ *                      (see [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 (except for escape chars).
  *
  *      [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.
+ *                      complements the set. A shorthand S-E (start-end)
+ *                      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. To include both,
+ *                      put - first: [-]A-Z]:
+ *                      [-]|] matches these 2 chars,
+ *                      []-|] matches from ] to | chars.
  *                      examples:        match:
  *
  *                              [a-z]    any lowercase alpha
  *
- *                              [^]-]    any char except ] and -
+ *                              [^-]]    any char except - and ]
  *
  *                              [^A-Z]   any char except uppercase
  *                                       alpha
  *      [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.
+ *                      as \(form\) (or (form) with posix flag) matches what
+ *                      form matches. The enclosure creates a set of tags,
+ *                      used for [8] and for pattern substitution.
+ *                      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.
+ *      [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
+ *      [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.
+ *                      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.
+ *  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                  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
+ *              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
+ *     by one bit in a 256-bit block. Thus, CCL always takes a
+ *     constant 32 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:    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:    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\\+
+ *  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:    \(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 ...
+ *  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 "CharClassify.h"
 #include "RESearch.h"
 
+// Shut up annoying Visual C++ warnings:
+#ifdef _MSC_VER
+#pragma warning(disable: 4514)
+#endif
+
 #define OKP     1
 #define NOP     0
 
 #define EOL     5
 #define BOT     6
 #define EOT     7
-#define BOW    8
-#define EOW    9
+#define BOW     8
+#define EOW     9
 #define REF     10
 #define CLO     11
 
  * The following defines are not meant to be changeable.
  * They are for readability only.
  */
-#define BLKIND 0370
-#define BITIND 07
-
-#define ASCIIB 0177
+#define BLKIND  0370
+#define BITIND  07
 
 const char bitarr[] = {1,2,4,8,16,32,64,'\200'};
 
 #define badpat(x)      (*nfa = END, x)
 
-RESearch::RESearch() {
+/*
+ * Character classification table for word boundary operators BOW
+ * and EOW is passed in by the creator of this object (Scintilla
+ * Document). The Document default state is that word chars are:
+ * 0-9,a-z, A-Z and _
+ */
+
+RESearch::RESearch(CharClassify *charClassTable) {
+       charClass = charClassTable;
        Init();
 }
 
@@ -215,7 +225,7 @@ RESearch::~RESearch() {
 }
 
 void RESearch::Init() {
-       sta = NOP;                      /* status of lastpat */
+       sta = NOP;                  /* status of lastpat */
        bol = 0;
        for (int i=0; i<MAXTAG; i++)
                pat[i] = 0;
@@ -285,15 +295,15 @@ const char escapeValue(char ch) {
 
 const char *RESearch::Compile(const char *pat, int length, bool caseSensitive, bool posix) {
        char *mp=nfa;          /* nfa pointer       */
-       char *lp;              /* saved pointer..   */
-       char *sp=nfa;          /* another one..     */
-    char *mpMax = mp + MAXNFA - BITBLK - 10;
+       char *lp;              /* saved pointer     */
+       char *sp=nfa;          /* another one       */
+       char *mpMax = mp + MAXNFA - BITBLK - 10;
 
        int tagi = 0;          /* tag stack index   */
        int tagc = 1;          /* actual tag count  */
 
        int n;
-       char mask;              /* xor mask -CCL/NCL */
+       char mask;             /* xor mask -CCL/NCL */
        int c1, c2;
 
        if (!pat || !length)
@@ -303,18 +313,18 @@ const char *RESearch::Compile(const char *pat, int length, bool caseSensitive, b
                        return badpat("No previous regular expression");
        sta = NOP;
 
-       const char *p=pat;               /* pattern pointer   */
+       const char *p=pat;     /* pattern pointer   */
        for (int i=0; i<length; i++, p++) {
                if (mp > mpMax)
                        return badpat("Pattern too long");
                lp = mp;
                switch(*p) {
 
-               case '.':               /* match any char..  */
+               case '.':               /* match any char  */
                        *mp++ = ANY;
                        break;
 
-               case '^':               /* match beginning.. */
+               case '^':               /* match beginning */
                        if (p == pat)
                                *mp++ = BOL;
                        else {
@@ -323,7 +333,7 @@ const char *RESearch::Compile(const char *pat, int length, bool caseSensitive, b
                        }
                        break;
 
-               case '$':               /* match endofline.. */
+               case '$':               /* match endofline */
                        if (!*(p+1))
                                *mp++ = EOL;
                        else {
@@ -332,7 +342,7 @@ const char *RESearch::Compile(const char *pat, int length, bool caseSensitive, b
                        }
                        break;
 
-               case '[':               /* match char class..*/
+               case '[':               /* match char class */
                        *mp++ = CCL;
 
                        i++;
@@ -343,7 +353,7 @@ const char *RESearch::Compile(const char *pat, int length, bool caseSensitive, b
                        } else
                                mask = 0;
 
-                       if (*p == '-') {                /* real dash */
+                       if (*p == '-') {        /* real dash */
                                i++;
                                ChSet(*p++);
                        }
@@ -384,12 +394,12 @@ const char *RESearch::Compile(const char *pat, int length, bool caseSensitive, b
 
                        break;
 
-               case '*':               /* match 0 or more.. */
-               case '+':               /* match 1 or more.. */
+               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..   */
+                       if (*lp == CLO)         /* equivalence... */
                                break;
                        switch(*lp) {
 
@@ -417,7 +427,7 @@ const char *RESearch::Compile(const char *pat, int length, bool caseSensitive, b
                        mp = sp;
                        break;
 
-               case '\\':              /* tags, backrefs .. */
+               case '\\':              /* tags, backrefs... */
                        i++;
                        switch(*++p) {
 
@@ -483,7 +493,7 @@ const char *RESearch::Compile(const char *pat, int length, bool caseSensitive, b
                        }
                        break;
 
-               default :               /* an ordinary char  */
+               default :               /* an ordinary char */
                        if (posix && *p == '(') {
                                if (tagc < MAXTAG) {
                                        tagstk[++tagi] = tagc;
@@ -524,23 +534,23 @@ const char *RESearch::Compile(const char *pat, int length, bool caseSensitive, b
 
 /*
  * 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.
+ *   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.
  *
  */
 
@@ -571,7 +581,7 @@ int RESearch::Execute(CharacterIndexer &ci, int lp, int endp) {
                c = *(ap+1);
                while ((lp < endp) && (ci.CharAt(lp) != c))
                        lp++;
-               if (lp >= endp)         /* if EOS, fail, else fall thru. */
+               if (lp >= endp) /* if EOS, fail, else fall thru. */
                        return 0;
        default:                        /* regular matching all the way. */
                while (lp < endp) {
@@ -595,78 +605,50 @@ int RESearch::Execute(CharacterIndexer &ci, int lp, int endp) {
 /*
  * 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).
- *
+ *  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])
+#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 34     /* [CLO] CCL 32bytes END ... */
+#define ANYSKIP 2      /* [CLO] ANY END          */
+#define CHRSKIP 3      /* [CLO] CHR chr END      */
+#define CCLSKIP 34     /* [CLO] CCL 32 bytes 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. */
+       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) {
@@ -756,44 +738,15 @@ int RESearch::PMatch(CharacterIndexer &ci, int lp, int endp, char *ap) {
        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 matched portions of the src in dst.
  *
- *     &       substitute the entire matched pattern.
+ *  &    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.
+ *  \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;
index a558b371d2542ad64f2f9abf840a5af43721d1cb..aa85579184257f2aaae1c5e4f42a8b97e83e53b0 100644 (file)
@@ -18,7 +18,7 @@
 #define BITBLK MAXCHR/CHRBIT
 
 class CharacterIndexer {
-public: 
+public:
        virtual char CharAt(int index)=0;
        virtual ~CharacterIndexer() {
        }
@@ -27,16 +27,11 @@ public:
 class RESearch {
 
 public:
-       RESearch();
+       RESearch(CharClassify *charClassTable);
        ~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, bool posix);
        int Execute(CharacterIndexer &ci, int lp, int endp);
-       void ModifyWord(char *s);
        int Substitute(CharacterIndexer &ci, char *src, char *dst);
 
        enum {MAXTAG=10};
@@ -48,15 +43,23 @@ public:
        char *pat[MAXTAG];
 
 private:
+       void Init();
+       void Clear();
+       void ChSet(char c);
+       void ChSetWithCase(char c, bool caseSensitive);
+
        int PMatch(CharacterIndexer &ci, int lp, int endp, char *ap);
 
        int bol;
-       int  tagstk[MAXTAG];             /* subpat tag stack..*/
-       char nfa[MAXNFA];               /* automaton..       */
+       int  tagstk[MAXTAG]; /* subpat tag stack */
+       char nfa[MAXNFA];    /* automaton */
        int sta;
-       char bittab[BITBLK];            /* bit table for CCL */
-                                               /* pre-set bits...   */
+       char bittab[BITBLK]; /* bit table for CCL pre-set bits */
        int failure;
+       CharClassify *charClass;
+       bool iswordc(unsigned char x) {
+               return charClass->IsWord(x);
+       }
 };
 
 #endif
index 6be8b74b533134932031686896dfc313572d4710..bcb0a77e29730a93d878af7fc7bfa64b037a6b45 100644 (file)
@@ -31,6 +31,7 @@
 #include "Style.h"
 #include "ViewStyle.h"
 #include "AutoComplete.h"
+#include "CharClassify.h"
 #include "Document.h"
 #include "Editor.h"
 #include "ScintillaBase.h"
@@ -368,12 +369,19 @@ int ScintillaBase::AutoCompleteGetCurrent() {
 void ScintillaBase::CallTipShow(Point pt, const char *defn) {
        AutoCompleteCancel();
        pt.y += vs.lineHeight;
+       // If container knows about STYLE_CALLTIP then use it in place of the
+       // STYLE_DEFAULT for the face name, size and character set. Also use it
+       // for the foreground and background colour.
+       int ctStyle = ct.UseStyleCallTip() ? STYLE_CALLTIP : STYLE_DEFAULT;
+       if (ct.UseStyleCallTip()) {
+               ct.SetForeBack(vs.styles[STYLE_CALLTIP].fore, vs.styles[STYLE_CALLTIP].back);
+       }
        PRectangle rc = ct.CallTipStart(currentPos, pt,
                defn,
-               vs.styles[STYLE_DEFAULT].fontName,
-               vs.styles[STYLE_DEFAULT].sizeZoomed,
+               vs.styles[ctStyle].fontName,
+               vs.styles[ctStyle].sizeZoomed,
                CodePage(),
-               vs.styles[STYLE_DEFAULT].characterSet,
+               vs.styles[ctStyle].characterSet,
                wMain);
        // If the call-tip window would be out of the client
        // space, adjust so it displays above the text.
@@ -461,7 +469,7 @@ void ScintillaBase::Colourise(int start, int end) {
 
                int styleStart = 0;
                if (start > 0)
-                       styleStart = styler.StyleAt(start - 1);
+                       styleStart = styler.StyleAt(start - 1) & pdoc->stylingBitsMask;
                styler.SetCodePage(pdoc->dbcsCodePage);
 
                if (lexCurrent && (len > 0)) {  // Should always succeed as null lexer should always be available
@@ -624,11 +632,13 @@ sptr_t ScintillaBase::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lPara
 
        case SCI_CALLTIPSETBACK:
                ct.colourBG = ColourDesired(wParam);
+               vs.styles[STYLE_CALLTIP].fore = ct.colourBG;
                InvalidateStyleRedraw();
                break;
 
        case SCI_CALLTIPSETFORE:
                ct.colourUnSel = ColourDesired(wParam);
+               vs.styles[STYLE_CALLTIP].fore = ct.colourUnSel;
                InvalidateStyleRedraw();
                break;
 
@@ -637,6 +647,11 @@ sptr_t ScintillaBase::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lPara
                InvalidateStyleRedraw();
                break;
 
+       case SCI_CALLTIPUSESTYLE:
+               ct.SetTabSize((int)wParam);
+               InvalidateStyleRedraw();
+               break;
+
        case SCI_USEPOPUP:
                displayPopupMenu = wParam != 0;
                break;
index c52f1e47287a51a1a1ed45acf8a2f54500332a0e..b4da30ace3f2077200aaf40891dc06a43f96fe83 100644 (file)
@@ -17,7 +17,7 @@
 #include "ViewStyle.h"
 
 MarginStyle::MarginStyle() :
-       symbol(false), width(16), mask(0xffffffff), sensitive(false) {
+       style(SC_MARGIN_SYMBOL), width(0), mask(0), sensitive(false) {
 }
 
 // A list of the fontnames - avoids wasting space in each style
@@ -73,6 +73,7 @@ ViewStyle::ViewStyle(const ViewStyle &source) {
        selbackset = source.selbackset;
        selbackground.desired = source.selbackground.desired;
        selbackground2.desired = source.selbackground2.desired;
+       selAlpha = source.selAlpha;
 
        foldmarginColourSet = source.foldmarginColourSet;
        foldmarginColour.desired = source.foldmarginColour.desired;
@@ -95,6 +96,7 @@ ViewStyle::ViewStyle(const ViewStyle &source) {
        caretcolour.desired = source.caretcolour.desired;
        showCaretLineBackground = source.showCaretLineBackground;
        caretLineBackground.desired = source.caretLineBackground.desired;
+       caretLineAlpha = source.caretLineAlpha;
        edgecolour.desired = source.edgecolour.desired;
        edgeState = source.edgeState;
        caretWidth = source.caretWidth;
@@ -140,6 +142,7 @@ void ViewStyle::Init() {
        selbackset = true;
        selbackground.desired = ColourDesired(0xc0, 0xc0, 0xc0);
        selbackground2.desired = ColourDesired(0xb0, 0xb0, 0xb0);
+       selAlpha = SC_ALPHA_NOALPHA;
 
        foldmarginColourSet = false;
        foldmarginColour.desired = ColourDesired(0xff, 0, 0);
@@ -157,6 +160,7 @@ void ViewStyle::Init() {
        caretcolour.desired = ColourDesired(0, 0, 0);
        showCaretLineBackground = false;
        caretLineBackground.desired = ColourDesired(0xff, 0xff, 0);
+       caretLineAlpha = SC_ALPHA_NOALPHA;
        edgecolour.desired = ColourDesired(0xc0, 0xc0, 0xc0);
        edgeState = EDGE_NONE;
        caretWidth = 1;
@@ -171,13 +175,13 @@ void ViewStyle::Init() {
 
        leftMarginWidth = 1;
        rightMarginWidth = 1;
-       ms[0].symbol = false;
+       ms[0].style = SC_MARGIN_NUMBER;
        ms[0].width = 0;
        ms[0].mask = 0;
-       ms[1].symbol = true;
+       ms[1].style = SC_MARGIN_SYMBOL;
        ms[1].width = 16;
        ms[1].mask = ~SC_MASK_FOLDERS;
-       ms[2].symbol = true;
+       ms[2].style = SC_MARGIN_SYMBOL;
        ms[2].width = 0;
        ms[2].mask = 0;
        fixedColumnWidth = leftMarginWidth;
@@ -185,7 +189,7 @@ void ViewStyle::Init() {
        maskInLine = 0xffffffff;
        for (int margin=0; margin < margins; margin++) {
                fixedColumnWidth += ms[margin].width;
-               symbolMargin = symbolMargin || ms[margin].symbol;
+               symbolMargin = symbolMargin || (ms[margin].style != SC_MARGIN_NUMBER);
                if (ms[margin].width > 0)
                        maskInLine &= ~ms[margin].mask;
        }
@@ -256,7 +260,7 @@ void ViewStyle::Refresh(Surface &surface) {
        maskInLine = 0xffffffff;
        for (int margin=0; margin < margins; margin++) {
                fixedColumnWidth += ms[margin].width;
-               symbolMargin = symbolMargin || ms[margin].symbol;
+               symbolMargin = symbolMargin || (ms[margin].style != SC_MARGIN_NUMBER);
                if (ms[margin].width > 0)
                        maskInLine &= ~ms[margin].mask;
        }
@@ -278,6 +282,10 @@ void ViewStyle::ClearStyles() {
                }
        }
        styles[STYLE_LINENUMBER].back.desired = Platform::Chrome();
+
+       // Set call tip fore/back to match the values previously set for call tips
+       styles[STYLE_CALLTIP].back.desired = ColourDesired(0xff, 0xff, 0xff);
+       styles[STYLE_CALLTIP].fore.desired = ColourDesired(0x80, 0x80, 0x80);
 }
 
 void ViewStyle::SetStyleFontName(int styleIndex, const char *name) {
index d06c0200272de604f482998a7d609efb4971a252..75f899d974a2e588cddb1bdea39cc253c95442ed 100644 (file)
@@ -12,7 +12,7 @@
  */
 class MarginStyle {
 public:
-       bool symbol;
+       int style;
        int width;
        int mask;
        bool sensitive;
@@ -53,6 +53,7 @@ public:
        bool selbackset;
        ColourPair selbackground;
        ColourPair selbackground2;
+       int selAlpha;
        bool whitespaceForegroundSet;
        ColourPair whitespaceForeground;
        bool whitespaceBackgroundSet;
@@ -70,7 +71,7 @@ public:
        bool hotspotUnderline;
        bool hotspotSingleLine;
        /// Margins are ordered: Line Numbers, Selection Margin, Spacing Margin
-       enum { margins=3 };
+       enum { margins=5 };
        int leftMarginWidth;    ///< Spacing margin on left of text
        int rightMarginWidth;   ///< Spacing margin on left of text
        bool symbolMargin;
@@ -85,6 +86,7 @@ public:
        ColourPair caretcolour;
        bool showCaretLineBackground;
        ColourPair caretLineBackground;
+       int caretLineAlpha;
        ColourPair edgecolour;
        int edgeState;
        int caretWidth;
index f42348d4bf47972a51ef777770942176e5eb4295..108dc0288c320e2a4967c8a89019c731602b6810 100644 (file)
@@ -535,6 +535,11 @@ void wxStyledTextCtrl::MarkerAddSet(int line, int set) {
     SendMsg(2466, line, set);
 }
 
+// Set the alpha used for a marker that is drawn in the text area, not the margin.
+void wxStyledTextCtrl::MarkerSetAlpha(int markerNumber, int alpha) {
+    SendMsg(2476, markerNumber, alpha);
+}
+
 // Set a margin to be either numeric or symbolic.
 void wxStyledTextCtrl::SetMarginType(int margin, int marginType) {
     SendMsg(2240, margin, marginType);
@@ -645,6 +650,16 @@ void wxStyledTextCtrl::SetSelBackground(bool useSetting, const wxColour& back) {
     SendMsg(2068, useSetting, wxColourAsLong(back));
 }
 
+// Get the alpha of the selection.
+int wxStyledTextCtrl::GetSelAlpha() {
+    return SendMsg(2477, 0, 0);
+}
+
+// Set the alpha of the selection.
+void wxStyledTextCtrl::SetSelAlpha(int alpha) {
+    SendMsg(2478, alpha, 0);
+}
+
 // Set the foreground colour of the caret.
 void wxStyledTextCtrl::SetCaretForeground(const wxColour& fore) {
     SendMsg(2069, wxColourAsLong(fore), 0);
@@ -1445,6 +1460,11 @@ void wxStyledTextCtrl::CallTipSetForegroundHighlight(const wxColour& fore) {
     SendMsg(2207, wxColourAsLong(fore), 0);
 }
 
+// Enable use of STYLE_CALLTIP and set call tip tab size in pixels.
+void wxStyledTextCtrl::CallTipUseStyle(int tabSize) {
+    SendMsg(2212, tabSize, 0);
+}
+
 // Find the display line of a document line taking hidden lines into account.
 int wxStyledTextCtrl::VisibleFromDocLine(int line) {
     return SendMsg(2220, line, 0);
@@ -2481,6 +2501,16 @@ void wxStyledTextCtrl::SelectionDuplicate() {
     SendMsg(2469, 0, 0);
 }
 
+// Set background alpha of the caret line.
+void wxStyledTextCtrl::SetCaretLineBackAlpha(int alpha) {
+    SendMsg(2470, alpha, 0);
+}
+
+// Get the background alpha of the caret line.
+int wxStyledTextCtrl::GetCaretLineBackAlpha() {
+    return SendMsg(2471, 0, 0);
+}
+
 // Start notifying the container of all key presses and commands.
 void wxStyledTextCtrl::StartRecord() {
     SendMsg(3001, 0, 0);
index c4815d274c84d553b035a39107091d6966362dbc..dde5aa02b6bd1f5ea1310a5bff64290d12929636 100644 (file)
 #define wxSTC_MASK_FOLDERS 0xFE000000
 #define wxSTC_MARGIN_SYMBOL 0
 #define wxSTC_MARGIN_NUMBER 1
+#define wxSTC_MARGIN_BACK 2
+#define wxSTC_MARGIN_FORE 3
 
-// Styles in range 32..37 are predefined for parts of the UI and are not used as normal styles.
-// Styles 38 and 39 are for future use.
+// Styles in range 32..38 are predefined for parts of the UI and are not used as normal styles.
+// Style 39 is for future use.
 #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_CALLTIP 38
 #define wxSTC_STYLE_LASTPREDEFINED 39
 #define wxSTC_STYLE_MAX 127
 
 #define wxSTC_INDIC_STRIKE 4
 #define wxSTC_INDIC_HIDDEN 5
 #define wxSTC_INDIC_BOX 6
+#define wxSTC_INDIC_ROUNDBOX 7
 #define wxSTC_INDIC0_MASK 0x20
 #define wxSTC_INDIC1_MASK 0x40
 #define wxSTC_INDIC2_MASK 0x80
 #define wxSTC_SEL_STREAM 0
 #define wxSTC_SEL_RECTANGLE 1
 #define wxSTC_SEL_LINES 2
+#define wxSTC_ALPHA_TRANSPARENT 0
+#define wxSTC_ALPHA_OPAQUE 255
+#define wxSTC_ALPHA_NOALPHA 256
 
 // Maximum value of keywordSet parameter of SetKeyWords.
 #define wxSTC_KEYWORDSET_MAX 8
 #define wxSTC_LEX_FLAGSHIP 73
 #define wxSTC_LEX_CSOUND 74
 #define wxSTC_LEX_FREEBASIC 75
-
-// These are deprecated, STC_LEX_HTML should be used instead.
-#define wxSTC_LEX_ASP 29
-#define wxSTC_LEX_PHP 30
+#define wxSTC_LEX_INNOSETUP 76
+#define wxSTC_LEX_OPAL 77
+#define wxSTC_LEX_SPICE 78
 
 // When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
 // value assigned in sequence from SCLEX_AUTOMATIC+1.
 #define wxSTC_C_COMMENTDOCKEYWORDERROR 18
 #define wxSTC_C_GLOBALCLASS 19
 
+// Lexical states for SCLEX_TCL
+#define wxSTC_TCL_DEFAULT 0
+#define wxSTC_TCL_COMMENT 1
+#define wxSTC_TCL_COMMENTLINE 2
+#define wxSTC_TCL_NUMBER 3
+#define wxSTC_TCL_WORD_IN_QUOTE 4
+#define wxSTC_TCL_IN_QUOTE 5
+#define wxSTC_TCL_OPERATOR 6
+#define wxSTC_TCL_IDENTIFIER 7
+#define wxSTC_TCL_SUBSTITUTION 8
+#define wxSTC_TCL_SUB_BRACE 9
+#define wxSTC_TCL_MODIFIER 10
+#define wxSTC_TCL_EXPAND 11
+#define wxSTC_TCL_WORD 12
+#define wxSTC_TCL_WORD2 13
+#define wxSTC_TCL_WORD3 14
+#define wxSTC_TCL_WORD4 15
+#define wxSTC_TCL_WORD5 16
+#define wxSTC_TCL_WORD6 17
+#define wxSTC_TCL_WORD7 18
+#define wxSTC_TCL_WORD8 19
+#define wxSTC_TCL_COMMENT_BOX 20
+#define wxSTC_TCL_BLOCK_COMMENT 21
+
 // Lexical states for SCLEX_HTML, SCLEX_XML
 #define wxSTC_H_DEFAULT 0
 #define wxSTC_H_TAG 1
 #define wxSTC_PROPS_SECTION 2
 #define wxSTC_PROPS_ASSIGNMENT 3
 #define wxSTC_PROPS_DEFVAL 4
+#define wxSTC_PROPS_KEY 5
 
 // Lexical states for SCLEX_LATEX
 #define wxSTC_L_DEFAULT 0
 #define wxSTC_AU3_SPECIAL 12
 #define wxSTC_AU3_EXPAND 13
 #define wxSTC_AU3_COMOBJ 14
+#define wxSTC_AU3_UDF 15
 
 // Lexical states for SCLEX_APDL
 #define wxSTC_APDL_DEFAULT 0
 #define wxSTC_CSOUND_GLOBAL_VAR 14
 #define wxSTC_CSOUND_STRINGEOL 15
 
+// Lexical states for SCLEX_INNOSETUP
+#define wxSTC_INNO_DEFAULT 0
+#define wxSTC_INNO_COMMENT 1
+#define wxSTC_INNO_KEYWORD 2
+#define wxSTC_INNO_PARAMETER 3
+#define wxSTC_INNO_SECTION 4
+#define wxSTC_INNO_PREPROC 5
+#define wxSTC_INNO_PREPROC_INLINE 6
+#define wxSTC_INNO_COMMENT_PASCAL 7
+#define wxSTC_INNO_KEYWORD_PASCAL 8
+#define wxSTC_INNO_KEYWORD_USER 9
+#define wxSTC_INNO_STRING_DOUBLE 10
+#define wxSTC_INNO_STRING_SINGLE 11
+#define wxSTC_INNO_IDENTIFIER 12
+
+// Lexical states for SCLEX_OPAL
+#define wxSTC_OPAL_SPACE 0
+#define wxSTC_OPAL_COMMENT_BLOCK 1
+#define wxSTC_OPAL_COMMENT_LINE 2
+#define wxSTC_OPAL_INTEGER 3
+#define wxSTC_OPAL_KEYWORD 4
+#define wxSTC_OPAL_SORT 5
+#define wxSTC_OPAL_STRING 6
+#define wxSTC_OPAL_PAR 7
+#define wxSTC_OPAL_BOOL_CONST 8
+#define wxSTC_OPAL_DEFAULT 32
+
+// Lexical states for SCLEX_SPICE
+#define wxSTC_SPICE_DEFAULT 0
+#define wxSTC_SPICE_IDENTIFIER 1
+#define wxSTC_SPICE_KEYWORD 2
+#define wxSTC_SPICE_KEYWORD2 3
+#define wxSTC_SPICE_KEYWORD3 4
+#define wxSTC_SPICE_NUMBER 5
+#define wxSTC_SPICE_DELIMITER 6
+#define wxSTC_SPICE_VALUE 7
+#define wxSTC_SPICE_COMMENTLINE 8
+
 
 //-----------------------------------------
 // Commands that can be bound to keystrokes
@@ -1935,6 +2005,9 @@ public:
     // Add a set of markers to a line.
     void MarkerAddSet(int line, int set);
 
+    // Set the alpha used for a marker that is drawn in the text area, not the margin.
+    void MarkerSetAlpha(int markerNumber, int alpha);
+
     // Set a margin to be either numeric or symbolic.
     void SetMarginType(int margin, int marginType);
 
@@ -2001,6 +2074,12 @@ public:
     // Set the background colour of the selection and whether to use this setting.
     void SetSelBackground(bool useSetting, const wxColour& back);
 
+    // Get the alpha of the selection.
+    int GetSelAlpha();
+
+    // Set the alpha of the selection.
+    void SetSelAlpha(int alpha);
+
     // Set the foreground colour of the caret.
     void SetCaretForeground(const wxColour& fore);
 
@@ -2440,6 +2519,9 @@ public:
     // Set the foreground colour for the highlighted part of the call tip.
     void CallTipSetForegroundHighlight(const wxColour& fore);
 
+    // Enable use of STYLE_CALLTIP and set call tip tab size in pixels.
+    void CallTipUseStyle(int tabSize);
+
     // Find the display line of a document line taking hidden lines into account.
     int VisibleFromDocLine(int line);
 
@@ -3068,6 +3150,12 @@ public:
     // Duplicate the selection. If selection empty duplicate the line containing the caret.
     void SelectionDuplicate();
 
+    // Set background alpha of the caret line.
+    void SetCaretLineBackAlpha(int alpha);
+
+    // Get the background alpha of the caret line.
+    int GetCaretLineBackAlpha();
+
     // Start notifying the container of all key presses and commands.
     void StartRecord();
 
index 6f91459bfc25efef610f486187c9c0c7b82a0895..5dc6c114a3a5d74c35806b09c5deaf34cc2c3d31 100644 (file)
@@ -66,6 +66,7 @@ STCDLL_OBJECTS =  \
        stcdll_AutoComplete.o \
        stcdll_CallTip.o \
        stcdll_CellBuffer.o \
+       stcdll_CharClassify.o \
        stcdll_ContractionState.o \
        stcdll_Document.o \
        stcdll_DocumentAccessor.o \
@@ -100,6 +101,7 @@ STCDLL_OBJECTS =  \
        stcdll_LexGui4Cli.o \
        stcdll_LexHTML.o \
        stcdll_LexHaskell.o \
+       stcdll_LexInno.o \
        stcdll_LexKix.o \
        stcdll_LexLisp.o \
        stcdll_LexLout.o \
@@ -110,6 +112,7 @@ STCDLL_OBJECTS =  \
        stcdll_LexMatlab.o \
        stcdll_LexMetapost.o \
        stcdll_LexNsis.o \
+       stcdll_LexOpal.o \
        stcdll_LexOthers.o \
        stcdll_LexPB.o \
        stcdll_LexPOV.o \
@@ -124,6 +127,8 @@ STCDLL_OBJECTS =  \
        stcdll_LexTADS3.o \
        stcdll_LexScriptol.o \
        stcdll_LexSpecman.o \
+       stcdll_LexSpice.o \
+       stcdll_LexTCL.o \
        stcdll_LexTeX.o \
        stcdll_LexVB.o \
        stcdll_LexVHDL.o \
@@ -151,6 +156,7 @@ STCLIB_OBJECTS =  \
        stclib_AutoComplete.o \
        stclib_CallTip.o \
        stclib_CellBuffer.o \
+       stclib_CharClassify.o \
        stclib_ContractionState.o \
        stclib_Document.o \
        stclib_DocumentAccessor.o \
@@ -185,6 +191,7 @@ STCLIB_OBJECTS =  \
        stclib_LexGui4Cli.o \
        stclib_LexHTML.o \
        stclib_LexHaskell.o \
+       stclib_LexInno.o \
        stclib_LexKix.o \
        stclib_LexLisp.o \
        stclib_LexLout.o \
@@ -195,6 +202,7 @@ STCLIB_OBJECTS =  \
        stclib_LexMatlab.o \
        stclib_LexMetapost.o \
        stclib_LexNsis.o \
+       stclib_LexOpal.o \
        stclib_LexOthers.o \
        stclib_LexPB.o \
        stclib_LexPOV.o \
@@ -209,6 +217,8 @@ STCLIB_OBJECTS =  \
        stclib_LexTADS3.o \
        stclib_LexScriptol.o \
        stclib_LexSpecman.o \
+       stclib_LexSpice.o \
+       stclib_LexTCL.o \
        stclib_LexTeX.o \
        stclib_LexVB.o \
        stclib_LexVHDL.o \
@@ -415,6 +425,9 @@ stcdll_CallTip.o: $(srcdir)/scintilla/src/CallTip.cxx
 stcdll_CellBuffer.o: $(srcdir)/scintilla/src/CellBuffer.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $(srcdir)/scintilla/src/CellBuffer.cxx
 
+stcdll_CharClassify.o: $(srcdir)/scintilla/src/CharClassify.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $(srcdir)/scintilla/src/CharClassify.cxx
+
 stcdll_ContractionState.o: $(srcdir)/scintilla/src/ContractionState.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $(srcdir)/scintilla/src/ContractionState.cxx
 
@@ -517,6 +530,9 @@ stcdll_LexHTML.o: $(srcdir)/scintilla/src/LexHTML.cxx
 stcdll_LexHaskell.o: $(srcdir)/scintilla/src/LexHaskell.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $(srcdir)/scintilla/src/LexHaskell.cxx
 
+stcdll_LexInno.o: $(srcdir)/scintilla/src/LexInno.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $(srcdir)/scintilla/src/LexInno.cxx
+
 stcdll_LexKix.o: $(srcdir)/scintilla/src/LexKix.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $(srcdir)/scintilla/src/LexKix.cxx
 
@@ -547,6 +563,9 @@ stcdll_LexMetapost.o: $(srcdir)/scintilla/src/LexMetapost.cxx
 stcdll_LexNsis.o: $(srcdir)/scintilla/src/LexNsis.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $(srcdir)/scintilla/src/LexNsis.cxx
 
+stcdll_LexOpal.o: $(srcdir)/scintilla/src/LexOpal.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $(srcdir)/scintilla/src/LexOpal.cxx
+
 stcdll_LexOthers.o: $(srcdir)/scintilla/src/LexOthers.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $(srcdir)/scintilla/src/LexOthers.cxx
 
@@ -589,6 +608,12 @@ stcdll_LexScriptol.o: $(srcdir)/scintilla/src/LexScriptol.cxx
 stcdll_LexSpecman.o: $(srcdir)/scintilla/src/LexSpecman.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $(srcdir)/scintilla/src/LexSpecman.cxx
 
+stcdll_LexSpice.o: $(srcdir)/scintilla/src/LexSpice.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $(srcdir)/scintilla/src/LexSpice.cxx
+
+stcdll_LexTCL.o: $(srcdir)/scintilla/src/LexTCL.cxx
+       $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $(srcdir)/scintilla/src/LexTCL.cxx
+
 stcdll_LexTeX.o: $(srcdir)/scintilla/src/LexTeX.cxx
        $(CXXC) -c -o $@ $(STCDLL_CXXFLAGS) $(srcdir)/scintilla/src/LexTeX.cxx
 
@@ -652,6 +677,9 @@ stclib_CallTip.o: $(srcdir)/scintilla/src/CallTip.cxx
 stclib_CellBuffer.o: $(srcdir)/scintilla/src/CellBuffer.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $(srcdir)/scintilla/src/CellBuffer.cxx
 
+stclib_CharClassify.o: $(srcdir)/scintilla/src/CharClassify.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $(srcdir)/scintilla/src/CharClassify.cxx
+
 stclib_ContractionState.o: $(srcdir)/scintilla/src/ContractionState.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $(srcdir)/scintilla/src/ContractionState.cxx
 
@@ -754,6 +782,9 @@ stclib_LexHTML.o: $(srcdir)/scintilla/src/LexHTML.cxx
 stclib_LexHaskell.o: $(srcdir)/scintilla/src/LexHaskell.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $(srcdir)/scintilla/src/LexHaskell.cxx
 
+stclib_LexInno.o: $(srcdir)/scintilla/src/LexInno.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $(srcdir)/scintilla/src/LexInno.cxx
+
 stclib_LexKix.o: $(srcdir)/scintilla/src/LexKix.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $(srcdir)/scintilla/src/LexKix.cxx
 
@@ -784,6 +815,9 @@ stclib_LexMetapost.o: $(srcdir)/scintilla/src/LexMetapost.cxx
 stclib_LexNsis.o: $(srcdir)/scintilla/src/LexNsis.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $(srcdir)/scintilla/src/LexNsis.cxx
 
+stclib_LexOpal.o: $(srcdir)/scintilla/src/LexOpal.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $(srcdir)/scintilla/src/LexOpal.cxx
+
 stclib_LexOthers.o: $(srcdir)/scintilla/src/LexOthers.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $(srcdir)/scintilla/src/LexOthers.cxx
 
@@ -826,6 +860,12 @@ stclib_LexScriptol.o: $(srcdir)/scintilla/src/LexScriptol.cxx
 stclib_LexSpecman.o: $(srcdir)/scintilla/src/LexSpecman.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $(srcdir)/scintilla/src/LexSpecman.cxx
 
+stclib_LexSpice.o: $(srcdir)/scintilla/src/LexSpice.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $(srcdir)/scintilla/src/LexSpice.cxx
+
+stclib_LexTCL.o: $(srcdir)/scintilla/src/LexTCL.cxx
+       $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $(srcdir)/scintilla/src/LexTCL.cxx
+
 stclib_LexTeX.o: $(srcdir)/scintilla/src/LexTeX.cxx
        $(CXXC) -c -o $@ $(STCLIB_CXXFLAGS) $(srcdir)/scintilla/src/LexTeX.cxx
 
index ba0af83d73943225cce4b2a0d7ed511a34c59a93..2e80894a4756f4a23e06a600441eed06567a70dd 100644 (file)
@@ -47,14 +47,21 @@ wxColour wxColourFromCA(const ColourAllocated& ca) {
 Palette::Palette() {
     used = 0;
     allowRealization = false;
+    size = 100;
+    entries = new ColourPair[size];
 }
 
 Palette::~Palette() {
     Release();
+    delete [] entries;
+    entries = 0;
 }
 
 void Palette::Release() {
     used = 0;
+    delete [] entries;
+    size = 100;
+    entries = new ColourPair[size];
 }
 
 // This method either adds a colour to the list of wanted colours (want==true)
@@ -67,11 +74,20 @@ void Palette::WantFind(ColourPair &cp, bool want) {
                 return;
         }
 
-        if (used < numEntries) {
-            entries[used].desired = cp.desired;
-            entries[used].allocated.Set(cp.desired.AsLong());
-            used++;
+        if (used >= size) {
+            int sizeNew = size * 2;
+            ColourPair *entriesNew = new ColourPair[sizeNew];
+            for (int j=0; j<size; j++) {
+                entriesNew[j] = entries[j];
+            }
+            delete []entries;
+            entries = entriesNew;
+            size = sizeNew;
         }
+
+        entries[used].desired = cp.desired;
+        entries[used].allocated.Set(cp.desired.AsLong());
+        used++;
     } else {
         for (int i=0; i < used; i++) {
             if (entries[i].desired == cp.desired) {
@@ -162,6 +178,8 @@ public:
     virtual void FillRectangle(PRectangle rc, ColourAllocated back);
     virtual void FillRectangle(PRectangle rc, Surface &surfacePattern);
     virtual void RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAllocated back);
+    virtual void AlphaRectangle(PRectangle rc, int cornerSize, ColourAllocated fill, int alphaFill,
+                                ColourAllocated outline, int alphaOutline, int flags);
     virtual void Ellipse(PRectangle rc, ColourAllocated fore, ColourAllocated back);
     virtual void Copy(PRectangle rc, Point from, Surface &surfaceSource);
 
@@ -316,6 +334,14 @@ void SurfaceImpl::RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAl
     hdc->DrawRoundedRectangle(wxRectFromPRectangle(rc), 4);
 }
 
+void SurfaceImpl::AlphaRectangle(PRectangle rc, int cornerSize,
+                                 ColourAllocated fill, int alphaFill,
+                                 ColourAllocated outline, int alphaOutline, int flags) {
+// ** TODO
+
+    RectangleDraw(rc, outline, fill);
+}
+
 void SurfaceImpl::Ellipse(PRectangle rc, ColourAllocated fore, ColourAllocated back) {
     PenColour(fore);
     BrushColour(back);
index c945804fce32bc5ffd2ba5d9c74c4ceeb6830325..29cec6479678e4805c093ffba25d0809490199bd 100644 (file)
@@ -27,6 +27,7 @@
 #include "Platform.h"
 
 #include "Scintilla.h"
+#include "CharClassify.h"
 #include "XPM.h"
 #ifdef SCI_LEXER
 #include "SciLexer.h"
@@ -48,7 +49,6 @@
 #include "Editor.h"
 #include "ScintillaBase.h"
 
-
 //----------------------------------------------------------------------
 
 #ifdef WXMAKINGDLL_STC
index 3dfc8698517e4711d3bec7152853bc8f88ad1f39..89ff867d441e96e71cd796bec2eb504ea5e72fba 100644 (file)
@@ -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.67
+The current version of the Scintilla code is 1.70
 
index 88a05272fdc66b0d577e5668c1b5bef4392e8096..9dafa9f7d6e78f9ae274100ecee4e4d827a4475a 100644 (file)
@@ -236,12 +236,15 @@ class Window;     // Forward declaration for Palette
  */
 class Palette {
        int used;
-       enum {numEntries = 100};
-       ColourPair entries[numEntries];
+       int size;
+       ColourPair *entries;
 #if PLAT_GTK
        void *allocatedPalette; // GdkColor *
        int allocatedLen;
 #endif
+       // Private so Palette objects can not be copied
+       Palette(const Palette &) {}
+       Palette &operator=(const Palette &) { return *this; }
 public:
 #if PLAT_WIN
        void *hpal;
@@ -319,6 +322,8 @@ public:
        virtual void FillRectangle(PRectangle rc, ColourAllocated back)=0;
        virtual void FillRectangle(PRectangle rc, Surface &surfacePattern)=0;
        virtual void RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAllocated back)=0;
+       virtual void AlphaRectangle(PRectangle rc, int cornerSize, ColourAllocated fill, int alphaFill,
+               ColourAllocated outline, int alphaOutline, int flags)=0;
        virtual void Ellipse(PRectangle rc, ColourAllocated fore, ColourAllocated back)=0;
        virtual void Copy(PRectangle rc, Point from, Surface &surfaceSource)=0;
 
index 9c7fc8a7ddae27b2abe9c0cb09fab060ec36ab07..22d016d21c4524eabb5acf8a4b80ea2840ae330f 100644 (file)
@@ -88,6 +88,9 @@
 #define SCLEX_FLAGSHIP 73
 #define SCLEX_CSOUND 74
 #define SCLEX_FREEBASIC 75
+#define SCLEX_INNOSETUP 76
+#define SCLEX_OPAL 77
+#define SCLEX_SPICE 78
 #define SCLEX_AUTOMATIC 1000
 #define SCE_P_DEFAULT 0
 #define SCE_P_COMMENTLINE 1
 #define SCE_C_COMMENTDOCKEYWORD 17
 #define SCE_C_COMMENTDOCKEYWORDERROR 18
 #define SCE_C_GLOBALCLASS 19
+#define SCE_TCL_DEFAULT 0
+#define SCE_TCL_COMMENT 1
+#define SCE_TCL_COMMENTLINE 2
+#define SCE_TCL_NUMBER 3
+#define SCE_TCL_WORD_IN_QUOTE 4
+#define SCE_TCL_IN_QUOTE 5
+#define SCE_TCL_OPERATOR 6
+#define SCE_TCL_IDENTIFIER 7
+#define SCE_TCL_SUBSTITUTION 8
+#define SCE_TCL_SUB_BRACE 9
+#define SCE_TCL_MODIFIER 10
+#define SCE_TCL_EXPAND 11
+#define SCE_TCL_WORD 12
+#define SCE_TCL_WORD2 13
+#define SCE_TCL_WORD3 14
+#define SCE_TCL_WORD4 15
+#define SCE_TCL_WORD5 16
+#define SCE_TCL_WORD6 17
+#define SCE_TCL_WORD7 18
+#define SCE_TCL_WORD8 19
+#define SCE_TCL_COMMENT_BOX 20
+#define SCE_TCL_BLOCK_COMMENT 21
 #define SCE_H_DEFAULT 0
 #define SCE_H_TAG 1
 #define SCE_H_TAGUNKNOWN 2
 #define SCE_PROPS_SECTION 2
 #define SCE_PROPS_ASSIGNMENT 3
 #define SCE_PROPS_DEFVAL 4
+#define SCE_PROPS_KEY 5
 #define SCE_L_DEFAULT 0
 #define SCE_L_COMMAND 1
 #define SCE_L_TAG 2
 #define SCE_AU3_SPECIAL 12
 #define SCE_AU3_EXPAND 13
 #define SCE_AU3_COMOBJ 14
+#define SCE_AU3_UDF 15
 #define SCE_APDL_DEFAULT 0
 #define SCE_APDL_COMMENT 1
 #define SCE_APDL_COMMENTBLOCK 2
 #define SCE_CSOUND_IRATE_VAR 13
 #define SCE_CSOUND_GLOBAL_VAR 14
 #define SCE_CSOUND_STRINGEOL 15
+#define SCE_INNO_DEFAULT 0
+#define SCE_INNO_COMMENT 1
+#define SCE_INNO_KEYWORD 2
+#define SCE_INNO_PARAMETER 3
+#define SCE_INNO_SECTION 4
+#define SCE_INNO_PREPROC 5
+#define SCE_INNO_PREPROC_INLINE 6
+#define SCE_INNO_COMMENT_PASCAL 7
+#define SCE_INNO_KEYWORD_PASCAL 8
+#define SCE_INNO_KEYWORD_USER 9
+#define SCE_INNO_STRING_DOUBLE 10
+#define SCE_INNO_STRING_SINGLE 11
+#define SCE_INNO_IDENTIFIER 12
+#define SCE_OPAL_SPACE 0
+#define SCE_OPAL_COMMENT_BLOCK 1
+#define SCE_OPAL_COMMENT_LINE 2
+#define SCE_OPAL_INTEGER 3
+#define SCE_OPAL_KEYWORD 4
+#define SCE_OPAL_SORT 5
+#define SCE_OPAL_STRING 6
+#define SCE_OPAL_PAR 7
+#define SCE_OPAL_BOOL_CONST 8
+#define SCE_OPAL_DEFAULT 32
+#define SCE_SPICE_DEFAULT 0
+#define SCE_SPICE_IDENTIFIER 1
+#define SCE_SPICE_KEYWORD 2
+#define SCE_SPICE_KEYWORD2 3
+#define SCE_SPICE_KEYWORD3 4
+#define SCE_SPICE_NUMBER 5
+#define SCE_SPICE_DELIMITER 6
+#define SCE_SPICE_VALUE 7
+#define SCE_SPICE_COMMENTLINE 8
 #define SCLEX_ASP 29
 #define SCLEX_PHP 30
 //--Autogenerated -- end of section automatically generated from Scintilla.iface
index 4fb9ec338baac9e0079a5352ee3213a227ee7686..3a57da6ae2b13bf548a0ab8ef33fad795e387187 100644 (file)
@@ -138,8 +138,11 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
 #define SCI_MARKERPREVIOUS 2048
 #define SCI_MARKERDEFINEPIXMAP 2049
 #define SCI_MARKERADDSET 2466
+#define SCI_MARKERSETALPHA 2476
 #define SC_MARGIN_SYMBOL 0
 #define SC_MARGIN_NUMBER 1
+#define SC_MARGIN_BACK 2
+#define SC_MARGIN_FORE 3
 #define SCI_SETMARGINTYPEN 2240
 #define SCI_GETMARGINTYPEN 2241
 #define SCI_SETMARGINWIDTHN 2242
@@ -154,6 +157,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
 #define STYLE_BRACEBAD 35
 #define STYLE_CONTROLCHAR 36
 #define STYLE_INDENTGUIDE 37
+#define STYLE_CALLTIP 38
 #define STYLE_LASTPREDEFINED 39
 #define STYLE_MAX 127
 #define SC_CHARSET_ANSI 0
@@ -195,6 +199,8 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
 #define SCI_STYLESETHOTSPOT 2409
 #define SCI_SETSELFORE 2067
 #define SCI_SETSELBACK 2068
+#define SCI_GETSELALPHA 2477
+#define SCI_SETSELALPHA 2478
 #define SCI_SETCARETFORE 2069
 #define SCI_ASSIGNCMDKEY 2070
 #define SCI_CLEARCMDKEY 2071
@@ -214,6 +220,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
 #define INDIC_STRIKE 4
 #define INDIC_HIDDEN 5
 #define INDIC_BOX 6
+#define INDIC_ROUNDBOX 7
 #define INDIC0_MASK 0x20
 #define INDIC1_MASK 0x40
 #define INDIC2_MASK 0x80
@@ -358,6 +365,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
 #define SCI_CALLTIPSETBACK 2205
 #define SCI_CALLTIPSETFORE 2206
 #define SCI_CALLTIPSETFOREHLT 2207
+#define SCI_CALLTIPUSESTYLE 2212
 #define SCI_VISIBLEFROMDOCLINE 2220
 #define SCI_DOCLINEFROMVISIBLE 2221
 #define SCI_WRAPCOUNT 2235
@@ -607,6 +615,11 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
 #define SCI_SETPASTECONVERTENDINGS 2467
 #define SCI_GETPASTECONVERTENDINGS 2468
 #define SCI_SELECTIONDUPLICATE 2469
+#define SC_ALPHA_TRANSPARENT 0
+#define SC_ALPHA_OPAQUE 255
+#define SC_ALPHA_NOALPHA 256
+#define SCI_SETCARETLINEBACKALPHA 2470
+#define SCI_GETCARETLINEBACKALPHA 2471
 #define SCI_STARTRECORD 3001
 #define SCI_STOPRECORD 3002
 #define SCI_SETLEXER 4001
index 9f7e5c01c9cdfd65d099ee73cd49fed44d155252..9540e0de1aaa556c8cdfe24a8110802f076cc229 100644 (file)
@@ -316,9 +316,14 @@ fun void MarkerDefinePixmap=2049(int markerNumber, string pixmap)
 # Add a set of markers to a line.
 fun void MarkerAddSet=2466(int line, int set)
 
+# Set the alpha used for a marker that is drawn in the text area, not the margin.
+fun void MarkerSetAlpha=2476(int markerNumber, int alpha)
+
 enu MarginType=SC_MARGIN_
 val SC_MARGIN_SYMBOL=0
 val SC_MARGIN_NUMBER=1
+val SC_MARGIN_BACK=2
+val SC_MARGIN_FORE=3
 
 # Set a margin to be either numeric or symbolic.
 set void SetMarginTypeN=2240(int margin, int marginType)
@@ -344,8 +349,8 @@ set void SetMarginSensitiveN=2246(int margin, bool sensitive)
 # Retrieve the mouse click sensitivity of a margin.
 get bool GetMarginSensitiveN=2247(int margin,)
 
-# Styles in range 32..37 are predefined for parts of the UI and are not used as normal styles.
-# Styles 38 and 39 are for future use.
+# Styles in range 32..38 are predefined for parts of the UI and are not used as normal styles.
+# Style 39 is for future use.
 enu StylesCommon=STYLE_
 val STYLE_DEFAULT=32
 val STYLE_LINENUMBER=33
@@ -353,6 +358,7 @@ val STYLE_BRACELIGHT=34
 val STYLE_BRACEBAD=35
 val STYLE_CONTROLCHAR=36
 val STYLE_INDENTGUIDE=37
+val STYLE_CALLTIP=38
 val STYLE_LASTPREDEFINED=39
 val STYLE_MAX=127
 
@@ -430,6 +436,12 @@ fun void SetSelFore=2067(bool useSetting, colour fore)
 # Set the background colour of the selection and whether to use this setting.
 fun void SetSelBack=2068(bool useSetting, colour back)
 
+# Get the alpha of the selection.
+get int GetSelAlpha=2477(,)
+
+# Set the alpha of the selection.
+set void SetSelAlpha=2478(int alpha,)
+
 # Set the foreground colour of the caret.
 set void SetCaretFore=2069(colour fore,)
 
@@ -474,6 +486,7 @@ val INDIC_DIAGONAL=3
 val INDIC_STRIKE=4
 val INDIC_HIDDEN=5
 val INDIC_BOX=6
+val INDIC_ROUNDBOX=7
 val INDIC0_MASK=0x20
 val INDIC1_MASK=0x40
 val INDIC2_MASK=0x80
@@ -919,6 +932,9 @@ set void CallTipSetFore=2206(colour fore,)
 # Set the foreground colour for the highlighted part of the call tip.
 set void CallTipSetForeHlt=2207(colour fore,)
 
+# Enable use of STYLE_CALLTIP and set call tip tab size in pixels.
+set void CallTipUseStyle=2212(int tabSize,)
+
 # Find the display line of a document line taking hidden lines into account.
 fun int VisibleFromDocLine=2220(int line,)
 
@@ -1446,7 +1462,6 @@ get int GetXOffset=2398(,)
 fun void ChooseCaretX=2399(,)
 
 # Set the focus to this Scintilla widget.
-# GTK+ Specific.
 fun void GrabFocus=2400(,)
 
 enu CaretPolicy = CARET_
@@ -1642,6 +1657,16 @@ get bool GetPasteConvertEndings=2468(,)
 # Duplicate the selection. If selection empty duplicate the line containing the caret.
 fun void SelectionDuplicate=2469(,)
 
+val SC_ALPHA_TRANSPARENT=0
+val SC_ALPHA_OPAQUE=255
+val SC_ALPHA_NOALPHA=256
+
+# Set background alpha of the caret line.
+set void SetCaretLineBackAlpha=2470(int alpha,)
+
+# Get the background alpha of the caret line.
+get int GetCaretLineBackAlpha=2471(,)
+
 # Start notifying the container of all key presses and commands.
 fun void StartRecord=3001(,)
 
@@ -1820,11 +1845,9 @@ val SCLEX_SMALLTALK=72
 val SCLEX_FLAGSHIP=73
 val SCLEX_CSOUND=74
 val SCLEX_FREEBASIC=75
-
-# These are deprecated, STC_LEX_HTML should be used instead.
-val SCLEX_ASP=29
-val SCLEX_PHP=30
-
+val SCLEX_INNOSETUP=76
+val SCLEX_OPAL=77
+val SCLEX_SPICE=78
 
 # When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
 # value assigned in sequence from SCLEX_AUTOMATIC+1.
@@ -1850,7 +1873,6 @@ val SCE_P_DECORATOR=15
 # Lexical states for SCLEX_CPP
 lex Cpp=SCLEX_CPP SCE_C_
 lex Pascal=SCLEX_PASCAL SCE_C_
-lex TCL=SCLEX_TCL SCE_C_
 lex BullAnt=SCLEX_BULLANT SCE_C_
 val SCE_C_DEFAULT=0
 val SCE_C_COMMENT=1
@@ -1872,6 +1894,30 @@ val SCE_C_WORD2=16
 val SCE_C_COMMENTDOCKEYWORD=17
 val SCE_C_COMMENTDOCKEYWORDERROR=18
 val SCE_C_GLOBALCLASS=19
+# Lexical states for SCLEX_TCL
+lex TCL=SCLEX_TCL SCE_TCL_
+val SCE_TCL_DEFAULT=0
+val SCE_TCL_COMMENT=1
+val SCE_TCL_COMMENTLINE=2
+val SCE_TCL_NUMBER=3
+val SCE_TCL_WORD_IN_QUOTE=4
+val SCE_TCL_IN_QUOTE=5
+val SCE_TCL_OPERATOR=6
+val SCE_TCL_IDENTIFIER=7
+val SCE_TCL_SUBSTITUTION=8
+val SCE_TCL_SUB_BRACE=9
+val SCE_TCL_MODIFIER=10
+val SCE_TCL_EXPAND=11
+val SCE_TCL_WORD=12
+val SCE_TCL_WORD2=13
+val SCE_TCL_WORD3=14
+val SCE_TCL_WORD4=15
+val SCE_TCL_WORD5=16
+val SCE_TCL_WORD6=17
+val SCE_TCL_WORD7=18
+val SCE_TCL_WORD8=19
+val SCE_TCL_COMMENT_BOX=20
+val SCE_TCL_BLOCK_COMMENT=21
 # Lexical states for SCLEX_HTML, SCLEX_XML
 lex HTML=SCLEX_HTML SCE_H
 lex XML=SCLEX_XML SCE_H
@@ -2100,6 +2146,7 @@ val SCE_PROPS_COMMENT=1
 val SCE_PROPS_SECTION=2
 val SCE_PROPS_ASSIGNMENT=3
 val SCE_PROPS_DEFVAL=4
+val SCE_PROPS_KEY=5
 # Lexical states for SCLEX_LATEX
 lex LaTeX=SCLEX_LATEX SCE_L_
 val SCE_L_DEFAULT=0
@@ -2646,6 +2693,7 @@ val SCE_AU3_PREPROCESSOR=11
 val SCE_AU3_SPECIAL=12
 val SCE_AU3_EXPAND=13
 val SCE_AU3_COMOBJ=14
+val SCE_AU3_UDF=15
 # Lexical states for SCLEX_APDL
 lex APDL=SCLEX_APDL SCE_APDL_
 val SCE_APDL_DEFAULT=0
@@ -2883,6 +2931,44 @@ val SCE_CSOUND_KRATE_VAR=12
 val SCE_CSOUND_IRATE_VAR=13
 val SCE_CSOUND_GLOBAL_VAR=14
 val SCE_CSOUND_STRINGEOL=15
+# Lexical states for SCLEX_INNOSETUP
+lex Inno=SCLEX_INNOSETUP SCE_INNO_
+val SCE_INNO_DEFAULT=0
+val SCE_INNO_COMMENT=1
+val SCE_INNO_KEYWORD=2
+val SCE_INNO_PARAMETER=3
+val SCE_INNO_SECTION=4
+val SCE_INNO_PREPROC=5
+val SCE_INNO_PREPROC_INLINE=6
+val SCE_INNO_COMMENT_PASCAL=7
+val SCE_INNO_KEYWORD_PASCAL=8
+val SCE_INNO_KEYWORD_USER=9
+val SCE_INNO_STRING_DOUBLE=10
+val SCE_INNO_STRING_SINGLE=11
+val SCE_INNO_IDENTIFIER=12
+# Lexical states for SCLEX_OPAL
+lex Opal=SCLEX_OPAL SCE_OPAL_
+val SCE_OPAL_SPACE=0
+val SCE_OPAL_COMMENT_BLOCK=1
+val SCE_OPAL_COMMENT_LINE=2
+val SCE_OPAL_INTEGER=3
+val SCE_OPAL_KEYWORD=4
+val SCE_OPAL_SORT=5
+val SCE_OPAL_STRING=6
+val SCE_OPAL_PAR=7
+val SCE_OPAL_BOOL_CONST=8
+val SCE_OPAL_DEFAULT=32
+# Lexical states for SCLEX_SPICE
+lex Spice=SCLEX_SPICE SCE_SPICE_
+val SCE_SPICE_DEFAULT=0
+val SCE_SPICE_IDENTIFIER=1
+val SCE_SPICE_KEYWORD=2
+val SCE_SPICE_KEYWORD2=3
+val SCE_SPICE_KEYWORD3=4
+val SCE_SPICE_NUMBER=5
+val SCE_SPICE_DELIMITER=6
+val SCE_SPICE_VALUE=7
+val SCE_SPICE_COMMENTLINE=8
 
 # Events
 
index 7f47de7e13c33fd31b7aec0bb10a8ad12a703d50..9d23ce2a9180759f56d7889397d1ab5d972e5e0e 100644 (file)
@@ -34,7 +34,11 @@ struct _ScintillaClass {
        void (* notify) (ScintillaObject *ttt);
 };
 
+#if GLIB_MAJOR_VERSION < 2
 GtkType                scintilla_get_type      (void);
+#else
+GType          scintilla_get_type      (void);
+#endif
 GtkWidget*     scintilla_new           (void);
 void           scintilla_set_id        (ScintillaObject *sci, uptr_t id);
 sptr_t         scintilla_send_message  (ScintillaObject *sci,unsigned int iMessage, uptr_t wParam, sptr_t lParam);
index 80fd55d7b85dc9cdd178cf42fb4203fe065116b2..f4bc5f83c42e0c93e00db9c0ea4ddd4f16e7e788 100644 (file)
@@ -13,6 +13,9 @@
 #include "Scintilla.h"
 #include "CallTip.h"
 
+static const int insetX = 5;    // text inset in x from calltip border
+static const int widthArrow = 14;
+
 CallTip::CallTip() {
        wCallTip = 0;
        inCallTipMode = false;
@@ -23,6 +26,8 @@ CallTip::CallTip() {
        lineHeight = 1;
        startHighlight = 0;
        endHighlight = 0;
+       tabSize = 0;
+       useStyleCallTip = false;    // for backwards compatibility
 
        colourBG.desired = ColourDesired(0xff, 0xff, 0xff);
        colourUnSel.desired = ColourDesired(0x80, 0x80, 0x80);
@@ -38,8 +43,6 @@ CallTip::~CallTip() {
        val = 0;
 }
 
-const int widthArrow = 14;
-
 void CallTip::RefreshColourPalette(Palette &pal, bool want) {
        pal.WantFind(colourBG, want);
        pal.WantFind(colourUnSel, want);
@@ -48,19 +51,42 @@ void CallTip::RefreshColourPalette(Palette &pal, bool want) {
        pal.WantFind(colourLight, want);
 }
 
+// Although this test includes 0, we should never see a \0 character.
 static bool IsArrowCharacter(char ch) {
        return (ch == 0) || (ch == '\001') || (ch == '\002');
 }
 
+// We ignore tabs unless a tab width has been set.
+bool CallTip::IsTabCharacter(char ch) {
+       return (tabSize > 0) && (ch == '\t');
+}
+
+int CallTip::NextTabPos(int x) {
+       if (tabSize > 0) {              // paranoia... not called unless this is true
+               x -= insetX;                // position relative to text
+               x = (x + tabSize) / tabSize;  // tab "number"
+               return tabSize*x + insetX;  // position of next tab
+       } else {
+               return x + 1;                 // arbitrary
+       }
+}
+
+// Draw a section of the call tip that does not include \n in one colour.
+// The text may include up to numEnds tabs or arrow characters.
 void CallTip::DrawChunk(Surface *surface, int &x, const char *s,
        int posStart, int posEnd, int ytext, PRectangle rcClient,
        bool highlight, bool draw) {
        s += posStart;
        int len = posEnd - posStart;
+
+       // Divide the text into sections that are all text, or that are
+       // single arrows or single tab characters (if tabSize > 0).
        int maxEnd = 0;
-       int ends[10];
+       const int numEnds = 10;
+       int ends[numEnds + 2];
        for (int i=0;i<len;i++) {
-               if (IsArrowCharacter(s[i])) {
+               if ((maxEnd < numEnds) &&
+                       (IsArrowCharacter(s[i]) || IsTabCharacter(s[i])) ) {
                        if (i > 0)
                                ends[maxEnd++] = i;
                        ends[maxEnd++] = i+1;
@@ -73,20 +99,19 @@ void CallTip::DrawChunk(Surface *surface, int &x, const char *s,
                int endSeg = ends[seg];
                if (endSeg > startSeg) {
                        if (IsArrowCharacter(s[startSeg])) {
-                               xEnd = x + widthArrow;
-                               offsetMain = xEnd;
+                               bool upArrow = s[startSeg] == '\001';
                                rcClient.left = x;
-                               rcClient.right = xEnd;
+                               rcClient.right = rcClient.left + widthArrow;
                                if (draw) {
                                        const int halfWidth = widthArrow / 2 - 3;
-                                       const int centreX = x + widthArrow / 2 - 1;
+                                       const int centreX = rcClient.left + widthArrow / 2 - 1;
                                        const int centreY = (rcClient.top + rcClient.bottom) / 2;
                                        surface->FillRectangle(rcClient, colourBG.allocated);
-                                       PRectangle rcClientInner(rcClient.left+1, rcClient.top+1, rcClient.right-2, rcClient.bottom-1);
+                                       PRectangle rcClientInner(rcClient.left + 1, rcClient.top + 1,
+                                                                rcClient.right - 2, rcClient.bottom - 1);
                                        surface->FillRectangle(rcClientInner, colourUnSel.allocated);
 
-                                       if (s[startSeg] == '\001') {
-                                               // Up arrow
+                                       if (upArrow) {      // Up arrow
                                                Point pts[] = {
                                                Point(centreX - halfWidth, centreY + halfWidth / 2),
                                                Point(centreX + halfWidth, centreY + halfWidth / 2),
@@ -94,8 +119,7 @@ void CallTip::DrawChunk(Surface *surface, int &x, const char *s,
                                                };
                                                surface->Polygon(pts, sizeof(pts) / sizeof(pts[0]),
                                                                colourBG.allocated, colourBG.allocated);
-                                       } else {
-                                               // Down arrow
+                                       } else {            // Down arrow
                                                Point pts[] = {
                                                Point(centreX - halfWidth, centreY - halfWidth / 2),
                                                Point(centreX + halfWidth, centreY - halfWidth / 2),
@@ -105,20 +129,23 @@ void CallTip::DrawChunk(Surface *surface, int &x, const char *s,
                                                                colourBG.allocated, colourBG.allocated);
                                        }
                                }
-                               if (s[startSeg] == '\001') {
+                               xEnd = rcClient.right;
+                               offsetMain = xEnd;
+                               if (upArrow) {
                                        rectUp = rcClient;
-                               } else if (s[startSeg] == '\002') {
+                               } else {
                                        rectDown = rcClient;
                                }
+                       } else if (IsTabCharacter(s[startSeg])) {
+                               xEnd = NextTabPos(x);
                        } else {
-                               xEnd = x + surface->WidthText(font, s+startSeg, endSeg - startSeg);
+                               xEnd = x + surface->WidthText(font, s + startSeg, endSeg - startSeg);
                                if (draw) {
                                        rcClient.left = x;
                                        rcClient.right = xEnd;
-                                       surface->DrawTextNoClip(rcClient, font, ytext,
+                                       surface->DrawTextTransparent(rcClient, font, ytext,
                                                                                s+startSeg, endSeg - startSeg,
-                                                                               highlight ? colourSel.allocated : colourUnSel.allocated,
-                                                                               colourBG.allocated);
+                                                                    highlight ? colourSel.allocated : colourUnSel.allocated);
                                }
                        }
                        x = xEnd;
@@ -160,7 +187,7 @@ int CallTip::PaintContents(Surface *surfaceWindow, bool draw) {
                thisEndHighlight -= chunkOffset;
                rcClient.top = ytext - ascent - 1;
 
-               int x = 5;
+               int x = insetX;     // start each line at this inset
 
                DrawChunk(surfaceWindow, x, chunkVal, 0, thisStartHighlight,
                        ytext, rcClient, false, draw);
@@ -187,7 +214,7 @@ void CallTip::PaintCT(Surface *surfaceWindow) {
 
        surfaceWindow->FillRectangle(rcClient, colourBG.allocated);
 
-       offsetMain = 5;
+       offsetMain = insetX;    // initial alignment assuming no arrows
        PaintContents(surfaceWindow, true);
 
        // Draw a raised border around the edges of the window
@@ -238,14 +265,17 @@ PRectangle CallTip::CallTipStart(int pos, Point pt, const char *defn,
        const char *look = val;
        rectUp = PRectangle(0,0,0,0);
        rectDown = PRectangle(0,0,0,0);
-       offsetMain = 5;
-       int width = PaintContents(surfaceMeasure, false) + 5;
+       offsetMain = insetX;            // changed to right edge of any arrows
+       int width = PaintContents(surfaceMeasure, false) + insetX;
        while ((newline = strchr(look, '\n')) != NULL) {
                look = newline + 1;
                numLines++;
        }
        lineHeight = surfaceMeasure->Height(font);
-       // Extra line for border and an empty line at top and bottom
+
+       // Extra line for border and an empty line at top and bottom. The returned
+       // rectangle is aligned to the right edge of the last arrow encountered in
+       // the tip text, else to the tip text left edge.
        int height = lineHeight * numLines - surfaceMeasure->InternalLeading(font) + 2 + 2;
        delete surfaceMeasure;
        return PRectangle(pt.x - offsetMain, pt.y + 1, pt.x + width - offsetMain, pt.y + 1 + height);
@@ -268,3 +298,17 @@ void CallTip::SetHighlight(int start, int end) {
                }
        }
 }
+
+// Set the tab size (sizes > 0 enable the use of tabs). This also enables the
+// use of the STYLE_CALLTIP.
+void CallTip::SetTabSize(int tabSz) {
+       tabSize = tabSz;
+       useStyleCallTip = true;
+}
+
+// It might be better to have two access functions for this and to use
+// them for all settings of colours.
+void CallTip::SetForeBack(const ColourPair &fore, const ColourPair &back) {
+       colourBG = back;
+       colourUnSel = fore;
+}
index 53eec832a25e3a48128f8ffeebd650aff97b17e1..9848a10af989e89d5068acb4ec45a1d0b5d09311 100644 (file)
 /**
  */
 class CallTip {
-       int startHighlight;
-       int endHighlight;
+       int startHighlight;    // character offset to start and...
+       int endHighlight;      // ...end of highlighted text
        char *val;
        Font font;
-       PRectangle rectUp;
-       PRectangle rectDown;
-       int lineHeight;
-       int offsetMain;
+       PRectangle rectUp;      // rectangle of last up angle in the tip
+       PRectangle rectDown;    // rectangle of last down arrow in the tip
+       int lineHeight;         // vertical line spacing
+       int offsetMain;         // The alignment point of the call tip
+       int tabSize;            // Tab size in pixels, <=0 no TAB expand
+       bool useStyleCallTip;   // if true, STYLE_CALLTIP should be used
+
        // Private so CallTip objects can not be copied
        CallTip(const CallTip &) {}
        CallTip &operator=(const CallTip &) { return *this; }
@@ -26,6 +29,8 @@ class CallTip {
                int posStart, int posEnd, int ytext, PRectangle rcClient,
                bool highlight, bool draw);
        int PaintContents(Surface *surfaceWindow, bool draw);
+       bool IsTabCharacter(char c);
+       int NextTabPos(int x);
 
 public:
        Window wCallTip;
@@ -60,6 +65,15 @@ public:
        /// Set a range of characters to be displayed in a highlight style.
        /// Commonly used to highlight the current parameter.
        void SetHighlight(int start, int end);
+
+       /// Set the tab size in pixels for the call tip. 0 or -ve means no tab expand.
+       void SetTabSize(int tabSz);
+
+       /// Used to determine which STYLE_xxxx to use for call tip information
+       bool UseStyleCallTip() const { return useStyleCallTip;}
+
+       // Modify foreground and background colours
+       void SetForeBack(const ColourPair &fore, const ColourPair &back);
 };
 
 #endif
diff --git a/src/stc/scintilla/src/CharClassify.cxx b/src/stc/scintilla/src/CharClassify.cxx
new file mode 100644 (file)
index 0000000..acab4b2
--- /dev/null
@@ -0,0 +1,43 @@
+// Scintilla source code edit control
+/** @file CharClassify.cxx
+ ** Character classifications used by Document and RESearch.
+ **/
+// Copyright 2006 by Neil Hodgson <neilh@scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#include <ctype.h>
+
+#include "CharClassify.h"
+
+// Shut up annoying Visual C++ warnings:
+#ifdef _MSC_VER
+#pragma warning(disable: 4514)
+#endif
+
+CharClassify::CharClassify() {
+       SetDefaultCharClasses(true);
+}
+
+void CharClassify::SetDefaultCharClasses(bool includeWordClass) {
+       // Initialize all char classes to default values
+       for (int ch = 0; ch < 256; ch++) {
+               if (ch == '\r' || ch == '\n')
+                       charClass[ch] = ccNewLine;
+               else if (ch < 0x20 || ch == ' ')
+                       charClass[ch] = ccSpace;
+               else if (includeWordClass && (ch >= 0x80 || isalnum(ch) || ch == '_'))
+                       charClass[ch] = ccWord;
+               else
+                       charClass[ch] = ccPunctuation;
+       }
+}
+
+void CharClassify::SetCharClasses(const unsigned char *chars, cc newCharClass) {
+       // Apply the newCharClass to the specifed chars
+       if (chars) {
+               while (*chars) {
+                       charClass[*chars] = static_cast<unsigned char>(newCharClass);
+                       chars++;
+               }
+       }
+}
diff --git a/src/stc/scintilla/src/CharClassify.h b/src/stc/scintilla/src/CharClassify.h
new file mode 100644 (file)
index 0000000..881d3a1
--- /dev/null
@@ -0,0 +1,25 @@
+// Scintilla source code edit control
+/** @file CharClassify.h
+ ** Character classifications used by Document and RESearch.
+ **/
+// Copyright 2006 by Neil Hodgson <neilh@scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#ifndef CHARCLASSIFY_H
+#define CHARCLASSIFY_H
+
+class CharClassify {
+public:
+       CharClassify();
+
+       enum cc { ccSpace, ccNewLine, ccWord, ccPunctuation };
+       void SetDefaultCharClasses(bool includeWordClass);
+       void SetCharClasses(const unsigned char *chars, cc newCharClass);
+       cc GetClass(unsigned char ch) const { return static_cast<cc>(charClass[ch]);}
+       bool IsWord(unsigned char ch) const { return static_cast<cc>(charClass[ch]) == ccWord;}
+
+private:
+       enum { maxChar=256 };
+       unsigned char charClass[maxChar];    // not type cc to save space
+};
+#endif
index 8833b07bc0e7c72a97c042737b005c4cb56c80ff..3d021b080b2f6d46133833722001c9eeccb2b619 100644 (file)
@@ -280,4 +280,10 @@ void ContractionState::ShowAll() {
        delete []lines;
        lines = 0;
        size = 0;
+
+       delete []docLines;
+       docLines = 0;
+       sizeDocLines = 0;
+
+       linesInDisplay = linesInDoc;
 }
index a88468cb1a8b26431c99864764564e68a43a1bcf..92be92691c0a117dcfc8b8a0ca3828276dcfa2b6 100644 (file)
@@ -15,6 +15,7 @@
 #include "Scintilla.h"
 #include "SVector.h"
 #include "CellBuffer.h"
+#include "CharClassify.h"
 #include "Document.h"
 #include "RESearch.h"
 
@@ -50,7 +51,6 @@ Document::Document() {
        stylingBits = 5;
        stylingBitsMask = 0x1F;
        stylingMask = 0;
-       SetDefaultCharClasses(true);
        endStyled = 0;
        styleClock = 0;
        enteredCount = 0;
@@ -836,10 +836,10 @@ int Document::ParaDown(int pos) {
                return LineEnd(line-1);
 }
 
-Document::charClassification Document::WordCharClass(unsigned char ch) {
+CharClassify::cc Document::WordCharClass(unsigned char ch) {
        if ((SC_CP_UTF8 == dbcsCodePage) && (ch >= 0x80))
-               return ccWord;
-       return charClass[ch];
+               return CharClassify::ccWord;
+       return charClass.GetClass(ch);
 }
 
 /**
@@ -847,7 +847,7 @@ Document::charClassification Document::WordCharClass(unsigned char ch) {
  * Finds the start of word at pos when delta < 0 or the end of the word when delta >= 0.
  */
 int Document::ExtendWordSelect(int pos, int delta, bool onlyWordCharacters) {
-       charClassification ccStart = ccWord;
+       CharClassify::cc ccStart = CharClassify::ccWord;
        if (delta < 0) {
                if (!onlyWordCharacters)
                        ccStart = WordCharClass(cb.CharAt(pos-1));
@@ -871,19 +871,19 @@ int Document::ExtendWordSelect(int pos, int delta, bool onlyWordCharacters) {
  */
 int Document::NextWordStart(int pos, int delta) {
        if (delta < 0) {
-               while (pos > 0 && (WordCharClass(cb.CharAt(pos - 1)) == ccSpace))
+               while (pos > 0 && (WordCharClass(cb.CharAt(pos - 1)) == CharClassify::ccSpace))
                        pos--;
                if (pos > 0) {
-                       charClassification ccStart = WordCharClass(cb.CharAt(pos-1));
+                       CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos-1));
                        while (pos > 0 && (WordCharClass(cb.CharAt(pos - 1)) == ccStart)) {
                                pos--;
                        }
                }
        } else {
-               charClassification ccStart = WordCharClass(cb.CharAt(pos));
+               CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos));
                while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == ccStart))
                        pos++;
-               while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == ccSpace))
+               while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == CharClassify::ccSpace))
                        pos++;
        }
        return pos;
@@ -899,22 +899,22 @@ int Document::NextWordStart(int pos, int delta) {
 int Document::NextWordEnd(int pos, int delta) {
        if (delta < 0) {
                if (pos > 0) {
-                       charClassification ccStart = WordCharClass(cb.CharAt(pos-1));
-                       if (ccStart != ccSpace) {
+                       CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos-1));
+                       if (ccStart != CharClassify::ccSpace) {
                                while (pos > 0 && WordCharClass(cb.CharAt(pos - 1)) == ccStart) {
                                        pos--;
                                }
                        }
-                       while (pos > 0 && WordCharClass(cb.CharAt(pos - 1)) == ccSpace) {
+                       while (pos > 0 && WordCharClass(cb.CharAt(pos - 1)) == CharClassify::ccSpace) {
                                pos--;
                        }
                }
        } else {
-               while (pos < Length() && WordCharClass(cb.CharAt(pos)) == ccSpace) {
+               while (pos < Length() && WordCharClass(cb.CharAt(pos)) == CharClassify::ccSpace) {
                        pos++;
                }
                if (pos < Length()) {
-                       charClassification ccStart = WordCharClass(cb.CharAt(pos));
+                       CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos));
                        while (pos < Length() && WordCharClass(cb.CharAt(pos)) == ccStart) {
                                pos++;
                        }
@@ -929,8 +929,8 @@ int Document::NextWordEnd(int pos, int delta) {
  */
 bool Document::IsWordStartAt(int pos) {
        if (pos > 0) {
-               charClassification ccPos = WordCharClass(CharAt(pos));
-               return (ccPos == ccWord || ccPos == ccPunctuation) &&
+               CharClassify::cc ccPos = WordCharClass(CharAt(pos));
+               return (ccPos == CharClassify::ccWord || ccPos == CharClassify::ccPunctuation) &&
                        (ccPos != WordCharClass(CharAt(pos - 1)));
        }
        return true;
@@ -942,8 +942,8 @@ bool Document::IsWordStartAt(int pos) {
  */
 bool Document::IsWordEndAt(int pos) {
        if (pos < Length()) {
-               charClassification ccPrev = WordCharClass(CharAt(pos-1));
-               return (ccPrev == ccWord || ccPrev == ccPunctuation) &&
+               CharClassify::cc ccPrev = WordCharClass(CharAt(pos-1));
+               return (ccPrev == CharClassify::ccWord || ccPrev == CharClassify::ccPunctuation) &&
                        (ccPrev != WordCharClass(CharAt(pos)));
        }
        return true;
@@ -1004,7 +1004,7 @@ long Document::FindText(int minPos, int maxPos, const char *s,
                         int *length) {
        if (regExp) {
                if (!pre)
-                       pre = new RESearch();
+                       pre = new RESearch(&charClass);
                if (!pre)
                        return -1;
 
@@ -1266,27 +1266,11 @@ void Document::ChangeCase(Range r, bool makeUpperCase) {
 }
 
 void Document::SetDefaultCharClasses(bool includeWordClass) {
-       // Initialize all char classes to default values
-       for (int ch = 0; ch < 256; ch++) {
-               if (ch == '\r' || ch == '\n')
-                       charClass[ch] = ccNewLine;
-               else if (ch < 0x20 || ch == ' ')
-                       charClass[ch] = ccSpace;
-               else if (includeWordClass && (ch >= 0x80 || isalnum(ch) || ch == '_'))
-                       charClass[ch] = ccWord;
-               else
-                       charClass[ch] = ccPunctuation;
-       }
+    charClass.SetDefaultCharClasses(includeWordClass);
 }
 
-void Document::SetCharClasses(const unsigned char *chars, charClassification newCharClass) {
-       // Apply the newCharClass to the specifed chars
-       if (chars) {
-               while (*chars) {
-                       charClass[*chars] = newCharClass;
-                       chars++;
-               }
-       }
+void Document::SetCharClasses(const unsigned char *chars, CharClassify::cc newCharClass) {
+    charClass.SetCharClasses(chars, newCharClass);
 }
 
 void Document::SetStylingBits(int bits) {
@@ -1430,7 +1414,7 @@ void Document::NotifyModified(DocModification mh) {
 }
 
 bool Document::IsWordPartSeparator(char ch) {
-       return (WordCharClass(ch) == ccWord) && IsPunctuation(ch);
+       return (WordCharClass(ch) == CharClassify::ccWord) && IsPunctuation(ch);
 }
 
 int Document::WordPartLeft(int pos) {
index 6ff858b9238b517fb90b438e3e3425f016685c2c..d774d5664e33f1f012094ec8a8c8b72fc3c59037 100644 (file)
@@ -93,7 +93,7 @@ public:
 private:
        int refCount;
        CellBuffer cb;
-       charClassification charClass[256];
+       CharClassify charClass;
        char stylingMask;
        int endStyled;
        int styleClock;
@@ -207,7 +207,7 @@ public:
        void ChangeCase(Range r, bool makeUpperCase);
 
        void SetDefaultCharClasses(bool includeWordClass);
-       void SetCharClasses(const unsigned char *chars, charClassification newCharClass);
+       void SetCharClasses(const unsigned char *chars, CharClassify::cc newCharClass);
        void SetStylingBits(int bits);
        void StartStyling(int position, char mask);
        bool SetStyleFor(int length, char style);
@@ -239,7 +239,7 @@ public:
 private:
        void CheckReadOnly();
 
-       charClassification WordCharClass(unsigned char ch);
+       CharClassify::cc WordCharClass(unsigned char ch);
        bool IsWordStartAt(int pos);
        bool IsWordEndAt(int pos);
        bool IsWordAt(int start, int end);
index f479ce0259258fe9d668a32c6efb3558c628721b..c695c5f510e510131f0b496cc9eae95efddb7b7b 100644 (file)
@@ -18,6 +18,7 @@
 #include "DocumentAccessor.h"
 #include "CellBuffer.h"
 #include "Scintilla.h"
+#include "CharClassify.h"
 #include "Document.h"
 
 DocumentAccessor::~DocumentAccessor() {
index 2c0615e15012422d02230c6dec9086659179e236..87a0391b487ff2a951052f0871aa8868adf9e7aa 100644 (file)
@@ -26,6 +26,7 @@
 #include "LineMarker.h"
 #include "Style.h"
 #include "ViewStyle.h"
+#include "CharClassify.h"
 #include "Document.h"
 #include "Editor.h"
 
@@ -213,7 +214,7 @@ void LineLayoutCache::Allocate(int length_) {
 }
 
 void LineLayoutCache::AllocateForLevel(int linesOnScreen, int linesInDoc) {
-//     PLATFORM_ASSERT(useCount == 0);
+       PLATFORM_ASSERT(useCount == 0);
        int lengthForLevel = 0;
        if (level == llcCaret) {
                lengthForLevel = 1;
@@ -239,7 +240,7 @@ void LineLayoutCache::AllocateForLevel(int linesOnScreen, int linesInDoc) {
 }
 
 void LineLayoutCache::Deallocate() {
-//     PLATFORM_ASSERT(useCount == 0);
+       PLATFORM_ASSERT(useCount == 0);
        for (int i = 0; i < length; i++)
                delete cache[i];
        delete []cache;
@@ -284,7 +285,7 @@ LineLayout *LineLayoutCache::Retrieve(int lineNumber, int lineCaret, int maxChar
        } else if (level == llcPage) {
                if (lineNumber == lineCaret) {
                        pos = 0;
-               } else {
+               } else if (length > 1) {
                        pos = 1 + (lineNumber % (length - 1));
                }
        } else if (level == llcDocument) {
@@ -327,7 +328,7 @@ void LineLayoutCache::Dispose(LineLayout *ll) {
                        delete ll;
                } else {
                        useCount--;
-               }
+               }
        }
 }
 
@@ -428,9 +429,8 @@ Editor::Editor() {
 
        wrapState = eWrapNone;
        wrapWidth = LineLayout::wrapWidthInfinite;
-       docLineLastWrapped = -1;
-       docLastLineToWrap = -1;
-       backgroundWrapEnabled = true;
+       wrapStart = wrapLineLarge;
+       wrapEnd = wrapLineLarge;
        wrapVisualFlags = 0;
        wrapVisualFlagsLocation = 0;
        wrapVisualStartIndent = 0;
@@ -810,6 +810,9 @@ int Editor::PositionFromLocationClose(Point pt) {
                                        return pdoc->MovePositionOutsideChar(i + posLineStart, 1);
                                }
                        }
+                       if (pt.x < (ll->positions[lineEnd] - subLineStart)) {
+                               return pdoc->MovePositionOutsideChar(lineEnd + posLineStart, 1);
+                       }
                }
        }
 
@@ -1483,29 +1486,18 @@ void Editor::InvalidateCaret() {
 void Editor::UpdateSystemCaret() {
 }
 
-void Editor::NeedWrapping(int docLineStartWrapping, int docLineEndWrapping) {
-       docLineStartWrapping = Platform::Minimum(docLineStartWrapping, pdoc->LinesTotal()-1);
-       docLineEndWrapping = Platform::Minimum(docLineEndWrapping, pdoc->LinesTotal()-1);
-       bool noWrap = (docLastLineToWrap == docLineLastWrapped);
-       if (docLineLastWrapped > (docLineStartWrapping - 1)) {
-               docLineLastWrapped = docLineStartWrapping - 1;
-               if (docLineLastWrapped < -1)
-                       docLineLastWrapped = -1;
+void Editor::NeedWrapping(int docLineStart, int docLineEnd) {
+       docLineStart = Platform::Clamp(docLineStart, 0, pdoc->LinesTotal());
+       if (wrapStart > docLineStart) {
+               wrapStart = docLineStart;
                llc.Invalidate(LineLayout::llPositions);
        }
-       if (noWrap) {
-               docLastLineToWrap = docLineEndWrapping;
-       } else if (docLastLineToWrap < docLineEndWrapping) {
-               docLastLineToWrap = docLineEndWrapping + 1;
+       if (wrapEnd < docLineEnd) {
+               wrapEnd = docLineEnd;
        }
-       if (docLastLineToWrap < -1)
-               docLastLineToWrap = -1;
-       if (docLastLineToWrap >= pdoc->LinesTotal())
-               docLastLineToWrap = pdoc->LinesTotal()-1;
+       wrapEnd = Platform::Clamp(wrapEnd, 0, pdoc->LinesTotal());
        // Wrap lines during idle.
-       if ((wrapState != eWrapNone) &&
-               backgroundWrapEnabled &&
-               (docLastLineToWrap != docLineLastWrapped)) {
+       if ((wrapState != eWrapNone) && (wrapEnd != wrapStart)) {
                SetIdle(true);
        }
 }
@@ -1514,33 +1506,33 @@ void Editor::NeedWrapping(int docLineStartWrapping, int docLineEndWrapping) {
 // fullwrap: if true, all lines which need wrapping will be done,
 //           in this single call.
 // priorityWrapLineStart: If greater than zero, all lines starting from
-//           here to 100 lines past will be wrapped (even if there are
+//           here to 1 page + 100 lines past will be wrapped (even if there are
 //           more lines under wrapping process in idle).
-// If it is neither fullwrap, nor priorityWrap, then 100 lines will be
+// If it is neither fullwrap, nor priorityWrap, then 1 page + 100 lines will be
 // wrapped, if there are any wrapping going on in idle. (Generally this
 // condition is called only from idler).
 // Return true if wrapping occurred.
 bool Editor::WrapLines(bool fullWrap, int priorityWrapLineStart) {
        // If there are any pending wraps, do them during idle if possible.
+       int linesInOneCall = LinesOnScreen() + 100;
        if (wrapState != eWrapNone) {
-               if (docLineLastWrapped < docLastLineToWrap) {
-                       if (!(backgroundWrapEnabled && SetIdle(true))) {
-                               // Background wrapping is disabled, or idle processing
-                               // not supported.  A full wrap is required.
+               if (wrapStart < wrapEnd) {
+                       if (!SetIdle(true)) {
+                               // Idle processing not supported so full wrap required.
                                fullWrap = true;
                        }
                }
                if (!fullWrap && priorityWrapLineStart >= 0 &&
                        // .. and if the paint window is outside pending wraps
-                       (((priorityWrapLineStart + 100) < docLineLastWrapped) ||
-                        (priorityWrapLineStart > docLastLineToWrap))) {
+                       (((priorityWrapLineStart + linesInOneCall) < wrapStart) ||
+                        (priorityWrapLineStart > wrapEnd))) {
                        // No priority wrap pending
                        return false;
                }
        }
        int goodTopLine = topLine;
        bool wrapOccurred = false;
-       if (docLineLastWrapped < pdoc->LinesTotal()) {
+       if (wrapStart <= pdoc->LinesTotal()) {
                if (wrapState == eWrapNone) {
                        if (wrapWidth != LineLayout::wrapWidthInfinite) {
                                wrapWidth = LineLayout::wrapWidthInfinite;
@@ -1549,8 +1541,11 @@ bool Editor::WrapLines(bool fullWrap, int priorityWrapLineStart) {
                                }
                                wrapOccurred = true;
                        }
-                       docLineLastWrapped = 0x7ffffff;
+                       wrapStart = wrapLineLarge;
+                       wrapEnd = wrapLineLarge;
                } else {
+                       if (wrapEnd >= pdoc->LinesTotal())
+                               wrapEnd = pdoc->LinesTotal();
                        //ElapsedTime et;
                        int lineDocTop = cs.DocFromDisplay(topLine);
                        int subLineTop = topLine - cs.DisplayFromDoc(lineDocTop);
@@ -1564,44 +1559,42 @@ bool Editor::WrapLines(bool fullWrap, int priorityWrapLineStart) {
                        AutoSurface surface(this);
                        if (surface) {
                                bool priorityWrap = false;
-                               int lastLineToWrap = docLastLineToWrap;
-                               int firstLineToWrap = docLineLastWrapped;
+                               int lastLineToWrap = wrapEnd;
+                               int lineToWrap = wrapStart;
                                if (!fullWrap) {
                                        if (priorityWrapLineStart >= 0) {
                                                // This is a priority wrap.
-                                               firstLineToWrap = priorityWrapLineStart;
-                                               lastLineToWrap = firstLineToWrap + 100;
+                                               lineToWrap = priorityWrapLineStart;
+                                               lastLineToWrap = priorityWrapLineStart + linesInOneCall;
                                                priorityWrap = true;
                                        } else {
                                                // This is idle wrap.
-                                               lastLineToWrap = docLineLastWrapped + 100;
+                                               lastLineToWrap = wrapStart + linesInOneCall;
                                        }
-                                       if (lastLineToWrap >= docLastLineToWrap)
-                                               lastLineToWrap = docLastLineToWrap;
+                                       if (lastLineToWrap >= wrapEnd)
+                                               lastLineToWrap = wrapEnd;
                                } // else do a fullWrap.
 
-                               // printf("Wraplines: full = %d, priorityStart = %d (wrapping: %d to %d)\n", fullWrap, priorityWrapLineStart, firstLineToWrap, lastLineToWrap);
-                               // printf("Pending wraps: %d to %d\n", docLineLastWrapped, docLastLineToWrap);
-                               while (firstLineToWrap < lastLineToWrap) {
-                                       firstLineToWrap++;
-                                       if (!priorityWrap)
-                                               docLineLastWrapped++;
-                                       if (firstLineToWrap < pdoc->LinesTotal()) {
-                                       AutoLineLayout ll(llc, RetrieveLineLayout(firstLineToWrap));
+                               // Platform::DebugPrintf("Wraplines: full = %d, priorityStart = %d (wrapping: %d to %d)\n", fullWrap, priorityWrapLineStart, lineToWrap, lastLineToWrap);
+                               // Platform::DebugPrintf("Pending wraps: %d to %d\n", wrapStart, wrapEnd);
+                               while (lineToWrap < lastLineToWrap) {
+                                       AutoLineLayout ll(llc, RetrieveLineLayout(lineToWrap));
                                        int linesWrapped = 1;
                                        if (ll) {
-                                               LayoutLine(firstLineToWrap, surface, vs, ll, wrapWidth);
+                                               LayoutLine(lineToWrap, surface, vs, ll, wrapWidth);
                                                linesWrapped = ll->lines;
                                        }
-                                       if (cs.SetHeight(firstLineToWrap, linesWrapped)) {
+                                       if (cs.SetHeight(lineToWrap, linesWrapped)) {
                                                wrapOccurred = true;
-                                               }
                                        }
+                                       lineToWrap++;
                                }
+                               if (!priorityWrap)
+                                       wrapStart = lineToWrap;
                                // If wrapping is done, bring it to resting position
-                               if (docLineLastWrapped > docLastLineToWrap) {
-                                       docLineLastWrapped = -1;
-                                       docLastLineToWrap = -1;
+                               if (wrapStart >= wrapEnd) {
+                                       wrapStart = wrapLineLarge;
+                                       wrapEnd = wrapLineLarge;
                                }
                        }
                        goodTopLine = cs.DisplayFromDoc(lineDocTop);
@@ -1673,6 +1666,7 @@ void Editor::LinesSplit(int pixelWidth) {
                                        targetEnd += static_cast<int>(strlen(eol));
                                }
                        }
+                       lineEnd = pdoc->LineFromPosition(targetEnd);
                }
                pdoc->EndUndoAction();
        }
@@ -1716,7 +1710,7 @@ void Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) {
                        rcSelMargin.left = rcSelMargin.right;
                        rcSelMargin.right = rcSelMargin.left + vs.ms[margin].width;
 
-                       if (vs.ms[margin].symbol) {
+                       if (vs.ms[margin].style != SC_MARGIN_NUMBER) {
                                /* alternate scheme:
                                if (vs.ms[margin].mask & SC_MASK_FOLDERS)
                                        surface->FillRectangle(rcSelMargin, vs.styles[STYLE_DEFAULT].back.allocated);
@@ -1727,8 +1721,21 @@ void Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) {
                                if (vs.ms[margin].mask & SC_MASK_FOLDERS)
                                        // Required because of special way brush is created for selection margin
                                        surface->FillRectangle(rcSelMargin, *pixmapSelPattern);
-                               else
-                                       surface->FillRectangle(rcSelMargin, vs.styles[STYLE_LINENUMBER].back.allocated);
+                               else {
+                                       ColourAllocated colour;
+                                       switch (vs.ms[margin].style) {
+                                       case SC_MARGIN_BACK:
+                                               colour = vs.styles[STYLE_DEFAULT].back.allocated;
+                                               break;
+                                       case SC_MARGIN_FORE:
+                                               colour = vs.styles[STYLE_DEFAULT].fore.allocated;
+                                               break;
+                                       default:
+                                               colour = vs.styles[STYLE_LINENUMBER].back.allocated;
+                                               break;
+                                       }
+                                       surface->FillRectangle(rcSelMargin, colour);
+                               }
                        } else {
                                surface->FillRectangle(rcSelMargin, vs.styles[STYLE_LINENUMBER].back.allocated);
                        }
@@ -1835,7 +1842,7 @@ void Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) {
                                PRectangle rcMarker = rcSelMargin;
                                rcMarker.top = yposScreen;
                                rcMarker.bottom = yposScreen + vs.lineHeight;
-                               if (!vs.ms[margin].symbol) {
+                               if (vs.ms[margin].style == SC_MARGIN_NUMBER) {
                                        char number[100];
                                        number[0] = '\0';
                                        if (firstSubLine)
@@ -2126,7 +2133,7 @@ void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayou
                                        continue;
                                }
                                if (p > 0) {
-                                       if (wrapState == eWrapChar){
+                                       if (wrapState == eWrapChar) {
                                                lastGoodBreak = pdoc->MovePositionOutsideChar(p + posLineStart, -1)
                                                                                                - posLineStart;
                                                p = pdoc->MovePositionOutsideChar(p + 1 + posLineStart, 1) - posLineStart;
@@ -2145,14 +2152,15 @@ void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayou
        }
 }
 
+ColourAllocated Editor::SelectionBackground(ViewStyle &vsDraw) {
+       return primarySelection ? vsDraw.selbackground.allocated : vsDraw.selbackground2.allocated;
+}
+
 ColourAllocated Editor::TextBackground(ViewStyle &vsDraw, bool overrideBackground,
                                        ColourAllocated background, bool inSelection, bool inHotspot, int styleMain, int i, LineLayout *ll) {
        if (inSelection) {
-               if (vsDraw.selbackset) {
-                       if (primarySelection)
-                               return vsDraw.selbackground.allocated;
-                       else
-                               return vsDraw.selbackground2.allocated;
+               if (vsDraw.selbackset && (vsDraw.selAlpha == SC_ALPHA_NOALPHA)) {
+                       return SelectionBackground(vsDraw);
                }
        } else {
                if ((vsDraw.edgeState == EDGE_BACKGROUND) &&
@@ -2204,7 +2212,7 @@ void Editor::DrawWrapMarker(Surface *surface, PRectangle rcPlace,
                    surface->LineTo(xBase + xDir * xRelative, yBase + yDir * yRelative);
                }
        };
-       Relative rel = {surface, x0, xStraight?1:-1, y0, yStraight?1:-1};
+       Relative rel = {surface, x0, xStraight ? 1 : -1, y0, yStraight ? 1 : -1};
 
        // arrow head
        rel.MoveTo(xa, y);
@@ -2220,6 +2228,12 @@ void Editor::DrawWrapMarker(Surface *surface, PRectangle rcPlace,
                        y - 2 * dy);
 }
 
+static void SimpleAlphaRectangle(Surface *surface, PRectangle rc, ColourAllocated fill, int alpha) {
+       if (alpha != SC_ALPHA_NOALPHA) {
+               surface->AlphaRectangle(rc, 0, fill, alpha, fill, alpha, 0);
+       }
+}
+
 void Editor::DrawEOL(Surface *surface, ViewStyle &vsDraw, PRectangle rcLine, LineLayout *ll,
                      int line, int lineEnd, int xStart, int subLine, int subLineStart,
                      bool overrideBackground, ColourAllocated background,
@@ -2236,15 +2250,17 @@ void Editor::DrawEOL(Surface *surface, ViewStyle &vsDraw, PRectangle rcLine, Lin
        bool eolInSelection = (subLine == (ll->lines - 1)) &&
                              (posLineEnd > ll->selStart) && (posLineEnd <= ll->selEnd) && (ll->selStart != ll->selEnd);
 
-       if (eolInSelection && vsDraw.selbackset && (line < pdoc->LinesTotal() - 1)) {
-               if (primarySelection)
-                       surface->FillRectangle(rcSegment, vsDraw.selbackground.allocated);
-               else
-                       surface->FillRectangle(rcSegment, vsDraw.selbackground2.allocated);
-       } else if (overrideBackground) {
-               surface->FillRectangle(rcSegment, background);
+       if (eolInSelection && vsDraw.selbackset && (line < pdoc->LinesTotal() - 1) && (vsDraw.selAlpha == SC_ALPHA_NOALPHA)) {
+               surface->FillRectangle(rcSegment, SelectionBackground(vsDraw));
        } else {
-               surface->FillRectangle(rcSegment, vsDraw.styles[ll->styles[ll->numCharsInLine] & styleMask].back.allocated);
+               if (overrideBackground) {
+                       surface->FillRectangle(rcSegment, background);
+               } else {
+                       surface->FillRectangle(rcSegment, vsDraw.styles[ll->styles[ll->numCharsInLine] & styleMask].back.allocated);
+               }
+               if (eolInSelection && vsDraw.selbackset && (line < pdoc->LinesTotal() - 1) && (vsDraw.selAlpha != SC_ALPHA_NOALPHA)) {
+                       SimpleAlphaRectangle(surface, rcSegment, SelectionBackground(vsDraw), vsDraw.selAlpha);
+               }
        }
 
        rcSegment.left = xEol + vsDraw.aveCharWidth + xStart;
@@ -2290,14 +2306,15 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis
        // the color for the highest numbered one is used.
        bool overrideBackground = false;
        ColourAllocated background;
-       if (caret.active && vsDraw.showCaretLineBackground && ll->containsCaret) {
+       if (caret.active && vsDraw.showCaretLineBackground && (vsDraw.caretLineAlpha == SC_ALPHA_NOALPHA) && ll->containsCaret) {
                overrideBackground = true;
                background = vsDraw.caretLineBackground.allocated;
        }
        if (!overrideBackground) {
                int marks = pdoc->GetMark(line);
                for (int markBit = 0; (markBit < 32) && marks; markBit++) {
-                       if ((marks & 1) && vsDraw.markers[markBit].markType == SC_MARK_BACKGROUND) {
+                       if ((marks & 1) && (vsDraw.markers[markBit].markType == SC_MARK_BACKGROUND) &&
+                               (vsDraw.markers[markBit].alpha == SC_ALPHA_NOALPHA)) {
                                background = vsDraw.markers[markBit].back.allocated;
                                overrideBackground = true;
                        }
@@ -2306,14 +2323,15 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis
        }
        if (!overrideBackground) {
                if (vsDraw.maskInLine) {
-                       int marks = pdoc->GetMark(line) & vsDraw.maskInLine;
-                       if (marks) {
-                               for (int markBit = 0; (markBit < 32) && marks; markBit++) {
-                                       if ((marks & 1) && (vsDraw.markers[markBit].markType != SC_MARK_EMPTY)) {
+                       int marksMasked = pdoc->GetMark(line) & vsDraw.maskInLine;
+                       if (marksMasked) {
+                               for (int markBit = 0; (markBit < 32) && marksMasked; markBit++) {
+                                       if ((marksMasked & 1) && (vsDraw.markers[markBit].markType != SC_MARK_EMPTY) &&
+                                               (vsDraw.markers[markBit].alpha == SC_ALPHA_NOALPHA)) {
                                                overrideBackground = true;
                                                background = vsDraw.markers[markBit].back.allocated;
                                        }
-                                       marks >>= 1;
+                                       marksMasked >>= 1;
                                }
                        }
                }
@@ -2641,6 +2659,15 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis
                        xStart, subLine, subLineStart, overrideBackground, background,
                        drawWrapMarkEnd, vsDraw.whitespaceForeground.allocated);
        }
+       if ((vsDraw.selAlpha != SC_ALPHA_NOALPHA) && (ll->selStart >= 0) && (ll->selEnd >= 0)) {
+               int startPosSel = (ll->selStart < posLineStart) ? posLineStart : ll->selStart;
+               int endPosSel = (ll->selEnd < (lineEnd + posLineStart)) ? ll->selEnd : (lineEnd + posLineStart);
+               if (startPosSel < endPosSel) {
+                       rcSegment.left = xStart + ll->positions[startPosSel - posLineStart] - subLineStart;
+                       rcSegment.right = xStart + ll->positions[endPosSel - posLineStart] - subLineStart;
+                       SimpleAlphaRectangle(surface, rcSegment, SelectionBackground(vsDraw), vsDraw.selAlpha);
+               }
+       }
 
        if (vsDraw.edgeState == EDGE_LINE) {
                int edgeX = theEdge * vsDraw.spaceWidth;
@@ -2648,6 +2675,31 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis
                rcSegment.right = rcSegment.left + 1;
                surface->FillRectangle(rcSegment, vsDraw.edgecolour.allocated);
        }
+
+       // Draw any translucent whole line states
+       rcSegment.left = xStart;
+       rcSegment.right = rcLine.right - 1;
+       if (caret.active && vsDraw.showCaretLineBackground && ll->containsCaret) {
+               SimpleAlphaRectangle(surface, rcSegment, vsDraw.caretLineBackground.allocated, vsDraw.caretLineAlpha);
+       }
+       int marks = pdoc->GetMark(line);
+       for (int markBit = 0; (markBit < 32) && marks; markBit++) {
+               if ((marks & 1) && (vsDraw.markers[markBit].markType == SC_MARK_BACKGROUND)) {
+                       SimpleAlphaRectangle(surface, rcSegment, vsDraw.markers[markBit].back.allocated, vsDraw.markers[markBit].alpha);
+               }
+               marks >>= 1;
+       }
+       if (vsDraw.maskInLine) {
+               int marksMasked = pdoc->GetMark(line) & vsDraw.maskInLine;
+               if (marksMasked) {
+                       for (int markBit = 0; (markBit < 32) && marksMasked; markBit++) {
+                               if ((marksMasked & 1) && (vsDraw.markers[markBit].markType != SC_MARK_EMPTY)) {
+                                       SimpleAlphaRectangle(surface, rcSegment, vsDraw.markers[markBit].back.allocated, vsDraw.markers[markBit].alpha);
+                               }
+                               marksMasked >>= 1;
+                       }
+               }
+       }
 }
 
 void Editor::RefreshPixMaps(Surface *surfaceWindow) {
@@ -2721,7 +2773,6 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
        //      paintingAllText, rcArea.left, rcArea.top, rcArea.right, rcArea.bottom);
 
        RefreshStyleData();
-
        RefreshPixMaps(surfaceWindow);
 
        PRectangle rcClient = GetClientRectangle();
@@ -2752,6 +2803,8 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
        if (needUpdateUI) {
                NotifyUpdateUI();
                needUpdateUI = false;
+               RefreshStyleData();
+               RefreshPixMaps(surfaceWindow);
        }
 
        // Call priority lines wrap on a window of lines which are likely
@@ -3063,7 +3116,7 @@ long Editor::FormatRange(bool draw, RangeToFormat *pfr) {
        // Printing supports only the line number margin.
        int lineNumberIndex = -1;
        for (int margin = 0; margin < ViewStyle::margins; margin++) {
-               if ((!vsPrint.ms[margin].symbol) && (vsPrint.ms[margin].width > 0)) {
+               if ((vsPrint.ms[margin].style == SC_MARGIN_NUMBER) && (vsPrint.ms[margin].width > 0)) {
                        lineNumberIndex = margin;
                } else {
                        vsPrint.ms[margin].width = 0;
@@ -3076,6 +3129,7 @@ long Editor::FormatRange(bool draw, RangeToFormat *pfr) {
        // Don't show the selection when printing
        vsPrint.selbackset = false;
        vsPrint.selforeset = false;
+       vsPrint.selAlpha = SC_ALPHA_NOALPHA;
        vsPrint.whitespaceBackgroundSet = false;
        vsPrint.whitespaceForegroundSet = false;
        vsPrint.showCaretLineBackground = false;
@@ -3662,19 +3716,8 @@ void Editor::CheckModificationForWrap(DocModification mh) {
                llc.Invalidate(LineLayout::llCheckTextAndStyle);
                if (wrapState != eWrapNone) {
                        int lineDoc = pdoc->LineFromPosition(mh.position);
-                       if (mh.linesAdded <= 0) {
-                               AutoSurface surface(this);
-                               AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc));
-                               if (surface && ll) {
-                                       LayoutLine(lineDoc, surface, vs, ll, wrapWidth);
-                                       if (cs.GetHeight(lineDoc) != ll->lines) {
-                                               NeedWrapping(lineDoc - 1, lineDoc + 1);
-                                               Redraw();
-                                       }
-                               }
-                       } else {
-                               NeedWrapping(lineDoc, lineDoc + 1 + mh.linesAdded);
-                       }
+                       int lines = Platform::Maximum(0, mh.linesAdded);
+                       NeedWrapping(lineDoc, lineDoc + lines + 1);
                }
        }
 }
@@ -3717,6 +3760,7 @@ void Editor::NotifyModified(Document*, DocModification mh, void *) {
                                InvalidateRange(mh.position, mh.position + mh.length);
                        }
                }
+               llc.Invalidate(LineLayout::llCheckTextAndStyle);
        } else {
                // Move selection and brace highlights
                if (mh.modificationType & SC_MOD_INSERTTEXT) {
@@ -4833,7 +4877,7 @@ void Editor::CopySelectionRange(SelectionText *ss) {
                                text[size] = '\0';
                        }
                }
-               ss->Set(text, size + 1, pdoc->dbcsCodePage,
+               ss->Set(text, size + 1, pdoc->dbcsCodePage,
                        vs.styles[STYLE_DEFAULT].characterSet, selType == selRectangle);
        }
 }
@@ -4849,7 +4893,7 @@ void Editor::CopyRangeToClipboard(int start, int end) {
 
 void Editor::CopyText(int length, const char *text) {
        SelectionText selectedText;
-       selectedText.Copy(text, length,
+       selectedText.Copy(text, length + 1,
                pdoc->dbcsCodePage, vs.styles[STYLE_DEFAULT].characterSet, false);
        CopyToClipboard(selectedText);
 }
@@ -5289,7 +5333,7 @@ void Editor::ButtonMove(Point pt) {
 }
 
 void Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) {
-        //Platform::DebugPrintf("ButtonUp %d\n", HaveMouseCapture());
+       //Platform::DebugPrintf("ButtonUp %d\n", HaveMouseCapture());
        if (HaveMouseCapture()) {
                if (PointInSelMargin(pt)) {
                        DisplayCursor(Window::cursorReverseArrow);
@@ -5377,13 +5421,13 @@ bool Editor::Idle() {
 
        bool idleDone;
 
-       bool wrappingDone = (wrapState == eWrapNone) || (!backgroundWrapEnabled);
+       bool wrappingDone = wrapState == eWrapNone;
 
        if (!wrappingDone) {
                // Wrap lines during idle.
                WrapLines(false, -1);
                // No more wrapping
-               if (docLineLastWrapped == docLastLineToWrap)
+               if (wrapStart == wrapEnd)
                        wrappingDone = true;
        }
 
@@ -6038,14 +6082,14 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                        pdoc->SetDefaultCharClasses(false);
                        if (lParam == 0)
                                return 0;
-                       pdoc->SetCharClasses(reinterpret_cast<unsigned char *>(lParam), Document::ccWord);
+                       pdoc->SetCharClasses(reinterpret_cast<unsigned char *>(lParam), CharClassify::ccWord);
                }
                break;
 
        case SCI_SETWHITESPACECHARS: {
                        if (lParam == 0)
                                return 0;
-                       pdoc->SetCharClasses(reinterpret_cast<unsigned char *>(lParam), Document::ccSpace);
+                       pdoc->SetCharClasses(reinterpret_cast<unsigned char *>(lParam), CharClassify::ccSpace);
                }
                break;
 
@@ -6305,16 +6349,16 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                return pdoc->ExtendWordSelect(wParam, 1, lParam != 0);
 
        case SCI_SETWRAPMODE:
-               switch(wParam){
-                       case SC_WRAP_WORD:
-                               wrapState = eWrapWord;
-                               break;
-                       case SC_WRAP_CHAR:
-                               wrapState = eWrapChar;
-                               break;
-                       default:
-                               wrapState = eWrapNone;
-                               break;
+               switch (wParam) {
+               case SC_WRAP_WORD:
+                       wrapState = eWrapWord;
+                       break;
+               case SC_WRAP_CHAR:
+                       wrapState = eWrapChar;
+                       break;
+               default:
+                       wrapState = eWrapNone;
+                       break;
                }
                xOffset = 0;
                InvalidateStyleRedraw();
@@ -6465,8 +6509,10 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                return pdoc->LineEnd(wParam);
 
        case SCI_SETCODEPAGE:
-               pdoc->dbcsCodePage = wParam;
-               InvalidateStyleRedraw();
+               if (ValidCodePage(wParam)) {
+                       pdoc->dbcsCodePage = wParam;
+                       InvalidateStyleRedraw();
+               }
                break;
 
        case SCI_GETCODEPAGE:
@@ -6499,6 +6545,11 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                InvalidateStyleData();
                RedrawSelMargin();
                break;
+       case SCI_MARKERSETALPHA:
+               if (wParam <= MARKER_MAX)
+                       vs.markers[wParam].alpha = lParam;
+               InvalidateStyleRedraw();
+               break;
        case SCI_MARKERADD: {
                        int markerID = pdoc->AddMark(wParam, lParam);
                        return markerID;
@@ -6546,14 +6597,14 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
 
        case SCI_SETMARGINTYPEN:
                if (ValidMargin(wParam)) {
-                       vs.ms[wParam].symbol = (lParam == SC_MARGIN_SYMBOL);
+                       vs.ms[wParam].style = lParam;
                        InvalidateStyleRedraw();
                }
                break;
 
        case SCI_GETMARGINTYPEN:
                if (ValidMargin(wParam))
-                       return vs.ms[wParam].symbol ? SC_MARGIN_SYMBOL : SC_MARGIN_NUMBER;
+                       return vs.ms[wParam].style;
                else
                        return 0;
 
@@ -6717,6 +6768,12 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                vs.caretLineBackground.desired = wParam;
                InvalidateStyleRedraw();
                break;
+       case SCI_GETCARETLINEBACKALPHA:
+               return vs.caretLineAlpha;
+       case SCI_SETCARETLINEBACKALPHA:
+               vs.caretLineAlpha = wParam;
+               InvalidateStyleRedraw();
+               break;
 
                // Folding messages
 
@@ -6831,6 +6888,14 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
                InvalidateStyleRedraw();
                break;
 
+       case SCI_SETSELALPHA:
+               vs.selAlpha = wParam;
+               InvalidateStyleRedraw();
+               break;
+
+       case SCI_GETSELALPHA:
+               return vs.selAlpha;
+
        case SCI_SETWHITESPACEFORE:
                vs.whitespaceForegroundSet = wParam != 0;
                vs.whitespaceForeground.desired = ColourDesired(lParam);
index 9243d3a2f42cf433ade40a24c2b170208b0c975d..fe7be268ae43ad8c169c117f0e2e7a9d306d6990 100644 (file)
@@ -305,10 +305,10 @@ protected:        // ScintillaBase subclass needs access to much of Editor
 
        // Wrapping support
        enum { eWrapNone, eWrapWord, eWrapChar } wrapState;
-       bool backgroundWrapEnabled;
+       enum { wrapLineLarge = 0x7ffffff };
        int wrapWidth;
-       int docLineLastWrapped;
-       int docLastLineToWrap;
+       int wrapStart;
+       int wrapEnd;
        int wrapVisualFlags;
        int wrapVisualFlagsLocation;
        int wrapVisualStartIndent;
@@ -377,7 +377,7 @@ protected:  // ScintillaBase subclass needs access to much of Editor
        void InvalidateCaret();
        virtual void UpdateSystemCaret();
 
-       void NeedWrapping(int docLineStartWrapping = 0, int docLineEndWrapping = 0x7ffffff);
+       void NeedWrapping(int docLineStart = 0, int docLineEnd = wrapLineLarge);
        bool WrapLines(bool fullWrap, int priorityWrapLineStart);
        void LinesJoin();
        void LinesSplit(int pixelWidth);
@@ -387,6 +387,7 @@ protected:  // ScintillaBase subclass needs access to much of Editor
        LineLayout *RetrieveLineLayout(int lineNumber);
        void LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayout *ll,
                int width=LineLayout::wrapWidthInfinite);
+       ColourAllocated SelectionBackground(ViewStyle &vsDraw);
        ColourAllocated TextBackground(ViewStyle &vsDraw, bool overrideBackground, ColourAllocated background, bool inSelection, bool inHotspot, int styleMain, int i, LineLayout *ll);
        void DrawIndentGuide(Surface *surface, int lineVisible, int lineHeight, int start, PRectangle rcSegment, bool highlight);
        void DrawWrapMarker(Surface *surface, PRectangle rcPlace, bool isEndMarker, ColourAllocated wrapColour);
@@ -524,6 +525,7 @@ protected:  // ScintillaBase subclass needs access to much of Editor
        void GetHotSpotRange(int& hsStart, int& hsEnd);
 
        int CodePage() const;
+       virtual bool ValidCodePage(int /* codePage */) const { return true; }
        int WrapCount(int line);
 
        virtual sptr_t DefWndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) = 0;
index 752118b7706251c005894feadf34d9ef5120b064..acf45bc2d53ae23b7a23c7364e78d8a5bd92319a 100644 (file)
@@ -12,6 +12,8 @@
 
 #include "Platform.h"
 
+#include "Scintilla.h"
+
 #include "SciLexer.h"
 #include "PropSet.h"
 #include "Accessor.h"
@@ -116,16 +118,16 @@ LexerLibrary::LexerLibrary(const char* ModuleName) {
        if (lib->IsValid()) {
                m_sModuleName = ModuleName;
                //Cannot use reinterpret_cast because: ANSI C++ forbids casting between pointers to functions and objects
-               GetLexerCountFn GetLexerCount = (GetLexerCountFn)lib->FindFunction("GetLexerCount");
+               GetLexerCountFn GetLexerCount = (GetLexerCountFn)(sptr_t)lib->FindFunction("GetLexerCount");
 
                if (GetLexerCount) {
                        ExternalLexerModule *lex;
                        LexerMinder *lm;
 
                        // Find functions in the DLL
-                       GetLexerNameFn GetLexerName = (GetLexerNameFn)lib->FindFunction("GetLexerName");
-                       ExtLexerFunction Lexer = (ExtLexerFunction)lib->FindFunction("Lex");
-                       ExtFoldFunction Folder = (ExtFoldFunction)lib->FindFunction("Fold");
+                       GetLexerNameFn GetLexerName = (GetLexerNameFn)(sptr_t)lib->FindFunction("GetLexerName");
+                       ExtLexerFunction Lexer = (ExtLexerFunction)(sptr_t)lib->FindFunction("Lex");
+                       ExtFoldFunction Folder = (ExtFoldFunction)(sptr_t)lib->FindFunction("Fold");
 
                        // Assign a buffer for the lexer name.
                        char lexname[100];
index a42abb2037de1583aec37833bad773f3f1bd17f0..7624a4a5255ed53e2284b703d3be5a1ca8f0e8cb 100644 (file)
@@ -63,6 +63,12 @@ void Indicator::Draw(Surface *surface, const PRectangle &rc, const PRectangle &r
                surface->LineTo(rc.right, rcLine.top+1);
                surface->LineTo(rc.left, rcLine.top+1);
                surface->LineTo(rc.left, ymid+1);
+       } else if (style == INDIC_ROUNDBOX) {
+               PRectangle rcBox = rcLine;
+               rcBox.top = rcLine.top + 1;
+               rcBox.left = rc.left;
+               rcBox.right = rc.right;
+               surface->AlphaRectangle(rcBox, 1, fore.allocated, 30, fore.allocated, 50, 0);
        } else {        // Either INDIC_PLAIN or unknown
                surface->MoveTo(rc.left, ymid);
                surface->LineTo(rc.right, ymid);
index 1ffc4fb5f89e73cb59b1c917c840481d46f48b12..f82eb7df6775fc05ef4eae5578636fee0fca480d 100644 (file)
@@ -171,6 +171,7 @@ int Scintilla_LinkLexers() {
        LINK_LEXER(lmGui4Cli);
        LINK_LEXER(lmHaskell);
        LINK_LEXER(lmHTML);
+       LINK_LEXER(lmInno);
        LINK_LEXER(lmKix);
        LINK_LEXER(lmLatex);
        LINK_LEXER(lmLISP);
@@ -186,6 +187,7 @@ int Scintilla_LinkLexers() {
        LINK_LEXER(lmNsis);
        LINK_LEXER(lmNull);
        LINK_LEXER(lmOctave);
+       LINK_LEXER(lmOpal);
        LINK_LEXER(lmPascal);
        LINK_LEXER(lmPB);
        LINK_LEXER(lmPerl);
@@ -201,6 +203,7 @@ int Scintilla_LinkLexers() {
        LINK_LEXER(lmScriptol);
        LINK_LEXER(lmSmalltalk);
        LINK_LEXER(lmSpecman);
+       LINK_LEXER(lmSpice);
        LINK_LEXER(lmSQL);
        LINK_LEXER(lmTADS3);
        LINK_LEXER(lmTCL);
index ee547f497fb0665a0fa1bf1ce1b746356b8b0899..2bc2e0f4bc1f4768d6ec9818d353df3fe63b7a20 100644 (file)
@@ -39,6 +39,9 @@
 // May 23, 2005   - Fixed the SentKey lexing in case of a missing }
 // Aug 11, 2005   - Fixed possible bug with s_save length > 100.
 // Aug 23, 2005   - Added Switch/endswitch support to the folding logic.
+// Sep 27, 2005   - Fixed the SentKey lexing logic in case of multiple sentkeys.
+// Mar 12, 2006   - Fixed issue with <> coloring as String in stead of Operator in rare occasions.
+// Apr  8, 2006   - Added support for AutoIt3 Standard UDF library (SCE_AU3_UDF)
 //
 // Copyright for Scintilla: 1998-2001 by Neil Hodgson <neilh@scintilla.org>
 // The License.txt file describes the conditions under which this software may be distributed.
@@ -92,6 +95,7 @@ static inline bool IsAOperator(char ch) {
 static int GetSendKey(const char *szLine, char *szKey)
 {
        int             nFlag   = 0;
+       int             nStartFound     = 0;
        int             nKeyPos = 0;
        int             nSpecPos= 0;
        int             nSpecNum= 1;
@@ -102,31 +106,34 @@ static int GetSendKey(const char *szLine, char *szKey)
        // split the portion of the sendkey in the part before and after the spaces
        while ( ( (cTemp = szLine[nPos]) != '\0'))
        {
-               // skip leading Ctrl/Shift/ALt state
-               if ((cTemp == '#' || cTemp == '!' || cTemp == '^') && (szLine[nPos+1] == '{') ) 
-               {
-               }       
-               else if ((cTemp == ' ') && (nFlag == 0) ) // get the stuff till first space
-               {
-                       nFlag = 1;
-                       // Add } to the end of the first bit for table lookup later.
-                       szKey[nKeyPos++] = '}';
-               }
-               else if (cTemp == ' ')
-               {
-                       // skip other spaces 
+               // skip leading Ctrl/Shift/Alt state
+               if (cTemp == '{') {
+                       nStartFound = 1;
                }
-               else if (nFlag == 0)
-               {
-                       // save first portion into var till space or } is hit
-                       szKey[nKeyPos++] = cTemp;
-               }
-               else if ((nFlag == 1) && (cTemp != '}'))
-               {
-                       // Save second portion into var...
-                       szSpecial[nSpecPos++] = cTemp;
-                       // check if Second portion is all numbers for repeat fuction
-                       if (isdigit(cTemp) == false) {nSpecNum = 0;} 
+               //
+               if (nStartFound == 1) {
+                       if ((cTemp == ' ') && (nFlag == 0) ) // get the stuff till first space
+                       {
+                               nFlag = 1;
+                               // Add } to the end of the first bit for table lookup later.
+                               szKey[nKeyPos++] = '}';
+                       }
+                       else if (cTemp == ' ')
+                       {
+                               // skip other spaces 
+                       }
+                       else if (nFlag == 0)
+                       {
+                               // save first portion into var till space or } is hit
+                               szKey[nKeyPos++] = cTemp;
+                       }
+                       else if ((nFlag == 1) && (cTemp != '}'))
+                       {
+                               // Save second portion into var...
+                               szSpecial[nSpecPos++] = cTemp;
+                               // check if Second portion is all numbers for repeat fuction
+                               if (isdigit(cTemp) == false) {nSpecNum = 0;} 
+                       }
                }
                nPos++;                                                                 // skip to next char
 
@@ -190,6 +197,7 @@ static void ColouriseAU3Doc(unsigned int startPos,
     WordList &keywords5 = *keywordlists[4];
     WordList &keywords6 = *keywordlists[5];
     WordList &keywords7 = *keywordlists[6];
+    WordList &keywords8 = *keywordlists[7];
        // find the first previous line without continuation character at the end
        int lineCurrent = styler.GetLine(startPos);
        int s_startPos = startPos;
@@ -325,6 +333,10 @@ static void ColouriseAU3Doc(unsigned int startPos,
                                                        sc.ChangeState(SCE_AU3_EXPAND);
                                                        sc.SetState(SCE_AU3_DEFAULT);
                                                }
+                                               else if (keywords8.InList(s)) {
+                                                       sc.ChangeState(SCE_AU3_UDF);
+                                                       sc.SetState(SCE_AU3_DEFAULT);
+                                               }
                                                else if (strcmp(s, "_") == 0) {
                                                        sc.ChangeState(SCE_AU3_OPERATOR);
                                                        sc.SetState(SCE_AU3_DEFAULT);
@@ -411,9 +423,11 @@ static void ColouriseAU3Doc(unsigned int startPos,
                    if ((si == 1 && sc.ch == '\"') || (si == 2 && sc.ch == '\'') || (si == 3 && sc.ch == '>'))
                                {
                                        sc.ForwardSetState(SCE_AU3_DEFAULT);
+                                       si=0;
                                }
                 if (sc.atLineEnd)
                                {
+                                       si=0;
                                        // at line end and not found a continuation char then reset to default
                                        int lineCurrent = styler.GetLine(sc.currentPos);
                                        if (!IsContinuationLine(lineCurrent,styler)) 
@@ -422,11 +436,8 @@ static void ColouriseAU3Doc(unsigned int startPos,
                                        }
                                }
                                // find Sendkeys in a STRING
-                               if (sc.ch == '{') {sc.SetState(SCE_AU3_SENT);}
-                               if (sc.ch == '+' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
-                               if (sc.ch == '!' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
-                               if (sc.ch == '^' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
-                               if (sc.ch == '#' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
+                               if (sc.ch == '{' || sc.ch == '+' || sc.ch == '!' || sc.ch == '^' || sc.ch == '#' ) {
+                                       sc.SetState(SCE_AU3_SENT);}
                                break;
             }
             
@@ -459,6 +470,35 @@ static void ColouriseAU3Doc(unsigned int startPos,
                                        }
                                        sc.SetState(SCE_AU3_STRING);
                                }
+                               else
+                               {
+                                       // check if the start is a valid SendKey start
+                                       int             nPos    = 0;
+                                       int             nState  = 1;
+                                       char    cTemp;
+                                       while (!(nState == 2) && ((cTemp = s[nPos]) != '\0')) 
+                                       {
+                                               if (cTemp == '{' && nState == 1) 
+                                               {
+                                                       nState = 2;
+                                               }
+                                               if (nState == 1 && !(cTemp == '+' || cTemp == '!' || cTemp == '^' || cTemp == '#' ))
+                                               {
+                                                       nState = 0;
+                                               }
+                                               nPos++;
+                                       }
+                                       //Verify characters infront of { ... if not assume  regular string
+                                       if (nState == 1 && (!(sc.ch == '{' || sc.ch == '+' || sc.ch == '!' || sc.ch == '^' || sc.ch == '#' ))) {
+                                               sc.ChangeState(SCE_AU3_STRING);
+                                               sc.SetState(SCE_AU3_STRING);
+                                       }
+                                       // If invalid character found then assume its a regular string  
+                                       if (nState == 0) {
+                                               sc.ChangeState(SCE_AU3_STRING);
+                                               sc.SetState(SCE_AU3_STRING);
+                                       }
+                               }
                                // check if next portion is again a sendkey
                                if (sc.atLineEnd) 
                                {
@@ -466,13 +506,12 @@ static void ColouriseAU3Doc(unsigned int startPos,
                                        sc.SetState(SCE_AU3_DEFAULT);
                                        si = 0;  // reset string indicator
                                }
-                               //if (sc.ch == '{' && sc.chPrev != '{') {sc.SetState(SCE_AU3_SENT);}
-                               if (sc.ch == '+' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
-                               if (sc.ch == '!' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
-                               if (sc.ch == '^' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
-                               if (sc.ch == '#' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);}
+                               //* check in next characters following a sentkey are again a sent key
+                               // Need this test incase of 2 sentkeys like {F1}{ENTER} but not detect {{}
+                               if (sc.state == SCE_AU3_STRING && (sc.ch == '{' || sc.ch == '+' || sc.ch == '!' || sc.ch == '^' || sc.ch == '#' )) {
+                                       sc.SetState(SCE_AU3_SENT);}
                                // check to see if the string ended...
-                               // Sentkey string isn't complete but the string ended....
+                               // Sendkey string isn't complete but the string ended....
                                if ((si == 1 && sc.ch == '\"') || (si == 2 && sc.ch == '\''))
                                {
                                        sc.ChangeState(SCE_AU3_STRING);
@@ -491,6 +530,7 @@ static void ColouriseAU3Doc(unsigned int startPos,
             else if (sc.ch == '$') {sc.SetState(SCE_AU3_VARIABLE);}
             else if (sc.ch == '.' && !IsADigit(sc.chNext)) {sc.SetState(SCE_AU3_OPERATOR);}
             else if (sc.ch == '@') {sc.SetState(SCE_AU3_KEYWORD);}
+            //else if (sc.ch == '_') {sc.SetState(SCE_AU3_KEYWORD);}
             else if (sc.ch == '<' && si==3) {sc.SetState(SCE_AU3_STRING);}  // string after #include 
             else if (sc.ch == '\"') {
                                sc.SetState(SCE_AU3_STRING);
@@ -543,6 +583,10 @@ static void ColouriseAU3Doc(unsigned int startPos,
                        sc.ChangeState(SCE_AU3_EXPAND);
                        sc.SetState(SCE_AU3_EXPAND);
                }
+               else if (keywords8.InList(s_save)) {
+                       sc.ChangeState(SCE_AU3_UDF);
+                       sc.SetState(SCE_AU3_UDF);
+               }
                else {
                        sc.ChangeState(SCE_AU3_DEFAULT);
                        sc.SetState(SCE_AU3_DEFAULT);
@@ -841,6 +885,7 @@ static const char * const AU3WordLists[] = {
     "#autoit Pre-processors",
     "#autoit Special",
     "#autoit Expand",
+    "#autoit UDF",
     0
 };
 LexerModule lmAU3(SCLEX_AU3, ColouriseAU3Doc, "au3", FoldAU3Doc , AU3WordLists);
index 903d793bb0b7b5551cbbcabe39eda665ffb083f1..e9c31d6b38fad7f73ec121ac1bf8c2cee4eff234 100644 (file)
@@ -258,7 +258,8 @@ static void ColouriseBashDoc(unsigned int startPos, int length, int initStyle,
 
                if (state == SCE_SH_DEFAULT) {
                        if (ch == '\\') {       // escaped character
-                               i++;
+                               if (i < lengthDoc - 1)
+                                       i++;
                                ch = chNext;
                                chNext = chNext2;
                                styler.ColourTo(i, SCE_SH_IDENTIFIER);
@@ -626,7 +627,7 @@ static void FoldBashDoc(unsigned int startPos, int length, int, WordList *[],
                      && !IsCommentLine(lineCurrent+1, styler))
                 levelCurrent--;
         }
-               if (style == SCE_C_OPERATOR) {
+               if (style == SCE_SH_OPERATOR) {
                        if (ch == '{') {
                                levelCurrent++;
                        } else if (ch == '}') {
index 4a1843aa0d05805a9fa203707549ff5a710cdbce..79ba2b89116bc5199f7ed385d524204f6b6d31c4 100644 (file)
@@ -147,7 +147,7 @@ static void ColouriseBasicDoc(unsigned int startPos, int length, int initStyle,
                                sc.ChangeState(SCE_B_ERROR);
                                sc.SetState(SCE_B_DEFAULT);
                        }
-               } else if (sc.state == SCE_B_COMMENT) {
+               } else if (sc.state == SCE_B_COMMENT || sc.state == SCE_B_PREPROCESSOR) {
                        if (sc.atLineEnd) {
                                sc.SetState(SCE_B_DEFAULT);
                        }
@@ -163,7 +163,12 @@ static void ColouriseBasicDoc(unsigned int startPos, int length, int initStyle,
                                wasfirst = isfirst;
                                sc.SetState(SCE_B_IDENTIFIER);
                        } else if (sc.Match(comment_char)) {
-                               sc.SetState(SCE_B_COMMENT);
+                               // Hack to make deprecated QBASIC '$Include show
+                               // up in freebasic with SCE_B_PREPROCESSOR.
+                               if (comment_char == '\'' && sc.Match(comment_char, '$'))
+                                       sc.SetState(SCE_B_PREPROCESSOR);
+                               else
+                                       sc.SetState(SCE_B_COMMENT);
                        } else if (sc.Match('"')) {
                                sc.SetState(SCE_B_STRING);
                        } else if (IsDigit(sc.ch)) {
index 40f3a60bd37a4f3451cd3211d8acff13dd8e2f3c..bf089d6cff1110712df160df04203c4be8c9cdf7 100644 (file)
@@ -459,4 +459,3 @@ static void ColouriseCppDocInsensitive(unsigned int startPos, int length, int in
 
 LexerModule lmCPP(SCLEX_CPP, ColouriseCppDocSensitive, "cpp", FoldCppDoc, cppWordLists);
 LexerModule lmCPPNoCase(SCLEX_CPPNOCASE, ColouriseCppDocInsensitive, "cppnocase", FoldCppDoc, cppWordLists);
-LexerModule lmTCL(SCLEX_TCL, ColouriseCppDocSensitive, "tcl", FoldCppDoc, cppWordLists);
index e9e154cd5f64b8eb8051aa11c7ccbf8ad08a0cda..4aed7c6af1aaa768e0c76fb727fbbf66e02cb02e 100644 (file)
@@ -32,7 +32,7 @@ static inline bool isEiffelOperator(unsigned int ch) {
 }
 
 static inline bool IsAWordChar(unsigned int  ch) {
-       return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
+       return (ch < 0x80) && (isalnum(ch) || ch == '_');
 }
 
 static inline bool IsAWordStart(unsigned int ch) {
index d830a46439e822b5a0704ccbd29d27152a618b81..dad8fce46fcb99ce5502185e324c3a0a05dee32b 100644 (file)
@@ -149,7 +149,13 @@ static inline bool isStringState(int state) {
        case SCE_HB_STRING:
        case SCE_HBA_STRING:
        case SCE_HP_STRING:
+       case SCE_HP_CHARACTER:
+       case SCE_HP_TRIPLE:
+       case SCE_HP_TRIPLEDOUBLE:
        case SCE_HPA_STRING:
+       case SCE_HPA_CHARACTER:
+       case SCE_HPA_TRIPLE:
+       case SCE_HPA_TRIPLEDOUBLE:
        case SCE_HPHP_HSTRING:
        case SCE_HPHP_SIMPLESTRING:
        case SCE_HPHP_HSTRING_VARIABLE:
@@ -163,6 +169,19 @@ static inline bool isStringState(int state) {
        return bResult;
 }
 
+static inline bool stateAllowsTermination(int state) {
+       bool allowTermination = !isStringState(state);
+       if (allowTermination) {
+               switch (state) {
+               case SCE_HPHP_COMMENT:
+               case SCE_HP_COMMENTLINE:
+               case SCE_HPA_COMMENTLINE:
+                       allowTermination = false;
+               }
+       }
+       return allowTermination;
+}
+
 // not really well done, since it's only comments that should lex the %> and <%
 static inline bool isCommentASPState(int state) {
        bool bResult;
@@ -668,7 +687,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
                         (ch == '<') &&
                         (chNext == '?') &&
                                 !IsScriptCommentState(state) ) {
-                       scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment() + 2, i + 10, eScriptPHP);
+                       scriptLanguage = segIsScriptingIndicator(styler, i + 2, i + 10, eScriptPHP);
                        if (scriptLanguage != eScriptPHP && isStringState(state)) continue;
                        styler.ColourTo(i - 1, StateToPrint);
                        beforePreProc = state;
@@ -763,9 +782,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
                else if ((
                             ((inScriptType == eNonHtmlPreProc)
                              || (inScriptType == eNonHtmlScriptPreProc)) && (
-                                ((scriptLanguage == eScriptPHP) && (ch == '?') && !isPHPStringState(state) && (state != SCE_HPHP_COMMENT)) ||
-                                ((scriptLanguage != eScriptNone) && !isStringState(state) &&
-                                 ((ch == '%') || (ch == '?')))
+                                ((scriptLanguage != eScriptNone) && stateAllowsTermination(state) && ((ch == '%') || (ch == '?')))
                             ) && (chNext == '>')) ||
                         ((scriptLanguage == eScriptSGML) && (ch == '>') && (state != SCE_H_SGML_COMMENT))) {
                        if (state == SCE_H_ASPAT) {
diff --git a/src/stc/scintilla/src/LexInno.cxx b/src/stc/scintilla/src/LexInno.cxx
new file mode 100644 (file)
index 0000000..ff99da7
--- /dev/null
@@ -0,0 +1,290 @@
+// Scintilla source code edit control
+/** @file LexInno.cxx
+ ** Lexer for Inno Setup scripts.
+ **/
+// Written by Friedrich Vedder <fvedd@t-online.de>, using code from LexOthers.cxx.
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+static void ColouriseInnoDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler) {
+       int state = SCE_INNO_DEFAULT;
+       char chPrev;
+       char ch = 0;
+       char chNext = styler[startPos];
+       int lengthDoc = startPos + length;
+       char *buffer = new char[length];
+       int bufferCount = 0;
+       bool isBOL, isEOL, isWS, isBOLWS = 0;
+
+       WordList &sectionKeywords = *keywordLists[0];
+       WordList &standardKeywords = *keywordLists[1];
+       WordList &parameterKeywords = *keywordLists[2];
+       WordList &preprocessorKeywords = *keywordLists[3];
+       WordList &pascalKeywords = *keywordLists[4];
+       WordList &userKeywords = *keywordLists[5];
+
+       // 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++) {
+               chPrev = ch;
+               ch = chNext;
+               chNext = styler.SafeGetCharAt(i + 1);
+
+               if (styler.IsLeadByte(ch)) {
+                       chNext = styler.SafeGetCharAt(i + 2);
+                       i++;
+                       continue;
+               }
+
+               isBOL = (chPrev == 0) || (chPrev == '\n') || (chPrev == '\r' && ch != '\n');
+               isBOLWS = (isBOL) ? 1 : (isBOLWS && (chPrev == ' ' || chPrev == '\t'));
+               isEOL = (ch == '\n' || ch == '\r');
+               isWS = (ch == ' ' || ch == '\t');
+
+               switch(state) {
+                       case SCE_INNO_DEFAULT:
+                               if (ch == ';' && isBOLWS) {
+                                       // Start of a comment
+                                       state = SCE_INNO_COMMENT;
+                               } else if (ch == '[' && isBOLWS) {
+                                       // Start of a section name
+                                       bufferCount = 0;
+                                       state = SCE_INNO_SECTION;
+                               } else if (ch == '#' && isBOLWS) {
+                                       // Start of a preprocessor directive
+                                       state = SCE_INNO_PREPROC;
+                               } else if (ch == '{' && chNext == '#') {
+                                       // Start of a preprocessor inline directive
+                                       state = SCE_INNO_PREPROC_INLINE;
+                               } else if ((ch == '{' && (chNext == ' ' || chNext == '\t'))
+                                          || (ch == '(' && chNext == '*')) {
+                                       // Start of a Pascal comment
+                                       state = SCE_INNO_COMMENT_PASCAL;
+                               } else if (ch == '"') {
+                                       // Start of a double-quote string
+                                       state = SCE_INNO_STRING_DOUBLE;
+                               } else if (ch == '\'') {
+                                       // Start of a single-quote string
+                                       state = SCE_INNO_STRING_SINGLE;
+                               } else if (isascii(ch) && (isalpha(ch) || (ch == '_'))) {
+                                       // Start of an identifier
+                                       bufferCount = 0;
+                                       buffer[bufferCount++] = static_cast<char>(tolower(ch));
+                                       state = SCE_INNO_IDENTIFIER;
+                               } else {
+                                       // Style it the default style
+                                       styler.ColourTo(i,SCE_INNO_DEFAULT);
+                               }
+                               break;
+
+                       case SCE_INNO_COMMENT:
+                               if (isEOL) {
+                                       state = SCE_INNO_DEFAULT;
+                                       styler.ColourTo(i,SCE_INNO_COMMENT);
+                               }
+                               break;
+
+                       case SCE_INNO_IDENTIFIER:
+                               if (isascii(ch) && (isalnum(ch) || (ch == '_'))) {
+                                       buffer[bufferCount++] = static_cast<char>(tolower(ch));
+                               } else {
+                                       state = SCE_INNO_DEFAULT;
+                                       buffer[bufferCount] = '\0';
+
+                                       // Check if the buffer contains a keyword
+                                       if (standardKeywords.InList(buffer)) {
+                                               styler.ColourTo(i-1,SCE_INNO_KEYWORD);
+                                       } else if (parameterKeywords.InList(buffer)) {
+                                               styler.ColourTo(i-1,SCE_INNO_PARAMETER);
+                                       } else if (pascalKeywords.InList(buffer)) {
+                                               styler.ColourTo(i-1,SCE_INNO_KEYWORD_PASCAL);
+                                       } else if (userKeywords.InList(buffer)) {
+                                               styler.ColourTo(i-1,SCE_INNO_KEYWORD_USER);
+                                       } else {
+                                               styler.ColourTo(i-1,SCE_INNO_DEFAULT);
+                                       }
+
+                                       // Push back the faulty character
+                                       chNext = styler[i--];
+                                       ch = chPrev;
+                               }
+                               break;
+
+                       case SCE_INNO_SECTION:
+                               if (ch == ']') {
+                                       state = SCE_INNO_DEFAULT;
+                                       buffer[bufferCount] = '\0';
+
+                                       // Check if the buffer contains a section name
+                                       if (sectionKeywords.InList(buffer)) {
+                                               styler.ColourTo(i,SCE_INNO_SECTION);
+                                       } else {
+                                               styler.ColourTo(i,SCE_INNO_DEFAULT);
+                                       }
+                               } else if (isascii(ch) && (isalnum(ch) || (ch == '_'))) {
+                                       buffer[bufferCount++] = static_cast<char>(tolower(ch));
+                               } else {
+                                       state = SCE_INNO_DEFAULT;
+                                       styler.ColourTo(i,SCE_INNO_DEFAULT);
+                               }
+                               break;
+
+                       case SCE_INNO_PREPROC:
+                               if (isWS || isEOL) {
+                                       if (isascii(chPrev) && isalpha(chPrev)) {
+                                               state = SCE_INNO_DEFAULT;
+                                               buffer[bufferCount] = '\0';
+
+                                               // Check if the buffer contains a preprocessor directive
+                                               if (preprocessorKeywords.InList(buffer)) {
+                                                       styler.ColourTo(i-1,SCE_INNO_PREPROC);
+                                               } else {
+                                                       styler.ColourTo(i-1,SCE_INNO_DEFAULT);
+                                               }
+
+                                               // Push back the faulty character
+                                               chNext = styler[i--];
+                                               ch = chPrev;
+                                       }
+                               } else if (isascii(ch) && isalpha(ch)) {
+                                       if (chPrev == '#' || chPrev == ' ' || chPrev == '\t')
+                                               bufferCount = 0;
+                                       buffer[bufferCount++] = static_cast<char>(tolower(ch));
+                               }
+                               break;
+
+                       case SCE_INNO_STRING_DOUBLE:
+                               if (ch == '"' || isEOL) {
+                                       state = SCE_INNO_DEFAULT;
+                                       styler.ColourTo(i,SCE_INNO_DEFAULT);
+                               }
+                               break;
+
+                       case SCE_INNO_STRING_SINGLE:
+                               if (ch == '\'' || isEOL) {
+                                       state = SCE_INNO_DEFAULT;
+                                       styler.ColourTo(i,SCE_INNO_DEFAULT);
+                               }
+                               break;
+
+                       case SCE_INNO_PREPROC_INLINE:
+                               if (ch == '}') {
+                                       state = SCE_INNO_DEFAULT;
+                                       styler.ColourTo(i,SCE_INNO_PREPROC_INLINE);
+                               } else if (isEOL) {
+                                       state = SCE_INNO_DEFAULT;
+                                       styler.ColourTo(i,SCE_INNO_DEFAULT);
+                               }
+                               break;
+
+                       case SCE_INNO_COMMENT_PASCAL:
+                               if (ch == '}' || (ch == ')' && chPrev == '*')) {
+                                       state = SCE_INNO_DEFAULT;
+                                       styler.ColourTo(i,SCE_INNO_COMMENT_PASCAL);
+                               } else if (isEOL) {
+                                       state = SCE_INNO_DEFAULT;
+                                       styler.ColourTo(i,SCE_INNO_DEFAULT);
+                               }
+                               break;
+
+               }
+       }
+       delete []buffer;
+}
+
+static const char * const innoWordListDesc[] = {
+       "Sections",
+       "Keywords",
+       "Parameters",
+       "Preprocessor directives",
+       "Pascal keywords",
+       "User defined keywords",
+       0
+};
+
+static void FoldInnoDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {
+       bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
+
+       unsigned int endPos = startPos + length;
+       int visibleChars = 0;
+       int lineCurrent = styler.GetLine(startPos);
+
+       char chNext = styler[startPos];
+       int styleNext = styler.StyleAt(startPos);
+       bool headerPoint = false;
+       int lev;
+
+       for (unsigned int i = startPos; i < endPos; i++) {
+               char ch = chNext;
+               chNext = styler[i+1];
+
+               int style = styleNext;
+               styleNext = styler.StyleAt(i + 1);
+               bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
+
+               if (style == SCE_INNO_SECTION)
+                       headerPoint = true;
+
+               if (atEOL) {
+                       lev = SC_FOLDLEVELBASE;
+
+                       if (lineCurrent > 0) {
+                               int levelPrevious = styler.LevelAt(lineCurrent - 1);
+
+                               if (levelPrevious & SC_FOLDLEVELHEADERFLAG)
+                                       lev = SC_FOLDLEVELBASE + 1;
+                               else
+                                       lev = levelPrevious & SC_FOLDLEVELNUMBERMASK;
+                       }
+
+                       if (headerPoint)
+                               lev = SC_FOLDLEVELBASE;
+
+                       if (visibleChars == 0 && foldCompact)
+                               lev |= SC_FOLDLEVELWHITEFLAG;
+
+                       if (headerPoint)
+                               lev |= SC_FOLDLEVELHEADERFLAG;
+
+                       if (lev != styler.LevelAt(lineCurrent))
+                               styler.SetLevel(lineCurrent, lev);
+
+                       lineCurrent++;
+                       visibleChars = 0;
+                       headerPoint = false;
+               }
+               if (!isspacechar(ch))
+                       visibleChars++;
+       }
+
+       if (lineCurrent > 0) {
+               int levelPrevious = styler.LevelAt(lineCurrent - 1);
+
+               if (levelPrevious & SC_FOLDLEVELHEADERFLAG)
+                       lev = SC_FOLDLEVELBASE + 1;
+               else
+                       lev = levelPrevious & SC_FOLDLEVELNUMBERMASK;
+       } else {
+               lev = SC_FOLDLEVELBASE;
+       }
+       int flagsNext = styler.LevelAt(lineCurrent);
+       styler.SetLevel(lineCurrent, lev | flagsNext & ~SC_FOLDLEVELNUMBERMASK);
+}
+
+LexerModule lmInno(SCLEX_INNOSETUP, ColouriseInnoDoc, "inno", FoldInnoDoc, innoWordListDesc);
index 7f6df070acb081cb97d95962d2df1d7f2defb54d..b3a46ad34188cc2f3b253422ef900d1cf24314fe 100644 (file)
@@ -38,7 +38,8 @@ static inline bool IsANumberChar(int ch) {
        // but probably enough in most cases.
        return (ch < 0x80) &&
                (isdigit(ch) || toupper(ch) == 'E' ||
-             ch == '.' || ch == '-' || ch == '+');
+               ch == '.' || ch == '-' || ch == '+' ||
+               (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F'));
 }
 
 static inline bool IsLuaOperator(int ch) {
@@ -51,7 +52,8 @@ static inline bool IsLuaOperator(int ch) {
                ch == '{' || ch == '}' || ch == '~' ||
                ch == '[' || ch == ']' || ch == ';' ||
                ch == '<' || ch == '>' || ch == ',' ||
-               ch == '.' || ch == '^' || ch == '%' || ch == ':') {
+               ch == '.' || ch == '^' || ch == '%' || ch == ':' ||
+               ch == '#') {
                return true;
        }
        return false;
@@ -144,7 +146,7 @@ static void ColouriseLuaDoc(
                if (sc.state == SCE_LUA_OPERATOR) {
                        sc.SetState(SCE_LUA_DEFAULT);
                } else if (sc.state == SCE_LUA_NUMBER) {
-                       // We stop the number definition on non-numerical non-dot non-eE non-sign char
+                       // We stop the number definition on non-numerical non-dot non-eE non-sign non-hexdigit char
                        if (!IsANumberChar(sc.ch)) {
                                sc.SetState(SCE_LUA_DEFAULT);
                        }
@@ -225,6 +227,9 @@ static void ColouriseLuaDoc(
                if (sc.state == SCE_LUA_DEFAULT) {
                        if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
                                sc.SetState(SCE_LUA_NUMBER);
+                               if (sc.ch == '0' && toupper(sc.chNext) == 'X') {
+                                       sc.Forward(1);
+                               }
                        } else if (IsAWordStart(sc.ch)) {
                                sc.SetState(SCE_LUA_IDENTIFIER);
                        } else if (sc.ch == '\"') {
index 0c54ce670153033c7a6d3138a35d88207173b221..a94666822b871b86aa4d5df6739b0222600618b0 100644 (file)
@@ -3,7 +3,7 @@
  ** Lexer for MSSQL.
  **/
 // By Filip Yaghob <fyaghob@gmail.com>
-
+// The License.txt file describes the conditions under which this software may be distributed.
 
 #include <stdlib.h>
 #include <string.h>
diff --git a/src/stc/scintilla/src/LexOpal.cxx b/src/stc/scintilla/src/LexOpal.cxx
new file mode 100644 (file)
index 0000000..d1d1889
--- /dev/null
@@ -0,0 +1,518 @@
+// Scintilla source code edit control
+/** @file LexOpal.cxx
+ ** Lexer for OPAL (functional language similar to Haskell)
+ ** Written by Sebastian Pipping <webmaster@hartwork.org>
+ **/
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+#include "StyleContext.h"
+
+inline 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] = static_cast<char>( styler[ start + i ] );
+               i++;
+       }
+       s[ i ] = '\0';
+}
+
+inline bool HandleString( unsigned int & cur, unsigned int one_too_much, Accessor & styler )
+{
+       char ch;
+
+       // Wait for string to close
+       bool even_backslash_count = true; // Without gaps in between
+       cur++; // Skip initial quote
+       for( ; ; )
+       {
+               if( cur >= one_too_much )
+               {
+                       styler.ColourTo( cur - 1, SCE_OPAL_STRING );
+                       return false; // STOP
+               }
+
+               ch = styler.SafeGetCharAt( cur );
+               if( ( ch == '\015' ) || ( ch == '\012' ) ) // Deny multi-line strings
+               {
+                       styler.ColourTo( cur - 1, SCE_OPAL_STRING );
+                       styler.StartSegment( cur );
+                       return true;
+               }
+               else
+               {
+                       if( even_backslash_count )
+                       {
+                               if( ch == '"' )
+                               {
+                                       styler.ColourTo( cur, SCE_OPAL_STRING );
+                                       cur++;
+                                       if( cur >= one_too_much )
+                                       {
+                                               return false; // STOP
+                                       }
+                                       else
+                                       {
+                                               styler.StartSegment( cur );
+                                               return true;
+                                       }
+                               }
+                               else if( ch == '\\' )
+                               {
+                                       even_backslash_count = false;
+                               }
+                       }
+                       else
+                       {
+                               even_backslash_count = true;
+                       }
+               }
+
+               cur++;
+       }
+}
+
+inline bool HandleCommentBlock( unsigned int & cur, unsigned int one_too_much, Accessor & styler, bool could_fail )
+{
+       char ch;
+       
+       if( could_fail )
+       {
+               cur++;
+               if( cur >= one_too_much )
+               {
+                       styler.ColourTo( cur - 1, SCE_OPAL_DEFAULT );
+                       return false; // STOP
+               }
+               
+               ch = styler.SafeGetCharAt( cur );
+               if( ch != '*' )
+               {
+                       styler.ColourTo( cur - 1, SCE_OPAL_DEFAULT );
+                       styler.StartSegment( cur );
+                       return true;
+               }
+       }
+       
+       // Wait for comment close
+       cur++;
+       bool star_found = false;
+       for( ; ; )
+       {
+               if( cur >= one_too_much )
+               {
+                       styler.ColourTo( cur - 1, SCE_OPAL_COMMENT_BLOCK );
+                       return false; // STOP
+               }
+               
+               ch = styler.SafeGetCharAt( cur );
+               if( star_found )
+               {
+                       if( ch == '/' )
+                       {
+                               styler.ColourTo( cur, SCE_OPAL_COMMENT_BLOCK );
+                               cur++;
+                               if( cur >= one_too_much )
+                               {
+                                       return false; // STOP
+                               }
+                               else
+                               {
+                                       styler.StartSegment( cur );
+                                       return true;
+                               }
+                       }
+                       else if( ch != '*' )
+                       {
+                               star_found = false;
+                       }
+               }
+               else if( ch == '*' )
+               {
+                       star_found = true;
+               }
+               cur++;
+       }
+}
+
+inline bool HandleCommentLine( unsigned int & cur, unsigned int one_too_much, Accessor & styler, bool could_fail )
+{
+       char ch;
+       
+       if( could_fail )
+       {
+               cur++;
+               if( cur >= one_too_much )
+               {
+                       styler.ColourTo( cur - 1, SCE_OPAL_DEFAULT );
+                       return false; // STOP
+               }
+               
+               ch = styler.SafeGetCharAt( cur );
+               if( ch != '-' )
+               {
+                       styler.ColourTo( cur - 1, SCE_OPAL_DEFAULT );
+                       styler.StartSegment( cur );
+                       return true;
+               }
+
+               cur++;
+               if( cur >= one_too_much )
+               {
+                       styler.ColourTo( cur - 1, SCE_OPAL_DEFAULT );
+                       return false; // STOP
+               }
+               
+               ch = styler.SafeGetCharAt( cur );
+               if( ( ch != ' ' ) && ( ch != '\t' ) )
+               {
+                       styler.ColourTo( cur - 1, SCE_OPAL_DEFAULT );
+                       styler.StartSegment( cur );
+                       return true;
+               }
+       }
+
+       // Wait for end of line
+       bool fifteen_found = false;
+
+       for( ; ; )
+       {
+               cur++;
+
+               if( cur >= one_too_much )
+               {
+                       styler.ColourTo( cur - 1, SCE_OPAL_COMMENT_LINE );
+                       return false; // STOP
+               }
+
+               ch = styler.SafeGetCharAt( cur );
+               if( fifteen_found )
+               {
+/*
+                       if( ch == '\012' )
+                       {
+                               // One newline on Windows (015, 012)
+                       }
+                       else
+                       {
+                               // One newline on MAC (015) and another char
+                       }
+*/
+                       cur--;
+                       styler.ColourTo( cur - 1, SCE_OPAL_COMMENT_LINE );
+                       styler.StartSegment( cur );
+                       return true;
+               }
+               else
+               {
+                       if( ch == '\015' )
+                       {
+                               fifteen_found = true;   
+                       }
+                       else if( ch == '\012' )
+                       {
+                               // One newline on Linux (012)
+                               styler.ColourTo( cur - 1, SCE_OPAL_COMMENT_LINE );
+                               styler.StartSegment( cur );
+                               return true;
+                       }
+               }
+       }
+}
+
+inline bool HandlePar( unsigned int & cur, Accessor & styler )
+{
+       styler.ColourTo( cur, SCE_OPAL_PAR );
+
+       cur++;
+
+       styler.StartSegment( cur );
+       return true;
+}
+
+inline bool HandleSpace( unsigned int & cur, unsigned int one_too_much, Accessor & styler )
+{
+       char ch;
+
+       cur++;
+       for( ; ; )
+       {
+               if( cur >= one_too_much )
+               {
+                       styler.ColourTo( cur - 1, SCE_OPAL_SPACE );
+                       return false;
+               }
+               
+               ch = styler.SafeGetCharAt( cur );
+               switch( ch )
+               {
+               case ' ':
+               case '\t':
+               case '\015':
+               case '\012':
+                       cur++;
+                       break;
+               
+               default:
+                       styler.ColourTo( cur - 1, SCE_OPAL_SPACE );
+                       styler.StartSegment( cur );
+                       return true;
+               }
+       }
+}
+
+inline bool HandleInteger( unsigned int & cur, unsigned int one_too_much, Accessor & styler )
+{
+       char ch;
+
+       for( ; ; )
+       {
+               cur++;
+               if( cur >= one_too_much )
+               {
+                       styler.ColourTo( cur - 1, SCE_OPAL_INTEGER );
+                       return false; // STOP
+               }
+
+               ch = styler.SafeGetCharAt( cur );
+               if( !isdigit( ch ) )
+               {
+                       styler.ColourTo( cur - 1, SCE_OPAL_INTEGER );
+                       styler.StartSegment( cur );
+                       return true;
+               }
+       }
+}
+
+inline bool HandleWord( unsigned int & cur, unsigned int one_too_much, Accessor & styler, WordList * keywordlists[] )
+{
+       char ch;
+       const unsigned int beg = cur;
+
+       cur++;
+       for( ; ; )
+       {
+               ch = styler.SafeGetCharAt( cur );
+               if( ( ch != '_' ) && ( ch != '-' ) &&
+                       !islower( ch ) && !isupper( ch ) && !isdigit( ch ) ) break;
+
+               cur++;
+               if( cur >= one_too_much ) 
+               {
+                       break;
+               }
+       }
+
+       const int ide_len = cur - beg + 1;
+       char * ide = new char[ ide_len ];
+       getRange( beg, cur, styler, ide, ide_len );
+       
+       WordList & keywords    = *keywordlists[ 0 ];
+       WordList & classwords  = *keywordlists[ 1 ];
+
+       if( keywords.InList( ide ) ) // Keyword
+       {
+               delete [] ide;
+
+               styler.ColourTo( cur - 1, SCE_OPAL_KEYWORD );
+               if( cur >= one_too_much )
+               {
+                       return false; // STOP
+               }
+               else
+               {
+                       styler.StartSegment( cur );     
+                       return true;                    
+               }
+       }
+       else if( classwords.InList( ide ) ) // Sort
+       {
+               delete [] ide;
+
+               styler.ColourTo( cur - 1, SCE_OPAL_SORT );
+               if( cur >= one_too_much )
+               {
+                       return false; // STOP
+               }
+               else
+               {
+                       styler.StartSegment( cur );     
+                       return true;                    
+               }
+       }
+       else if( !strcmp( ide, "true" ) || !strcmp( ide, "false" ) ) // Bool const
+       {
+               delete [] ide;
+
+               styler.ColourTo( cur - 1, SCE_OPAL_BOOL_CONST );
+               if( cur >= one_too_much )
+               {
+                       return false; // STOP
+               }
+               else
+               {
+                       styler.StartSegment( cur );     
+                       return true;                    
+               }
+       }
+       else // Unknown keyword
+       {
+               delete [] ide;
+
+               styler.ColourTo( cur - 1, SCE_OPAL_DEFAULT );
+               if( cur >= one_too_much )
+               {
+                       return false; // STOP
+               }
+               else
+               {
+                       styler.StartSegment( cur );
+                       return true;                    
+               }
+       }
+
+}
+
+inline bool HandleSkip( unsigned int & cur, unsigned int one_too_much, Accessor & styler )
+{
+       cur++;
+       styler.ColourTo( cur - 1, SCE_OPAL_DEFAULT );
+       if( cur >= one_too_much )
+       {
+               return false; // STOP
+       }
+       else
+       {
+               styler.StartSegment( cur );     
+               return true;
+       }
+}
+
+static void ColouriseOpalDoc( unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor & styler )
+{
+       styler.StartAt( startPos );
+       styler.StartSegment( startPos );
+
+       unsigned int & cur = startPos;
+       const unsigned int one_too_much = startPos + length;
+
+       int state = initStyle;
+
+       for( ; ; )
+       {
+               switch( state )
+               {
+               case SCE_OPAL_KEYWORD:
+               case SCE_OPAL_SORT:
+                       if( !HandleWord( cur, one_too_much, styler, keywordlists ) ) return;
+                       state = SCE_OPAL_DEFAULT;
+                       break;
+
+               case SCE_OPAL_INTEGER:
+                       if( !HandleInteger( cur, one_too_much, styler ) ) return;
+                       state = SCE_OPAL_DEFAULT;
+                       break;
+
+               case SCE_OPAL_COMMENT_BLOCK:
+                       if( !HandleCommentBlock( cur, one_too_much, styler, false ) ) return;
+                       state = SCE_OPAL_DEFAULT;
+                       break;
+
+               case SCE_OPAL_COMMENT_LINE:
+                       if( !HandleCommentLine( cur, one_too_much, styler, false ) ) return;
+                       state = SCE_OPAL_DEFAULT;
+                       break;
+
+               case SCE_OPAL_STRING:
+                       if( !HandleString( cur, one_too_much, styler ) ) return;
+                       state = SCE_OPAL_DEFAULT;
+                       break;
+                       
+               default: // SCE_OPAL_DEFAULT:
+                       {
+                               char ch = styler.SafeGetCharAt( cur );
+                               
+                               switch( ch )
+                               {
+                               // String
+                               case '"':
+                                       if( !HandleString( cur, one_too_much, styler ) ) return;
+                                       break;
+
+                               // Comment block
+                               case '/':
+                                       if( !HandleCommentBlock( cur, one_too_much, styler, true ) ) return;
+                                       break;
+
+                               // Comment line
+                               case '-':
+                                       if( !HandleCommentLine( cur, one_too_much, styler, true ) ) return;
+                                       break;
+
+                               // Par
+                               case '(':
+                               case ')':
+                               case '[':
+                               case ']':
+                               case '{':
+                               case '}':
+                                       if( !HandlePar( cur, styler ) ) return;
+                                       break;
+
+                               // Whitespace
+                               case ' ':
+                               case '\t':
+                               case '\015':
+                               case '\012':
+                                       if( !HandleSpace( cur, one_too_much, styler ) ) return;
+                                       break;
+                               
+                               default:
+                                       {
+                                               // Integer
+                                               if( isdigit( ch ) )
+                                               {
+                                                       if( !HandleInteger( cur, one_too_much, styler ) ) return;
+                                               }
+
+                                               // Keyword
+                                               else if( islower( ch ) || isupper( ch ) )
+                                               {
+                                                       if( !HandleWord( cur, one_too_much, styler, keywordlists ) ) return;
+                                                       
+                                               }
+
+                                               // Skip
+                                               else
+                                               {
+                                                       if( !HandleSkip( cur, one_too_much, styler ) ) return;
+                                               }
+                                       }
+                               }
+
+                               break;
+                       }
+               }
+       }
+}
+
+static const char * const opalWordListDesc[] = {
+       "Keywords",
+       "Sorts",
+       0
+};
+
+LexerModule lmOpal(SCLEX_OPAL, ColouriseOpalDoc, "opal", NULL, opalWordListDesc);
index 4f4c1e3258fcabf2c106f7813c12bb48d2c11511..5f6e7e404152f53182fb7cd6c53e825d674bdfd6 100644 (file)
@@ -41,7 +41,7 @@ static bool IsBOperator(char ch) {
 
 // Tests for BATCH Separators
 static bool IsBSeparator(char ch) {
-       return (ch == ':') || (ch == '\\') || (ch == '.') || (ch == ';') ||
+       return (ch == '\\') || (ch == '.') || (ch == ';') ||
                (ch == '\"') || (ch == '\'') || (ch == '/') || (ch == ')');
 }
 
@@ -50,7 +50,7 @@ static void ColouriseBatchLine(
     unsigned int lengthLine,
     unsigned int startLine,
     unsigned int endPos,
-    WordList &keywords,
+    WordList *keywordlists[],
     Accessor &styler) {
 
        unsigned int offset = 0;        // Line Buffer Offset
@@ -59,7 +59,9 @@ static void ColouriseBatchLine(
        char wordBuffer[81];            // Word Buffer - large to catch long paths
        unsigned int wbl;               // Word Buffer Length
        unsigned int wbo;               // Word Buffer Offset - also Special Keyword Buffer Length
-       bool forFound = false;          // No Local Variable without FOR statement
+       WordList &keywords = *keywordlists[0];      // Internal Commands
+       WordList &keywords2 = *keywordlists[1];     // External Commands (optional)
+
        // CHOICE, ECHO, GOTO, PROMPT and SET have Default Text that may contain Regular Keywords
        //   Toggling Regular Keyword Checking off improves readability
        // Other Regular Keywords and External Commands / Programs might also benefit from toggling
@@ -174,7 +176,13 @@ static void ColouriseBatchLine(
                                // Reset Offset to re-process remainder of word
                                offset -= (wbl - 1);
                                // Colorize External Command / Program
-                               styler.ColourTo(startLine + offset - 1, SCE_BAT_COMMAND);
+                               if (!keywords2) {
+                                       styler.ColourTo(startLine + offset - 1, SCE_BAT_COMMAND);
+                               } else if (keywords2.InList(wordBuffer)) {
+                                       styler.ColourTo(startLine + offset - 1, SCE_BAT_COMMAND);
+                               } else {
+                                       styler.ColourTo(startLine + offset - 1, SCE_BAT_DEFAULT);
+                               }
                                // Reset External Command / Program Location
                                cmdLoc = offset;
                        } else {
@@ -186,10 +194,6 @@ static void ColouriseBatchLine(
                // Check for Regular Keyword in list
                } else if ((keywords.InList(wordBuffer)) &&
                        (continueProcessing)) {
-                       // Local Variables do not exist if no FOR statement
-                       if (CompareCaseInsensitive(wordBuffer, "for") == 0) {
-                               forFound = true;
-                       }
                        // ECHO, GOTO, PROMPT and SET require no further Regular Keyword Checking
                        if ((CompareCaseInsensitive(wordBuffer, "echo") == 0) ||
                                (CompareCaseInsensitive(wordBuffer, "goto") == 0) ||
@@ -261,8 +265,8 @@ static void ColouriseBatchLine(
                                        styler.ColourTo(startLine + offset - 1 - (wbl - wbo), SCE_BAT_WORD);
                                        // Reset Offset to re-process remainder of word
                                        offset -= (wbl - wbo);
+                               }
                        }
-               }
                        // Check for External Command / Program or Default Text
                        if (!sKeywordFound) {
                                wbo = 0;
@@ -306,8 +310,14 @@ static void ColouriseBatchLine(
                                                        }
                                                }
                                        }
-                                       // Colorize External command / program
-                                       styler.ColourTo(startLine + offset - 1, SCE_BAT_COMMAND);
+                                       // Colorize External Command / Program
+                                       if (!keywords2) {
+                                               styler.ColourTo(startLine + offset - 1, SCE_BAT_COMMAND);
+                                       } else if (keywords2.InList(wordBuffer)) {
+                                               styler.ColourTo(startLine + offset - 1, SCE_BAT_COMMAND);
+                                       } else {
+                                               styler.ColourTo(startLine + offset - 1, SCE_BAT_DEFAULT);
+                                       }
                                        // No need to Reset Offset
                                // Check for Default Text
                                } else {
@@ -354,13 +364,13 @@ static void ColouriseBatchLine(
                                // Check for External Command / Program
                                if (cmdLoc == offset - wbl) {
                                        cmdLoc = offset - (wbl - wbo);
-                       }
+                               }
                                // Colorize Environment Variable
                                styler.ColourTo(startLine + offset - 1 - (wbl - wbo), SCE_BAT_IDENTIFIER);
                                // Reset Offset to re-process remainder of word
                                offset -= (wbl - wbo);
                        // Check for Local Variable (%%a)
-                       } else if ((forFound) &&
+                       } else if (
                                (wordBuffer[1] == '%') &&
                                (wordBuffer[2] != '%') &&
                                (!IsBOperator(wordBuffer[2])) &&
@@ -447,7 +457,6 @@ static void ColouriseBatchDoc(
     Accessor &styler) {
 
        char lineBuffer[1024];
-       WordList &keywords = *keywordlists[0];
 
        styler.StartAt(startPos);
        styler.StartSegment(startPos);
@@ -458,14 +467,14 @@ static void ColouriseBatchDoc(
                if (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {
                        // End of line (or of line buffer) met, colourise it
                        lineBuffer[linePos] = '\0';
-                       ColouriseBatchLine(lineBuffer, linePos, startLine, i, keywords, styler);
+                       ColouriseBatchLine(lineBuffer, linePos, startLine, i, keywordlists, styler);
                        linePos = 0;
                        startLine = i + 1;
                }
        }
        if (linePos > 0) {      // Last line does not have ending characters
                ColouriseBatchLine(lineBuffer, linePos, startLine, startPos + length - 1,
-                                  keywords, styler);
+                                  keywordlists, styler);
        }
 }
 
@@ -593,8 +602,8 @@ static void ColourisePropsLine(
                        while ((i < lengthLine) && (lineBuffer[i] != '='))
                                i++;
                        if ((i < lengthLine) && (lineBuffer[i] == '=')) {
-                               styler.ColourTo(startLine + i - 1, SCE_PROPS_DEFAULT);
-                               styler.ColourTo(startLine + i, 3);
+                               styler.ColourTo(startLine + i - 1, SCE_PROPS_KEY);
+                               styler.ColourTo(startLine + i, SCE_PROPS_ASSIGNMENT);
                                styler.ColourTo(endPos, SCE_PROPS_DEFAULT);
                        } else {
                                styler.ColourTo(endPos, SCE_PROPS_DEFAULT);
@@ -871,7 +880,7 @@ static int RecogniseErrorListLine(const char *lineBuffer, unsigned int lengthLin
                // CTags: \t<message>
                // Lua 5 traceback: \t<filename>:<line>:<message>
                bool initialTab = (lineBuffer[0] == '\t');
-               enum { stInitial, 
+               enum { stInitial,
                        stGccStart, stGccDigit, stGcc,
                        stMsStart, stMsDigit, stMsBracket, stMsVc, stMsDigitComma, stMsDotNet,
                        stCtagsStart, stCtagsStartString, stCtagsStringDollar, stCtags,
@@ -933,8 +942,8 @@ static int RecogniseErrorListLine(const char *lineBuffer, unsigned int lengthLin
                                        for (j = i + numstep; j < lengthLine && isalpha(lineBuffer[j]) && chPos < sizeof(word) - 1; j++)
                                                word[chPos++] = lineBuffer[j];
                                        word[chPos] = 0;
-                                       if (!CompareCaseInsensitive(word, "error") || !CompareCaseInsensitive(word, "warning") || 
-                                               !CompareCaseInsensitive(word, "fatal") || !CompareCaseInsensitive(word, "catastrophic") || 
+                                       if (!CompareCaseInsensitive(word, "error") || !CompareCaseInsensitive(word, "warning") ||
+                                               !CompareCaseInsensitive(word, "fatal") || !CompareCaseInsensitive(word, "catastrophic") ||
                                                !CompareCaseInsensitive(word, "note") || !CompareCaseInsensitive(word, "remark")) {
                                                state = stMsVc;
                                        } else
@@ -1103,7 +1112,8 @@ static void ColouriseLatexDoc(unsigned int startPos, int length, int initStyle,
 }
 
 static const char * const batchWordListDesc[] = {
-       "Keywords",
+       "Internal Commands",
+       "External Commands",
        0
 };
 
index c1397b79130979b6390e9bb49357f2a66d1df17e..1bdebf6deda620c874d25d4f3436a5571902355d 100644 (file)
@@ -212,6 +212,8 @@ static void ColourisePyDoc(unsigned int startPos, int length, int initStyle,
                } else if (sc.state == SCE_P_DECORATOR) {
                        if (sc.ch == '\r' || sc.ch == '\n') {
                                sc.SetState(SCE_P_DEFAULT);
+                       } else if (sc.ch == '#') {
+                               sc.SetState((sc.chNext == '#') ? SCE_P_COMMENTBLOCK  :  SCE_P_COMMENTLINE);
                        }
                } else if ((sc.state == SCE_P_STRING) || (sc.state == SCE_P_CHARACTER)) {
                        if (sc.ch == '\\') {
index 75a958cb60009664592d9871cd57feb311d59e24..d8e14b9eb104c46a8d9c5ca4c6d5c8f902500dc4 100644 (file)
@@ -43,7 +43,6 @@ static inline bool IsANumberChar(int ch) {
              ch == '.' || ch == '-' || ch == '+');
 }
 
-
 static void ColouriseSQLDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
                             Accessor &styler) {
 
@@ -60,28 +59,8 @@ static void ColouriseSQLDoc(unsigned int startPos, int length, int initStyle, Wo
 
        bool sqlBackslashEscapes = styler.GetPropertyInt("sql.backslash.escapes", 0) != 0;
        bool sqlBackticksIdentifier = styler.GetPropertyInt("lexer.sql.backticks.identifier", 0) != 0;
-       int styleBeforeDCKeyword = SCE_C_DEFAULT;
-       bool fold = styler.GetPropertyInt("fold") != 0;
-       int lineCurrent = styler.GetLine(startPos);
-
+       int styleBeforeDCKeyword = SCE_SQL_DEFAULT;
        for (; sc.More(); sc.Forward()) {
-               // Fold based on indentation
-               if (sc.atLineStart) {
-                       int spaceFlags = 0;
-                       int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags);
-                       int level = indentCurrent;
-                       if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {
-                               // Only non whitespace lines can be headers
-                               int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags);
-                               if (indentCurrent < (indentNext & ~SC_FOLDLEVELWHITEFLAG)) {
-                                       level |= SC_FOLDLEVELHEADERFLAG;
-                               }
-                       }
-                       if (fold) {
-                               styler.SetLevel(lineCurrent, level);
-                       }
-               }
-
                // Determine if the current state should terminate.
                switch (sc.state) {
                case SCE_SQL_OPERATOR:
@@ -243,12 +222,14 @@ static void FoldSQLDoc(unsigned int startPos, int length, int initStyle,
                             WordList *[], Accessor &styler) {
        bool foldComment = styler.GetPropertyInt("fold.comment") != 0;
        bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
+       bool foldOnlyBegin = styler.GetPropertyInt("fold.sql.only.begin", 0) != 0;
+
        unsigned int endPos = startPos + length;
        int visibleChars = 0;
        int lineCurrent = styler.GetLine(startPos);
        int levelCurrent = SC_FOLDLEVELBASE;
        if (lineCurrent > 0) {
-               levelCurrent = styler.LevelAt(lineCurrent - 1) & SC_FOLDLEVELNUMBERMASK;
+               levelCurrent = styler.LevelAt(lineCurrent - 1) >> 16;
        }
        int levelNext = levelCurrent;
        char chNext = styler[startPos];
@@ -306,7 +287,7 @@ static void FoldSQLDoc(unsigned int startPos, int length, int initStyle,
                        } else {
                                s[j] = '\0';
                        }
-                       if (strcmp(s, "if") == 0 || strcmp(s, "loop") == 0) {
+                       if ((!foldOnlyBegin) && (strcmp(s, "if") == 0 || strcmp(s, "loop") == 0)) {
                                if (endFound) {
                                        // ignore
                                        endFound = false;
@@ -326,16 +307,14 @@ static void FoldSQLDoc(unsigned int startPos, int length, int initStyle,
                        }
                }
                if (atEOL) {
-                       int level = levelCurrent;
-                       if (visibleChars == 0 && foldCompact) {
-                               // Empty line
-                               level |= SC_FOLDLEVELWHITEFLAG;
-                       }
-                       if (visibleChars > 0 && levelNext > levelCurrent) {
-                               level |= SC_FOLDLEVELHEADERFLAG;
-                       }
-                       if (level != styler.LevelAt(lineCurrent)) {
-                               styler.SetLevel(lineCurrent, level);
+                       int levelUse = levelCurrent;
+                       int lev = levelUse | levelNext << 16;
+                       if (visibleChars == 0 && foldCompact)
+                               lev |= SC_FOLDLEVELWHITEFLAG;
+                       if (levelUse < levelNext)
+                               lev |= SC_FOLDLEVELHEADERFLAG;
+                       if (lev != styler.LevelAt(lineCurrent)) {
+                               styler.SetLevel(lineCurrent, lev);
                        }
                        lineCurrent++;
                        levelCurrent = levelNext;
diff --git a/src/stc/scintilla/src/LexSpice.cxx b/src/stc/scintilla/src/LexSpice.cxx
new file mode 100644 (file)
index 0000000..8a1683f
--- /dev/null
@@ -0,0 +1,221 @@
+// Scintilla source code edit control
+/** @file LexSpice.cxx
+ ** Lexer for Spice
+ **/
+// Copyright 2006 by Fabien Proriol
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "Platform.h"
+
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "PropSet.h"
+#include "KeyWords.h"
+#include "SciLexer.h"
+#include "SString.h"
+
+/*
+ * Interface
+ */
+
+static void ColouriseDocument(
+    unsigned int startPos,
+    int length,
+    int initStyle,
+    WordList *keywordlists[],
+    Accessor &styler);
+
+static const char * const spiceWordListDesc[] = {
+    "Keywords",        // SPICE command
+    "Keywords2",    // SPICE functions
+    "Keywords3",    // SPICE params
+    0
+};
+
+LexerModule lmSpice(SCLEX_SPICE, ColouriseDocument, "spice", NULL, spiceWordListDesc);
+
+/*
+ * Implementation
+ */
+
+static void ColouriseComment(StyleContext& sc, bool& apostropheStartsAttribute);
+static void ColouriseDelimiter(StyleContext& sc, bool& apostropheStartsAttribute);
+static void ColouriseNumber(StyleContext& sc, bool& apostropheStartsAttribute);
+static void ColouriseWhiteSpace(StyleContext& sc, bool& apostropheStartsAttribute);
+static void ColouriseWord(StyleContext& sc, WordList& keywords, WordList& keywords2, WordList& keywords3, bool& apostropheStartsAttribute);
+
+static inline bool IsDelimiterCharacter(int ch);
+static inline bool IsNumberStartCharacter(int ch);
+static inline bool IsNumberCharacter(int ch);
+static inline bool IsSeparatorOrDelimiterCharacter(int ch);
+static inline bool IsWordStartCharacter(int ch);
+static inline bool IsWordCharacter(int ch);
+
+static void ColouriseComment(StyleContext& sc, bool&) {
+    sc.SetState(SCE_SPICE_COMMENTLINE);
+    while (!sc.atLineEnd) {
+        sc.Forward();
+    }
+}
+
+static void ColouriseDelimiter(StyleContext& sc, bool& apostropheStartsAttribute) {
+    apostropheStartsAttribute = sc.Match (')');
+    sc.SetState(SCE_SPICE_DELIMITER);
+    sc.ForwardSetState(SCE_SPICE_DEFAULT);
+}
+
+static void ColouriseNumber(StyleContext& sc, bool& apostropheStartsAttribute) {
+    apostropheStartsAttribute = true;
+    SString number;
+    sc.SetState(SCE_SPICE_NUMBER);
+    // Get all characters up to a delimiter or a separator, including points, but excluding
+    // double points (ranges).
+    while (!IsSeparatorOrDelimiterCharacter(sc.ch) || (sc.ch == '.' && sc.chNext != '.')) {
+        number += static_cast<char>(sc.ch);
+        sc.Forward();
+    }
+    // Special case: exponent with sign
+    if ((sc.chPrev == 'e' || sc.chPrev == 'E') &&
+            (sc.ch == '+' || sc.ch == '-')) {
+        number += static_cast<char>(sc.ch);
+        sc.Forward ();
+        while (!IsSeparatorOrDelimiterCharacter(sc.ch)) {
+            number += static_cast<char>(sc.ch);
+            sc.Forward();
+        }
+    }
+    sc.SetState(SCE_SPICE_DEFAULT);
+}
+
+static void ColouriseWhiteSpace(StyleContext& sc, bool& ) {
+    sc.SetState(SCE_SPICE_DEFAULT);
+    sc.ForwardSetState(SCE_SPICE_DEFAULT);
+}
+
+static void ColouriseWord(StyleContext& sc, WordList& keywords, WordList& keywords2, WordList& keywords3, bool& apostropheStartsAttribute) {
+    apostropheStartsAttribute = true;
+    sc.SetState(SCE_SPICE_IDENTIFIER);
+    SString word;
+    while (!sc.atLineEnd && !IsSeparatorOrDelimiterCharacter(sc.ch)) {
+        word += static_cast<char>(tolower(sc.ch));
+        sc.Forward();
+    }
+    if (keywords.InList(word.c_str())) {
+        sc.ChangeState(SCE_SPICE_KEYWORD);
+        if (word != "all") {
+            apostropheStartsAttribute = false;
+        }
+    }
+    else if (keywords2.InList(word.c_str())) {
+        sc.ChangeState(SCE_SPICE_KEYWORD2);
+        if (word != "all") {
+            apostropheStartsAttribute = false;
+        }
+    }
+    else if (keywords3.InList(word.c_str())) {
+        sc.ChangeState(SCE_SPICE_KEYWORD3);
+        if (word != "all") {
+            apostropheStartsAttribute = false;
+        }
+    }
+    sc.SetState(SCE_SPICE_DEFAULT);
+}
+
+//
+// ColouriseDocument
+//
+static void ColouriseDocument(
+    unsigned int startPos,
+    int length,
+    int initStyle,
+    WordList *keywordlists[],
+    Accessor &styler) {
+    WordList &keywords = *keywordlists[0];
+    WordList &keywords2 = *keywordlists[1];
+    WordList &keywords3 = *keywordlists[2];
+    StyleContext sc(startPos, length, initStyle, styler);
+    int lineCurrent = styler.GetLine(startPos);
+    bool apostropheStartsAttribute = (styler.GetLineState(lineCurrent) & 1) != 0;
+    while (sc.More()) {
+        if (sc.atLineEnd) {
+            // Go to the next line
+            sc.Forward();
+            lineCurrent++;
+            // Remember the line state for future incremental lexing
+            styler.SetLineState(lineCurrent, apostropheStartsAttribute);
+            // Don't continue any styles on the next line
+            sc.SetState(SCE_SPICE_DEFAULT);
+        }
+        // Comments
+        if ((sc.Match('*') && sc.atLineStart) || sc.Match('*','~')) {
+            ColouriseComment(sc, apostropheStartsAttribute);
+        // Whitespace
+        } else if (IsASpace(sc.ch)) {
+            ColouriseWhiteSpace(sc, apostropheStartsAttribute);
+        // Delimiters
+        } else if (IsDelimiterCharacter(sc.ch)) {
+            ColouriseDelimiter(sc, apostropheStartsAttribute);
+        // Numbers
+        } else if (IsADigit(sc.ch) || sc.ch == '#') {
+            ColouriseNumber(sc, apostropheStartsAttribute);
+        // Keywords or identifiers
+        } else {
+            ColouriseWord(sc, keywords, keywords2, keywords3, apostropheStartsAttribute);
+        }
+    }
+    sc.Complete();
+}
+
+static inline bool IsDelimiterCharacter(int ch) {
+    switch (ch) {
+    case '&':
+    case '\'':
+    case '(':
+    case ')':
+    case '*':
+    case '+':
+    case ',':
+    case '-':
+    case '.':
+    case '/':
+    case ':':
+    case ';':
+    case '<':
+    case '=':
+    case '>':
+    case '|':
+        return true;
+    default:
+        return false;
+    }
+}
+
+static inline bool IsNumberCharacter(int ch) {
+    return IsNumberStartCharacter(ch) ||
+           ch == '_' ||
+           ch == '.' ||
+           ch == '#' ||
+           (ch >= 'a' && ch <= 'f') ||
+           (ch >= 'A' && ch <= 'F');
+}
+
+static inline bool IsNumberStartCharacter(int ch) {
+    return IsADigit(ch);
+}
+
+static inline bool IsSeparatorOrDelimiterCharacter(int ch) {
+    return IsASpace(ch) || IsDelimiterCharacter(ch);
+}
+
+static inline bool IsWordCharacter(int ch) {
+    return IsWordStartCharacter(ch) || IsADigit(ch);
+}
+
+static inline bool IsWordStartCharacter(int ch) {
+    return (isascii(ch) && isalpha(ch)) || ch == '_';
+}
diff --git a/src/stc/scintilla/src/LexTCL.cxx b/src/stc/scintilla/src/LexTCL.cxx
new file mode 100644 (file)
index 0000000..c782141
--- /dev/null
@@ -0,0 +1,362 @@
+// Scintilla source code edit control
+/** @file LexTCL.cxx
+ ** Lexer for TCL language.
+ **/
+// Copyright 1998-2001 by Andre Arpin <arpin@kingston.net>
+// 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 "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+// Extended to accept accented characters
+static inline bool IsAWordChar(int ch) {
+       return ch >= 0x80 ||
+        (isalnum(ch) || ch == '_' || ch ==':' || ch=='.'); // : name space separator
+}
+
+static inline bool IsAWordStart(int ch) {
+       return ch >= 0x80 || (ch ==':' || isalpha(ch) || ch == '_');
+}
+
+static inline bool IsANumberChar(int ch) {
+       // Not exactly following number definition (several dots are seen as OK, etc.)
+       // but probably enough in most cases.
+       return (ch < 0x80) &&
+              (IsADigit(ch, 0x10) || toupper(ch) == 'E' ||
+               ch == '.' || ch == '-' || ch == '+');
+}
+
+static void ColouriseTCLDoc(unsigned int startPos, int length, int , WordList *keywordlists[], Accessor &styler) {
+#define  isComment(s) (s==SCE_TCL_COMMENT || s==SCE_TCL_COMMENTLINE || s==SCE_TCL_COMMENT_BOX || s==SCE_TCL_BLOCK_COMMENT)
+       bool foldComment = styler.GetPropertyInt("fold.comment") != 0;
+       bool commentLevel = false;
+    bool subBrace = false; // substitution begin with a brace ${.....}
+       enum tLineState {LS_DEFAULT, LS_OPEN_COMMENT, LS_OPEN_DOUBLE_QUOTE, LS_COMMENT_BOX, LS_MASK_STATE = 0xf, 
+        LS_COMMAND_EXPECTED = 16, LS_BRACE_ONLY = 32 } lineState = LS_DEFAULT;
+       bool prevSlash = false;
+       int currentLevel = 0;
+    bool expected = 0;
+    bool subParen = 0;
+
+       int currentLine = styler.GetLine(startPos);
+    if (currentLine > 0)
+        currentLine--;
+       length += startPos - styler.LineStart(currentLine);
+       // make sure lines overlap
+       startPos = styler.LineStart(currentLine);
+
+       WordList &keywords = *keywordlists[0];
+       WordList &keywords2 = *keywordlists[1];
+       WordList &keywords3 = *keywordlists[2];
+       WordList &keywords4 = *keywordlists[3];
+       WordList &keywords5 = *keywordlists[4];
+       WordList &keywords6 = *keywordlists[5];
+       WordList &keywords7 = *keywordlists[6];
+    WordList &keywords8 = *keywordlists[7];
+    WordList &keywords9 = *keywordlists[8];
+
+       if (currentLine > 0) {
+        int ls = styler.GetLineState(currentLine - 1);
+               lineState = tLineState(ls & LS_MASK_STATE);
+               expected = LS_COMMAND_EXPECTED == tLineState(ls & LS_COMMAND_EXPECTED);
+        subBrace = LS_BRACE_ONLY == tLineState(ls & LS_BRACE_ONLY);
+               currentLevel = styler.LevelAt(currentLine - 1) >> 17;
+               commentLevel = (styler.LevelAt(currentLine - 1) >> 16) & 1;
+       } else
+               styler.SetLevel(0, SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG);
+       bool visibleChars = false;
+
+       int previousLevel = currentLevel;
+    StyleContext sc(startPos, length, SCE_TCL_DEFAULT, styler);
+       for (; ; sc.Forward()) {
+next:
+        if (sc.ch=='\r' && sc.chNext == '\n') // only ignore \r on PC process on the mac 
+            continue;
+        bool atEnd = !sc.More();  // make sure we coloured the last word
+        if (lineState != LS_DEFAULT) {
+            sc.SetState(SCE_TCL_DEFAULT);
+            if (lineState == LS_OPEN_COMMENT)
+                sc.SetState(SCE_TCL_COMMENTLINE);
+            else if (lineState == LS_OPEN_DOUBLE_QUOTE)
+                sc.SetState(SCE_TCL_IN_QUOTE);
+            else if (lineState == LS_COMMENT_BOX && (sc.ch == '#' || (sc.ch == ' ' && sc.chNext=='#')))
+                sc.SetState(SCE_TCL_COMMENT_BOX);
+            lineState = LS_DEFAULT;
+        }
+        if (subBrace) { // ${ overrides every thing even \ except }
+            if (sc.ch == '}') {
+                subBrace = false;
+                sc.SetState(SCE_TCL_OPERATOR);
+                sc.ForwardSetState(SCE_TCL_DEFAULT);
+                goto next;
+            }
+            else
+                sc.SetState(SCE_TCL_SUB_BRACE);
+            if (!sc.atLineEnd)
+                continue;
+        } else if (sc.state == SCE_TCL_DEFAULT || sc.state ==SCE_TCL_OPERATOR) {
+            expected &= isspacechar(static_cast<unsigned char>(sc.ch)) || IsAWordStart(sc.ch) || sc.ch =='#';
+        } else if (sc.state == SCE_TCL_SUBSTITUTION) {
+            switch(sc.ch) {
+            case '(':
+                subParen=true;
+                sc.SetState(SCE_TCL_OPERATOR);
+                sc.ForwardSetState(SCE_TCL_SUBSTITUTION);
+                continue;
+            case ')':
+                sc.SetState(SCE_TCL_OPERATOR);
+                subParen=false;
+                continue;
+            case '$':
+                continue;
+            case ',':
+                sc.SetState(SCE_TCL_OPERATOR);
+                if (subParen)
+                    sc.ForwardSetState(SCE_TCL_SUBSTITUTION);
+                continue;
+            default :
+                // maybe spaces should be allowed ???
+                if (!IsAWordChar(sc.ch)) { // probably the code is wrong
+                    sc.SetState(SCE_TCL_DEFAULT);
+                    subParen = 0;
+                }
+                break;
+            }
+        } else if (isComment(sc.state)) {
+        } else if (!IsAWordChar(sc.ch)) {
+            if ((sc.state == SCE_TCL_IDENTIFIER && expected) ||  sc.state == SCE_TCL_MODIFIER) {
+                char w[100];
+                char *s=w;
+                sc.GetCurrent(w, sizeof(w));
+                if (w[strlen(w)-1]=='\r')
+                    w[strlen(w)-1]=0;
+                while(*s == ':') // ignore leading : like in ::set a 10
+                    ++s;
+                bool quote = sc.state == SCE_TCL_IN_QUOTE;
+                if (commentLevel  || expected) {
+                    if (keywords.InList(s)) {
+                        sc.ChangeState(quote ? SCE_TCL_WORD_IN_QUOTE : SCE_TCL_WORD);
+                    } else if (keywords2.InList(s)) {
+                        sc.ChangeState(quote ? SCE_TCL_WORD_IN_QUOTE : SCE_TCL_WORD2);
+                    } else if (keywords3.InList(s)) {
+                        sc.ChangeState(quote ? SCE_TCL_WORD_IN_QUOTE : SCE_TCL_WORD3);
+                    } else if (keywords4.InList(s)) {
+                        sc.ChangeState(quote ? SCE_TCL_WORD_IN_QUOTE : SCE_TCL_WORD4);
+                    } else if (sc.GetRelative(-static_cast<int>(strlen(s))-1) == '{' &&
+                        keywords5.InList(s) && sc.ch == '}') { // {keyword} exactly no spaces
+                            sc.ChangeState(SCE_TCL_EXPAND);
+                    }
+                    if (keywords6.InList(s)) {
+                        sc.ChangeState(SCE_TCL_WORD5);
+                    } else if (keywords7.InList(s)) {
+                        sc.ChangeState(SCE_TCL_WORD6);
+                    } else if (keywords8.InList(s)) {
+                        sc.ChangeState(SCE_TCL_WORD7);
+                    } else if (keywords9.InList(s)) {
+                        sc.ChangeState(SCE_TCL_WORD8);
+                    } 
+                }
+                expected = false;
+                sc.SetState(quote ? SCE_TCL_IN_QUOTE : SCE_TCL_DEFAULT);
+            } else if (sc.state == SCE_TCL_MODIFIER || sc.state == SCE_TCL_IDENTIFIER) {
+                sc.SetState(SCE_TCL_DEFAULT);
+            }
+        }
+               if (atEnd)
+                       break;
+        if (sc.atLineEnd) {
+            lineState = LS_DEFAULT;
+                       currentLine = styler.GetLine(sc.currentPos);
+                       if (foldComment && sc.state!=SCE_TCL_COMMENT && isComment(sc.state)) {
+                               if (currentLevel == 0) {
+                                       ++currentLevel;
+                                       commentLevel = true;
+                               }
+                       } else {
+                               if (visibleChars && commentLevel) {
+                                       --currentLevel;
+                                       --previousLevel;
+                                       commentLevel = false;
+                               }
+                       }
+                       int flag = 0;
+                       if (!visibleChars)
+                               flag = SC_FOLDLEVELWHITEFLAG;
+                       if (currentLevel > previousLevel)
+                               flag = SC_FOLDLEVELHEADERFLAG;
+                       styler.SetLevel(currentLine, flag + previousLevel + SC_FOLDLEVELBASE + (currentLevel << 17) + (commentLevel << 16));
+
+                       // Update the line state, so it can be seen by next line
+                       if (sc.state == SCE_TCL_IN_QUOTE)
+                               lineState = LS_OPEN_DOUBLE_QUOTE;
+                       else {
+                            if (prevSlash) {
+                                   if (isComment(sc.state))
+                                           lineState = LS_OPEN_COMMENT;
+                } else if (sc.state == SCE_TCL_COMMENT_BOX)
+                    lineState = LS_COMMENT_BOX;
+                       }
+            styler.SetLineState(currentLine, 
+                (subBrace ? LS_BRACE_ONLY : 0) |
+                (expected ? LS_COMMAND_EXPECTED : 0)  | lineState);
+            if (lineState == LS_COMMENT_BOX)
+                sc.ForwardSetState(SCE_TCL_COMMENT_BOX);
+            else if (lineState == LS_OPEN_DOUBLE_QUOTE)
+                sc.ForwardSetState(SCE_TCL_IN_QUOTE);
+            else
+                sc.ForwardSetState(SCE_TCL_DEFAULT);
+                       prevSlash = false;
+                       previousLevel = currentLevel;
+                       goto next;
+               }
+
+               if (prevSlash) {
+            prevSlash = false;
+            if (sc.ch == '#' && IsANumberChar(sc.chNext))
+                sc.ForwardSetState(SCE_TCL_NUMBER);
+            continue;
+               }
+        prevSlash = sc.ch == '\\';
+        if (isComment(sc.state))
+            continue;
+               if (sc.atLineStart) {
+                       visibleChars = false;
+                       if (sc.state!=SCE_TCL_IN_QUOTE && !isComment(sc.state))
+            {
+                               sc.SetState(SCE_TCL_DEFAULT);
+                expected = IsAWordStart(sc.ch)|| isspacechar(static_cast<unsigned char>(sc.ch));
+            }
+               }
+
+               switch (sc.state) {
+               case SCE_TCL_NUMBER:
+                       if (!IsANumberChar(sc.ch))
+                               sc.SetState(SCE_TCL_DEFAULT);
+                       break;
+               case SCE_TCL_IN_QUOTE:
+                       if (sc.ch == '"') {
+                               sc.ForwardSetState(SCE_TCL_DEFAULT);
+                               visibleChars = true; // necessary if a " is the first and only character on a line
+                               goto next;
+                       } else if (sc.ch == '[' || sc.ch == ']' || sc.ch == '$') {
+                               sc.SetState(SCE_TCL_OPERATOR);
+                expected = sc.ch == '[';
+                sc.ForwardSetState(SCE_TCL_IN_QUOTE);
+                               goto next;
+                       }
+            continue;
+        case SCE_TCL_OPERATOR:
+                       sc.SetState(SCE_TCL_DEFAULT);
+                       break;
+               }
+
+               if (sc.ch == '#') {
+                       if (visibleChars) {
+                if (sc.state != SCE_TCL_IN_QUOTE && expected)
+                                       sc.SetState(SCE_TCL_COMMENT);
+                       } else {
+                sc.SetState(SCE_TCL_COMMENTLINE);
+                if (sc.chNext == '~')
+                    sc.SetState(SCE_TCL_BLOCK_COMMENT);
+                if (sc.atLineStart && (sc.chNext == '#' || sc.chNext == '-'))
+                        sc.SetState(SCE_TCL_COMMENT_BOX);
+            }
+        }
+
+               if (!isspacechar(static_cast<unsigned char>(sc.ch))) {
+                       visibleChars = true;
+               }
+
+               if (sc.ch == '\\') {
+                       prevSlash = true;
+                       continue;               
+               }
+
+               // Determine if a new state should be entered.
+               if (sc.state == SCE_TCL_DEFAULT) {
+            if (IsAWordStart(sc.ch)) {
+                               sc.SetState(SCE_TCL_IDENTIFIER);
+                       } else if (IsADigit(sc.ch) && !IsAWordChar(sc.chPrev)) {
+                               sc.SetState(SCE_TCL_NUMBER);
+                       } else {
+                               switch (sc.ch) {
+                               case '\"':
+                                       sc.SetState(SCE_TCL_IN_QUOTE);
+                                       break;
+                               case '{':
+                                       sc.SetState(SCE_TCL_OPERATOR);
+                                       expected = true;
+                                       ++currentLevel;
+                                       break;
+                               case '}':
+                                       sc.SetState(SCE_TCL_OPERATOR);
+                                       --currentLevel;
+                                       break;
+                               case '[':
+                    expected = true;
+                               case ']':
+                               case '(':
+                               case ')':
+                                       sc.SetState(SCE_TCL_OPERATOR);
+                                       break;
+                               case ';':
+                    expected = true;
+                                       break;
+                case '$':
+                    subParen = 0;
+                    if (sc.chNext != '{') {
+                        sc.SetState(SCE_TCL_SUBSTITUTION);
+                    } 
+                    else {
+                        sc.SetState(SCE_TCL_OPERATOR);  // $
+                        sc.Forward();  // {
+                        sc.ForwardSetState(SCE_TCL_SUB_BRACE);
+                        subBrace = true;
+                    }
+                    break;
+                case '#':
+                    if ((isspacechar(static_cast<unsigned char>(sc.chPrev))||
+                            isoperator(static_cast<char>(sc.chPrev))) && IsADigit(sc.chNext,0x10))
+                        sc.SetState(SCE_TCL_NUMBER);
+                    break;
+                case '-':
+                    sc.SetState(IsADigit(sc.chNext)? SCE_TCL_NUMBER: SCE_TCL_MODIFIER);
+                    break;
+                default:
+                    if (isoperator(static_cast<char>(sc.ch))) {
+                        sc.SetState(SCE_TCL_OPERATOR);
+                    }
+                               }
+                       }
+               }
+       }
+       sc.Complete();
+}
+
+static const char * const tclWordListDesc[] = {
+            "TCL Keywords",
+            "TK Keywords",
+            "iTCL Keywords",
+            "tkCommands",
+            "expand"
+            "user1",
+            "user2",
+            "user3",
+            "user4",
+            0
+        };
+
+// this code supports folding in the colourizer
+LexerModule lmTCL(SCLEX_TCL, ColouriseTCLDoc, "tcl", 0, tclWordListDesc);
index ef5924f7511e1207fce82854915880125fef8125..8ebdce491831105ba331da610a90c3898442b025 100644 (file)
@@ -15,11 +15,13 @@ public:
        int markType;
        ColourPair fore;
        ColourPair back;
+       int alpha;
        XPM *pxpm;
        LineMarker() {
                markType = SC_MARK_CIRCLE;
                fore = ColourDesired(0,0,0);
                back = ColourDesired(0xff,0xff,0xff);
+               alpha = SC_ALPHA_NOALPHA;
                pxpm = NULL;
        }
        LineMarker(const LineMarker &) {
@@ -27,6 +29,7 @@ public:
                markType = SC_MARK_CIRCLE;
                fore = ColourDesired(0,0,0);
                back = ColourDesired(0xff,0xff,0xff);
+               alpha = SC_ALPHA_NOALPHA;
                pxpm = NULL;
        }
        ~LineMarker() {
@@ -37,6 +40,7 @@ public:
                markType = SC_MARK_CIRCLE;
                fore = ColourDesired(0,0,0);
                back = ColourDesired(0xff,0xff,0xff);
+               alpha = SC_ALPHA_NOALPHA;
                delete pxpm;
                pxpm = NULL;
                return *this;
index b7ea71bfb9631d81d3b92743c6626b2dfda35cee..00e183060af654a4d2b644026abf97e7ca7f2f1f 100644 (file)
@@ -4,7 +4,7 @@
  **/
 
 /*
- * regex - Regular expression pattern matching  and replacement
+ * regex - Regular expression pattern matching and replacement
  *
  * By:  Ozan S. Yigit (oz)
  *      Dept. of Computer Science
@@ -15,7 +15,7 @@
  * 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.
+ * 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.
  * Modification history removed.
  *
  * Interfaces:
- *      RESearch::Compile:        compile a regular expression into a NFA.
+ *  RESearch::Compile:      compile a regular expression into a NFA.
  *
- *                     char *RESearch::Compile(s)
- *                     char *s;
+ *          const char *RESearch::Compile(const char *pat, int length,
+ *                                        bool caseSensitive, bool posix)
  *
- *      RESearch::Execute:        execute the NFA to match a pattern.
+ * Returns a short error string if they fail.
  *
- *                     int RESearch::Execute(s)
- *                     char *s;
+ *  RESearch::Execute:      execute the NFA to match a pattern.
  *
- *     RESearch::ModifyWord            change RESearch::Execute's understanding of what a "word"
- *                     looks like (for \< and \>) by adding into the
- *                     hidden word-syntax table.
+ *          int RESearch::Execute(characterIndexer &ci, int lp, int endp)
  *
- *                     void RESearch::ModifyWord(s)
- *                     char *s;
+ *  RESearch::Substitute:   substitute the matched portions in a new string.
  *
- *      RESearch::Substitute:  substitute the matched portions in a new string.
+ *          int RESearch::Substitute(CharacterIndexer &ci, char *src, char *dst)
  *
- *                     int RESearch::Substitute(src, dst)
- *                     char *src;
- *                     char *dst;
+ *  re_fail:                failure routine for RESearch::Execute. (no longer used)
  *
- *     re_fail:        failure routine for RESearch::Execute.
- *
- *                     void re_fail(msg, op)
- *                     char *msg;
- *                     char op;
+ *          void re_fail(char *msg, char op)
  *
  * Regular Expressions:
  *
  *      [1]     char    matches itself, unless it is a special
  *                      character (metachar): . \ [ ] * + ^ $
+ *                      and ( ) if posix option.
  *
  *      [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.
+ *      [3]     \       matches the character following it, except:
+ *                      - \a, \b, \f, \n, \t, \v match the
+ *                      corresponding C escape char;
+ *                      - if not in posix mode, when followed by a
+ *                      left or right round bracket (see [7]);
+ *                      - when followed by a digit 1 to 9 (see [8]);
+ *                      - when followed by a left or right angle bracket
+ *                      (see [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 (except for escape chars).
  *
  *      [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.
+ *                      complements the set. A shorthand S-E (start-end)
+ *                      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. To include both,
+ *                      put - first: [-]A-Z]:
+ *                      [-]|] matches these 2 chars,
+ *                      []-|] matches from ] to | chars.
  *                      examples:        match:
  *
  *                              [a-z]    any lowercase alpha
  *
- *                              [^]-]    any char except ] and -
+ *                              [^-]]    any char except - and ]
  *
  *                              [^A-Z]   any char except uppercase
  *                                       alpha
  *      [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.
+ *                      as \(form\) (or (form) with posix flag) matches what
+ *                      form matches. The enclosure creates a set of tags,
+ *                      used for [8] and for pattern substitution.
+ *                      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.
+ *      [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
+ *      [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.
+ *                      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.
+ *  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                  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
+ *              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
+ *     by one bit in a 256-bit block. Thus, CCL always takes a
+ *     constant 32 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:    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:    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\\+
+ *  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:    \(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 ...
+ *  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 "CharClassify.h"
 #include "RESearch.h"
 
+// Shut up annoying Visual C++ warnings:
+#ifdef _MSC_VER
+#pragma warning(disable: 4514)
+#endif
+
 #define OKP     1
 #define NOP     0
 
 #define EOL     5
 #define BOT     6
 #define EOT     7
-#define BOW    8
-#define EOW    9
+#define BOW     8
+#define EOW     9
 #define REF     10
 #define CLO     11
 
  * The following defines are not meant to be changeable.
  * They are for readability only.
  */
-#define BLKIND 0370
-#define BITIND 07
-
-#define ASCIIB 0177
+#define BLKIND  0370
+#define BITIND  07
 
 const char bitarr[] = {1,2,4,8,16,32,64,'\200'};
 
 #define badpat(x)      (*nfa = END, x)
 
-RESearch::RESearch() {
+/*
+ * Character classification table for word boundary operators BOW
+ * and EOW is passed in by the creator of this object (Scintilla
+ * Document). The Document default state is that word chars are:
+ * 0-9,a-z, A-Z and _
+ */
+
+RESearch::RESearch(CharClassify *charClassTable) {
+       charClass = charClassTable;
        Init();
 }
 
@@ -215,7 +225,7 @@ RESearch::~RESearch() {
 }
 
 void RESearch::Init() {
-       sta = NOP;                      /* status of lastpat */
+       sta = NOP;                  /* status of lastpat */
        bol = 0;
        for (int i=0; i<MAXTAG; i++)
                pat[i] = 0;
@@ -285,15 +295,15 @@ const char escapeValue(char ch) {
 
 const char *RESearch::Compile(const char *pat, int length, bool caseSensitive, bool posix) {
        char *mp=nfa;          /* nfa pointer       */
-       char *lp;              /* saved pointer..   */
-       char *sp=nfa;          /* another one..     */
-    char *mpMax = mp + MAXNFA - BITBLK - 10;
+       char *lp;              /* saved pointer     */
+       char *sp=nfa;          /* another one       */
+       char *mpMax = mp + MAXNFA - BITBLK - 10;
 
        int tagi = 0;          /* tag stack index   */
        int tagc = 1;          /* actual tag count  */
 
        int n;
-       char mask;              /* xor mask -CCL/NCL */
+       char mask;             /* xor mask -CCL/NCL */
        int c1, c2;
 
        if (!pat || !length)
@@ -303,18 +313,18 @@ const char *RESearch::Compile(const char *pat, int length, bool caseSensitive, b
                        return badpat("No previous regular expression");
        sta = NOP;
 
-       const char *p=pat;               /* pattern pointer   */
+       const char *p=pat;     /* pattern pointer   */
        for (int i=0; i<length; i++, p++) {
                if (mp > mpMax)
                        return badpat("Pattern too long");
                lp = mp;
                switch(*p) {
 
-               case '.':               /* match any char..  */
+               case '.':               /* match any char  */
                        *mp++ = ANY;
                        break;
 
-               case '^':               /* match beginning.. */
+               case '^':               /* match beginning */
                        if (p == pat)
                                *mp++ = BOL;
                        else {
@@ -323,7 +333,7 @@ const char *RESearch::Compile(const char *pat, int length, bool caseSensitive, b
                        }
                        break;
 
-               case '$':               /* match endofline.. */
+               case '$':               /* match endofline */
                        if (!*(p+1))
                                *mp++ = EOL;
                        else {
@@ -332,7 +342,7 @@ const char *RESearch::Compile(const char *pat, int length, bool caseSensitive, b
                        }
                        break;
 
-               case '[':               /* match char class..*/
+               case '[':               /* match char class */
                        *mp++ = CCL;
 
                        i++;
@@ -343,7 +353,7 @@ const char *RESearch::Compile(const char *pat, int length, bool caseSensitive, b
                        } else
                                mask = 0;
 
-                       if (*p == '-') {                /* real dash */
+                       if (*p == '-') {        /* real dash */
                                i++;
                                ChSet(*p++);
                        }
@@ -384,12 +394,12 @@ const char *RESearch::Compile(const char *pat, int length, bool caseSensitive, b
 
                        break;
 
-               case '*':               /* match 0 or more.. */
-               case '+':               /* match 1 or more.. */
+               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..   */
+                       if (*lp == CLO)         /* equivalence... */
                                break;
                        switch(*lp) {
 
@@ -417,7 +427,7 @@ const char *RESearch::Compile(const char *pat, int length, bool caseSensitive, b
                        mp = sp;
                        break;
 
-               case '\\':              /* tags, backrefs .. */
+               case '\\':              /* tags, backrefs... */
                        i++;
                        switch(*++p) {
 
@@ -483,7 +493,7 @@ const char *RESearch::Compile(const char *pat, int length, bool caseSensitive, b
                        }
                        break;
 
-               default :               /* an ordinary char  */
+               default :               /* an ordinary char */
                        if (posix && *p == '(') {
                                if (tagc < MAXTAG) {
                                        tagstk[++tagi] = tagc;
@@ -524,23 +534,23 @@ const char *RESearch::Compile(const char *pat, int length, bool caseSensitive, b
 
 /*
  * 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.
+ *   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.
  *
  */
 
@@ -571,7 +581,7 @@ int RESearch::Execute(CharacterIndexer &ci, int lp, int endp) {
                c = *(ap+1);
                while ((lp < endp) && (ci.CharAt(lp) != c))
                        lp++;
-               if (lp >= endp)         /* if EOS, fail, else fall thru. */
+               if (lp >= endp) /* if EOS, fail, else fall thru. */
                        return 0;
        default:                        /* regular matching all the way. */
                while (lp < endp) {
@@ -595,78 +605,50 @@ int RESearch::Execute(CharacterIndexer &ci, int lp, int endp) {
 /*
  * 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).
- *
+ *  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])
+#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 34     /* [CLO] CCL 32bytes END ... */
+#define ANYSKIP 2      /* [CLO] ANY END          */
+#define CHRSKIP 3      /* [CLO] CHR chr END      */
+#define CCLSKIP 34     /* [CLO] CCL 32 bytes 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. */
+       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) {
@@ -756,44 +738,15 @@ int RESearch::PMatch(CharacterIndexer &ci, int lp, int endp, char *ap) {
        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 matched portions of the src in dst.
  *
- *     &       substitute the entire matched pattern.
+ *  &    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.
+ *  \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;
index a558b371d2542ad64f2f9abf840a5af43721d1cb..aa85579184257f2aaae1c5e4f42a8b97e83e53b0 100644 (file)
@@ -18,7 +18,7 @@
 #define BITBLK MAXCHR/CHRBIT
 
 class CharacterIndexer {
-public: 
+public:
        virtual char CharAt(int index)=0;
        virtual ~CharacterIndexer() {
        }
@@ -27,16 +27,11 @@ public:
 class RESearch {
 
 public:
-       RESearch();
+       RESearch(CharClassify *charClassTable);
        ~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, bool posix);
        int Execute(CharacterIndexer &ci, int lp, int endp);
-       void ModifyWord(char *s);
        int Substitute(CharacterIndexer &ci, char *src, char *dst);
 
        enum {MAXTAG=10};
@@ -48,15 +43,23 @@ public:
        char *pat[MAXTAG];
 
 private:
+       void Init();
+       void Clear();
+       void ChSet(char c);
+       void ChSetWithCase(char c, bool caseSensitive);
+
        int PMatch(CharacterIndexer &ci, int lp, int endp, char *ap);
 
        int bol;
-       int  tagstk[MAXTAG];             /* subpat tag stack..*/
-       char nfa[MAXNFA];               /* automaton..       */
+       int  tagstk[MAXTAG]; /* subpat tag stack */
+       char nfa[MAXNFA];    /* automaton */
        int sta;
-       char bittab[BITBLK];            /* bit table for CCL */
-                                               /* pre-set bits...   */
+       char bittab[BITBLK]; /* bit table for CCL pre-set bits */
        int failure;
+       CharClassify *charClass;
+       bool iswordc(unsigned char x) {
+               return charClass->IsWord(x);
+       }
 };
 
 #endif
index 6be8b74b533134932031686896dfc313572d4710..bcb0a77e29730a93d878af7fc7bfa64b037a6b45 100644 (file)
@@ -31,6 +31,7 @@
 #include "Style.h"
 #include "ViewStyle.h"
 #include "AutoComplete.h"
+#include "CharClassify.h"
 #include "Document.h"
 #include "Editor.h"
 #include "ScintillaBase.h"
@@ -368,12 +369,19 @@ int ScintillaBase::AutoCompleteGetCurrent() {
 void ScintillaBase::CallTipShow(Point pt, const char *defn) {
        AutoCompleteCancel();
        pt.y += vs.lineHeight;
+       // If container knows about STYLE_CALLTIP then use it in place of the
+       // STYLE_DEFAULT for the face name, size and character set. Also use it
+       // for the foreground and background colour.
+       int ctStyle = ct.UseStyleCallTip() ? STYLE_CALLTIP : STYLE_DEFAULT;
+       if (ct.UseStyleCallTip()) {
+               ct.SetForeBack(vs.styles[STYLE_CALLTIP].fore, vs.styles[STYLE_CALLTIP].back);
+       }
        PRectangle rc = ct.CallTipStart(currentPos, pt,
                defn,
-               vs.styles[STYLE_DEFAULT].fontName,
-               vs.styles[STYLE_DEFAULT].sizeZoomed,
+               vs.styles[ctStyle].fontName,
+               vs.styles[ctStyle].sizeZoomed,
                CodePage(),
-               vs.styles[STYLE_DEFAULT].characterSet,
+               vs.styles[ctStyle].characterSet,
                wMain);
        // If the call-tip window would be out of the client
        // space, adjust so it displays above the text.
@@ -461,7 +469,7 @@ void ScintillaBase::Colourise(int start, int end) {
 
                int styleStart = 0;
                if (start > 0)
-                       styleStart = styler.StyleAt(start - 1);
+                       styleStart = styler.StyleAt(start - 1) & pdoc->stylingBitsMask;
                styler.SetCodePage(pdoc->dbcsCodePage);
 
                if (lexCurrent && (len > 0)) {  // Should always succeed as null lexer should always be available
@@ -624,11 +632,13 @@ sptr_t ScintillaBase::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lPara
 
        case SCI_CALLTIPSETBACK:
                ct.colourBG = ColourDesired(wParam);
+               vs.styles[STYLE_CALLTIP].fore = ct.colourBG;
                InvalidateStyleRedraw();
                break;
 
        case SCI_CALLTIPSETFORE:
                ct.colourUnSel = ColourDesired(wParam);
+               vs.styles[STYLE_CALLTIP].fore = ct.colourUnSel;
                InvalidateStyleRedraw();
                break;
 
@@ -637,6 +647,11 @@ sptr_t ScintillaBase::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lPara
                InvalidateStyleRedraw();
                break;
 
+       case SCI_CALLTIPUSESTYLE:
+               ct.SetTabSize((int)wParam);
+               InvalidateStyleRedraw();
+               break;
+
        case SCI_USEPOPUP:
                displayPopupMenu = wParam != 0;
                break;
index c52f1e47287a51a1a1ed45acf8a2f54500332a0e..b4da30ace3f2077200aaf40891dc06a43f96fe83 100644 (file)
@@ -17,7 +17,7 @@
 #include "ViewStyle.h"
 
 MarginStyle::MarginStyle() :
-       symbol(false), width(16), mask(0xffffffff), sensitive(false) {
+       style(SC_MARGIN_SYMBOL), width(0), mask(0), sensitive(false) {
 }
 
 // A list of the fontnames - avoids wasting space in each style
@@ -73,6 +73,7 @@ ViewStyle::ViewStyle(const ViewStyle &source) {
        selbackset = source.selbackset;
        selbackground.desired = source.selbackground.desired;
        selbackground2.desired = source.selbackground2.desired;
+       selAlpha = source.selAlpha;
 
        foldmarginColourSet = source.foldmarginColourSet;
        foldmarginColour.desired = source.foldmarginColour.desired;
@@ -95,6 +96,7 @@ ViewStyle::ViewStyle(const ViewStyle &source) {
        caretcolour.desired = source.caretcolour.desired;
        showCaretLineBackground = source.showCaretLineBackground;
        caretLineBackground.desired = source.caretLineBackground.desired;
+       caretLineAlpha = source.caretLineAlpha;
        edgecolour.desired = source.edgecolour.desired;
        edgeState = source.edgeState;
        caretWidth = source.caretWidth;
@@ -140,6 +142,7 @@ void ViewStyle::Init() {
        selbackset = true;
        selbackground.desired = ColourDesired(0xc0, 0xc0, 0xc0);
        selbackground2.desired = ColourDesired(0xb0, 0xb0, 0xb0);
+       selAlpha = SC_ALPHA_NOALPHA;
 
        foldmarginColourSet = false;
        foldmarginColour.desired = ColourDesired(0xff, 0, 0);
@@ -157,6 +160,7 @@ void ViewStyle::Init() {
        caretcolour.desired = ColourDesired(0, 0, 0);
        showCaretLineBackground = false;
        caretLineBackground.desired = ColourDesired(0xff, 0xff, 0);
+       caretLineAlpha = SC_ALPHA_NOALPHA;
        edgecolour.desired = ColourDesired(0xc0, 0xc0, 0xc0);
        edgeState = EDGE_NONE;
        caretWidth = 1;
@@ -171,13 +175,13 @@ void ViewStyle::Init() {
 
        leftMarginWidth = 1;
        rightMarginWidth = 1;
-       ms[0].symbol = false;
+       ms[0].style = SC_MARGIN_NUMBER;
        ms[0].width = 0;
        ms[0].mask = 0;
-       ms[1].symbol = true;
+       ms[1].style = SC_MARGIN_SYMBOL;
        ms[1].width = 16;
        ms[1].mask = ~SC_MASK_FOLDERS;
-       ms[2].symbol = true;
+       ms[2].style = SC_MARGIN_SYMBOL;
        ms[2].width = 0;
        ms[2].mask = 0;
        fixedColumnWidth = leftMarginWidth;
@@ -185,7 +189,7 @@ void ViewStyle::Init() {
        maskInLine = 0xffffffff;
        for (int margin=0; margin < margins; margin++) {
                fixedColumnWidth += ms[margin].width;
-               symbolMargin = symbolMargin || ms[margin].symbol;
+               symbolMargin = symbolMargin || (ms[margin].style != SC_MARGIN_NUMBER);
                if (ms[margin].width > 0)
                        maskInLine &= ~ms[margin].mask;
        }
@@ -256,7 +260,7 @@ void ViewStyle::Refresh(Surface &surface) {
        maskInLine = 0xffffffff;
        for (int margin=0; margin < margins; margin++) {
                fixedColumnWidth += ms[margin].width;
-               symbolMargin = symbolMargin || ms[margin].symbol;
+               symbolMargin = symbolMargin || (ms[margin].style != SC_MARGIN_NUMBER);
                if (ms[margin].width > 0)
                        maskInLine &= ~ms[margin].mask;
        }
@@ -278,6 +282,10 @@ void ViewStyle::ClearStyles() {
                }
        }
        styles[STYLE_LINENUMBER].back.desired = Platform::Chrome();
+
+       // Set call tip fore/back to match the values previously set for call tips
+       styles[STYLE_CALLTIP].back.desired = ColourDesired(0xff, 0xff, 0xff);
+       styles[STYLE_CALLTIP].fore.desired = ColourDesired(0x80, 0x80, 0x80);
 }
 
 void ViewStyle::SetStyleFontName(int styleIndex, const char *name) {
index d06c0200272de604f482998a7d609efb4971a252..75f899d974a2e588cddb1bdea39cc253c95442ed 100644 (file)
@@ -12,7 +12,7 @@
  */
 class MarginStyle {
 public:
-       bool symbol;
+       int style;
        int width;
        int mask;
        bool sensitive;
@@ -53,6 +53,7 @@ public:
        bool selbackset;
        ColourPair selbackground;
        ColourPair selbackground2;
+       int selAlpha;
        bool whitespaceForegroundSet;
        ColourPair whitespaceForeground;
        bool whitespaceBackgroundSet;
@@ -70,7 +71,7 @@ public:
        bool hotspotUnderline;
        bool hotspotSingleLine;
        /// Margins are ordered: Line Numbers, Selection Margin, Spacing Margin
-       enum { margins=3 };
+       enum { margins=5 };
        int leftMarginWidth;    ///< Spacing margin on left of text
        int rightMarginWidth;   ///< Spacing margin on left of text
        bool symbolMargin;
@@ -85,6 +86,7 @@ public:
        ColourPair caretcolour;
        bool showCaretLineBackground;
        ColourPair caretLineBackground;
+       int caretLineAlpha;
        ColourPair edgecolour;
        int edgeState;
        int caretWidth;
index f42348d4bf47972a51ef777770942176e5eb4295..108dc0288c320e2a4967c8a89019c731602b6810 100644 (file)
@@ -535,6 +535,11 @@ void wxStyledTextCtrl::MarkerAddSet(int line, int set) {
     SendMsg(2466, line, set);
 }
 
+// Set the alpha used for a marker that is drawn in the text area, not the margin.
+void wxStyledTextCtrl::MarkerSetAlpha(int markerNumber, int alpha) {
+    SendMsg(2476, markerNumber, alpha);
+}
+
 // Set a margin to be either numeric or symbolic.
 void wxStyledTextCtrl::SetMarginType(int margin, int marginType) {
     SendMsg(2240, margin, marginType);
@@ -645,6 +650,16 @@ void wxStyledTextCtrl::SetSelBackground(bool useSetting, const wxColour& back) {
     SendMsg(2068, useSetting, wxColourAsLong(back));
 }
 
+// Get the alpha of the selection.
+int wxStyledTextCtrl::GetSelAlpha() {
+    return SendMsg(2477, 0, 0);
+}
+
+// Set the alpha of the selection.
+void wxStyledTextCtrl::SetSelAlpha(int alpha) {
+    SendMsg(2478, alpha, 0);
+}
+
 // Set the foreground colour of the caret.
 void wxStyledTextCtrl::SetCaretForeground(const wxColour& fore) {
     SendMsg(2069, wxColourAsLong(fore), 0);
@@ -1445,6 +1460,11 @@ void wxStyledTextCtrl::CallTipSetForegroundHighlight(const wxColour& fore) {
     SendMsg(2207, wxColourAsLong(fore), 0);
 }
 
+// Enable use of STYLE_CALLTIP and set call tip tab size in pixels.
+void wxStyledTextCtrl::CallTipUseStyle(int tabSize) {
+    SendMsg(2212, tabSize, 0);
+}
+
 // Find the display line of a document line taking hidden lines into account.
 int wxStyledTextCtrl::VisibleFromDocLine(int line) {
     return SendMsg(2220, line, 0);
@@ -2481,6 +2501,16 @@ void wxStyledTextCtrl::SelectionDuplicate() {
     SendMsg(2469, 0, 0);
 }
 
+// Set background alpha of the caret line.
+void wxStyledTextCtrl::SetCaretLineBackAlpha(int alpha) {
+    SendMsg(2470, alpha, 0);
+}
+
+// Get the background alpha of the caret line.
+int wxStyledTextCtrl::GetCaretLineBackAlpha() {
+    return SendMsg(2471, 0, 0);
+}
+
 // Start notifying the container of all key presses and commands.
 void wxStyledTextCtrl::StartRecord() {
     SendMsg(3001, 0, 0);
index 99bcff3e64474192f3b144bd085099f58f4ab2bd..a7686c21a8c8e11baf883a8fb46db669af48e3ea 100644 (file)
@@ -155,6 +155,9 @@ DocStr(wxStyledTextCtrl::MarkerDefineBitmap,
 DocStr(wxStyledTextCtrl::MarkerAddSet,
 "Add a set of markers to a line.", "");
 
+DocStr(wxStyledTextCtrl::MarkerSetAlpha,
+"Set the alpha used for a marker that is drawn in the text area, not the margin.", "");
+
 DocStr(wxStyledTextCtrl::SetMarginType,
 "Set a margin to be either numeric or symbolic.", "");
 
@@ -221,6 +224,12 @@ DocStr(wxStyledTextCtrl::SetSelForeground,
 DocStr(wxStyledTextCtrl::SetSelBackground,
 "Set the background colour of the selection and whether to use this setting.", "");
 
+DocStr(wxStyledTextCtrl::GetSelAlpha,
+"Get the alpha of the selection.", "");
+
+DocStr(wxStyledTextCtrl::SetSelAlpha,
+"Set the alpha of the selection.", "");
+
 DocStr(wxStyledTextCtrl::SetCaretForeground,
 "Set the foreground colour of the caret.", "");
 
@@ -654,6 +663,9 @@ DocStr(wxStyledTextCtrl::CallTipSetForeground,
 DocStr(wxStyledTextCtrl::CallTipSetForegroundHighlight,
 "Set the foreground colour for the highlighted part of the call tip.", "");
 
+DocStr(wxStyledTextCtrl::CallTipUseStyle,
+"Enable use of STYLE_CALLTIP and set call tip tab size in pixels.", "");
+
 DocStr(wxStyledTextCtrl::VisibleFromDocLine,
 "Find the display line of a document line taking hidden lines into account.", "");
 
@@ -1302,6 +1314,12 @@ DocStr(wxStyledTextCtrl::GetPasteConvertEndings,
 DocStr(wxStyledTextCtrl::SelectionDuplicate,
 "Duplicate the selection. If selection empty duplicate the line containing the caret.", "");
 
+DocStr(wxStyledTextCtrl::SetCaretLineBackAlpha,
+"Set background alpha of the caret line.", "");
+
+DocStr(wxStyledTextCtrl::GetCaretLineBackAlpha,
+"Get the background alpha of the caret line.", "");
+
 DocStr(wxStyledTextCtrl::StartRecord,
 "Start notifying the container of all key presses and commands.", "");
 
index d056255450ff13e292d0cb22fd49cd7f5bf519a6..47135629a62a3ba8f89121b955af37a25b0aafd7 100644 (file)
@@ -3,6 +3,7 @@ Recent Changes for wxPython
 
 2.7.0.0
 -------
+*
 
 The following deprecated items have been removed:
 
@@ -175,10 +176,48 @@ Added wrappers for the wxAUI classes, in the wx.aui module.
 Added the PseudoDC class from Paul Lanier.  It provides a way to
 record operations on a DC and then play them back later.
 
+Upgraded to Scintilla 1.70 for wx.stc.StyledTextCtrl.
 
 
 
 
+2.6.3.3
+-------
+* 15-July-2006
+
+wx.lib.pubsub updates from Oliver Schoenborn:
+    - fixed the hash problem with non-hashable objects
+    - now supports listeners that use \*args as an argument
+      (listener(\*args) was not passing the validity test)
+    - corrected some mistakes in documentation
+    - added some clarifications (hopefully useful for first time
+      users)
+    - changed the way singleton is implemented since old way prevented
+      pydoc etc from extracting docs for Publisher
+
+DocView and ActiveGrid IDE updates from Morgan Hua:
+    New Features: In Tab-View mode, Ctrl-number will take the user to
+    the numbered tab view.  Modified files now show an '*' astrisk in
+    the view title.  Debugger framework can now support PHP debugging.
+    Not important for python development, but at least that means the
+    debugger framework is more generalized.
+
+wx.lib.mixins.listctrl.TextEditMixin: Fixed the double END_LABEL_EDIT
+event problem in TextEditMixin by checking if the editor was already
+hidden before continuing with the CloseEditor method.  Also added code
+to OpenEditor to send the BEGIN_LABEL_EDIT event and to not allow the
+opening of the editor to continue if the event handler doesn't allow
+it.
+
+Undeprecated wx.GetNumberFromUser and added wx.NumberEntryDialog.
+
+Made necessaary changes for building wxPython for Python 2.5.  There
+may still be some issues related to the new Py_ssize_t type and 64-bit
+machines, but at least all compile errors and warnings related to it
+have been resolved.
+
+
+
 
 2.6.3.2
 -------