Update Scintilla from 3.4.4 to 3.5.2
This commit is contained in:
parent
7ebb51a895
commit
43057d1c43
20
Makefile.in
20
Makefile.in
@ -236,6 +236,7 @@ WXSCINTILLA_OBJECTS = \
|
||||
wxscintilla_LexBaan.o \
|
||||
wxscintilla_LexBash.o \
|
||||
wxscintilla_LexBasic.o \
|
||||
wxscintilla_LexBibTeX.o \
|
||||
wxscintilla_LexBullant.o \
|
||||
wxscintilla_LexCaml.o \
|
||||
wxscintilla_LexCLW.o \
|
||||
@ -295,6 +296,7 @@ WXSCINTILLA_OBJECTS = \
|
||||
wxscintilla_LexPython.o \
|
||||
wxscintilla_LexR.o \
|
||||
wxscintilla_LexRebol.o \
|
||||
wxscintilla_LexRegistry.o \
|
||||
wxscintilla_LexRuby.o \
|
||||
wxscintilla_LexRust.o \
|
||||
wxscintilla_LexScriptol.o \
|
||||
@ -337,11 +339,14 @@ WXSCINTILLA_OBJECTS = \
|
||||
wxscintilla_ContractionState.o \
|
||||
wxscintilla_Decoration.o \
|
||||
wxscintilla_Document.o \
|
||||
wxscintilla_EditModel.o \
|
||||
wxscintilla_EditView.o \
|
||||
wxscintilla_Editor.o \
|
||||
wxscintilla_ExternalLexer.o \
|
||||
wxscintilla_Indicator.o \
|
||||
wxscintilla_KeyMap.o \
|
||||
wxscintilla_LineMarker.o \
|
||||
wxscintilla_MarginView.o \
|
||||
wxscintilla_PerLine.o \
|
||||
wxscintilla_PositionCache.o \
|
||||
wxscintilla_RESearch.o \
|
||||
@ -17060,6 +17065,9 @@ wxscintilla_LexBash.o: $(srcdir)/src/stc/scintilla/lexers/LexBash.cxx
|
||||
wxscintilla_LexBasic.o: $(srcdir)/src/stc/scintilla/lexers/LexBasic.cxx
|
||||
$(CXXC) -c -o $@ $(WXSCINTILLA_CXXFLAGS) $(srcdir)/src/stc/scintilla/lexers/LexBasic.cxx
|
||||
|
||||
wxscintilla_LexBibTeX.o: $(srcdir)/src/stc/scintilla/lexers/LexBibTeX.cxx
|
||||
$(CXXC) -c -o $@ $(WXSCINTILLA_CXXFLAGS) $(srcdir)/src/stc/scintilla/lexers/LexBibTeX.cxx
|
||||
|
||||
wxscintilla_LexBullant.o: $(srcdir)/src/stc/scintilla/lexers/LexBullant.cxx
|
||||
$(CXXC) -c -o $@ $(WXSCINTILLA_CXXFLAGS) $(srcdir)/src/stc/scintilla/lexers/LexBullant.cxx
|
||||
|
||||
@ -17237,6 +17245,9 @@ wxscintilla_LexR.o: $(srcdir)/src/stc/scintilla/lexers/LexR.cxx
|
||||
wxscintilla_LexRebol.o: $(srcdir)/src/stc/scintilla/lexers/LexRebol.cxx
|
||||
$(CXXC) -c -o $@ $(WXSCINTILLA_CXXFLAGS) $(srcdir)/src/stc/scintilla/lexers/LexRebol.cxx
|
||||
|
||||
wxscintilla_LexRegistry.o: $(srcdir)/src/stc/scintilla/lexers/LexRegistry.cxx
|
||||
$(CXXC) -c -o $@ $(WXSCINTILLA_CXXFLAGS) $(srcdir)/src/stc/scintilla/lexers/LexRegistry.cxx
|
||||
|
||||
wxscintilla_LexRuby.o: $(srcdir)/src/stc/scintilla/lexers/LexRuby.cxx
|
||||
$(CXXC) -c -o $@ $(WXSCINTILLA_CXXFLAGS) $(srcdir)/src/stc/scintilla/lexers/LexRuby.cxx
|
||||
|
||||
@ -17363,6 +17374,12 @@ wxscintilla_Decoration.o: $(srcdir)/src/stc/scintilla/src/Decoration.cxx
|
||||
wxscintilla_Document.o: $(srcdir)/src/stc/scintilla/src/Document.cxx
|
||||
$(CXXC) -c -o $@ $(WXSCINTILLA_CXXFLAGS) $(srcdir)/src/stc/scintilla/src/Document.cxx
|
||||
|
||||
wxscintilla_EditModel.o: $(srcdir)/src/stc/scintilla/src/EditModel.cxx
|
||||
$(CXXC) -c -o $@ $(WXSCINTILLA_CXXFLAGS) $(srcdir)/src/stc/scintilla/src/EditModel.cxx
|
||||
|
||||
wxscintilla_EditView.o: $(srcdir)/src/stc/scintilla/src/EditView.cxx
|
||||
$(CXXC) -c -o $@ $(WXSCINTILLA_CXXFLAGS) $(srcdir)/src/stc/scintilla/src/EditView.cxx
|
||||
|
||||
wxscintilla_Editor.o: $(srcdir)/src/stc/scintilla/src/Editor.cxx
|
||||
$(CXXC) -c -o $@ $(WXSCINTILLA_CXXFLAGS) $(srcdir)/src/stc/scintilla/src/Editor.cxx
|
||||
|
||||
@ -17378,6 +17395,9 @@ wxscintilla_KeyMap.o: $(srcdir)/src/stc/scintilla/src/KeyMap.cxx
|
||||
wxscintilla_LineMarker.o: $(srcdir)/src/stc/scintilla/src/LineMarker.cxx
|
||||
$(CXXC) -c -o $@ $(WXSCINTILLA_CXXFLAGS) $(srcdir)/src/stc/scintilla/src/LineMarker.cxx
|
||||
|
||||
wxscintilla_MarginView.o: $(srcdir)/src/stc/scintilla/src/MarginView.cxx
|
||||
$(CXXC) -c -o $@ $(WXSCINTILLA_CXXFLAGS) $(srcdir)/src/stc/scintilla/src/MarginView.cxx
|
||||
|
||||
wxscintilla_PerLine.o: $(srcdir)/src/stc/scintilla/src/PerLine.cxx
|
||||
$(CXXC) -c -o $@ $(WXSCINTILLA_CXXFLAGS) $(srcdir)/src/stc/scintilla/src/PerLine.cxx
|
||||
|
||||
|
@ -69,6 +69,7 @@
|
||||
src/stc/scintilla/lexers/LexBaan.cxx
|
||||
src/stc/scintilla/lexers/LexBash.cxx
|
||||
src/stc/scintilla/lexers/LexBasic.cxx
|
||||
src/stc/scintilla/lexers/LexBibTeX.cxx
|
||||
src/stc/scintilla/lexers/LexBullant.cxx
|
||||
src/stc/scintilla/lexers/LexCaml.cxx
|
||||
src/stc/scintilla/lexers/LexCLW.cxx
|
||||
@ -128,6 +129,7 @@
|
||||
src/stc/scintilla/lexers/LexPython.cxx
|
||||
src/stc/scintilla/lexers/LexR.cxx
|
||||
src/stc/scintilla/lexers/LexRebol.cxx
|
||||
src/stc/scintilla/lexers/LexRegistry.cxx
|
||||
src/stc/scintilla/lexers/LexRuby.cxx
|
||||
src/stc/scintilla/lexers/LexRust.cxx
|
||||
src/stc/scintilla/lexers/LexScriptol.cxx
|
||||
@ -170,11 +172,14 @@
|
||||
src/stc/scintilla/src/ContractionState.cxx
|
||||
src/stc/scintilla/src/Decoration.cxx
|
||||
src/stc/scintilla/src/Document.cxx
|
||||
src/stc/scintilla/src/EditModel.cxx
|
||||
src/stc/scintilla/src/EditView.cxx
|
||||
src/stc/scintilla/src/Editor.cxx
|
||||
src/stc/scintilla/src/ExternalLexer.cxx
|
||||
src/stc/scintilla/src/Indicator.cxx
|
||||
src/stc/scintilla/src/KeyMap.cxx
|
||||
src/stc/scintilla/src/LineMarker.cxx
|
||||
src/stc/scintilla/src/MarginView.cxx
|
||||
src/stc/scintilla/src/PerLine.cxx
|
||||
src/stc/scintilla/src/PositionCache.cxx
|
||||
src/stc/scintilla/src/RESearch.cxx
|
||||
|
@ -217,6 +217,7 @@ WXSCINTILLA_OBJECTS = \
|
||||
$(OBJS)\wxscintilla_LexBaan.obj \
|
||||
$(OBJS)\wxscintilla_LexBash.obj \
|
||||
$(OBJS)\wxscintilla_LexBasic.obj \
|
||||
$(OBJS)\wxscintilla_LexBibTeX.obj \
|
||||
$(OBJS)\wxscintilla_LexBullant.obj \
|
||||
$(OBJS)\wxscintilla_LexCaml.obj \
|
||||
$(OBJS)\wxscintilla_LexCLW.obj \
|
||||
@ -276,6 +277,7 @@ WXSCINTILLA_OBJECTS = \
|
||||
$(OBJS)\wxscintilla_LexPython.obj \
|
||||
$(OBJS)\wxscintilla_LexR.obj \
|
||||
$(OBJS)\wxscintilla_LexRebol.obj \
|
||||
$(OBJS)\wxscintilla_LexRegistry.obj \
|
||||
$(OBJS)\wxscintilla_LexRuby.obj \
|
||||
$(OBJS)\wxscintilla_LexRust.obj \
|
||||
$(OBJS)\wxscintilla_LexScriptol.obj \
|
||||
@ -318,11 +320,14 @@ WXSCINTILLA_OBJECTS = \
|
||||
$(OBJS)\wxscintilla_ContractionState.obj \
|
||||
$(OBJS)\wxscintilla_Decoration.obj \
|
||||
$(OBJS)\wxscintilla_Document.obj \
|
||||
$(OBJS)\wxscintilla_EditModel.obj \
|
||||
$(OBJS)\wxscintilla_EditView.obj \
|
||||
$(OBJS)\wxscintilla_Editor.obj \
|
||||
$(OBJS)\wxscintilla_ExternalLexer.obj \
|
||||
$(OBJS)\wxscintilla_Indicator.obj \
|
||||
$(OBJS)\wxscintilla_KeyMap.obj \
|
||||
$(OBJS)\wxscintilla_LineMarker.obj \
|
||||
$(OBJS)\wxscintilla_MarginView.obj \
|
||||
$(OBJS)\wxscintilla_PerLine.obj \
|
||||
$(OBJS)\wxscintilla_PositionCache.obj \
|
||||
$(OBJS)\wxscintilla_RESearch.obj \
|
||||
@ -5942,6 +5947,9 @@ $(OBJS)\wxscintilla_LexBash.obj: ..\..\src\stc\scintilla\lexers\LexBash.cxx
|
||||
$(OBJS)\wxscintilla_LexBasic.obj: ..\..\src\stc\scintilla\lexers\LexBasic.cxx
|
||||
$(CXX) -q -c -P -o$@ $(WXSCINTILLA_CXXFLAGS) ..\..\src\stc\scintilla\lexers\LexBasic.cxx
|
||||
|
||||
$(OBJS)\wxscintilla_LexBibTeX.obj: ..\..\src\stc\scintilla\lexers\LexBibTeX.cxx
|
||||
$(CXX) -q -c -P -o$@ $(WXSCINTILLA_CXXFLAGS) ..\..\src\stc\scintilla\lexers\LexBibTeX.cxx
|
||||
|
||||
$(OBJS)\wxscintilla_LexBullant.obj: ..\..\src\stc\scintilla\lexers\LexBullant.cxx
|
||||
$(CXX) -q -c -P -o$@ $(WXSCINTILLA_CXXFLAGS) ..\..\src\stc\scintilla\lexers\LexBullant.cxx
|
||||
|
||||
@ -6119,6 +6127,9 @@ $(OBJS)\wxscintilla_LexR.obj: ..\..\src\stc\scintilla\lexers\LexR.cxx
|
||||
$(OBJS)\wxscintilla_LexRebol.obj: ..\..\src\stc\scintilla\lexers\LexRebol.cxx
|
||||
$(CXX) -q -c -P -o$@ $(WXSCINTILLA_CXXFLAGS) ..\..\src\stc\scintilla\lexers\LexRebol.cxx
|
||||
|
||||
$(OBJS)\wxscintilla_LexRegistry.obj: ..\..\src\stc\scintilla\lexers\LexRegistry.cxx
|
||||
$(CXX) -q -c -P -o$@ $(WXSCINTILLA_CXXFLAGS) ..\..\src\stc\scintilla\lexers\LexRegistry.cxx
|
||||
|
||||
$(OBJS)\wxscintilla_LexRuby.obj: ..\..\src\stc\scintilla\lexers\LexRuby.cxx
|
||||
$(CXX) -q -c -P -o$@ $(WXSCINTILLA_CXXFLAGS) ..\..\src\stc\scintilla\lexers\LexRuby.cxx
|
||||
|
||||
@ -6245,6 +6256,12 @@ $(OBJS)\wxscintilla_Decoration.obj: ..\..\src\stc\scintilla\src\Decoration.cxx
|
||||
$(OBJS)\wxscintilla_Document.obj: ..\..\src\stc\scintilla\src\Document.cxx
|
||||
$(CXX) -q -c -P -o$@ $(WXSCINTILLA_CXXFLAGS) ..\..\src\stc\scintilla\src\Document.cxx
|
||||
|
||||
$(OBJS)\wxscintilla_EditModel.obj: ..\..\src\stc\scintilla\src\EditModel.cxx
|
||||
$(CXX) -q -c -P -o$@ $(WXSCINTILLA_CXXFLAGS) ..\..\src\stc\scintilla\src\EditModel.cxx
|
||||
|
||||
$(OBJS)\wxscintilla_EditView.obj: ..\..\src\stc\scintilla\src\EditView.cxx
|
||||
$(CXX) -q -c -P -o$@ $(WXSCINTILLA_CXXFLAGS) ..\..\src\stc\scintilla\src\EditView.cxx
|
||||
|
||||
$(OBJS)\wxscintilla_Editor.obj: ..\..\src\stc\scintilla\src\Editor.cxx
|
||||
$(CXX) -q -c -P -o$@ $(WXSCINTILLA_CXXFLAGS) ..\..\src\stc\scintilla\src\Editor.cxx
|
||||
|
||||
@ -6260,6 +6277,9 @@ $(OBJS)\wxscintilla_KeyMap.obj: ..\..\src\stc\scintilla\src\KeyMap.cxx
|
||||
$(OBJS)\wxscintilla_LineMarker.obj: ..\..\src\stc\scintilla\src\LineMarker.cxx
|
||||
$(CXX) -q -c -P -o$@ $(WXSCINTILLA_CXXFLAGS) ..\..\src\stc\scintilla\src\LineMarker.cxx
|
||||
|
||||
$(OBJS)\wxscintilla_MarginView.obj: ..\..\src\stc\scintilla\src\MarginView.cxx
|
||||
$(CXX) -q -c -P -o$@ $(WXSCINTILLA_CXXFLAGS) ..\..\src\stc\scintilla\src\MarginView.cxx
|
||||
|
||||
$(OBJS)\wxscintilla_PerLine.obj: ..\..\src\stc\scintilla\src\PerLine.cxx
|
||||
$(CXX) -q -c -P -o$@ $(WXSCINTILLA_CXXFLAGS) ..\..\src\stc\scintilla\src\PerLine.cxx
|
||||
|
||||
|
@ -205,6 +205,7 @@ WXSCINTILLA_OBJECTS = \
|
||||
$(OBJS)\wxscintilla_LexBaan.o \
|
||||
$(OBJS)\wxscintilla_LexBash.o \
|
||||
$(OBJS)\wxscintilla_LexBasic.o \
|
||||
$(OBJS)\wxscintilla_LexBibTeX.o \
|
||||
$(OBJS)\wxscintilla_LexBullant.o \
|
||||
$(OBJS)\wxscintilla_LexCaml.o \
|
||||
$(OBJS)\wxscintilla_LexCLW.o \
|
||||
@ -264,6 +265,7 @@ WXSCINTILLA_OBJECTS = \
|
||||
$(OBJS)\wxscintilla_LexPython.o \
|
||||
$(OBJS)\wxscintilla_LexR.o \
|
||||
$(OBJS)\wxscintilla_LexRebol.o \
|
||||
$(OBJS)\wxscintilla_LexRegistry.o \
|
||||
$(OBJS)\wxscintilla_LexRuby.o \
|
||||
$(OBJS)\wxscintilla_LexRust.o \
|
||||
$(OBJS)\wxscintilla_LexScriptol.o \
|
||||
@ -306,11 +308,14 @@ WXSCINTILLA_OBJECTS = \
|
||||
$(OBJS)\wxscintilla_ContractionState.o \
|
||||
$(OBJS)\wxscintilla_Decoration.o \
|
||||
$(OBJS)\wxscintilla_Document.o \
|
||||
$(OBJS)\wxscintilla_EditModel.o \
|
||||
$(OBJS)\wxscintilla_EditView.o \
|
||||
$(OBJS)\wxscintilla_Editor.o \
|
||||
$(OBJS)\wxscintilla_ExternalLexer.o \
|
||||
$(OBJS)\wxscintilla_Indicator.o \
|
||||
$(OBJS)\wxscintilla_KeyMap.o \
|
||||
$(OBJS)\wxscintilla_LineMarker.o \
|
||||
$(OBJS)\wxscintilla_MarginView.o \
|
||||
$(OBJS)\wxscintilla_PerLine.o \
|
||||
$(OBJS)\wxscintilla_PositionCache.o \
|
||||
$(OBJS)\wxscintilla_RESearch.o \
|
||||
@ -6117,6 +6122,9 @@ $(OBJS)\wxscintilla_LexBash.o: ../../src/stc/scintilla/lexers/LexBash.cxx
|
||||
$(OBJS)\wxscintilla_LexBasic.o: ../../src/stc/scintilla/lexers/LexBasic.cxx
|
||||
$(CXX) -c -o $@ $(WXSCINTILLA_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
$(OBJS)\wxscintilla_LexBibTeX.o: ../../src/stc/scintilla/lexers/LexBibTeX.cxx
|
||||
$(CXX) -c -o $@ $(WXSCINTILLA_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
$(OBJS)\wxscintilla_LexBullant.o: ../../src/stc/scintilla/lexers/LexBullant.cxx
|
||||
$(CXX) -c -o $@ $(WXSCINTILLA_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
@ -6294,6 +6302,9 @@ $(OBJS)\wxscintilla_LexR.o: ../../src/stc/scintilla/lexers/LexR.cxx
|
||||
$(OBJS)\wxscintilla_LexRebol.o: ../../src/stc/scintilla/lexers/LexRebol.cxx
|
||||
$(CXX) -c -o $@ $(WXSCINTILLA_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
$(OBJS)\wxscintilla_LexRegistry.o: ../../src/stc/scintilla/lexers/LexRegistry.cxx
|
||||
$(CXX) -c -o $@ $(WXSCINTILLA_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
$(OBJS)\wxscintilla_LexRuby.o: ../../src/stc/scintilla/lexers/LexRuby.cxx
|
||||
$(CXX) -c -o $@ $(WXSCINTILLA_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
@ -6420,6 +6431,12 @@ $(OBJS)\wxscintilla_Decoration.o: ../../src/stc/scintilla/src/Decoration.cxx
|
||||
$(OBJS)\wxscintilla_Document.o: ../../src/stc/scintilla/src/Document.cxx
|
||||
$(CXX) -c -o $@ $(WXSCINTILLA_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
$(OBJS)\wxscintilla_EditModel.o: ../../src/stc/scintilla/src/EditModel.cxx
|
||||
$(CXX) -c -o $@ $(WXSCINTILLA_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
$(OBJS)\wxscintilla_EditView.o: ../../src/stc/scintilla/src/EditView.cxx
|
||||
$(CXX) -c -o $@ $(WXSCINTILLA_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
$(OBJS)\wxscintilla_Editor.o: ../../src/stc/scintilla/src/Editor.cxx
|
||||
$(CXX) -c -o $@ $(WXSCINTILLA_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
@ -6435,6 +6452,9 @@ $(OBJS)\wxscintilla_KeyMap.o: ../../src/stc/scintilla/src/KeyMap.cxx
|
||||
$(OBJS)\wxscintilla_LineMarker.o: ../../src/stc/scintilla/src/LineMarker.cxx
|
||||
$(CXX) -c -o $@ $(WXSCINTILLA_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
$(OBJS)\wxscintilla_MarginView.o: ../../src/stc/scintilla/src/MarginView.cxx
|
||||
$(CXX) -c -o $@ $(WXSCINTILLA_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
$(OBJS)\wxscintilla_PerLine.o: ../../src/stc/scintilla/src/PerLine.cxx
|
||||
$(CXX) -c -o $@ $(WXSCINTILLA_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
|
@ -228,6 +228,7 @@ WXSCINTILLA_OBJECTS = \
|
||||
$(OBJS)\wxscintilla_LexBaan.obj \
|
||||
$(OBJS)\wxscintilla_LexBash.obj \
|
||||
$(OBJS)\wxscintilla_LexBasic.obj \
|
||||
$(OBJS)\wxscintilla_LexBibTeX.obj \
|
||||
$(OBJS)\wxscintilla_LexBullant.obj \
|
||||
$(OBJS)\wxscintilla_LexCaml.obj \
|
||||
$(OBJS)\wxscintilla_LexCLW.obj \
|
||||
@ -287,6 +288,7 @@ WXSCINTILLA_OBJECTS = \
|
||||
$(OBJS)\wxscintilla_LexPython.obj \
|
||||
$(OBJS)\wxscintilla_LexR.obj \
|
||||
$(OBJS)\wxscintilla_LexRebol.obj \
|
||||
$(OBJS)\wxscintilla_LexRegistry.obj \
|
||||
$(OBJS)\wxscintilla_LexRuby.obj \
|
||||
$(OBJS)\wxscintilla_LexRust.obj \
|
||||
$(OBJS)\wxscintilla_LexScriptol.obj \
|
||||
@ -329,11 +331,14 @@ WXSCINTILLA_OBJECTS = \
|
||||
$(OBJS)\wxscintilla_ContractionState.obj \
|
||||
$(OBJS)\wxscintilla_Decoration.obj \
|
||||
$(OBJS)\wxscintilla_Document.obj \
|
||||
$(OBJS)\wxscintilla_EditModel.obj \
|
||||
$(OBJS)\wxscintilla_EditView.obj \
|
||||
$(OBJS)\wxscintilla_Editor.obj \
|
||||
$(OBJS)\wxscintilla_ExternalLexer.obj \
|
||||
$(OBJS)\wxscintilla_Indicator.obj \
|
||||
$(OBJS)\wxscintilla_KeyMap.obj \
|
||||
$(OBJS)\wxscintilla_LineMarker.obj \
|
||||
$(OBJS)\wxscintilla_MarginView.obj \
|
||||
$(OBJS)\wxscintilla_PerLine.obj \
|
||||
$(OBJS)\wxscintilla_PositionCache.obj \
|
||||
$(OBJS)\wxscintilla_RESearch.obj \
|
||||
@ -6634,6 +6639,9 @@ $(OBJS)\wxscintilla_LexBash.obj: ..\..\src\stc\scintilla\lexers\LexBash.cxx
|
||||
$(OBJS)\wxscintilla_LexBasic.obj: ..\..\src\stc\scintilla\lexers\LexBasic.cxx
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(WXSCINTILLA_CXXFLAGS) ..\..\src\stc\scintilla\lexers\LexBasic.cxx
|
||||
|
||||
$(OBJS)\wxscintilla_LexBibTeX.obj: ..\..\src\stc\scintilla\lexers\LexBibTeX.cxx
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(WXSCINTILLA_CXXFLAGS) ..\..\src\stc\scintilla\lexers\LexBibTeX.cxx
|
||||
|
||||
$(OBJS)\wxscintilla_LexBullant.obj: ..\..\src\stc\scintilla\lexers\LexBullant.cxx
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(WXSCINTILLA_CXXFLAGS) ..\..\src\stc\scintilla\lexers\LexBullant.cxx
|
||||
|
||||
@ -6811,6 +6819,9 @@ $(OBJS)\wxscintilla_LexR.obj: ..\..\src\stc\scintilla\lexers\LexR.cxx
|
||||
$(OBJS)\wxscintilla_LexRebol.obj: ..\..\src\stc\scintilla\lexers\LexRebol.cxx
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(WXSCINTILLA_CXXFLAGS) ..\..\src\stc\scintilla\lexers\LexRebol.cxx
|
||||
|
||||
$(OBJS)\wxscintilla_LexRegistry.obj: ..\..\src\stc\scintilla\lexers\LexRegistry.cxx
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(WXSCINTILLA_CXXFLAGS) ..\..\src\stc\scintilla\lexers\LexRegistry.cxx
|
||||
|
||||
$(OBJS)\wxscintilla_LexRuby.obj: ..\..\src\stc\scintilla\lexers\LexRuby.cxx
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(WXSCINTILLA_CXXFLAGS) ..\..\src\stc\scintilla\lexers\LexRuby.cxx
|
||||
|
||||
@ -6937,6 +6948,12 @@ $(OBJS)\wxscintilla_Decoration.obj: ..\..\src\stc\scintilla\src\Decoration.cxx
|
||||
$(OBJS)\wxscintilla_Document.obj: ..\..\src\stc\scintilla\src\Document.cxx
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(WXSCINTILLA_CXXFLAGS) ..\..\src\stc\scintilla\src\Document.cxx
|
||||
|
||||
$(OBJS)\wxscintilla_EditModel.obj: ..\..\src\stc\scintilla\src\EditModel.cxx
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(WXSCINTILLA_CXXFLAGS) ..\..\src\stc\scintilla\src\EditModel.cxx
|
||||
|
||||
$(OBJS)\wxscintilla_EditView.obj: ..\..\src\stc\scintilla\src\EditView.cxx
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(WXSCINTILLA_CXXFLAGS) ..\..\src\stc\scintilla\src\EditView.cxx
|
||||
|
||||
$(OBJS)\wxscintilla_Editor.obj: ..\..\src\stc\scintilla\src\Editor.cxx
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(WXSCINTILLA_CXXFLAGS) ..\..\src\stc\scintilla\src\Editor.cxx
|
||||
|
||||
@ -6952,6 +6969,9 @@ $(OBJS)\wxscintilla_KeyMap.obj: ..\..\src\stc\scintilla\src\KeyMap.cxx
|
||||
$(OBJS)\wxscintilla_LineMarker.obj: ..\..\src\stc\scintilla\src\LineMarker.cxx
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(WXSCINTILLA_CXXFLAGS) ..\..\src\stc\scintilla\src\LineMarker.cxx
|
||||
|
||||
$(OBJS)\wxscintilla_MarginView.obj: ..\..\src\stc\scintilla\src\MarginView.cxx
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(WXSCINTILLA_CXXFLAGS) ..\..\src\stc\scintilla\src\MarginView.cxx
|
||||
|
||||
$(OBJS)\wxscintilla_PerLine.obj: ..\..\src\stc\scintilla\src\PerLine.cxx
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(WXSCINTILLA_CXXFLAGS) ..\..\src\stc\scintilla\src\PerLine.cxx
|
||||
|
||||
|
@ -286,6 +286,12 @@
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\src\Document.cxx">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\src\EditModel.cxx">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\src\EditView.cxx">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\src\Editor.cxx">
|
||||
</File>
|
||||
@ -337,6 +343,9 @@
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\lexers\LexBasic.cxx">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\lexers\LexBibTeX.cxx">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\lexers\LexBullant.cxx">
|
||||
</File>
|
||||
@ -514,6 +523,9 @@
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\lexers\LexRebol.cxx">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\lexers\LexRegistry.cxx">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\lexers\LexRuby.cxx">
|
||||
</File>
|
||||
@ -595,6 +607,9 @@
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\src\LineMarker.cxx">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\src\MarginView.cxx">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\src\PerLine.cxx">
|
||||
</File>
|
||||
|
@ -730,6 +730,14 @@
|
||||
RelativePath="..\..\src\stc\scintilla\src\Document.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\src\EditModel.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\src\EditView.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\src\Editor.cxx"
|
||||
>
|
||||
@ -798,6 +806,10 @@
|
||||
RelativePath="..\..\src\stc\scintilla\lexers\LexBasic.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\lexers\LexBibTeX.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\lexers\LexBullant.cxx"
|
||||
>
|
||||
@ -1034,6 +1046,10 @@
|
||||
RelativePath="..\..\src\stc\scintilla\lexers\LexRebol.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\lexers\LexRegistry.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\lexers\LexRuby.cxx"
|
||||
>
|
||||
@ -1142,6 +1158,10 @@
|
||||
RelativePath="..\..\src\stc\scintilla\src\LineMarker.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\src\MarginView.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\src\PerLine.cxx"
|
||||
>
|
||||
|
@ -726,6 +726,14 @@
|
||||
RelativePath="..\..\src\stc\scintilla\src\Document.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\src\EditModel.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\src\EditView.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\src\Editor.cxx"
|
||||
>
|
||||
@ -794,6 +802,10 @@
|
||||
RelativePath="..\..\src\stc\scintilla\lexers\LexBasic.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\lexers\LexBibTeX.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\lexers\LexBullant.cxx"
|
||||
>
|
||||
@ -1030,6 +1042,10 @@
|
||||
RelativePath="..\..\src\stc\scintilla\lexers\LexRebol.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\lexers\LexRegistry.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\lexers\LexRuby.cxx"
|
||||
>
|
||||
@ -1138,6 +1154,10 @@
|
||||
RelativePath="..\..\src\stc\scintilla\src\LineMarker.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\src\MarginView.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\stc\scintilla\src\PerLine.cxx"
|
||||
>
|
||||
|
@ -75,6 +75,8 @@ class WXDLLIMPEXP_FWD_CORE wxScrollBar;
|
||||
/// The SC_CP_UTF8 value can be used to enter Unicode mode.
|
||||
/// This is the same value as CP_UTF8 in Windows
|
||||
#define wxSTC_CP_UTF8 65001
|
||||
#define wxSTC_IME_WINDOWED 0
|
||||
#define wxSTC_IME_INLINE 1
|
||||
#define wxSTC_MARKER_MAX 31
|
||||
#define wxSTC_MARK_CIRCLE 0
|
||||
#define wxSTC_MARK_ROUNDRECT 1
|
||||
@ -190,7 +192,9 @@ class WXDLLIMPEXP_FWD_CORE wxScrollBar;
|
||||
#define wxSTC_INDIC_DOTBOX 12
|
||||
#define wxSTC_INDIC_SQUIGGLEPIXMAP 13
|
||||
#define wxSTC_INDIC_COMPOSITIONTHICK 14
|
||||
#define wxSTC_INDIC_MAX 31
|
||||
#define wxSTC_INDIC_IME 32
|
||||
#define wxSTC_INDIC_IME_MAX 35
|
||||
#define wxSTC_INDIC_MAX 35
|
||||
#define wxSTC_INDIC_CONTAINER 8
|
||||
#define wxSTC_INDIC0_MASK 0x20
|
||||
#define wxSTC_INDIC1_MASK 0x40
|
||||
@ -220,6 +224,7 @@ class WXDLLIMPEXP_FWD_CORE wxScrollBar;
|
||||
#define wxSTC_FIND_WORDSTART 0x00100000
|
||||
#define wxSTC_FIND_REGEXP 0x00200000
|
||||
#define wxSTC_FIND_POSIX 0x00400000
|
||||
#define wxSTC_FIND_CXX11REGEX 0x00800000
|
||||
#define wxSTC_FOLDLEVELBASE 0x400
|
||||
#define wxSTC_FOLDLEVELWHITEFLAG 0x1000
|
||||
#define wxSTC_FOLDLEVELHEADERFLAG 0x2000
|
||||
@ -255,6 +260,9 @@ class WXDLLIMPEXP_FWD_CORE wxScrollBar;
|
||||
#define wxSTC_CACHE_CARET 1
|
||||
#define wxSTC_CACHE_PAGE 2
|
||||
#define wxSTC_CACHE_DOCUMENT 3
|
||||
#define wxSTC_PHASES_ONE 0
|
||||
#define wxSTC_PHASES_TWO 1
|
||||
#define wxSTC_PHASES_MULTIPLE 2
|
||||
|
||||
/// Control font anti-aliasing.
|
||||
#define wxSTC_EFF_QUALITY_MASK 0xF
|
||||
@ -270,6 +278,8 @@ class WXDLLIMPEXP_FWD_CORE wxScrollBar;
|
||||
#define wxSTC_STATUS_OK 0
|
||||
#define wxSTC_STATUS_FAILURE 1
|
||||
#define wxSTC_STATUS_BADALLOC 2
|
||||
#define wxSTC_STATUS_WARN_START 1000
|
||||
#define wxSTC_STATUS_WARN_REGEX 1001
|
||||
#define wxSTC_CURSORNORMAL -1
|
||||
#define wxSTC_CURSORARROW 2
|
||||
#define wxSTC_CURSORWAIT 4
|
||||
@ -329,12 +339,15 @@ class WXDLLIMPEXP_FWD_CORE wxScrollBar;
|
||||
#define wxSTC_ANNOTATION_HIDDEN 0
|
||||
#define wxSTC_ANNOTATION_STANDARD 1
|
||||
#define wxSTC_ANNOTATION_BOXED 2
|
||||
#define wxSTC_ANNOTATION_INDENTED 3
|
||||
#define wxSTC_UNDO_MAY_COALESCE 1
|
||||
#define wxSTC_SCVS_NONE 0
|
||||
#define wxSTC_SCVS_RECTANGULARSELECTION 1
|
||||
#define wxSTC_SCVS_USERACCESSIBLE 2
|
||||
#define wxSTC_TECHNOLOGY_DEFAULT 0
|
||||
#define wxSTC_TECHNOLOGY_DIRECTWRITE 1
|
||||
#define wxSTC_TECHNOLOGY_DIRECTWRITERETAIN 2
|
||||
#define wxSTC_TECHNOLOGY_DIRECTWRITEDC 3
|
||||
|
||||
/// Line end types which may be used in addition to LF, CR, and CRLF
|
||||
/// SC_LINE_END_TYPE_UNICODE includes U+2028 Line Separator,
|
||||
@ -373,7 +386,8 @@ class WXDLLIMPEXP_FWD_CORE wxScrollBar;
|
||||
#define wxSTC_MOD_CONTAINER 0x40000
|
||||
#define wxSTC_MOD_LEXERSTATE 0x80000
|
||||
#define wxSTC_MOD_INSERTCHECK 0x100000
|
||||
#define wxSTC_MODEVENTMASKALL 0x1FFFFF
|
||||
#define wxSTC_MOD_CHANGETABSTOPS 0x200000
|
||||
#define wxSTC_MODEVENTMASKALL 0x3FFFFF
|
||||
#define wxSTC_UPDATE_CONTENT 0x1
|
||||
#define wxSTC_UPDATE_SELECTION 0x2
|
||||
#define wxSTC_UPDATE_V_SCROLL 0x4
|
||||
@ -523,6 +537,8 @@ class WXDLLIMPEXP_FWD_CORE wxScrollBar;
|
||||
#define wxSTC_LEX_DMAP 112
|
||||
#define wxSTC_LEX_AS 113
|
||||
#define wxSTC_LEX_DMIS 114
|
||||
#define wxSTC_LEX_REGISTRY 115
|
||||
#define wxSTC_LEX_BIBTEX 116
|
||||
|
||||
/// When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
|
||||
/// value assigned in sequence from SCLEX_AUTOMATIC+1.
|
||||
@ -1418,6 +1434,7 @@ class WXDLLIMPEXP_FWD_CORE wxScrollBar;
|
||||
#define wxSTC_KIX_KEYWORD 7
|
||||
#define wxSTC_KIX_FUNCTIONS 8
|
||||
#define wxSTC_KIX_OPERATOR 9
|
||||
#define wxSTC_KIX_COMMENTSTREAM 10
|
||||
#define wxSTC_KIX_IDENTIFIER 31
|
||||
|
||||
/// Lexical states for SCLEX_GUI4CLI
|
||||
@ -1528,6 +1545,7 @@ class WXDLLIMPEXP_FWD_CORE wxScrollBar;
|
||||
#define wxSTC_VHDL_STDPACKAGE 12
|
||||
#define wxSTC_VHDL_STDTYPE 13
|
||||
#define wxSTC_VHDL_USERWORD 14
|
||||
#define wxSTC_VHDL_BLOCK_COMMENT 15
|
||||
|
||||
/// Lexical states for SCLEX_CAML
|
||||
#define wxSTC_CAML_DEFAULT 0
|
||||
@ -1649,6 +1667,7 @@ class WXDLLIMPEXP_FWD_CORE wxScrollBar;
|
||||
#define wxSTC_SQL_USER3 21
|
||||
#define wxSTC_SQL_USER4 22
|
||||
#define wxSTC_SQL_QUOTEDIDENTIFIER 23
|
||||
#define wxSTC_SQL_QOPERATOR 24
|
||||
|
||||
/// Lexical states for SCLEX_SMALLTALK
|
||||
#define wxSTC_ST_DEFAULT 0
|
||||
@ -2294,6 +2313,9 @@ class WXDLLIMPEXP_FWD_CORE wxScrollBar;
|
||||
#define wxSTC_RUST_LIFETIME 18
|
||||
#define wxSTC_RUST_MACRO 19
|
||||
#define wxSTC_RUST_LEXERROR 20
|
||||
#define wxSTC_RUST_BYTESTRING 21
|
||||
#define wxSTC_RUST_BYTESTRINGR 22
|
||||
#define wxSTC_RUST_BYTECHARACTER 23
|
||||
|
||||
/// Lexical states for SCLEX_DMAP
|
||||
#define wxSTC_DMAP_DEFAULT 0
|
||||
@ -2320,6 +2342,30 @@ class WXDLLIMPEXP_FWD_CORE wxScrollBar;
|
||||
#define wxSTC_DMIS_UNSUPPORTED_MINOR 8
|
||||
#define wxSTC_DMIS_LABEL 9
|
||||
|
||||
/// Lexical states for SCLEX_REGISTRY
|
||||
#define wxSTC_REG_DEFAULT 0
|
||||
#define wxSTC_REG_COMMENT 1
|
||||
#define wxSTC_REG_VALUENAME 2
|
||||
#define wxSTC_REG_STRING 3
|
||||
#define wxSTC_REG_HEXDIGIT 4
|
||||
#define wxSTC_REG_VALUETYPE 5
|
||||
#define wxSTC_REG_ADDEDKEY 6
|
||||
#define wxSTC_REG_DELETEDKEY 7
|
||||
#define wxSTC_REG_ESCAPED 8
|
||||
#define wxSTC_REG_KEYPATH_GUID 9
|
||||
#define wxSTC_REG_STRING_GUID 10
|
||||
#define wxSTC_REG_PARAMETER 11
|
||||
#define wxSTC_REG_OPERATOR 12
|
||||
|
||||
/// Lexical state for SCLEX_BIBTEX
|
||||
#define wxSTC_BIBTEX_DEFAULT 0
|
||||
#define wxSTC_BIBTEX_ENTRY 1
|
||||
#define wxSTC_BIBTEX_UNKNOWN_ENTRY 2
|
||||
#define wxSTC_BIBTEX_KEY 3
|
||||
#define wxSTC_BIBTEX_PARAMETER 4
|
||||
#define wxSTC_BIBTEX_VALUE 5
|
||||
#define wxSTC_BIBTEX_COMMENT 6
|
||||
|
||||
//}}}
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
@ -2806,9 +2852,24 @@ public:
|
||||
// Retrieve the visible size of a tab.
|
||||
int GetTabWidth() const;
|
||||
|
||||
// Clear explicit tabstops on a line.
|
||||
void ClearTabStops(int line);
|
||||
|
||||
// Add an explicit tab stop for a line.
|
||||
void AddTabStop(int line, int x);
|
||||
|
||||
// Find the next explicit tab stop position on a line after a position.
|
||||
int GetNextTabStop(int line, int x);
|
||||
|
||||
// Set the code page used to interpret the bytes of the document as characters.
|
||||
void SetCodePage(int codePage);
|
||||
|
||||
// Is the IME displayed in a winow or inline?
|
||||
int GetIMEInteraction() const;
|
||||
|
||||
// Choose to display the the IME in a winow or inline.
|
||||
void SetIMEInteraction(int imeInteraction);
|
||||
|
||||
// Set the symbol used for a particular marker number,
|
||||
// and optionally the fore and background colours.
|
||||
void MarkerDefine(int markerNumber, int markerSymbol,
|
||||
@ -3632,13 +3693,22 @@ public:
|
||||
// Append a string to the end of the document without changing the selection.
|
||||
void AppendText(const wxString& text);
|
||||
|
||||
// Is drawing done in two phases with backgrounds drawn before faoregrounds?
|
||||
// Is drawing done in two phases with backgrounds drawn before foregrounds?
|
||||
bool GetTwoPhaseDraw() const;
|
||||
|
||||
// In twoPhaseDraw mode, drawing is performed in two phases, first the background
|
||||
// and then the foreground. This avoids chopping off characters that overlap the next run.
|
||||
void SetTwoPhaseDraw(bool twoPhase);
|
||||
|
||||
// How many phases is drawing done in?
|
||||
int GetPhasesDraw() const;
|
||||
|
||||
// In one phase draw, text is drawn in a series of rectangular blocks with no overlap.
|
||||
// In two phase draw, text is drawn in a series of lines allowing runs to overlap horizontally.
|
||||
// In multiple phase draw, each element is drawn over the whole drawing area, allowing text
|
||||
// to overlap from one line to the next.
|
||||
void SetPhasesDraw(int phases);
|
||||
|
||||
// Scroll so that a display line is at the top of the display.
|
||||
void SetFirstVisibleLine(int lineDisplay);
|
||||
|
||||
|
@ -31,6 +31,8 @@
|
||||
/// The SC_CP_UTF8 value can be used to enter Unicode mode.
|
||||
/// This is the same value as CP_UTF8 in Windows
|
||||
#define wxSTC_CP_UTF8 65001
|
||||
#define wxSTC_IME_WINDOWED 0
|
||||
#define wxSTC_IME_INLINE 1
|
||||
#define wxSTC_MARKER_MAX 31
|
||||
#define wxSTC_MARK_CIRCLE 0
|
||||
#define wxSTC_MARK_ROUNDRECT 1
|
||||
@ -146,7 +148,9 @@
|
||||
#define wxSTC_INDIC_DOTBOX 12
|
||||
#define wxSTC_INDIC_SQUIGGLEPIXMAP 13
|
||||
#define wxSTC_INDIC_COMPOSITIONTHICK 14
|
||||
#define wxSTC_INDIC_MAX 31
|
||||
#define wxSTC_INDIC_IME 32
|
||||
#define wxSTC_INDIC_IME_MAX 35
|
||||
#define wxSTC_INDIC_MAX 35
|
||||
#define wxSTC_INDIC_CONTAINER 8
|
||||
#define wxSTC_INDIC0_MASK 0x20
|
||||
#define wxSTC_INDIC1_MASK 0x40
|
||||
@ -176,6 +180,7 @@
|
||||
#define wxSTC_FIND_WORDSTART 0x00100000
|
||||
#define wxSTC_FIND_REGEXP 0x00200000
|
||||
#define wxSTC_FIND_POSIX 0x00400000
|
||||
#define wxSTC_FIND_CXX11REGEX 0x00800000
|
||||
#define wxSTC_FOLDLEVELBASE 0x400
|
||||
#define wxSTC_FOLDLEVELWHITEFLAG 0x1000
|
||||
#define wxSTC_FOLDLEVELHEADERFLAG 0x2000
|
||||
@ -211,6 +216,9 @@
|
||||
#define wxSTC_CACHE_CARET 1
|
||||
#define wxSTC_CACHE_PAGE 2
|
||||
#define wxSTC_CACHE_DOCUMENT 3
|
||||
#define wxSTC_PHASES_ONE 0
|
||||
#define wxSTC_PHASES_TWO 1
|
||||
#define wxSTC_PHASES_MULTIPLE 2
|
||||
|
||||
/// Control font anti-aliasing.
|
||||
#define wxSTC_EFF_QUALITY_MASK 0xF
|
||||
@ -226,6 +234,8 @@
|
||||
#define wxSTC_STATUS_OK 0
|
||||
#define wxSTC_STATUS_FAILURE 1
|
||||
#define wxSTC_STATUS_BADALLOC 2
|
||||
#define wxSTC_STATUS_WARN_START 1000
|
||||
#define wxSTC_STATUS_WARN_REGEX 1001
|
||||
#define wxSTC_CURSORNORMAL -1
|
||||
#define wxSTC_CURSORARROW 2
|
||||
#define wxSTC_CURSORWAIT 4
|
||||
@ -285,12 +295,15 @@
|
||||
#define wxSTC_ANNOTATION_HIDDEN 0
|
||||
#define wxSTC_ANNOTATION_STANDARD 1
|
||||
#define wxSTC_ANNOTATION_BOXED 2
|
||||
#define wxSTC_ANNOTATION_INDENTED 3
|
||||
#define wxSTC_UNDO_MAY_COALESCE 1
|
||||
#define wxSTC_SCVS_NONE 0
|
||||
#define wxSTC_SCVS_RECTANGULARSELECTION 1
|
||||
#define wxSTC_SCVS_USERACCESSIBLE 2
|
||||
#define wxSTC_TECHNOLOGY_DEFAULT 0
|
||||
#define wxSTC_TECHNOLOGY_DIRECTWRITE 1
|
||||
#define wxSTC_TECHNOLOGY_DIRECTWRITERETAIN 2
|
||||
#define wxSTC_TECHNOLOGY_DIRECTWRITEDC 3
|
||||
|
||||
/// Line end types which may be used in addition to LF, CR, and CRLF
|
||||
/// SC_LINE_END_TYPE_UNICODE includes U+2028 Line Separator,
|
||||
@ -329,7 +342,8 @@
|
||||
#define wxSTC_MOD_CONTAINER 0x40000
|
||||
#define wxSTC_MOD_LEXERSTATE 0x80000
|
||||
#define wxSTC_MOD_INSERTCHECK 0x100000
|
||||
#define wxSTC_MODEVENTMASKALL 0x1FFFFF
|
||||
#define wxSTC_MOD_CHANGETABSTOPS 0x200000
|
||||
#define wxSTC_MODEVENTMASKALL 0x3FFFFF
|
||||
#define wxSTC_UPDATE_CONTENT 0x1
|
||||
#define wxSTC_UPDATE_SELECTION 0x2
|
||||
#define wxSTC_UPDATE_V_SCROLL 0x4
|
||||
@ -479,6 +493,8 @@
|
||||
#define wxSTC_LEX_DMAP 112
|
||||
#define wxSTC_LEX_AS 113
|
||||
#define wxSTC_LEX_DMIS 114
|
||||
#define wxSTC_LEX_REGISTRY 115
|
||||
#define wxSTC_LEX_BIBTEX 116
|
||||
|
||||
/// When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
|
||||
/// value assigned in sequence from SCLEX_AUTOMATIC+1.
|
||||
@ -1374,6 +1390,7 @@
|
||||
#define wxSTC_KIX_KEYWORD 7
|
||||
#define wxSTC_KIX_FUNCTIONS 8
|
||||
#define wxSTC_KIX_OPERATOR 9
|
||||
#define wxSTC_KIX_COMMENTSTREAM 10
|
||||
#define wxSTC_KIX_IDENTIFIER 31
|
||||
|
||||
/// Lexical states for SCLEX_GUI4CLI
|
||||
@ -1484,6 +1501,7 @@
|
||||
#define wxSTC_VHDL_STDPACKAGE 12
|
||||
#define wxSTC_VHDL_STDTYPE 13
|
||||
#define wxSTC_VHDL_USERWORD 14
|
||||
#define wxSTC_VHDL_BLOCK_COMMENT 15
|
||||
|
||||
/// Lexical states for SCLEX_CAML
|
||||
#define wxSTC_CAML_DEFAULT 0
|
||||
@ -1605,6 +1623,7 @@
|
||||
#define wxSTC_SQL_USER3 21
|
||||
#define wxSTC_SQL_USER4 22
|
||||
#define wxSTC_SQL_QUOTEDIDENTIFIER 23
|
||||
#define wxSTC_SQL_QOPERATOR 24
|
||||
|
||||
/// Lexical states for SCLEX_SMALLTALK
|
||||
#define wxSTC_ST_DEFAULT 0
|
||||
@ -2250,6 +2269,9 @@
|
||||
#define wxSTC_RUST_LIFETIME 18
|
||||
#define wxSTC_RUST_MACRO 19
|
||||
#define wxSTC_RUST_LEXERROR 20
|
||||
#define wxSTC_RUST_BYTESTRING 21
|
||||
#define wxSTC_RUST_BYTESTRINGR 22
|
||||
#define wxSTC_RUST_BYTECHARACTER 23
|
||||
|
||||
/// Lexical states for SCLEX_DMAP
|
||||
#define wxSTC_DMAP_DEFAULT 0
|
||||
@ -2276,6 +2298,30 @@
|
||||
#define wxSTC_DMIS_UNSUPPORTED_MINOR 8
|
||||
#define wxSTC_DMIS_LABEL 9
|
||||
|
||||
/// Lexical states for SCLEX_REGISTRY
|
||||
#define wxSTC_REG_DEFAULT 0
|
||||
#define wxSTC_REG_COMMENT 1
|
||||
#define wxSTC_REG_VALUENAME 2
|
||||
#define wxSTC_REG_STRING 3
|
||||
#define wxSTC_REG_HEXDIGIT 4
|
||||
#define wxSTC_REG_VALUETYPE 5
|
||||
#define wxSTC_REG_ADDEDKEY 6
|
||||
#define wxSTC_REG_DELETEDKEY 7
|
||||
#define wxSTC_REG_ESCAPED 8
|
||||
#define wxSTC_REG_KEYPATH_GUID 9
|
||||
#define wxSTC_REG_STRING_GUID 10
|
||||
#define wxSTC_REG_PARAMETER 11
|
||||
#define wxSTC_REG_OPERATOR 12
|
||||
|
||||
/// Lexical state for SCLEX_BIBTEX
|
||||
#define wxSTC_BIBTEX_DEFAULT 0
|
||||
#define wxSTC_BIBTEX_ENTRY 1
|
||||
#define wxSTC_BIBTEX_UNKNOWN_ENTRY 2
|
||||
#define wxSTC_BIBTEX_KEY 3
|
||||
#define wxSTC_BIBTEX_PARAMETER 4
|
||||
#define wxSTC_BIBTEX_VALUE 5
|
||||
#define wxSTC_BIBTEX_COMMENT 6
|
||||
|
||||
//}}}
|
||||
|
||||
// Commands that can be bound to keystrokes {{{
|
||||
@ -2916,11 +2962,36 @@ public:
|
||||
*/
|
||||
int GetTabWidth() const;
|
||||
|
||||
/**
|
||||
Clear explicit tabstops on a line.
|
||||
*/
|
||||
void ClearTabStops(int line);
|
||||
|
||||
/**
|
||||
Add an explicit tab stop for a line.
|
||||
*/
|
||||
void AddTabStop(int line, int x);
|
||||
|
||||
/**
|
||||
Find the next explicit tab stop position on a line after a position.
|
||||
*/
|
||||
int GetNextTabStop(int line, int x);
|
||||
|
||||
/**
|
||||
Set the code page used to interpret the bytes of the document as characters.
|
||||
*/
|
||||
void SetCodePage(int codePage);
|
||||
|
||||
/**
|
||||
Is the IME displayed in a winow or inline?
|
||||
*/
|
||||
int GetIMEInteraction() const;
|
||||
|
||||
/**
|
||||
Choose to display the the IME in a winow or inline.
|
||||
*/
|
||||
void SetIMEInteraction(int imeInteraction);
|
||||
|
||||
/**
|
||||
Set the symbol used for a particular marker number,
|
||||
and optionally the fore and background colours.
|
||||
@ -4261,7 +4332,7 @@ public:
|
||||
void AppendText(const wxString& text);
|
||||
|
||||
/**
|
||||
Is drawing done in two phases with backgrounds drawn before faoregrounds?
|
||||
Is drawing done in two phases with backgrounds drawn before foregrounds?
|
||||
*/
|
||||
bool GetTwoPhaseDraw() const;
|
||||
|
||||
@ -4271,6 +4342,19 @@ public:
|
||||
*/
|
||||
void SetTwoPhaseDraw(bool twoPhase);
|
||||
|
||||
/**
|
||||
How many phases is drawing done in?
|
||||
*/
|
||||
int GetPhasesDraw() const;
|
||||
|
||||
/**
|
||||
In one phase draw, text is drawn in a series of rectangular blocks with no overlap.
|
||||
In two phase draw, text is drawn in a series of lines allowing runs to overlap horizontally.
|
||||
In multiple phase draw, each element is drawn over the whole drawing area, allowing text
|
||||
to overlap from one line to the next.
|
||||
*/
|
||||
void SetPhasesDraw(int phases);
|
||||
|
||||
/**
|
||||
Scroll so that a display line is at the top of the display.
|
||||
*/
|
||||
|
@ -3,7 +3,7 @@ directories from the Scintilla source distribution. All other code
|
||||
needed to implement Scintilla on top of wxWidgets is located in the
|
||||
directory above this one.
|
||||
|
||||
The current version of the Scintilla code is 3.4.4
|
||||
The current version of the Scintilla code is 3.5.2
|
||||
|
||||
These are the basic steps needed to update the version of Scintilla used by wxSTC.
|
||||
|
||||
|
@ -127,6 +127,8 @@
|
||||
#define SCLEX_DMAP 112
|
||||
#define SCLEX_AS 113
|
||||
#define SCLEX_DMIS 114
|
||||
#define SCLEX_REGISTRY 115
|
||||
#define SCLEX_BIBTEX 116
|
||||
#define SCLEX_AUTOMATIC 1000
|
||||
#define SCE_P_DEFAULT 0
|
||||
#define SCE_P_COMMENTLINE 1
|
||||
@ -906,6 +908,7 @@
|
||||
#define SCE_KIX_KEYWORD 7
|
||||
#define SCE_KIX_FUNCTIONS 8
|
||||
#define SCE_KIX_OPERATOR 9
|
||||
#define SCE_KIX_COMMENTSTREAM 10
|
||||
#define SCE_KIX_IDENTIFIER 31
|
||||
#define SCE_GC_DEFAULT 0
|
||||
#define SCE_GC_COMMENTLINE 1
|
||||
@ -1002,6 +1005,7 @@
|
||||
#define SCE_VHDL_STDPACKAGE 12
|
||||
#define SCE_VHDL_STDTYPE 13
|
||||
#define SCE_VHDL_USERWORD 14
|
||||
#define SCE_VHDL_BLOCK_COMMENT 15
|
||||
#define SCE_CAML_DEFAULT 0
|
||||
#define SCE_CAML_IDENTIFIER 1
|
||||
#define SCE_CAML_TAGNAME 2
|
||||
@ -1113,6 +1117,7 @@
|
||||
#define SCE_SQL_USER3 21
|
||||
#define SCE_SQL_USER4 22
|
||||
#define SCE_SQL_QUOTEDIDENTIFIER 23
|
||||
#define SCE_SQL_QOPERATOR 24
|
||||
#define SCE_ST_DEFAULT 0
|
||||
#define SCE_ST_STRING 1
|
||||
#define SCE_ST_NUMBER 2
|
||||
@ -1692,6 +1697,9 @@
|
||||
#define SCE_RUST_LIFETIME 18
|
||||
#define SCE_RUST_MACRO 19
|
||||
#define SCE_RUST_LEXERROR 20
|
||||
#define SCE_RUST_BYTESTRING 21
|
||||
#define SCE_RUST_BYTESTRINGR 22
|
||||
#define SCE_RUST_BYTECHARACTER 23
|
||||
#define SCE_DMAP_DEFAULT 0
|
||||
#define SCE_DMAP_COMMENT 1
|
||||
#define SCE_DMAP_NUMBER 2
|
||||
@ -1713,6 +1721,26 @@
|
||||
#define SCE_DMIS_UNSUPPORTED_MAJOR 7
|
||||
#define SCE_DMIS_UNSUPPORTED_MINOR 8
|
||||
#define SCE_DMIS_LABEL 9
|
||||
#define SCE_REG_DEFAULT 0
|
||||
#define SCE_REG_COMMENT 1
|
||||
#define SCE_REG_VALUENAME 2
|
||||
#define SCE_REG_STRING 3
|
||||
#define SCE_REG_HEXDIGIT 4
|
||||
#define SCE_REG_VALUETYPE 5
|
||||
#define SCE_REG_ADDEDKEY 6
|
||||
#define SCE_REG_DELETEDKEY 7
|
||||
#define SCE_REG_ESCAPED 8
|
||||
#define SCE_REG_KEYPATH_GUID 9
|
||||
#define SCE_REG_STRING_GUID 10
|
||||
#define SCE_REG_PARAMETER 11
|
||||
#define SCE_REG_OPERATOR 12
|
||||
#define SCE_BIBTEX_DEFAULT 0
|
||||
#define SCE_BIBTEX_ENTRY 1
|
||||
#define SCE_BIBTEX_UNKNOWN_ENTRY 2
|
||||
#define SCE_BIBTEX_KEY 3
|
||||
#define SCE_BIBTEX_PARAMETER 4
|
||||
#define SCE_BIBTEX_VALUE 5
|
||||
#define SCE_BIBTEX_COMMENT 6
|
||||
/* --Autogenerated -- end of section automatically generated from Scintilla.iface */
|
||||
|
||||
#endif
|
||||
|
@ -18,9 +18,9 @@ extern "C" {
|
||||
#if defined(_WIN32)
|
||||
/* Return false on failure: */
|
||||
int Scintilla_RegisterClasses(void *hInstance);
|
||||
int Scintilla_ReleaseResources();
|
||||
int Scintilla_ReleaseResources(void);
|
||||
#endif
|
||||
int Scintilla_LinkLexers();
|
||||
int Scintilla_LinkLexers(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
@ -103,8 +103,15 @@ inline int isascii(int c) { return !(c & ~0x7F); }
|
||||
#define SCI_SETBUFFEREDDRAW 2035
|
||||
#define SCI_SETTABWIDTH 2036
|
||||
#define SCI_GETTABWIDTH 2121
|
||||
#define SCI_CLEARTABSTOPS 2675
|
||||
#define SCI_ADDTABSTOP 2676
|
||||
#define SCI_GETNEXTTABSTOP 2677
|
||||
#define SC_CP_UTF8 65001
|
||||
#define SCI_SETCODEPAGE 2037
|
||||
#define SC_IME_WINDOWED 0
|
||||
#define SC_IME_INLINE 1
|
||||
#define SCI_GETIMEINTERACTION 2678
|
||||
#define SCI_SETIMEINTERACTION 2679
|
||||
#define MARKER_MAX 31
|
||||
#define SC_MARK_CIRCLE 0
|
||||
#define SC_MARK_ROUNDRECT 1
|
||||
@ -278,7 +285,9 @@ inline int isascii(int c) { return !(c & ~0x7F); }
|
||||
#define INDIC_DOTBOX 12
|
||||
#define INDIC_SQUIGGLEPIXMAP 13
|
||||
#define INDIC_COMPOSITIONTHICK 14
|
||||
#define INDIC_MAX 31
|
||||
#define INDIC_IME 32
|
||||
#define INDIC_IME_MAX 35
|
||||
#define INDIC_MAX 35
|
||||
#define INDIC_CONTAINER 8
|
||||
#define INDIC0_MASK 0x20
|
||||
#define INDIC1_MASK 0x40
|
||||
@ -376,6 +385,7 @@ inline int isascii(int c) { return !(c & ~0x7F); }
|
||||
#define SCFIND_WORDSTART 0x00100000
|
||||
#define SCFIND_REGEXP 0x00200000
|
||||
#define SCFIND_POSIX 0x00400000
|
||||
#define SCFIND_CXX11REGEX 0x00800000
|
||||
#define SCI_FINDTEXT 2150
|
||||
#define SCI_FORMATRANGE 2151
|
||||
#define SCI_GETFIRSTVISIBLELINE 2152
|
||||
@ -528,6 +538,11 @@ inline int isascii(int c) { return !(c & ~0x7F); }
|
||||
#define SCI_APPENDTEXT 2282
|
||||
#define SCI_GETTWOPHASEDRAW 2283
|
||||
#define SCI_SETTWOPHASEDRAW 2284
|
||||
#define SC_PHASES_ONE 0
|
||||
#define SC_PHASES_TWO 1
|
||||
#define SC_PHASES_MULTIPLE 2
|
||||
#define SCI_GETPHASESDRAW 2673
|
||||
#define SCI_SETPHASESDRAW 2674
|
||||
#define SC_EFF_QUALITY_MASK 0xF
|
||||
#define SC_EFF_QUALITY_DEFAULT 0
|
||||
#define SC_EFF_QUALITY_NON_ANTIALIASED 1
|
||||
@ -642,6 +657,8 @@ inline int isascii(int c) { return !(c & ~0x7F); }
|
||||
#define SC_STATUS_OK 0
|
||||
#define SC_STATUS_FAILURE 1
|
||||
#define SC_STATUS_BADALLOC 2
|
||||
#define SC_STATUS_WARN_START 1000
|
||||
#define SC_STATUS_WARN_REGEX 1001
|
||||
#define SCI_SETSTATUS 2382
|
||||
#define SCI_GETSTATUS 2383
|
||||
#define SCI_SETMOUSEDOWNCAPTURES 2384
|
||||
@ -812,6 +829,7 @@ inline int isascii(int c) { return !(c & ~0x7F); }
|
||||
#define ANNOTATION_HIDDEN 0
|
||||
#define ANNOTATION_STANDARD 1
|
||||
#define ANNOTATION_BOXED 2
|
||||
#define ANNOTATION_INDENTED 3
|
||||
#define SCI_ANNOTATIONSETVISIBLE 2548
|
||||
#define SCI_ANNOTATIONGETVISIBLE 2549
|
||||
#define SCI_ANNOTATIONSETSTYLEOFFSET 2550
|
||||
@ -891,6 +909,8 @@ inline int isascii(int c) { return !(c & ~0x7F); }
|
||||
#define SCI_SCROLLTOEND 2629
|
||||
#define SC_TECHNOLOGY_DEFAULT 0
|
||||
#define SC_TECHNOLOGY_DIRECTWRITE 1
|
||||
#define SC_TECHNOLOGY_DIRECTWRITERETAIN 2
|
||||
#define SC_TECHNOLOGY_DIRECTWRITEDC 3
|
||||
#define SCI_SETTECHNOLOGY 2630
|
||||
#define SCI_GETTECHNOLOGY 2631
|
||||
#define SCI_CREATELOADER 2632
|
||||
@ -963,7 +983,8 @@ inline int isascii(int c) { return !(c & ~0x7F); }
|
||||
#define SC_MOD_CONTAINER 0x40000
|
||||
#define SC_MOD_LEXERSTATE 0x80000
|
||||
#define SC_MOD_INSERTCHECK 0x100000
|
||||
#define SC_MODEVENTMASKALL 0x1FFFFF
|
||||
#define SC_MOD_CHANGETABSTOPS 0x200000
|
||||
#define SC_MODEVENTMASKALL 0x3FFFFF
|
||||
#define SC_UPDATE_CONTENT 0x1
|
||||
#define SC_UPDATE_SELECTION 0x2
|
||||
#define SC_UPDATE_V_SCROLL 0x4
|
||||
|
@ -226,6 +226,15 @@ set void SetTabWidth=2036(int tabWidth,)
|
||||
# Retrieve the visible size of a tab.
|
||||
get int GetTabWidth=2121(,)
|
||||
|
||||
# Clear explicit tabstops on a line.
|
||||
fun void ClearTabStops=2675(int line,)
|
||||
|
||||
# Add an explicit tab stop for a line.
|
||||
fun void AddTabStop=2676(int line, int x)
|
||||
|
||||
# Find the next explicit tab stop position on a line after a position.
|
||||
fun int GetNextTabStop=2677(int line, int x)
|
||||
|
||||
# The SC_CP_UTF8 value can be used to enter Unicode mode.
|
||||
# This is the same value as CP_UTF8 in Windows
|
||||
val SC_CP_UTF8=65001
|
||||
@ -234,6 +243,16 @@ val SC_CP_UTF8=65001
|
||||
# The SC_CP_UTF8 value can be used to enter Unicode mode.
|
||||
set void SetCodePage=2037(int codePage,)
|
||||
|
||||
enu IMEInteraction=SC_IME_
|
||||
val SC_IME_WINDOWED=0
|
||||
val SC_IME_INLINE=1
|
||||
|
||||
# Is the IME displayed in a winow or inline?
|
||||
get int GetIMEInteraction=2678(,)
|
||||
|
||||
# Choose to display the the IME in a winow or inline.
|
||||
set void SetIMEInteraction=2679(int imeInteraction,)
|
||||
|
||||
enu MarkerSymbol=SC_MARK_
|
||||
val MARKER_MAX=31
|
||||
val SC_MARK_CIRCLE=0
|
||||
@ -586,7 +605,9 @@ val INDIC_SQUIGGLELOW=11
|
||||
val INDIC_DOTBOX=12
|
||||
val INDIC_SQUIGGLEPIXMAP=13
|
||||
val INDIC_COMPOSITIONTHICK=14
|
||||
val INDIC_MAX=31
|
||||
val INDIC_IME=32
|
||||
val INDIC_IME_MAX=35
|
||||
val INDIC_MAX=35
|
||||
val INDIC_CONTAINER=8
|
||||
val INDIC0_MASK=0x20
|
||||
val INDIC1_MASK=0x40
|
||||
@ -865,6 +886,7 @@ val SCFIND_MATCHCASE=0x4
|
||||
val SCFIND_WORDSTART=0x00100000
|
||||
val SCFIND_REGEXP=0x00200000
|
||||
val SCFIND_POSIX=0x00400000
|
||||
val SCFIND_CXX11REGEX=0x00800000
|
||||
|
||||
# Find some text in the document.
|
||||
fun position FindText=2150(int flags, findtext ft)
|
||||
@ -1291,13 +1313,27 @@ get bool GetVScrollBar=2281(,)
|
||||
# Append a string to the end of the document without changing the selection.
|
||||
fun void AppendText=2282(int length, string text)
|
||||
|
||||
# Is drawing done in two phases with backgrounds drawn before faoregrounds?
|
||||
# Is drawing done in two phases with backgrounds drawn before foregrounds?
|
||||
get bool GetTwoPhaseDraw=2283(,)
|
||||
|
||||
# In twoPhaseDraw mode, drawing is performed in two phases, first the background
|
||||
# and then the foreground. This avoids chopping off characters that overlap the next run.
|
||||
set void SetTwoPhaseDraw=2284(bool twoPhase,)
|
||||
|
||||
enu FontQuality=SC_PHASES_
|
||||
val SC_PHASES_ONE=0
|
||||
val SC_PHASES_TWO=1
|
||||
val SC_PHASES_MULTIPLE=2
|
||||
|
||||
# How many phases is drawing done in?
|
||||
get int GetPhasesDraw=2673(,)
|
||||
|
||||
# In one phase draw, text is drawn in a series of rectangular blocks with no overlap.
|
||||
# In two phase draw, text is drawn in a series of lines allowing runs to overlap horizontally.
|
||||
# In multiple phase draw, each element is drawn over the whole drawing area, allowing text
|
||||
# to overlap from one line to the next.
|
||||
set void SetPhasesDraw=2674(int phases,)
|
||||
|
||||
# Control font anti-aliasing.
|
||||
|
||||
enu FontQuality=SC_EFF_
|
||||
@ -1628,6 +1664,8 @@ enu Status=SC_STATUS_
|
||||
val SC_STATUS_OK=0
|
||||
val SC_STATUS_FAILURE=1
|
||||
val SC_STATUS_BADALLOC=2
|
||||
val SC_STATUS_WARN_START=1000
|
||||
val SC_STATUS_WARN_REGEX=1001
|
||||
|
||||
# Change error status - 0 = OK.
|
||||
set void SetStatus=2382(int statusCode,)
|
||||
@ -2119,6 +2157,7 @@ enu AnnotationVisible=ANNOTATION_
|
||||
val ANNOTATION_HIDDEN=0
|
||||
val ANNOTATION_STANDARD=1
|
||||
val ANNOTATION_BOXED=2
|
||||
val ANNOTATION_INDENTED=3
|
||||
|
||||
# Set the visibility for the annotations for a view
|
||||
set void AnnotationSetVisible=2548(int visible,)
|
||||
@ -2326,6 +2365,8 @@ fun void ScrollToEnd=2629(,)
|
||||
|
||||
val SC_TECHNOLOGY_DEFAULT=0
|
||||
val SC_TECHNOLOGY_DIRECTWRITE=1
|
||||
val SC_TECHNOLOGY_DIRECTWRITERETAIN=2
|
||||
val SC_TECHNOLOGY_DIRECTWRITEDC=3
|
||||
|
||||
# Set the technology used.
|
||||
set void SetTechnology=2630(int technology,)
|
||||
@ -2509,7 +2550,8 @@ val SC_MOD_CHANGEANNOTATION=0x20000
|
||||
val SC_MOD_CONTAINER=0x40000
|
||||
val SC_MOD_LEXERSTATE=0x80000
|
||||
val SC_MOD_INSERTCHECK=0x100000
|
||||
val SC_MODEVENTMASKALL=0x1FFFFF
|
||||
val SC_MOD_CHANGETABSTOPS=0x200000
|
||||
val SC_MODEVENTMASKALL=0x3FFFFF
|
||||
|
||||
enu Update=SC_UPDATE_
|
||||
val SC_UPDATE_CONTENT=0x1
|
||||
@ -2675,6 +2717,8 @@ val SCLEX_RUST=111
|
||||
val SCLEX_DMAP=112
|
||||
val SCLEX_AS=113
|
||||
val SCLEX_DMIS=114
|
||||
val SCLEX_REGISTRY=115
|
||||
val SCLEX_BIBTEX=116
|
||||
|
||||
# When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
|
||||
# value assigned in sequence from SCLEX_AUTOMATIC+1.
|
||||
@ -3567,6 +3611,7 @@ val SCE_KIX_MACRO=6
|
||||
val SCE_KIX_KEYWORD=7
|
||||
val SCE_KIX_FUNCTIONS=8
|
||||
val SCE_KIX_OPERATOR=9
|
||||
val SCE_KIX_COMMENTSTREAM=10
|
||||
val SCE_KIX_IDENTIFIER=31
|
||||
# Lexical states for SCLEX_GUI4CLI
|
||||
lex Gui4Cli=SCLEX_GUI4CLI SCE_GC_
|
||||
@ -3677,6 +3722,7 @@ val SCE_VHDL_STDFUNCTION=11
|
||||
val SCE_VHDL_STDPACKAGE=12
|
||||
val SCE_VHDL_STDTYPE=13
|
||||
val SCE_VHDL_USERWORD=14
|
||||
val SCE_VHDL_BLOCK_COMMENT=15
|
||||
# Lexical states for SCLEX_CAML
|
||||
lex Caml=SCLEX_CAML SCE_CAML_
|
||||
val SCE_CAML_DEFAULT=0
|
||||
@ -3798,6 +3844,7 @@ val SCE_SQL_USER2=20
|
||||
val SCE_SQL_USER3=21
|
||||
val SCE_SQL_USER4=22
|
||||
val SCE_SQL_QUOTEDIDENTIFIER=23
|
||||
val SCE_SQL_QOPERATOR=24
|
||||
# Lexical states for SCLEX_SMALLTALK
|
||||
lex Smalltalk=SCLEX_SMALLTALK SCE_ST_
|
||||
val SCE_ST_DEFAULT=0
|
||||
@ -4443,6 +4490,9 @@ val SCE_RUST_IDENTIFIER=17
|
||||
val SCE_RUST_LIFETIME=18
|
||||
val SCE_RUST_MACRO=19
|
||||
val SCE_RUST_LEXERROR=20
|
||||
val SCE_RUST_BYTESTRING=21
|
||||
val SCE_RUST_BYTESTRINGR=22
|
||||
val SCE_RUST_BYTECHARACTER=23
|
||||
# Lexical states for SCLEX_DMAP
|
||||
lex DMAP=SCLEX_DMAP SCE_DMAP_
|
||||
val SCE_DMAP_DEFAULT=0
|
||||
@ -4468,6 +4518,30 @@ val SCE_DMIS_MINORWORD=6
|
||||
val SCE_DMIS_UNSUPPORTED_MAJOR=7
|
||||
val SCE_DMIS_UNSUPPORTED_MINOR=8
|
||||
val SCE_DMIS_LABEL=9
|
||||
# Lexical states for SCLEX_REGISTRY
|
||||
lex REG=SCLEX_REGISTRY SCE_REG_
|
||||
val SCE_REG_DEFAULT=0
|
||||
val SCE_REG_COMMENT=1
|
||||
val SCE_REG_VALUENAME=2
|
||||
val SCE_REG_STRING=3
|
||||
val SCE_REG_HEXDIGIT=4
|
||||
val SCE_REG_VALUETYPE=5
|
||||
val SCE_REG_ADDEDKEY=6
|
||||
val SCE_REG_DELETEDKEY=7
|
||||
val SCE_REG_ESCAPED=8
|
||||
val SCE_REG_KEYPATH_GUID=9
|
||||
val SCE_REG_STRING_GUID=10
|
||||
val SCE_REG_PARAMETER=11
|
||||
val SCE_REG_OPERATOR=12
|
||||
# Lexical state for SCLEX_BIBTEX
|
||||
lex BibTeX=SCLEX_BIBTEX SCE_BIBTEX_
|
||||
val SCE_BIBTEX_DEFAULT=0
|
||||
val SCE_BIBTEX_ENTRY=1
|
||||
val SCE_BIBTEX_UNKNOWN_ENTRY=2
|
||||
val SCE_BIBTEX_KEY=3
|
||||
val SCE_BIBTEX_PARAMETER=4
|
||||
val SCE_BIBTEX_VALUE=5
|
||||
val SCE_BIBTEX_COMMENT=6
|
||||
|
||||
# Events
|
||||
|
||||
|
310
src/stc/scintilla/lexers/LexBibTeX.cxx
Normal file
310
src/stc/scintilla/lexers/LexBibTeX.cxx
Normal file
@ -0,0 +1,310 @@
|
||||
// Copyright 2008-2010 Sergiu Dotenco. The License.txt file describes the
|
||||
// conditions under which this software may be distributed.
|
||||
|
||||
/**
|
||||
* @file LexBibTeX.cxx
|
||||
* @brief General BibTeX coloring scheme.
|
||||
* @author Sergiu Dotenco
|
||||
* @date April 18, 2009
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <cassert>
|
||||
#include <cctype>
|
||||
|
||||
#include <string>
|
||||
#include <algorithm>
|
||||
#include <functional>
|
||||
|
||||
#include "ILexer.h"
|
||||
#include "Scintilla.h"
|
||||
#include "SciLexer.h"
|
||||
|
||||
#include "PropSetSimple.h"
|
||||
#include "WordList.h"
|
||||
#include "LexAccessor.h"
|
||||
#include "Accessor.h"
|
||||
#include "StyleContext.h"
|
||||
#include "CharacterSet.h"
|
||||
#include "LexerModule.h"
|
||||
|
||||
#ifdef SCI_NAMESPACE
|
||||
using namespace Scintilla;
|
||||
#endif
|
||||
|
||||
namespace {
|
||||
bool IsAlphabetic(unsigned int ch)
|
||||
{
|
||||
return IsASCII(ch) && std::isalpha(ch) != 0;
|
||||
}
|
||||
bool IsAlphaNumeric(char ch)
|
||||
{
|
||||
return IsASCII(ch) && std::isalnum(ch);
|
||||
}
|
||||
|
||||
bool EqualCaseInsensitive(const char* a, const char* b)
|
||||
{
|
||||
return CompareCaseInsensitive(a, b) == 0;
|
||||
}
|
||||
|
||||
bool EntryWithoutKey(const char* name)
|
||||
{
|
||||
return EqualCaseInsensitive(name,"string");
|
||||
}
|
||||
|
||||
char GetClosingBrace(char openbrace)
|
||||
{
|
||||
char result = openbrace;
|
||||
|
||||
switch (openbrace) {
|
||||
case '(': result = ')'; break;
|
||||
case '{': result = '}'; break;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
bool IsEntryStart(char prev, char ch)
|
||||
{
|
||||
return prev != '\\' && ch == '@';
|
||||
}
|
||||
|
||||
bool IsEntryStart(const StyleContext& sc)
|
||||
{
|
||||
return IsEntryStart(sc.chPrev, sc.ch);
|
||||
}
|
||||
|
||||
void ColorizeBibTeX(unsigned start_pos, int length, int /*init_style*/, WordList* keywordlists[], Accessor& styler)
|
||||
{
|
||||
WordList &EntryNames = *keywordlists[0];
|
||||
bool fold_compact = styler.GetPropertyInt("fold.compact", 1) != 0;
|
||||
|
||||
std::string buffer;
|
||||
buffer.reserve(25);
|
||||
|
||||
// We always colorize a section from the beginning, so let's
|
||||
// search for the @ character which isn't escaped, i.e. \@
|
||||
while (start_pos > 0 && !IsEntryStart(styler.SafeGetCharAt(start_pos - 1),
|
||||
styler.SafeGetCharAt(start_pos))) {
|
||||
--start_pos; ++length;
|
||||
}
|
||||
|
||||
styler.StartAt(start_pos);
|
||||
styler.StartSegment(start_pos);
|
||||
|
||||
int current_line = styler.GetLine(start_pos);
|
||||
int prev_level = styler.LevelAt(current_line) & SC_FOLDLEVELNUMBERMASK;
|
||||
int current_level = prev_level;
|
||||
int visible_chars = 0;
|
||||
|
||||
bool in_comment = false ;
|
||||
StyleContext sc(start_pos, length, SCE_BIBTEX_DEFAULT, styler);
|
||||
|
||||
bool going = sc.More(); // needed because of a fuzzy end of file state
|
||||
char closing_brace = 0;
|
||||
bool collect_entry_name = false;
|
||||
|
||||
for (; going; sc.Forward()) {
|
||||
if (!sc.More())
|
||||
going = false; // we need to go one behind the end of text
|
||||
|
||||
if (in_comment) {
|
||||
if (sc.atLineEnd) {
|
||||
sc.SetState(SCE_BIBTEX_DEFAULT);
|
||||
in_comment = false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Found @entry
|
||||
if (IsEntryStart(sc)) {
|
||||
sc.SetState(SCE_BIBTEX_UNKNOWN_ENTRY);
|
||||
sc.Forward();
|
||||
++current_level;
|
||||
|
||||
buffer.clear();
|
||||
collect_entry_name = true;
|
||||
}
|
||||
else if ((sc.state == SCE_BIBTEX_ENTRY || sc.state == SCE_BIBTEX_UNKNOWN_ENTRY)
|
||||
&& (sc.ch == '{' || sc.ch == '(')) {
|
||||
// Entry name colorization done
|
||||
// Found either a { or a ( after entry's name, e.g. @entry(...) @entry{...}
|
||||
// Closing counterpart needs to be stored.
|
||||
closing_brace = GetClosingBrace(sc.ch);
|
||||
|
||||
sc.SetState(SCE_BIBTEX_DEFAULT); // Don't colorize { (
|
||||
|
||||
// @string doesn't have any key
|
||||
if (EntryWithoutKey(buffer.c_str()))
|
||||
sc.ForwardSetState(SCE_BIBTEX_PARAMETER);
|
||||
else
|
||||
sc.ForwardSetState(SCE_BIBTEX_KEY); // Key/label colorization
|
||||
}
|
||||
|
||||
// Need to handle the case where entry's key is empty
|
||||
// e.g. @book{,...}
|
||||
if (sc.state == SCE_BIBTEX_KEY && sc.ch == ',') {
|
||||
// Key/label colorization done
|
||||
sc.SetState(SCE_BIBTEX_DEFAULT); // Don't colorize the ,
|
||||
sc.ForwardSetState(SCE_BIBTEX_PARAMETER); // Parameter colorization
|
||||
}
|
||||
else if (sc.state == SCE_BIBTEX_PARAMETER && sc.ch == '=') {
|
||||
sc.SetState(SCE_BIBTEX_DEFAULT); // Don't colorize the =
|
||||
sc.ForwardSetState(SCE_BIBTEX_VALUE); // Parameter value colorization
|
||||
|
||||
int start = sc.currentPos;
|
||||
|
||||
// We need to handle multiple situations:
|
||||
// 1. name"one two {three}"
|
||||
// 2. name={one {one two {two}} three}
|
||||
// 3. year=2005
|
||||
|
||||
// Skip ", { until we encounter the first alphanumerical character
|
||||
while (sc.More() && !(IsAlphaNumeric(sc.ch) || sc.ch == '"' || sc.ch == '{'))
|
||||
sc.Forward();
|
||||
|
||||
if (sc.More()) {
|
||||
// Store " or {
|
||||
char ch = sc.ch;
|
||||
|
||||
// Not interested in alphanumerical characters
|
||||
if (IsAlphaNumeric(ch))
|
||||
ch = 0;
|
||||
|
||||
int skipped = 0;
|
||||
|
||||
if (ch) {
|
||||
// Skip preceding " or { such as in name={{test}}.
|
||||
// Remember how many characters have been skipped
|
||||
// Make sure that empty values, i.e. "" are also handled correctly
|
||||
while (sc.More() && (sc.ch == ch && (ch != '"' || skipped < 1))) {
|
||||
sc.Forward();
|
||||
++skipped;
|
||||
}
|
||||
}
|
||||
|
||||
// Closing counterpart for " is the same character
|
||||
if (ch == '{')
|
||||
ch = '}';
|
||||
|
||||
// We have reached the parameter value
|
||||
// In case the open character was a alnum char, skip until , is found
|
||||
// otherwise until skipped == 0
|
||||
while (sc.More() && (skipped > 0 || (!ch && !(sc.ch == ',' || sc.ch == closing_brace)))) {
|
||||
// Make sure the character isn't escaped
|
||||
if (sc.chPrev != '\\') {
|
||||
// Parameter value contains a { which is the 2nd case described above
|
||||
if (sc.ch == '{')
|
||||
++skipped; // Remember it
|
||||
else if (sc.ch == '}')
|
||||
--skipped;
|
||||
else if (skipped == 1 && sc.ch == ch && ch == '"') // Don't ignore cases like {"o}
|
||||
skipped = 0;
|
||||
}
|
||||
|
||||
sc.Forward();
|
||||
}
|
||||
}
|
||||
|
||||
// Don't colorize the ,
|
||||
sc.SetState(SCE_BIBTEX_DEFAULT);
|
||||
|
||||
// Skip until the , or entry's closing closing_brace is found
|
||||
// since this parameter might be the last one
|
||||
while (sc.More() && !(sc.ch == ',' || sc.ch == closing_brace))
|
||||
sc.Forward();
|
||||
|
||||
int state = SCE_BIBTEX_PARAMETER; // The might be more parameters
|
||||
|
||||
// We've reached the closing closing_brace for the bib entry
|
||||
// in case no " or {} has been used to enclose the value,
|
||||
// as in 3rd case described above
|
||||
if (sc.ch == closing_brace) {
|
||||
--current_level;
|
||||
// Make sure the text between entries is not colored
|
||||
// using parameter's style
|
||||
state = SCE_BIBTEX_DEFAULT;
|
||||
}
|
||||
|
||||
int end = sc.currentPos;
|
||||
current_line = styler.GetLine(end);
|
||||
|
||||
// We have possibly skipped some lines, so the folding levels
|
||||
// have to be adjusted separately
|
||||
for (int i = styler.GetLine(start); i <= styler.GetLine(end); ++i)
|
||||
styler.SetLevel(i, prev_level);
|
||||
|
||||
sc.ForwardSetState(state);
|
||||
}
|
||||
|
||||
if (sc.state == SCE_BIBTEX_PARAMETER && sc.ch == closing_brace) {
|
||||
sc.SetState(SCE_BIBTEX_DEFAULT);
|
||||
--current_level;
|
||||
}
|
||||
|
||||
// Non escaped % found which represents a comment until the end of the line
|
||||
if (sc.chPrev != '\\' && sc.ch == '%') {
|
||||
in_comment = true;
|
||||
sc.SetState(SCE_BIBTEX_COMMENT);
|
||||
}
|
||||
}
|
||||
|
||||
if (sc.state == SCE_BIBTEX_UNKNOWN_ENTRY || sc.state == SCE_BIBTEX_ENTRY) {
|
||||
if (!IsAlphabetic(sc.ch) && collect_entry_name)
|
||||
collect_entry_name = false;
|
||||
|
||||
if (collect_entry_name) {
|
||||
buffer += static_cast<char>(tolower(sc.ch));
|
||||
if (EntryNames.InList(buffer.c_str()))
|
||||
sc.ChangeState(SCE_BIBTEX_ENTRY);
|
||||
else
|
||||
sc.ChangeState(SCE_BIBTEX_UNKNOWN_ENTRY);
|
||||
}
|
||||
}
|
||||
|
||||
if (sc.atLineEnd) {
|
||||
int level = prev_level;
|
||||
|
||||
if (visible_chars == 0 && fold_compact)
|
||||
level |= SC_FOLDLEVELWHITEFLAG;
|
||||
|
||||
if ((current_level > prev_level))
|
||||
level |= SC_FOLDLEVELHEADERFLAG;
|
||||
// else if (current_level < prev_level)
|
||||
// level |= SC_FOLDLEVELBOXFOOTERFLAG; // Deprecated
|
||||
|
||||
if (level != styler.LevelAt(current_line)) {
|
||||
styler.SetLevel(current_line, level);
|
||||
}
|
||||
|
||||
++current_line;
|
||||
prev_level = current_level;
|
||||
visible_chars = 0;
|
||||
}
|
||||
|
||||
if (!isspacechar(sc.ch))
|
||||
++visible_chars;
|
||||
}
|
||||
|
||||
sc.Complete();
|
||||
|
||||
// Fill in the real level of the next line, keeping the current flags as they will be filled in later
|
||||
int flagsNext = styler.LevelAt(current_line) & ~SC_FOLDLEVELNUMBERMASK;
|
||||
styler.SetLevel(current_line, prev_level | flagsNext);
|
||||
}
|
||||
}
|
||||
static const char * const BibTeXWordLists[] = {
|
||||
"Entry Names",
|
||||
0,
|
||||
};
|
||||
|
||||
|
||||
LexerModule lmBibTeX(SCLEX_BIBTEX, ColorizeBibTeX, "bib", 0, BibTeXWordLists);
|
||||
|
||||
// Entry Names
|
||||
// article, book, booklet, conference, inbook,
|
||||
// incollection, inproceedings, manual, mastersthesis,
|
||||
// misc, phdthesis, proceedings, techreport, unpublished,
|
||||
// string, url
|
||||
|
@ -31,11 +31,8 @@ using namespace Scintilla;
|
||||
#endif
|
||||
|
||||
static bool IsSpaceEquiv(int state) {
|
||||
return (state <= SCE_COFFEESCRIPT_COMMENTDOC
|
||||
// including SCE_COFFEESCRIPT_DEFAULT, SCE_COFFEESCRIPT_COMMENT, SCE_COFFEESCRIPT_COMMENTLINE
|
||||
|| state == SCE_COFFEESCRIPT_COMMENTLINEDOC
|
||||
|| state == SCE_COFFEESCRIPT_COMMENTDOCKEYWORD
|
||||
|| state == SCE_COFFEESCRIPT_COMMENTDOCKEYWORDERROR
|
||||
return (state == SCE_COFFEESCRIPT_DEFAULT
|
||||
|| state == SCE_COFFEESCRIPT_COMMENTLINE
|
||||
|| state == SCE_COFFEESCRIPT_COMMENTBLOCK
|
||||
|| state == SCE_COFFEESCRIPT_VERBOSE_REGEX
|
||||
|| state == SCE_COFFEESCRIPT_VERBOSE_REGEX_COMMENT
|
||||
@ -88,51 +85,16 @@ static void ColouriseCoffeeScriptDoc(unsigned int startPos, int length, int init
|
||||
|
||||
WordList &keywords = *keywordlists[0];
|
||||
WordList &keywords2 = *keywordlists[1];
|
||||
WordList &keywords3 = *keywordlists[2];
|
||||
WordList &keywords4 = *keywordlists[3];
|
||||
|
||||
// property styling.within.preprocessor
|
||||
// For C++ code, determines whether all preprocessor code is styled in the preprocessor style (0, the default)
|
||||
// or only from the initial # to the end of the command word(1).
|
||||
bool stylingWithinPreprocessor = styler.GetPropertyInt("styling.within.preprocessor") != 0;
|
||||
|
||||
CharacterSet setOKBeforeRE(CharacterSet::setNone, "([{=,:;!%^&*|?~+-");
|
||||
CharacterSet setCouldBePostOp(CharacterSet::setNone, "+-");
|
||||
|
||||
CharacterSet setDoxygen(CharacterSet::setAlpha, "$@\\&<>#{}[]");
|
||||
|
||||
CharacterSet setWordStart(CharacterSet::setAlpha, "_", 0x80, true);
|
||||
CharacterSet setWord(CharacterSet::setAlphaNum, "._", 0x80, true);
|
||||
|
||||
// property lexer.cpp.allow.dollars
|
||||
// Set to 0 to disallow the '$' character in identifiers with the cpp lexer.
|
||||
if (styler.GetPropertyInt("lexer.cpp.allow.dollars", 1) != 0) {
|
||||
setWordStart.Add('$');
|
||||
setWord.Add('$');
|
||||
}
|
||||
CharacterSet setWordStart(CharacterSet::setAlpha, "_$@", 0x80, true);
|
||||
CharacterSet setWord(CharacterSet::setAlphaNum, "._$", 0x80, true);
|
||||
|
||||
int chPrevNonWhite = ' ';
|
||||
int visibleChars = 0;
|
||||
bool lastWordWasUUID = false;
|
||||
int styleBeforeDCKeyword = SCE_COFFEESCRIPT_DEFAULT;
|
||||
bool continuationLine = false;
|
||||
bool isIncludePreprocessor = false;
|
||||
|
||||
if (initStyle == SCE_COFFEESCRIPT_PREPROCESSOR) {
|
||||
// Set continuationLine if last character of previous line is '\'
|
||||
int lineCurrent = styler.GetLine(startPos);
|
||||
if (lineCurrent > 0) {
|
||||
int chBack = styler.SafeGetCharAt(startPos-1, 0);
|
||||
int chBack2 = styler.SafeGetCharAt(startPos-2, 0);
|
||||
int lineEndChar = '!';
|
||||
if (chBack2 == '\r' && chBack == '\n') {
|
||||
lineEndChar = styler.SafeGetCharAt(startPos-3, 0);
|
||||
} else if (chBack == '\n' || chBack == '\r') {
|
||||
lineEndChar = chBack2;
|
||||
}
|
||||
continuationLine = lineEndChar == '\\';
|
||||
}
|
||||
}
|
||||
|
||||
// look back to set chPrevNonWhite properly for better regex colouring
|
||||
int endPos = startPos + length;
|
||||
@ -161,20 +123,6 @@ static void ColouriseCoffeeScriptDoc(unsigned int startPos, int length, int init
|
||||
// Reset states to beginning of colourise so no surprises
|
||||
// if different sets of lines lexed.
|
||||
visibleChars = 0;
|
||||
lastWordWasUUID = false;
|
||||
isIncludePreprocessor = false;
|
||||
}
|
||||
|
||||
// Handle line continuation generically.
|
||||
if (sc.ch == '\\') {
|
||||
if (sc.chNext == '\n' || sc.chNext == '\r') {
|
||||
sc.Forward();
|
||||
if (sc.ch == '\r' && sc.chNext == '\n') {
|
||||
sc.Forward();
|
||||
}
|
||||
continuationLine = true;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// Determine if the current state should terminate.
|
||||
@ -193,7 +141,6 @@ static void ColouriseCoffeeScriptDoc(unsigned int startPos, int length, int init
|
||||
char s[1000];
|
||||
sc.GetCurrent(s, sizeof(s));
|
||||
if (keywords.InList(s)) {
|
||||
lastWordWasUUID = strcmp(s, "uuid") == 0;
|
||||
sc.ChangeState(SCE_COFFEESCRIPT_WORD);
|
||||
} else if (keywords2.InList(s)) {
|
||||
sc.ChangeState(SCE_COFFEESCRIPT_WORD2);
|
||||
@ -210,74 +157,13 @@ static void ColouriseCoffeeScriptDoc(unsigned int startPos, int length, int init
|
||||
sc.SetState(SCE_COFFEESCRIPT_DEFAULT);
|
||||
}
|
||||
break;
|
||||
case SCE_COFFEESCRIPT_PREPROCESSOR:
|
||||
if (sc.atLineStart && !continuationLine) {
|
||||
sc.SetState(SCE_COFFEESCRIPT_DEFAULT);
|
||||
} else if (stylingWithinPreprocessor) {
|
||||
if (IsASpace(sc.ch)) {
|
||||
sc.SetState(SCE_COFFEESCRIPT_DEFAULT);
|
||||
}
|
||||
} else {
|
||||
if (sc.Match('/', '*') || sc.Match('/', '/')) {
|
||||
sc.SetState(SCE_COFFEESCRIPT_DEFAULT);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SCE_COFFEESCRIPT_COMMENT:
|
||||
if (sc.Match('*', '/')) {
|
||||
sc.Forward();
|
||||
sc.ForwardSetState(SCE_COFFEESCRIPT_DEFAULT);
|
||||
}
|
||||
break;
|
||||
case SCE_COFFEESCRIPT_COMMENTDOC:
|
||||
if (sc.Match('*', '/')) {
|
||||
sc.Forward();
|
||||
sc.ForwardSetState(SCE_COFFEESCRIPT_DEFAULT);
|
||||
} else if (sc.ch == '@' || sc.ch == '\\') { // JavaDoc and Doxygen support
|
||||
// Verify that we have the conditions to mark a comment-doc-keyword
|
||||
if ((IsASpace(sc.chPrev) || sc.chPrev == '*') && (!IsASpace(sc.chNext))) {
|
||||
styleBeforeDCKeyword = SCE_COFFEESCRIPT_COMMENTDOC;
|
||||
sc.SetState(SCE_COFFEESCRIPT_COMMENTDOCKEYWORD);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SCE_COFFEESCRIPT_COMMENTLINE:
|
||||
if (sc.atLineStart) {
|
||||
sc.SetState(SCE_COFFEESCRIPT_DEFAULT);
|
||||
}
|
||||
break;
|
||||
case SCE_COFFEESCRIPT_COMMENTLINEDOC:
|
||||
if (sc.atLineStart) {
|
||||
sc.SetState(SCE_COFFEESCRIPT_DEFAULT);
|
||||
} else if (sc.ch == '@' || sc.ch == '\\') { // JavaDoc and Doxygen support
|
||||
// Verify that we have the conditions to mark a comment-doc-keyword
|
||||
if ((IsASpace(sc.chPrev) || sc.chPrev == '/' || sc.chPrev == '!') && (!IsASpace(sc.chNext))) {
|
||||
styleBeforeDCKeyword = SCE_COFFEESCRIPT_COMMENTLINEDOC;
|
||||
sc.SetState(SCE_COFFEESCRIPT_COMMENTDOCKEYWORD);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SCE_COFFEESCRIPT_COMMENTDOCKEYWORD:
|
||||
if ((styleBeforeDCKeyword == SCE_COFFEESCRIPT_COMMENTDOC) && sc.Match('*', '/')) {
|
||||
sc.ChangeState(SCE_COFFEESCRIPT_COMMENTDOCKEYWORDERROR);
|
||||
sc.Forward();
|
||||
sc.ForwardSetState(SCE_COFFEESCRIPT_DEFAULT);
|
||||
} else if (!setDoxygen.Contains(sc.ch)) {
|
||||
char s[100];
|
||||
sc.GetCurrent(s, sizeof(s));
|
||||
if (!IsASpace(sc.ch) || !keywords3.InList(s + 1)) {
|
||||
sc.ChangeState(SCE_COFFEESCRIPT_COMMENTDOCKEYWORDERROR);
|
||||
}
|
||||
sc.SetState(styleBeforeDCKeyword);
|
||||
}
|
||||
break;
|
||||
case SCE_COFFEESCRIPT_STRING:
|
||||
if (isIncludePreprocessor) {
|
||||
if (sc.ch == '>') {
|
||||
sc.ForwardSetState(SCE_COFFEESCRIPT_DEFAULT);
|
||||
isIncludePreprocessor = false;
|
||||
}
|
||||
} else if (sc.ch == '\\') {
|
||||
if (sc.ch == '\\') {
|
||||
if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {
|
||||
sc.Forward();
|
||||
}
|
||||
@ -314,20 +200,6 @@ static void ColouriseCoffeeScriptDoc(unsigned int startPos, int length, int init
|
||||
sc.SetState(SCE_COFFEESCRIPT_DEFAULT);
|
||||
}
|
||||
break;
|
||||
case SCE_COFFEESCRIPT_VERBATIM:
|
||||
if (sc.ch == '\"') {
|
||||
if (sc.chNext == '\"') {
|
||||
sc.Forward();
|
||||
} else {
|
||||
sc.ForwardSetState(SCE_COFFEESCRIPT_DEFAULT);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SCE_COFFEESCRIPT_UUID:
|
||||
if (sc.ch == '\r' || sc.ch == '\n' || sc.ch == ')') {
|
||||
sc.SetState(SCE_COFFEESCRIPT_DEFAULT);
|
||||
}
|
||||
break;
|
||||
case SCE_COFFEESCRIPT_COMMENTBLOCK:
|
||||
if (sc.Match("###")) {
|
||||
sc.Forward();
|
||||
@ -357,30 +229,10 @@ static void ColouriseCoffeeScriptDoc(unsigned int startPos, int length, int init
|
||||
|
||||
// Determine if a new state should be entered.
|
||||
if (sc.state == SCE_COFFEESCRIPT_DEFAULT) {
|
||||
if (sc.Match('@', '\"')) {
|
||||
sc.SetState(SCE_COFFEESCRIPT_VERBATIM);
|
||||
sc.Forward();
|
||||
} else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
|
||||
if (lastWordWasUUID) {
|
||||
sc.SetState(SCE_COFFEESCRIPT_UUID);
|
||||
lastWordWasUUID = false;
|
||||
} else {
|
||||
sc.SetState(SCE_COFFEESCRIPT_NUMBER);
|
||||
}
|
||||
} else if (setWordStart.Contains(sc.ch) || (sc.ch == '@') || (sc.ch == '$')) {
|
||||
if (lastWordWasUUID) {
|
||||
sc.SetState(SCE_COFFEESCRIPT_UUID);
|
||||
lastWordWasUUID = false;
|
||||
} else {
|
||||
sc.SetState(SCE_COFFEESCRIPT_IDENTIFIER);
|
||||
}
|
||||
} else if (sc.Match('/', '*')) {
|
||||
if (sc.Match("/**") || sc.Match("/*!")) { // Support of Qt/Doxygen doc. style
|
||||
sc.SetState(SCE_COFFEESCRIPT_COMMENTDOC);
|
||||
} else {
|
||||
sc.SetState(SCE_COFFEESCRIPT_COMMENT);
|
||||
}
|
||||
sc.Forward(); // Eat the * so it isn't used for the end of the comment
|
||||
if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
|
||||
sc.SetState(SCE_COFFEESCRIPT_NUMBER);
|
||||
} else if (setWordStart.Contains(sc.ch)) {
|
||||
sc.SetState(SCE_COFFEESCRIPT_IDENTIFIER);
|
||||
} else if (sc.Match("///")) {
|
||||
sc.SetState(SCE_COFFEESCRIPT_VERBOSE_REGEX);
|
||||
sc.Forward();
|
||||
@ -393,9 +245,6 @@ static void ColouriseCoffeeScriptDoc(unsigned int startPos, int length, int init
|
||||
sc.SetState(SCE_COFFEESCRIPT_REGEX); // JavaScript's RegEx
|
||||
} else if (sc.ch == '\"') {
|
||||
sc.SetState(SCE_COFFEESCRIPT_STRING);
|
||||
isIncludePreprocessor = false; // ensure that '>' won't end the string
|
||||
} else if (isIncludePreprocessor && sc.ch == '<') {
|
||||
sc.SetState(SCE_COFFEESCRIPT_STRING);
|
||||
} else if (sc.ch == '\'') {
|
||||
sc.SetState(SCE_COFFEESCRIPT_CHARACTER);
|
||||
} else if (sc.ch == '#') {
|
||||
@ -403,7 +252,6 @@ static void ColouriseCoffeeScriptDoc(unsigned int startPos, int length, int init
|
||||
sc.SetState(SCE_COFFEESCRIPT_COMMENTBLOCK);
|
||||
sc.Forward();
|
||||
sc.Forward();
|
||||
|
||||
} else {
|
||||
sc.SetState(SCE_COFFEESCRIPT_COMMENTLINE);
|
||||
}
|
||||
@ -416,7 +264,6 @@ static void ColouriseCoffeeScriptDoc(unsigned int startPos, int length, int init
|
||||
chPrevNonWhite = sc.ch;
|
||||
visibleChars++;
|
||||
}
|
||||
continuationLine = false;
|
||||
}
|
||||
sc.Complete();
|
||||
}
|
||||
@ -428,10 +275,6 @@ static bool IsCommentLine(int line, Accessor &styler) {
|
||||
char ch = styler[i];
|
||||
if (ch == '#')
|
||||
return true;
|
||||
else if (ch == '/'
|
||||
&& i < eol_pos - 1
|
||||
&& styler[i + 1] == '*')
|
||||
return true;
|
||||
else if (ch != ' ' && ch != '\t')
|
||||
return false;
|
||||
}
|
||||
@ -563,6 +406,9 @@ static void FoldCoffeeScriptDoc(unsigned int startPos, int length, int,
|
||||
|
||||
static const char *const csWordLists[] = {
|
||||
"Keywords",
|
||||
"Secondary keywords",
|
||||
"Unused",
|
||||
"Global classes",
|
||||
0,
|
||||
};
|
||||
|
||||
|
@ -822,19 +822,27 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
|
||||
// handle start of Mako comment line
|
||||
if (isMako && ch == '#' && chNext == '#') {
|
||||
makoComment = 1;
|
||||
state = SCE_HP_COMMENTLINE;
|
||||
}
|
||||
|
||||
// handle end of Mako comment line
|
||||
else if (isMako && makoComment && (ch == '\r' || ch == '\n')) {
|
||||
makoComment = 0;
|
||||
styler.ColourTo(i, SCE_HP_COMMENTLINE);
|
||||
state = SCE_HP_DEFAULT;
|
||||
styler.ColourTo(i, StateToPrint);
|
||||
if (scriptLanguage == eScriptPython) {
|
||||
state = SCE_HP_DEFAULT;
|
||||
} else {
|
||||
state = SCE_H_DEFAULT;
|
||||
}
|
||||
}
|
||||
|
||||
// Allow falling through to mako handling code if newline is going to end a block
|
||||
if (((ch == '\r' && chNext != '\n') || (ch == '\n')) &&
|
||||
(!isMako || (0 != strcmp(makoBlockType, "%")))) {
|
||||
}
|
||||
// Ignore everything in mako comment until the line ends
|
||||
else if (isMako && makoComment) {
|
||||
}
|
||||
|
||||
// generic end of script processing
|
||||
else if ((inScriptType == eNonHtmlScript) && (ch == '<') && (chNext == '/')) {
|
||||
|
@ -4,6 +4,7 @@
|
||||
**/
|
||||
// Copyright 2004 by Manfred Becker <manfred@becker-trdf.de>
|
||||
// The License.txt file describes the conditions under which this software may be distributed.
|
||||
// Edited by Lee Wilmott (24-Jun-2014) added support for block comments
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@ -54,6 +55,10 @@ static void ColouriseKixDoc(unsigned int startPos, int length, int initStyle,
|
||||
if (sc.atLineEnd) {
|
||||
sc.SetState(SCE_KIX_DEFAULT);
|
||||
}
|
||||
} else if (sc.state == SCE_KIX_COMMENTSTREAM) {
|
||||
if (sc.ch == '/' && sc.chPrev == '*') {
|
||||
sc.ForwardSetState(SCE_KIX_DEFAULT);
|
||||
}
|
||||
} else if (sc.state == SCE_KIX_STRING1) {
|
||||
// This is a doubles quotes string
|
||||
if (sc.ch == '\"') {
|
||||
@ -104,6 +109,8 @@ static void ColouriseKixDoc(unsigned int startPos, int length, int initStyle,
|
||||
if (sc.state == SCE_KIX_DEFAULT) {
|
||||
if (sc.ch == ';') {
|
||||
sc.SetState(SCE_KIX_COMMENT);
|
||||
} else if (sc.ch == '/' && sc.chNext == '*') {
|
||||
sc.SetState(SCE_KIX_COMMENTSTREAM);
|
||||
} else if (sc.ch == '\"') {
|
||||
sc.SetState(SCE_KIX_STRING1);
|
||||
} else if (sc.ch == '\'') {
|
||||
|
@ -12,6 +12,9 @@
|
||||
** - added ... displayed as a comment
|
||||
** - removed unused IsAWord functions
|
||||
** - added some comments
|
||||
**
|
||||
** Changes by John Donoghue 2014/08/01
|
||||
** - fix allowed transpose ' after {} operator
|
||||
**/
|
||||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
||||
// The License.txt file describes the conditions under which this software may be distributed.
|
||||
@ -218,7 +221,7 @@ static void ColouriseMatlabOctaveDoc(
|
||||
} else if (isalpha(sc.ch)) {
|
||||
sc.SetState(SCE_MATLAB_KEYWORD);
|
||||
} else if (isoperator(static_cast<char>(sc.ch)) || sc.ch == '@' || sc.ch == '\\') {
|
||||
if (sc.ch == ')' || sc.ch == ']') {
|
||||
if (sc.ch == ')' || sc.ch == ']' || sc.ch == '}') {
|
||||
transpose = true;
|
||||
} else {
|
||||
transpose = false;
|
||||
|
416
src/stc/scintilla/lexers/LexRegistry.cxx
Normal file
416
src/stc/scintilla/lexers/LexRegistry.cxx
Normal file
@ -0,0 +1,416 @@
|
||||
// Scintilla source code edit control
|
||||
/**
|
||||
* @file LexRegistry.cxx
|
||||
* @date July 26 2014
|
||||
* @brief Lexer for Windows registration files(.reg)
|
||||
* @author nkmathew
|
||||
*
|
||||
* The License.txt file describes the conditions under which this software may be
|
||||
* distributed.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <cstdlib>
|
||||
#include <cassert>
|
||||
#include <cctype>
|
||||
#include <cstdio>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
|
||||
#include "ILexer.h"
|
||||
#include "Scintilla.h"
|
||||
#include "SciLexer.h"
|
||||
#include "WordList.h"
|
||||
#include "LexAccessor.h"
|
||||
#include "StyleContext.h"
|
||||
#include "CharacterSet.h"
|
||||
#include "LexerModule.h"
|
||||
#include "OptionSet.h"
|
||||
|
||||
#ifdef SCI_NAMESPACE
|
||||
using namespace Scintilla;
|
||||
#endif
|
||||
|
||||
static const char *const RegistryWordListDesc[] = {
|
||||
0
|
||||
};
|
||||
|
||||
struct OptionsRegistry {
|
||||
bool foldCompact;
|
||||
bool fold;
|
||||
OptionsRegistry() {
|
||||
foldCompact = false;
|
||||
fold = false;
|
||||
}
|
||||
};
|
||||
|
||||
struct OptionSetRegistry : public OptionSet<OptionsRegistry> {
|
||||
OptionSetRegistry() {
|
||||
DefineProperty("fold.compact", &OptionsRegistry::foldCompact);
|
||||
DefineProperty("fold", &OptionsRegistry::fold);
|
||||
DefineWordListSets(RegistryWordListDesc);
|
||||
}
|
||||
};
|
||||
|
||||
class LexerRegistry : public ILexer {
|
||||
OptionsRegistry options;
|
||||
OptionSetRegistry optSetRegistry;
|
||||
|
||||
static bool IsStringState(int state) {
|
||||
return (state == SCE_REG_VALUENAME || state == SCE_REG_STRING);
|
||||
}
|
||||
|
||||
static bool IsKeyPathState(int state) {
|
||||
return (state == SCE_REG_ADDEDKEY || state == SCE_REG_DELETEDKEY);
|
||||
}
|
||||
|
||||
static bool AtValueType(LexAccessor &styler, int start) {
|
||||
int i = 0;
|
||||
while (i < 10) {
|
||||
i++;
|
||||
char curr = styler.SafeGetCharAt(start+i, '\0');
|
||||
if (curr == ':') {
|
||||
return true;
|
||||
} else if (!curr) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool IsNextNonWhitespace(LexAccessor &styler, int start, char ch) {
|
||||
int i = 0;
|
||||
while (i < 100) {
|
||||
i++;
|
||||
char curr = styler.SafeGetCharAt(start+i, '\0');
|
||||
char next = styler.SafeGetCharAt(start+i+1, '\0');
|
||||
bool atEOL = (curr == '\r' && next != '\n') || (curr == '\n');
|
||||
if (curr == ch) {
|
||||
return true;
|
||||
} else if (!isspacechar(curr) || atEOL) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Looks for the equal sign at the end of the string
|
||||
static bool AtValueName(LexAccessor &styler, int start) {
|
||||
bool atEOL = false;
|
||||
int i = 0;
|
||||
bool escaped = false;
|
||||
while (!atEOL) {
|
||||
i++;
|
||||
char curr = styler.SafeGetCharAt(start+i, '\0');
|
||||
char next = styler.SafeGetCharAt(start+i+1, '\0');
|
||||
atEOL = (curr == '\r' && next != '\n') || (curr == '\n');
|
||||
if (escaped) {
|
||||
escaped = false;
|
||||
continue;
|
||||
}
|
||||
escaped = curr == '\\';
|
||||
if (curr == '"') {
|
||||
return IsNextNonWhitespace(styler, start+i, '=');
|
||||
} else if (!curr) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool AtKeyPathEnd(LexAccessor &styler, int start) {
|
||||
bool atEOL = false;
|
||||
int i = 0;
|
||||
while (!atEOL) {
|
||||
i++;
|
||||
char curr = styler.SafeGetCharAt(start+i, '\0');
|
||||
char next = styler.SafeGetCharAt(start+i+1, '\0');
|
||||
atEOL = (curr == '\r' && next != '\n') || (curr == '\n');
|
||||
if (curr == ']' || !curr) {
|
||||
// There's still at least one or more square brackets ahead
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool AtGUID(LexAccessor &styler, int start) {
|
||||
int count = 8;
|
||||
int portion = 0;
|
||||
int offset = 1;
|
||||
char digit = '\0';
|
||||
while (portion < 5) {
|
||||
int i = 0;
|
||||
while (i < count) {
|
||||
digit = styler.SafeGetCharAt(start+offset);
|
||||
if (!(isxdigit(digit) || digit == '-')) {
|
||||
return false;
|
||||
}
|
||||
offset++;
|
||||
i++;
|
||||
}
|
||||
portion++;
|
||||
count = (portion == 4) ? 13 : 5;
|
||||
}
|
||||
digit = styler.SafeGetCharAt(start+offset);
|
||||
if (digit == '}') {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
LexerRegistry() {}
|
||||
virtual ~LexerRegistry() {}
|
||||
virtual int SCI_METHOD Version() const {
|
||||
return lvOriginal;
|
||||
}
|
||||
virtual void SCI_METHOD Release() {
|
||||
delete this;
|
||||
}
|
||||
virtual const char *SCI_METHOD PropertyNames() {
|
||||
return optSetRegistry.PropertyNames();
|
||||
}
|
||||
virtual int SCI_METHOD PropertyType(const char *name) {
|
||||
return optSetRegistry.PropertyType(name);
|
||||
}
|
||||
virtual const char *SCI_METHOD DescribeProperty(const char *name) {
|
||||
return optSetRegistry.DescribeProperty(name);
|
||||
}
|
||||
virtual int SCI_METHOD PropertySet(const char *key, const char *val) {
|
||||
if (optSetRegistry.PropertySet(&options, key, val)) {
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
virtual int SCI_METHOD WordListSet(int, const char *) {
|
||||
return -1;
|
||||
}
|
||||
virtual void *SCI_METHOD PrivateCall(int, void *) {
|
||||
return 0;
|
||||
}
|
||||
static ILexer *LexerFactoryRegistry() {
|
||||
return new LexerRegistry;
|
||||
}
|
||||
virtual const char *SCI_METHOD DescribeWordListSets() {
|
||||
return optSetRegistry.DescribeWordListSets();
|
||||
}
|
||||
virtual void SCI_METHOD Lex(unsigned startPos,
|
||||
int length,
|
||||
int initStyle,
|
||||
IDocument *pAccess);
|
||||
virtual void SCI_METHOD Fold(unsigned startPos,
|
||||
int length,
|
||||
int initStyle,
|
||||
IDocument *pAccess);
|
||||
};
|
||||
|
||||
void SCI_METHOD LexerRegistry::Lex(unsigned startPos,
|
||||
int length,
|
||||
int initStyle,
|
||||
IDocument *pAccess) {
|
||||
int beforeGUID = SCE_REG_DEFAULT;
|
||||
int beforeEscape = SCE_REG_DEFAULT;
|
||||
CharacterSet setOperators = CharacterSet(CharacterSet::setNone, "-,.=:\\@()");
|
||||
LexAccessor styler(pAccess);
|
||||
StyleContext context(startPos, length, initStyle, styler);
|
||||
bool highlight = true;
|
||||
bool afterEqualSign = false;
|
||||
while (context.More()) {
|
||||
if (context.atLineStart) {
|
||||
int currPos = static_cast<int>(context.currentPos);
|
||||
bool continued = styler[currPos-3] == '\\';
|
||||
highlight = continued ? true : false;
|
||||
}
|
||||
switch (context.state) {
|
||||
case SCE_REG_COMMENT:
|
||||
if (context.atLineEnd) {
|
||||
context.SetState(SCE_REG_DEFAULT);
|
||||
}
|
||||
break;
|
||||
case SCE_REG_VALUENAME:
|
||||
case SCE_REG_STRING: {
|
||||
int currPos = static_cast<int>(context.currentPos);
|
||||
if (context.ch == '"') {
|
||||
context.ForwardSetState(SCE_REG_DEFAULT);
|
||||
} else if (context.ch == '\\') {
|
||||
beforeEscape = context.state;
|
||||
context.SetState(SCE_REG_ESCAPED);
|
||||
context.Forward();
|
||||
} else if (context.ch == '{') {
|
||||
if (AtGUID(styler, currPos)) {
|
||||
beforeGUID = context.state;
|
||||
context.SetState(SCE_REG_STRING_GUID);
|
||||
}
|
||||
}
|
||||
if (context.state == SCE_REG_STRING &&
|
||||
context.ch == '%' &&
|
||||
(isdigit(context.chNext) || context.chNext == '*')) {
|
||||
context.SetState(SCE_REG_PARAMETER);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SCE_REG_PARAMETER:
|
||||
context.ForwardSetState(SCE_REG_STRING);
|
||||
if (context.ch == '"') {
|
||||
context.ForwardSetState(SCE_REG_DEFAULT);
|
||||
}
|
||||
break;
|
||||
case SCE_REG_VALUETYPE:
|
||||
if (context.ch == ':') {
|
||||
context.SetState(SCE_REG_DEFAULT);
|
||||
afterEqualSign = false;
|
||||
}
|
||||
break;
|
||||
case SCE_REG_HEXDIGIT:
|
||||
case SCE_REG_OPERATOR:
|
||||
context.SetState(SCE_REG_DEFAULT);
|
||||
break;
|
||||
case SCE_REG_DELETEDKEY:
|
||||
case SCE_REG_ADDEDKEY: {
|
||||
int currPos = static_cast<int>(context.currentPos);
|
||||
if (context.ch == ']' && AtKeyPathEnd(styler, currPos)) {
|
||||
context.ForwardSetState(SCE_REG_DEFAULT);
|
||||
} else if (context.ch == '{') {
|
||||
if (AtGUID(styler, currPos)) {
|
||||
beforeGUID = context.state;
|
||||
context.SetState(SCE_REG_KEYPATH_GUID);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SCE_REG_ESCAPED:
|
||||
if (context.ch == '"') {
|
||||
context.SetState(beforeEscape);
|
||||
context.ForwardSetState(SCE_REG_DEFAULT);
|
||||
} else if (context.ch == '\\') {
|
||||
context.Forward();
|
||||
} else {
|
||||
context.SetState(beforeEscape);
|
||||
beforeEscape = SCE_REG_DEFAULT;
|
||||
}
|
||||
break;
|
||||
case SCE_REG_STRING_GUID:
|
||||
case SCE_REG_KEYPATH_GUID: {
|
||||
if (context.ch == '}') {
|
||||
context.ForwardSetState(beforeGUID);
|
||||
beforeGUID = SCE_REG_DEFAULT;
|
||||
}
|
||||
int currPos = static_cast<int>(context.currentPos);
|
||||
if (context.ch == '"' && IsStringState(context.state)) {
|
||||
context.ForwardSetState(SCE_REG_DEFAULT);
|
||||
} else if (context.ch == ']' &&
|
||||
AtKeyPathEnd(styler, currPos) &&
|
||||
IsKeyPathState(context.state)) {
|
||||
context.ForwardSetState(SCE_REG_DEFAULT);
|
||||
} else if (context.ch == '\\' && IsStringState(context.state)) {
|
||||
beforeEscape = context.state;
|
||||
context.SetState(SCE_REG_ESCAPED);
|
||||
context.Forward();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
// Determine if a new state should be entered.
|
||||
if (context.state == SCE_REG_DEFAULT) {
|
||||
int currPos = static_cast<int>(context.currentPos);
|
||||
if (context.ch == ';') {
|
||||
context.SetState(SCE_REG_COMMENT);
|
||||
} else if (context.ch == '"') {
|
||||
if (AtValueName(styler, currPos)) {
|
||||
context.SetState(SCE_REG_VALUENAME);
|
||||
} else {
|
||||
context.SetState(SCE_REG_STRING);
|
||||
}
|
||||
} else if (context.ch == '[') {
|
||||
if (IsNextNonWhitespace(styler, currPos, '-')) {
|
||||
context.SetState(SCE_REG_DELETEDKEY);
|
||||
} else {
|
||||
context.SetState(SCE_REG_ADDEDKEY);
|
||||
}
|
||||
} else if (context.ch == '=') {
|
||||
afterEqualSign = true;
|
||||
highlight = true;
|
||||
} else if (afterEqualSign) {
|
||||
bool wordStart = isalpha(context.ch) && !isalpha(context.chPrev);
|
||||
if (wordStart && AtValueType(styler, currPos)) {
|
||||
context.SetState(SCE_REG_VALUETYPE);
|
||||
}
|
||||
} else if (isxdigit(context.ch) && highlight) {
|
||||
context.SetState(SCE_REG_HEXDIGIT);
|
||||
}
|
||||
highlight = (context.ch == '@') ? true : highlight;
|
||||
if (setOperators.Contains(context.ch) && highlight) {
|
||||
context.SetState(SCE_REG_OPERATOR);
|
||||
}
|
||||
}
|
||||
context.Forward();
|
||||
}
|
||||
context.Complete();
|
||||
}
|
||||
|
||||
// Folding similar to that of FoldPropsDoc in LexOthers
|
||||
void SCI_METHOD LexerRegistry::Fold(unsigned startPos,
|
||||
int length,
|
||||
int,
|
||||
IDocument *pAccess) {
|
||||
if (!options.fold) {
|
||||
return;
|
||||
}
|
||||
LexAccessor styler(pAccess);
|
||||
int currLine = styler.GetLine(startPos);
|
||||
int visibleChars = 0;
|
||||
unsigned endPos = startPos + length;
|
||||
bool atKeyPath = false;
|
||||
for (unsigned i = startPos; i < endPos; i++) {
|
||||
atKeyPath = IsKeyPathState(styler.StyleAt(i)) ? true : atKeyPath;
|
||||
char curr = styler.SafeGetCharAt(i);
|
||||
char next = styler.SafeGetCharAt(i+1);
|
||||
bool atEOL = (curr == '\r' && next != '\n') || (curr == '\n');
|
||||
if (atEOL || i == (endPos-1)) {
|
||||
int level = SC_FOLDLEVELBASE;
|
||||
if (currLine > 0) {
|
||||
int prevLevel = styler.LevelAt(currLine-1);
|
||||
if (prevLevel & SC_FOLDLEVELHEADERFLAG) {
|
||||
level += 1;
|
||||
} else {
|
||||
level = prevLevel;
|
||||
}
|
||||
}
|
||||
if (!visibleChars && options.foldCompact) {
|
||||
level |= SC_FOLDLEVELWHITEFLAG;
|
||||
} else if (atKeyPath) {
|
||||
level = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG;
|
||||
}
|
||||
if (level != styler.LevelAt(currLine)) {
|
||||
styler.SetLevel(currLine, level);
|
||||
}
|
||||
currLine++;
|
||||
visibleChars = 0;
|
||||
atKeyPath = false;
|
||||
}
|
||||
if (!isspacechar(curr)) {
|
||||
visibleChars++;
|
||||
}
|
||||
}
|
||||
|
||||
// Make the folding reach the last line in the file
|
||||
int level = SC_FOLDLEVELBASE;
|
||||
if (currLine > 0) {
|
||||
int prevLevel = styler.LevelAt(currLine-1);
|
||||
if (prevLevel & SC_FOLDLEVELHEADERFLAG) {
|
||||
level += 1;
|
||||
} else {
|
||||
level = prevLevel;
|
||||
}
|
||||
}
|
||||
styler.SetLevel(currLine, level);
|
||||
}
|
||||
|
||||
LexerModule lmRegistry(SCLEX_REGISTRY,
|
||||
LexerRegistry::LexerFactoryRegistry,
|
||||
"registry",
|
||||
RegistryWordListDesc);
|
||||
|
@ -882,6 +882,31 @@ static void ColouriseRbDoc(unsigned int startPos, int length, int initStyle,
|
||||
preferRE = false;
|
||||
} else if (isSafeWordcharOrHigh(chNext)) {
|
||||
state = SCE_RB_SYMBOL;
|
||||
} else if ((chNext == '@' || chNext == '$') &&
|
||||
isSafeWordcharOrHigh(chNext2)) {
|
||||
// instance and global variable followed by an identifier
|
||||
advance_char(i, ch, chNext, chNext2);
|
||||
state = SCE_RB_SYMBOL;
|
||||
} else if (((chNext == '@' && chNext2 == '@') ||
|
||||
(chNext == '$' && chNext2 == '-')) &&
|
||||
isSafeWordcharOrHigh(styler.SafeGetCharAt(i+3))) {
|
||||
// class variables and special global variable "$-IDENTCHAR"
|
||||
state = SCE_RB_SYMBOL;
|
||||
// $-IDENTCHAR doesn't continue past the IDENTCHAR
|
||||
if (chNext == '$') {
|
||||
styler.ColourTo(i+3, SCE_RB_SYMBOL);
|
||||
state = SCE_RB_DEFAULT;
|
||||
}
|
||||
i += 3;
|
||||
ch = styler.SafeGetCharAt(i);
|
||||
chNext = styler.SafeGetCharAt(i+1);
|
||||
} else if (chNext == '$' && strchr("_~*$?!@/\\;,.=:<>\"&`'+", chNext2)) {
|
||||
// single-character special global variables
|
||||
i += 2;
|
||||
ch = chNext2;
|
||||
chNext = styler.SafeGetCharAt(i+1);
|
||||
styler.ColourTo(i, SCE_RB_SYMBOL);
|
||||
state = SCE_RB_DEFAULT;
|
||||
} else if (strchr("[*!~+-*/%=<>&^|", chNext)) {
|
||||
// Do the operator analysis in-line, looking ahead
|
||||
// Based on the table in pickaxe 2nd ed., page 339
|
||||
@ -1260,7 +1285,16 @@ static void ColouriseRbDoc(unsigned int startPos, int length, int initStyle,
|
||||
} else if (state == SCE_RB_CLASS_VAR
|
||||
|| state == SCE_RB_INSTANCE_VAR
|
||||
|| state == SCE_RB_SYMBOL) {
|
||||
if (!isSafeWordcharOrHigh(ch)) {
|
||||
if (state == SCE_RB_SYMBOL &&
|
||||
// FIDs suffices '?' and '!'
|
||||
(((ch == '!' || ch == '?') && chNext != '=') ||
|
||||
// identifier suffix '='
|
||||
(ch == '=' && (chNext != '~' && chNext != '>' &&
|
||||
(chNext != '=' || chNext2 == '>'))))) {
|
||||
styler.ColourTo(i, state);
|
||||
state = SCE_RB_DEFAULT;
|
||||
preferRE = false;
|
||||
} else if (!isSafeWordcharOrHigh(ch)) {
|
||||
styler.ColourTo(i - 1, state);
|
||||
redo_char(i, ch, chNext, chNext2, state); // pass by ref
|
||||
preferRE = false;
|
||||
|
@ -230,7 +230,9 @@ static void ScanIdentifier(Accessor& styler, int& pos, WordList *keywords) {
|
||||
}
|
||||
}
|
||||
|
||||
static void ScanDigits(Accessor& styler, int& pos, int base) {
|
||||
/* Scans a sequence of digits, returning true if it found any. */
|
||||
static bool ScanDigits(Accessor& styler, int& pos, int base) {
|
||||
int old_pos = pos;
|
||||
for (;;) {
|
||||
int c = styler.SafeGetCharAt(pos, '\0');
|
||||
if (IsADigit(c, base) || c == '_')
|
||||
@ -238,13 +240,17 @@ static void ScanDigits(Accessor& styler, int& pos, int base) {
|
||||
else
|
||||
break;
|
||||
}
|
||||
return old_pos != pos;
|
||||
}
|
||||
|
||||
/* Scans an integer and floating point literals. */
|
||||
static void ScanNumber(Accessor& styler, int& pos) {
|
||||
int base = 10;
|
||||
int c = styler.SafeGetCharAt(pos, '\0');
|
||||
int n = styler.SafeGetCharAt(pos + 1, '\0');
|
||||
bool error = false;
|
||||
/* Scan the prefix, thus determining the base.
|
||||
* 10 is default if there's no prefix. */
|
||||
if (c == '0' && n == 'x') {
|
||||
pos += 2;
|
||||
base = 16;
|
||||
@ -255,8 +261,11 @@ static void ScanNumber(Accessor& styler, int& pos) {
|
||||
pos += 2;
|
||||
base = 8;
|
||||
}
|
||||
int old_pos = pos;
|
||||
ScanDigits(styler, pos, base);
|
||||
|
||||
/* Scan initial digits. The literal is malformed if there are none. */
|
||||
error |= !ScanDigits(styler, pos, base);
|
||||
/* See if there's an integer suffix. We mimic the Rust's lexer
|
||||
* and munch it even if there was an error above. */
|
||||
c = styler.SafeGetCharAt(pos, '\0');
|
||||
if (c == 'u' || c == 'i') {
|
||||
pos++;
|
||||
@ -271,14 +280,22 @@ static void ScanNumber(Accessor& styler, int& pos) {
|
||||
} else if (c == '6' && n == '4') {
|
||||
pos += 2;
|
||||
}
|
||||
} else {
|
||||
/* See if it's a floating point literal. These literals have to be base 10.
|
||||
*/
|
||||
} else if (!error) {
|
||||
/* If there's a period, it's a floating point literal unless it's
|
||||
* followed by an identifier (meaning this is a method call, e.g.
|
||||
* `1.foo()`) or another period, in which case it's a range (e.g. 1..2)
|
||||
*/
|
||||
n = styler.SafeGetCharAt(pos + 1, '\0');
|
||||
if (c == '.' && !(IsIdentifierStart(n) || n == '.')) {
|
||||
error |= base != 10;
|
||||
pos++;
|
||||
/* It's ok to have no digits after the period. */
|
||||
ScanDigits(styler, pos, 10);
|
||||
}
|
||||
|
||||
/* Look for the exponentiation. */
|
||||
c = styler.SafeGetCharAt(pos, '\0');
|
||||
if (c == 'e' || c == 'E') {
|
||||
error |= base != 10;
|
||||
@ -286,13 +303,11 @@ static void ScanNumber(Accessor& styler, int& pos) {
|
||||
c = styler.SafeGetCharAt(pos, '\0');
|
||||
if (c == '-' || c == '+')
|
||||
pos++;
|
||||
int old_pos = pos;
|
||||
ScanDigits(styler, pos, 10);
|
||||
if (old_pos == pos) {
|
||||
error = true;
|
||||
}
|
||||
/* It is invalid to have no digits in the exponent. */
|
||||
error |= !ScanDigits(styler, pos, 10);
|
||||
}
|
||||
|
||||
/* Scan the floating point suffix. */
|
||||
c = styler.SafeGetCharAt(pos, '\0');
|
||||
if (c == 'f') {
|
||||
error |= base != 10;
|
||||
@ -308,9 +323,7 @@ static void ScanNumber(Accessor& styler, int& pos) {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (old_pos == pos) {
|
||||
error = true;
|
||||
}
|
||||
|
||||
if (error)
|
||||
styler.ColourTo(pos - 1, SCE_RUST_LEXERROR);
|
||||
else
|
||||
@ -351,7 +364,7 @@ static bool IsValidCharacterEscape(int c) {
|
||||
}
|
||||
|
||||
static bool IsValidStringEscape(int c) {
|
||||
return IsValidCharacterEscape(c) || c == '\n';
|
||||
return IsValidCharacterEscape(c) || c == '\n' || c == '\r';
|
||||
}
|
||||
|
||||
static bool ScanNumericEscape(Accessor &styler, int& pos, int num_digits, bool stop_asap) {
|
||||
@ -373,12 +386,12 @@ static bool ScanNumericEscape(Accessor &styler, int& pos, int num_digits, bool s
|
||||
|
||||
/* This is overly permissive for character literals in order to accept UTF-8 encoded
|
||||
* character literals. */
|
||||
static void ScanCharacterLiteralOrLifetime(Accessor &styler, int& pos) {
|
||||
static void ScanCharacterLiteralOrLifetime(Accessor &styler, int& pos, bool ascii_only) {
|
||||
pos++;
|
||||
int c = styler.SafeGetCharAt(pos, '\0');
|
||||
int n = styler.SafeGetCharAt(pos + 1, '\0');
|
||||
bool done = false;
|
||||
bool valid_lifetime = IsIdentifierStart(c);
|
||||
bool valid_lifetime = !ascii_only && IsIdentifierStart(c);
|
||||
bool valid_char = true;
|
||||
bool first = true;
|
||||
while (!done) {
|
||||
@ -390,10 +403,10 @@ static void ScanCharacterLiteralOrLifetime(Accessor &styler, int& pos) {
|
||||
} else if (n == 'x') {
|
||||
pos += 2;
|
||||
valid_char = ScanNumericEscape(styler, pos, 2, false);
|
||||
} else if (n == 'u') {
|
||||
} else if (n == 'u' && !ascii_only) {
|
||||
pos += 2;
|
||||
valid_char = ScanNumericEscape(styler, pos, 4, false);
|
||||
} else if (n == 'U') {
|
||||
} else if (n == 'U' && !ascii_only) {
|
||||
pos += 2;
|
||||
valid_char = ScanNumericEscape(styler, pos, 8, false);
|
||||
} else {
|
||||
@ -412,7 +425,10 @@ static void ScanCharacterLiteralOrLifetime(Accessor &styler, int& pos) {
|
||||
done = true;
|
||||
break;
|
||||
default:
|
||||
if (!IsIdentifierContinue(c) && !first) {
|
||||
if (ascii_only && !IsASCII((char)c)) {
|
||||
done = true;
|
||||
valid_char = false;
|
||||
} else if (!IsIdentifierContinue(c) && !first) {
|
||||
done = true;
|
||||
} else {
|
||||
pos++;
|
||||
@ -433,7 +449,7 @@ static void ScanCharacterLiteralOrLifetime(Accessor &styler, int& pos) {
|
||||
styler.ColourTo(pos - 1, SCE_RUST_LIFETIME);
|
||||
} else if (valid_char) {
|
||||
pos++;
|
||||
styler.ColourTo(pos - 1, SCE_RUST_CHARACTER);
|
||||
styler.ColourTo(pos - 1, ascii_only ? SCE_RUST_BYTECHARACTER : SCE_RUST_CHARACTER);
|
||||
} else {
|
||||
styler.ColourTo(pos - 1, SCE_RUST_LEXERROR);
|
||||
}
|
||||
@ -542,7 +558,7 @@ static void ScanComments(Accessor &styler, int& pos, int max) {
|
||||
ResumeBlockComment(styler, pos, max, UnknownComment, 1);
|
||||
}
|
||||
|
||||
static void ResumeString(Accessor &styler, int& pos, int max) {
|
||||
static void ResumeString(Accessor &styler, int& pos, int max, bool ascii_only) {
|
||||
int c = styler.SafeGetCharAt(pos, '\0');
|
||||
bool error = false;
|
||||
while (c != '"' && !error) {
|
||||
@ -559,10 +575,10 @@ static void ResumeString(Accessor &styler, int& pos, int max) {
|
||||
} else if (n == 'x') {
|
||||
pos += 2;
|
||||
error = !ScanNumericEscape(styler, pos, 2, true);
|
||||
} else if (n == 'u') {
|
||||
} else if (n == 'u' && !ascii_only) {
|
||||
pos += 2;
|
||||
error = !ScanNumericEscape(styler, pos, 4, true);
|
||||
} else if (n == 'U') {
|
||||
} else if (n == 'U' && !ascii_only) {
|
||||
pos += 2;
|
||||
error = !ScanNumericEscape(styler, pos, 8, true);
|
||||
} else {
|
||||
@ -570,16 +586,19 @@ static void ResumeString(Accessor &styler, int& pos, int max) {
|
||||
error = true;
|
||||
}
|
||||
} else {
|
||||
pos++;
|
||||
if (ascii_only && !IsASCII((char)c))
|
||||
error = true;
|
||||
else
|
||||
pos++;
|
||||
}
|
||||
c = styler.SafeGetCharAt(pos, '\0');
|
||||
}
|
||||
if (!error)
|
||||
pos++;
|
||||
styler.ColourTo(pos - 1, SCE_RUST_STRING);
|
||||
styler.ColourTo(pos - 1, ascii_only ? SCE_RUST_BYTESTRING : SCE_RUST_STRING);
|
||||
}
|
||||
|
||||
static void ResumeRawString(Accessor &styler, int& pos, int max, int num_hashes) {
|
||||
static void ResumeRawString(Accessor &styler, int& pos, int max, int num_hashes, bool ascii_only) {
|
||||
for (;;) {
|
||||
if (pos == styler.LineEnd(styler.GetLine(pos)))
|
||||
styler.SetLineState(styler.GetLine(pos), num_hashes);
|
||||
@ -594,19 +613,20 @@ static void ResumeRawString(Accessor &styler, int& pos, int max, int num_hashes)
|
||||
}
|
||||
if (trailing_num_hashes == num_hashes) {
|
||||
styler.SetLineState(styler.GetLine(pos), 0);
|
||||
styler.ColourTo(pos - 1, SCE_RUST_STRINGR);
|
||||
break;
|
||||
}
|
||||
} else if (pos >= max) {
|
||||
styler.ColourTo(pos - 1, SCE_RUST_STRINGR);
|
||||
break;
|
||||
} else {
|
||||
} else {
|
||||
if (ascii_only && !IsASCII((char)c))
|
||||
break;
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
styler.ColourTo(pos - 1, ascii_only ? SCE_RUST_BYTESTRINGR : SCE_RUST_STRINGR);
|
||||
}
|
||||
|
||||
static void ScanRawString(Accessor &styler, int& pos, int max) {
|
||||
static void ScanRawString(Accessor &styler, int& pos, int max, bool ascii_only) {
|
||||
pos++;
|
||||
int num_hashes = 0;
|
||||
while (styler.SafeGetCharAt(pos, '\0') == '#') {
|
||||
@ -617,7 +637,7 @@ static void ScanRawString(Accessor &styler, int& pos, int max) {
|
||||
styler.ColourTo(pos - 1, SCE_RUST_LEXERROR);
|
||||
} else {
|
||||
pos++;
|
||||
ResumeRawString(styler, pos, max, num_hashes);
|
||||
ResumeRawString(styler, pos, max, num_hashes, ascii_only);
|
||||
}
|
||||
}
|
||||
|
||||
@ -635,9 +655,13 @@ void SCI_METHOD LexerRust::Lex(unsigned int startPos, int length, int initStyle,
|
||||
} else if (initStyle == SCE_RUST_COMMENTLINE || initStyle == SCE_RUST_COMMENTLINEDOC) {
|
||||
ResumeLineComment(styler, pos, max, initStyle == SCE_RUST_COMMENTLINEDOC ? DocComment : NotDocComment);
|
||||
} else if (initStyle == SCE_RUST_STRING) {
|
||||
ResumeString(styler, pos, max);
|
||||
ResumeString(styler, pos, max, false);
|
||||
} else if (initStyle == SCE_RUST_BYTESTRING) {
|
||||
ResumeString(styler, pos, max, true);
|
||||
} else if (initStyle == SCE_RUST_STRINGR) {
|
||||
ResumeRawString(styler, pos, max, styler.GetLineState(styler.GetLine(pos) - 1));
|
||||
ResumeRawString(styler, pos, max, styler.GetLineState(styler.GetLine(pos) - 1), false);
|
||||
} else if (initStyle == SCE_RUST_BYTESTRINGR) {
|
||||
ResumeRawString(styler, pos, max, styler.GetLineState(styler.GetLine(pos) - 1), true);
|
||||
}
|
||||
|
||||
while (pos < max) {
|
||||
@ -645,7 +669,7 @@ void SCI_METHOD LexerRust::Lex(unsigned int startPos, int length, int initStyle,
|
||||
int n = styler.SafeGetCharAt(pos + 1, '\0');
|
||||
int n2 = styler.SafeGetCharAt(pos + 2, '\0');
|
||||
|
||||
if (pos == 0 && c == '#' && n == '!') {
|
||||
if (pos == 0 && c == '#' && n == '!' && n2 != '[') {
|
||||
pos += 2;
|
||||
ResumeLineComment(styler, pos, max, NotDocComment);
|
||||
} else if (IsWhitespace(c)) {
|
||||
@ -653,7 +677,16 @@ void SCI_METHOD LexerRust::Lex(unsigned int startPos, int length, int initStyle,
|
||||
} else if (c == '/' && (n == '/' || n == '*')) {
|
||||
ScanComments(styler, pos, max);
|
||||
} else if (c == 'r' && (n == '#' || n == '"')) {
|
||||
ScanRawString(styler, pos, max);
|
||||
ScanRawString(styler, pos, max, false);
|
||||
} else if (c == 'b' && n == 'r' && (n2 == '#' || n2 == '"')) {
|
||||
pos++;
|
||||
ScanRawString(styler, pos, max, true);
|
||||
} else if (c == 'b' && n == '"') {
|
||||
pos += 2;
|
||||
ResumeString(styler, pos, max, true);
|
||||
} else if (c == 'b' && n == '\'') {
|
||||
pos++;
|
||||
ScanCharacterLiteralOrLifetime(styler, pos, true);
|
||||
} else if (IsIdentifierStart(c)) {
|
||||
ScanIdentifier(styler, pos, keywords);
|
||||
} else if (IsADigit(c)) {
|
||||
@ -668,10 +701,10 @@ void SCI_METHOD LexerRust::Lex(unsigned int startPos, int length, int initStyle,
|
||||
pos++;
|
||||
styler.ColourTo(pos - 1, SCE_RUST_OPERATOR);
|
||||
} else if (c == '\'') {
|
||||
ScanCharacterLiteralOrLifetime(styler, pos);
|
||||
ScanCharacterLiteralOrLifetime(styler, pos, false);
|
||||
} else if (c == '"') {
|
||||
pos++;
|
||||
ResumeString(styler, pos, max);
|
||||
ResumeString(styler, pos, max, false);
|
||||
} else {
|
||||
pos++;
|
||||
styler.ColourTo(pos - 1, SCE_RUST_LEXERROR);
|
||||
|
@ -444,6 +444,8 @@ void SCI_METHOD LexerSQL::Lex(unsigned int startPos, int length, int initStyle,
|
||||
StyleContext sc(startPos, length, initStyle, styler);
|
||||
int styleBeforeDCKeyword = SCE_SQL_DEFAULT;
|
||||
int offset = 0;
|
||||
char qOperator = 0x00;
|
||||
|
||||
for (; sc.More(); sc.Forward(), offset++) {
|
||||
// Determine if the current state should terminate.
|
||||
switch (sc.state) {
|
||||
@ -556,11 +558,39 @@ void SCI_METHOD LexerSQL::Lex(unsigned int startPos, int length, int initStyle,
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SCE_SQL_QOPERATOR:
|
||||
if (qOperator == 0x00) {
|
||||
qOperator = sc.ch;
|
||||
} else {
|
||||
char qComplement = 0x00;
|
||||
|
||||
if (qOperator == '<') {
|
||||
qComplement = '>';
|
||||
} else if (qOperator == '(') {
|
||||
qComplement = ')';
|
||||
} else if (qOperator == '{') {
|
||||
qComplement = '}';
|
||||
} else if (qOperator == '[') {
|
||||
qComplement = ']';
|
||||
} else {
|
||||
qComplement = qOperator;
|
||||
}
|
||||
|
||||
if (sc.Match(qComplement, '\'')) {
|
||||
sc.Forward();
|
||||
sc.ForwardSetState(SCE_SQL_DEFAULT);
|
||||
qOperator = 0x00;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// Determine if a new state should be entered.
|
||||
if (sc.state == SCE_SQL_DEFAULT) {
|
||||
if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
|
||||
if (sc.Match('q', '\'') || sc.Match('Q', '\'')) {
|
||||
sc.SetState(SCE_SQL_QOPERATOR);
|
||||
sc.Forward();
|
||||
} else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
|
||||
sc.SetState(SCE_SQL_NUMBER);
|
||||
} else if (IsAWordStart(sc.ch)) {
|
||||
sc.SetState(SCE_SQL_IDENTIFIER);
|
||||
|
@ -119,6 +119,11 @@ static void ColouriseVHDLDoc(
|
||||
sc.ChangeState(SCE_VHDL_STRINGEOL);
|
||||
sc.ForwardSetState(SCE_VHDL_DEFAULT);
|
||||
}
|
||||
} else if (sc.state == SCE_VHDL_BLOCK_COMMENT){
|
||||
if(sc.ch == '*' && sc.chNext == '/'){
|
||||
sc.Forward();
|
||||
sc.ForwardSetState(SCE_VHDL_DEFAULT);
|
||||
}
|
||||
}
|
||||
|
||||
// Determine if a new state should be entered.
|
||||
@ -132,6 +137,8 @@ static void ColouriseVHDLDoc(
|
||||
sc.SetState(SCE_VHDL_COMMENTLINEBANG);
|
||||
else
|
||||
sc.SetState(SCE_VHDL_COMMENT);
|
||||
} else if (sc.Match('/', '*')){
|
||||
sc.SetState(SCE_VHDL_BLOCK_COMMENT);
|
||||
} else if (sc.ch == '\"') {
|
||||
sc.SetState(SCE_VHDL_STRING);
|
||||
} else if (isoperator(static_cast<char>(sc.ch))) {
|
||||
@ -155,6 +162,39 @@ static bool IsCommentLine(int line, Accessor &styler) {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
static bool IsCommentBlockStart(int line, Accessor &styler)
|
||||
{
|
||||
int pos = styler.LineStart(line);
|
||||
int eol_pos = styler.LineStart(line + 1) - 1;
|
||||
for (int i = pos; i < eol_pos; i++) {
|
||||
char ch = styler[i];
|
||||
char chNext = styler[i+1];
|
||||
char style = styler.StyleAt(i);
|
||||
if ((style == SCE_VHDL_BLOCK_COMMENT) && (ch == '/') && (chNext == '*'))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool IsCommentBlockEnd(int line, Accessor &styler)
|
||||
{
|
||||
int pos = styler.LineStart(line);
|
||||
int eol_pos = styler.LineStart(line + 1) - 1;
|
||||
|
||||
for (int i = pos; i < eol_pos; i++) {
|
||||
char ch = styler[i];
|
||||
char chNext = styler[i+1];
|
||||
char style = styler.StyleAt(i);
|
||||
if ((style == SCE_VHDL_BLOCK_COMMENT) && (ch == '*') && (chNext == '/'))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool IsCommentStyle(char style)
|
||||
{
|
||||
return style == SCE_VHDL_BLOCK_COMMENT || style == SCE_VHDL_COMMENT || style == SCE_VHDL_COMMENTLINEBANG;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
// Folding the code
|
||||
@ -167,7 +207,7 @@ static void FoldNoBoxVHDLDoc(
|
||||
// Decided it would be smarter to have the lexer have all keywords included. Therefore I
|
||||
// don't check if the style for the keywords that I use to adjust the levels.
|
||||
char words[] =
|
||||
"architecture begin case component else elsif end entity generate loop package process record then "
|
||||
"architecture begin block case component else elsif end entity generate loop package process record then "
|
||||
"procedure function when";
|
||||
WordList keywords;
|
||||
keywords.Set(words);
|
||||
@ -207,14 +247,14 @@ static void FoldNoBoxVHDLDoc(
|
||||
char chPrev = styler.SafeGetCharAt(j-1);
|
||||
int style = styler.StyleAt(j);
|
||||
int stylePrev = styler.StyleAt(j-1);
|
||||
if ((stylePrev != SCE_VHDL_COMMENT) && (stylePrev != SCE_VHDL_STRING))
|
||||
if ((!IsCommentStyle(style)) && (stylePrev != SCE_VHDL_STRING))
|
||||
{
|
||||
if(IsAWordChar(chPrev) && !IsAWordChar(ch))
|
||||
{
|
||||
end = j-1;
|
||||
}
|
||||
}
|
||||
if ((style != SCE_VHDL_COMMENT) && (style != SCE_VHDL_STRING))
|
||||
if ((!IsCommentStyle(style)) && (style != SCE_VHDL_STRING))
|
||||
{
|
||||
if(!IsAWordChar(chPrev) && IsAWordStart(ch) && (end != 0))
|
||||
{
|
||||
@ -236,7 +276,7 @@ static void FoldNoBoxVHDLDoc(
|
||||
{
|
||||
char ch = styler.SafeGetCharAt(j);
|
||||
int style = styler.StyleAt(j);
|
||||
if ((style != SCE_VHDL_COMMENT) && (style != SCE_VHDL_STRING))
|
||||
if ((!IsCommentStyle(style)) && (style != SCE_VHDL_STRING))
|
||||
{
|
||||
if((ch == ';') && (strcmp(prevWord, "end") == 0))
|
||||
{
|
||||
@ -268,15 +308,29 @@ static void FoldNoBoxVHDLDoc(
|
||||
styleNext = styler.StyleAt(i + 1);
|
||||
bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
|
||||
|
||||
if (foldComment && atEOL && IsCommentLine(lineCurrent, styler))
|
||||
if (foldComment && atEOL)
|
||||
{
|
||||
if(!IsCommentLine(lineCurrent-1, styler) && IsCommentLine(lineCurrent+1, styler))
|
||||
if(IsCommentLine(lineCurrent, styler))
|
||||
{
|
||||
levelNext++;
|
||||
if(!IsCommentLine(lineCurrent-1, styler) && IsCommentLine(lineCurrent+1, styler))
|
||||
{
|
||||
levelNext++;
|
||||
}
|
||||
else if(IsCommentLine(lineCurrent-1, styler) && !IsCommentLine(lineCurrent+1, styler))
|
||||
{
|
||||
levelNext--;
|
||||
}
|
||||
}
|
||||
else if(IsCommentLine(lineCurrent-1, styler) && !IsCommentLine(lineCurrent+1, styler))
|
||||
else
|
||||
{
|
||||
levelNext--;
|
||||
if (IsCommentBlockStart(lineCurrent, styler) && !IsCommentBlockEnd(lineCurrent, styler))
|
||||
{
|
||||
levelNext++;
|
||||
}
|
||||
else if (IsCommentBlockEnd(lineCurrent, styler) && !IsCommentBlockStart(lineCurrent, styler))
|
||||
{
|
||||
levelNext--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -289,7 +343,7 @@ static void FoldNoBoxVHDLDoc(
|
||||
}
|
||||
}
|
||||
|
||||
if ((style != SCE_VHDL_COMMENT) && (style != SCE_VHDL_STRING))
|
||||
if ((!IsCommentStyle(style)) && (style != SCE_VHDL_STRING))
|
||||
{
|
||||
if((ch == ';') && (strcmp(prevWord, "end") == 0))
|
||||
{
|
||||
@ -301,7 +355,7 @@ static void FoldNoBoxVHDLDoc(
|
||||
lastStart = i;
|
||||
}
|
||||
|
||||
if(iswordchar(ch) && !iswordchar(chNext)) {
|
||||
if(IsAWordChar(ch) && !IsAWordChar(chNext)) {
|
||||
char s[32];
|
||||
unsigned int k;
|
||||
for(k=0; (k<31 ) && (k<i-lastStart+1 ); k++) {
|
||||
@ -314,9 +368,8 @@ static void FoldNoBoxVHDLDoc(
|
||||
if (
|
||||
strcmp(s, "architecture") == 0 ||
|
||||
strcmp(s, "case") == 0 ||
|
||||
strcmp(s, "component") == 0 ||
|
||||
strcmp(s, "entity") == 0 ||
|
||||
strcmp(s, "generate") == 0 ||
|
||||
strcmp(s, "block") == 0 ||
|
||||
strcmp(s, "loop") == 0 ||
|
||||
strcmp(s, "package") ==0 ||
|
||||
strcmp(s, "process") == 0 ||
|
||||
@ -330,6 +383,32 @@ static void FoldNoBoxVHDLDoc(
|
||||
}
|
||||
levelNext++;
|
||||
}
|
||||
} else if (
|
||||
strcmp(s, "component") == 0 ||
|
||||
strcmp(s, "entity") == 0 ||
|
||||
strcmp(s, "configuration") == 0 )
|
||||
{
|
||||
if (strcmp(prevWord, "end") != 0)
|
||||
{ // check for instantiated unit by backward searching for the colon.
|
||||
unsigned pos = lastStart-1;
|
||||
char chAtPos, styleAtPos;
|
||||
do{// skip white spaces
|
||||
styleAtPos = styler.StyleAt(pos);
|
||||
chAtPos = styler.SafeGetCharAt(pos--);
|
||||
}while(pos>0 &&
|
||||
(chAtPos == ' ' || chAtPos == '\t' ||
|
||||
chAtPos == '\n' || chAtPos == '\r' ||
|
||||
IsCommentStyle(styleAtPos)));
|
||||
|
||||
// check for a colon (':') before the instantiated units "entity", "component" or "configuration". Don't fold thereafter.
|
||||
if (chAtPos != ':')
|
||||
{
|
||||
if (levelMinCurrentElse > levelNext) {
|
||||
levelMinCurrentElse = levelNext;
|
||||
}
|
||||
levelNext++;
|
||||
}
|
||||
}
|
||||
} else if (
|
||||
strcmp(s, "procedure") == 0 ||
|
||||
strcmp(s, "function") == 0)
|
||||
@ -338,19 +417,19 @@ static void FoldNoBoxVHDLDoc(
|
||||
{ // This code checks to see if the procedure / function is a definition within a "package"
|
||||
// rather than the actual code in the body.
|
||||
int BracketLevel = 0;
|
||||
for(int j=i+1; j<styler.Length(); j++)
|
||||
for(int pos=i+1; pos<styler.Length(); pos++)
|
||||
{
|
||||
int LocalStyle = styler.StyleAt(j);
|
||||
char LocalCh = styler.SafeGetCharAt(j);
|
||||
if(LocalCh == '(') BracketLevel++;
|
||||
if(LocalCh == ')') BracketLevel--;
|
||||
int styleAtPos = styler.StyleAt(pos);
|
||||
char chAtPos = styler.SafeGetCharAt(pos);
|
||||
if(chAtPos == '(') BracketLevel++;
|
||||
if(chAtPos == ')') BracketLevel--;
|
||||
if(
|
||||
(BracketLevel == 0) &&
|
||||
(LocalStyle != SCE_VHDL_COMMENT) &&
|
||||
(LocalStyle != SCE_VHDL_STRING) &&
|
||||
!iswordchar(styler.SafeGetCharAt(j-1)) &&
|
||||
styler.Match(j, "is") &&
|
||||
!iswordchar(styler.SafeGetCharAt(j+2)))
|
||||
(!IsCommentStyle(styleAtPos)) &&
|
||||
(styleAtPos != SCE_VHDL_STRING) &&
|
||||
!iswordchar(styler.SafeGetCharAt(pos-1)) &&
|
||||
styler.Match(pos, "is") &&
|
||||
!iswordchar(styler.SafeGetCharAt(pos+2)))
|
||||
{
|
||||
if (levelMinCurrentElse > levelNext) {
|
||||
levelMinCurrentElse = levelNext;
|
||||
@ -358,7 +437,7 @@ static void FoldNoBoxVHDLDoc(
|
||||
levelNext++;
|
||||
break;
|
||||
}
|
||||
if((BracketLevel == 0) && (LocalCh == ';'))
|
||||
if((BracketLevel == 0) && (chAtPos == ';'))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
@ -67,7 +67,12 @@ inline int Maximum(int a, int b) {
|
||||
|
||||
// Shut up annoying Visual C++ warnings:
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(disable: 4244 4309)
|
||||
#pragma warning(disable: 4244 4309 4456 4457)
|
||||
#endif
|
||||
|
||||
// Turn off shadow warnings for lexers as may be maintained by others
|
||||
#if defined(__GNUC__)
|
||||
#pragma GCC diagnostic ignored "-Wshadow"
|
||||
#endif
|
||||
|
||||
#ifdef SCI_NAMESPACE
|
||||
|
@ -90,6 +90,7 @@ int Scintilla_LinkLexers() {
|
||||
LINK_LEXER(lmBaan);
|
||||
LINK_LEXER(lmBash);
|
||||
LINK_LEXER(lmBatch);
|
||||
LINK_LEXER(lmBibTeX);
|
||||
LINK_LEXER(lmBlitzBasic);
|
||||
LINK_LEXER(lmBullant);
|
||||
LINK_LEXER(lmCaml);
|
||||
@ -163,6 +164,7 @@ int Scintilla_LinkLexers() {
|
||||
LINK_LEXER(lmPython);
|
||||
LINK_LEXER(lmR);
|
||||
LINK_LEXER(lmREBOL);
|
||||
LINK_LEXER(lmRegistry);
|
||||
LINK_LEXER(lmRuby);
|
||||
LINK_LEXER(lmRust);
|
||||
LINK_LEXER(lmScriptol);
|
||||
|
@ -144,6 +144,7 @@ UndoHistory::UndoHistory() {
|
||||
currentAction = 0;
|
||||
undoSequenceDepth = 0;
|
||||
savePoint = 0;
|
||||
tentativePoint = -1;
|
||||
|
||||
actions[currentAction].Create(startAction);
|
||||
}
|
||||
@ -194,7 +195,7 @@ const char *UndoHistory::AppendAction(actionType at, int position, const char *d
|
||||
// Visual Studio 2013 Code Analysis wrongly believes actions can be NULL at its next reference
|
||||
__analysis_assume(actions);
|
||||
#endif
|
||||
if (currentAction == savePoint) {
|
||||
if ((currentAction == savePoint) || (currentAction == tentativePoint)) {
|
||||
currentAction++;
|
||||
} else if (!actions[currentAction].mayCoalesce) {
|
||||
// Not allowed to coalesce if this set
|
||||
@ -282,6 +283,7 @@ void UndoHistory::DeleteUndoHistory() {
|
||||
currentAction = 0;
|
||||
actions[currentAction].Create(startAction);
|
||||
savePoint = 0;
|
||||
tentativePoint = -1;
|
||||
}
|
||||
|
||||
void UndoHistory::SetSavePoint() {
|
||||
@ -292,6 +294,26 @@ bool UndoHistory::IsSavePoint() const {
|
||||
return savePoint == currentAction;
|
||||
}
|
||||
|
||||
void UndoHistory::TentativeStart() {
|
||||
tentativePoint = currentAction;
|
||||
}
|
||||
|
||||
void UndoHistory::TentativeCommit() {
|
||||
tentativePoint = -1;
|
||||
// Truncate undo history
|
||||
maxAction = currentAction;
|
||||
}
|
||||
|
||||
int UndoHistory::TentativeSteps() {
|
||||
// Drop any trailing startAction
|
||||
if (actions[currentAction].at == startAction && currentAction > 0)
|
||||
currentAction--;
|
||||
if (tentativePoint >= 0)
|
||||
return currentAction - tentativePoint;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
bool UndoHistory::CanUndo() const {
|
||||
return (currentAction > 0) && (maxAction > 0);
|
||||
}
|
||||
@ -356,7 +378,7 @@ char CellBuffer::CharAt(int position) const {
|
||||
}
|
||||
|
||||
void CellBuffer::GetCharRange(char *buffer, int position, int lengthRetrieve) const {
|
||||
if (lengthRetrieve < 0)
|
||||
if (lengthRetrieve <= 0)
|
||||
return;
|
||||
if (position < 0)
|
||||
return;
|
||||
@ -505,6 +527,22 @@ bool CellBuffer::IsSavePoint() const {
|
||||
return uh.IsSavePoint();
|
||||
}
|
||||
|
||||
void CellBuffer::TentativeStart() {
|
||||
uh.TentativeStart();
|
||||
}
|
||||
|
||||
void CellBuffer::TentativeCommit() {
|
||||
uh.TentativeCommit();
|
||||
}
|
||||
|
||||
int CellBuffer::TentativeSteps() {
|
||||
return uh.TentativeSteps();
|
||||
}
|
||||
|
||||
bool CellBuffer::TentativeActive() const {
|
||||
return uh.TentativeActive();
|
||||
}
|
||||
|
||||
// Without undo
|
||||
|
||||
void CellBuffer::InsertLine(int line, int position, bool lineStart) {
|
||||
|
@ -95,6 +95,7 @@ class UndoHistory {
|
||||
int currentAction;
|
||||
int undoSequenceDepth;
|
||||
int savePoint;
|
||||
int tentativePoint;
|
||||
|
||||
void EnsureUndoRoom();
|
||||
|
||||
@ -117,6 +118,12 @@ public:
|
||||
void SetSavePoint();
|
||||
bool IsSavePoint() const;
|
||||
|
||||
// Tentative actions are used for input composition so that it can be undone cleanly
|
||||
void TentativeStart();
|
||||
void TentativeCommit();
|
||||
bool TentativeActive() const { return tentativePoint >= 0; }
|
||||
int TentativeSteps();
|
||||
|
||||
/// To perform an undo, StartUndo is called to retrieve the number of steps, then UndoStep is
|
||||
/// called that many times. Similarly for redo.
|
||||
bool CanUndo() const;
|
||||
@ -193,6 +200,11 @@ public:
|
||||
void SetSavePoint();
|
||||
bool IsSavePoint() const;
|
||||
|
||||
void TentativeStart();
|
||||
void TentativeCommit();
|
||||
bool TentativeActive() const;
|
||||
int TentativeSteps();
|
||||
|
||||
bool SetUndoCollection(bool collectUndo);
|
||||
bool IsCollectingUndo() const;
|
||||
void BeginUndoAction();
|
||||
|
@ -150,8 +150,8 @@ bool ContractionState::GetVisible(int lineDoc) const {
|
||||
}
|
||||
}
|
||||
|
||||
bool ContractionState::SetVisible(int lineDocStart, int lineDocEnd, bool visible_) {
|
||||
if (OneToOne() && visible_) {
|
||||
bool ContractionState::SetVisible(int lineDocStart, int lineDocEnd, bool isVisible) {
|
||||
if (OneToOne() && isVisible) {
|
||||
return false;
|
||||
} else {
|
||||
EnsureData();
|
||||
@ -159,9 +159,9 @@ bool ContractionState::SetVisible(int lineDocStart, int lineDocEnd, bool visible
|
||||
Check();
|
||||
if ((lineDocStart <= lineDocEnd) && (lineDocStart >= 0) && (lineDocEnd < LinesInDoc())) {
|
||||
for (int line = lineDocStart; line <= lineDocEnd; line++) {
|
||||
if (GetVisible(line) != visible_) {
|
||||
int difference = visible_ ? heights->ValueAt(line) : -heights->ValueAt(line);
|
||||
visible->SetValueAt(line, visible_ ? 1 : 0);
|
||||
if (GetVisible(line) != isVisible) {
|
||||
int difference = isVisible ? heights->ValueAt(line) : -heights->ValueAt(line);
|
||||
visible->SetValueAt(line, isVisible ? 1 : 0);
|
||||
displayLines->InsertText(line, difference);
|
||||
delta += difference;
|
||||
}
|
||||
@ -191,13 +191,13 @@ bool ContractionState::GetExpanded(int lineDoc) const {
|
||||
}
|
||||
}
|
||||
|
||||
bool ContractionState::SetExpanded(int lineDoc, bool expanded_) {
|
||||
if (OneToOne() && expanded_) {
|
||||
bool ContractionState::SetExpanded(int lineDoc, bool isExpanded) {
|
||||
if (OneToOne() && isExpanded) {
|
||||
return false;
|
||||
} else {
|
||||
EnsureData();
|
||||
if (expanded_ != (expanded->ValueAt(lineDoc) == 1)) {
|
||||
expanded->SetValueAt(lineDoc, expanded_ ? 1 : 0);
|
||||
if (isExpanded != (expanded->ValueAt(lineDoc) == 1)) {
|
||||
expanded->SetValueAt(lineDoc, isExpanded ? 1 : 0);
|
||||
Check();
|
||||
return true;
|
||||
} else {
|
||||
|
@ -48,11 +48,11 @@ public:
|
||||
void DeleteLines(int lineDoc, int lineCount);
|
||||
|
||||
bool GetVisible(int lineDoc) const;
|
||||
bool SetVisible(int lineDocStart, int lineDocEnd, bool visible);
|
||||
bool SetVisible(int lineDocStart, int lineDocEnd, bool isVisible);
|
||||
bool HiddenLines() const;
|
||||
|
||||
bool GetExpanded(int lineDoc) const;
|
||||
bool SetExpanded(int lineDoc, bool expanded);
|
||||
bool SetExpanded(int lineDoc, bool isExpanded);
|
||||
int ContractedNext(int lineDocStart) const;
|
||||
|
||||
int GetHeight(int lineDoc) const;
|
||||
|
@ -163,7 +163,9 @@ int DecorationList::AllOnFor(int position) const {
|
||||
int mask = 0;
|
||||
for (Decoration *deco=root; deco; deco = deco->next) {
|
||||
if (deco->rs.ValueAt(position)) {
|
||||
mask |= 1 << deco->indicator;
|
||||
if (deco->indicator < INDIC_IME) {
|
||||
mask |= 1 << deco->indicator;
|
||||
}
|
||||
}
|
||||
}
|
||||
return mask;
|
||||
|
@ -11,10 +11,15 @@
|
||||
#include <assert.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
|
||||
#ifdef CXX11_REGEX
|
||||
#include <regex>
|
||||
#endif
|
||||
|
||||
#include "Platform.h"
|
||||
|
||||
#include "ILexer.h"
|
||||
@ -209,6 +214,65 @@ void Document::SetSavePoint() {
|
||||
NotifySavePoint(true);
|
||||
}
|
||||
|
||||
void Document::TentativeUndo() {
|
||||
CheckReadOnly();
|
||||
if (enteredModification == 0) {
|
||||
enteredModification++;
|
||||
if (!cb.IsReadOnly()) {
|
||||
bool startSavePoint = cb.IsSavePoint();
|
||||
bool multiLine = false;
|
||||
int steps = cb.TentativeSteps();
|
||||
//Platform::DebugPrintf("Steps=%d\n", steps);
|
||||
for (int step = 0; step < steps; step++) {
|
||||
const int prevLinesTotal = LinesTotal();
|
||||
const Action &action = cb.GetUndoStep();
|
||||
if (action.at == removeAction) {
|
||||
NotifyModified(DocModification(
|
||||
SC_MOD_BEFOREINSERT | SC_PERFORMED_UNDO, action));
|
||||
} else if (action.at == containerAction) {
|
||||
DocModification dm(SC_MOD_CONTAINER | SC_PERFORMED_UNDO);
|
||||
dm.token = action.position;
|
||||
NotifyModified(dm);
|
||||
} else {
|
||||
NotifyModified(DocModification(
|
||||
SC_MOD_BEFOREDELETE | SC_PERFORMED_UNDO, action));
|
||||
}
|
||||
cb.PerformUndoStep();
|
||||
if (action.at != containerAction) {
|
||||
ModifiedAt(action.position);
|
||||
}
|
||||
|
||||
int modFlags = SC_PERFORMED_UNDO;
|
||||
// With undo, an insertion action becomes a deletion notification
|
||||
if (action.at == removeAction) {
|
||||
modFlags |= SC_MOD_INSERTTEXT;
|
||||
} else if (action.at == insertAction) {
|
||||
modFlags |= SC_MOD_DELETETEXT;
|
||||
}
|
||||
if (steps > 1)
|
||||
modFlags |= SC_MULTISTEPUNDOREDO;
|
||||
const int linesAdded = LinesTotal() - prevLinesTotal;
|
||||
if (linesAdded != 0)
|
||||
multiLine = true;
|
||||
if (step == steps - 1) {
|
||||
modFlags |= SC_LASTSTEPINUNDOREDO;
|
||||
if (multiLine)
|
||||
modFlags |= SC_MULTILINEUNDOREDO;
|
||||
}
|
||||
NotifyModified(DocModification(modFlags, action.position, action.lenData,
|
||||
linesAdded, action.data));
|
||||
}
|
||||
|
||||
bool endSavePoint = cb.IsSavePoint();
|
||||
if (startSavePoint != endSavePoint)
|
||||
NotifySavePoint(endSavePoint);
|
||||
|
||||
cb.TentativeCommit();
|
||||
}
|
||||
enteredModification--;
|
||||
}
|
||||
}
|
||||
|
||||
int Document::GetMark(int line) {
|
||||
return static_cast<LineMarkers *>(perLineData[ldMarkers])->MarkValue(line);
|
||||
}
|
||||
@ -276,6 +340,10 @@ int SCI_METHOD Document::LineStart(int line) const {
|
||||
return cb.LineStart(line);
|
||||
}
|
||||
|
||||
bool Document::IsLineStartPosition(int position) const {
|
||||
return LineStart(LineFromPosition(position)) == position;
|
||||
}
|
||||
|
||||
int SCI_METHOD Document::LineEnd(int line) const {
|
||||
if (line >= LinesTotal() - 1) {
|
||||
return LineStart(line + 1);
|
||||
@ -542,7 +610,7 @@ bool Document::InGoodUTF8(int pos, int &start, int &end) const {
|
||||
// When lines are terminated with \r\n pairs which should be treated as one character.
|
||||
// When displaying DBCS text such as Japanese.
|
||||
// If moving, move the position in the indicated direction.
|
||||
int Document::MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd) {
|
||||
int Document::MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd) const {
|
||||
//Platform::DebugPrintf("NoCRLF %d %d\n", pos, moveDir);
|
||||
// If out of range, just return minimum/maximum value.
|
||||
if (pos <= 0)
|
||||
@ -878,6 +946,8 @@ void Document::CheckReadOnly() {
|
||||
// SetStyleAt does not change the persistent state of a document
|
||||
|
||||
bool Document::DeleteChars(int pos, int len) {
|
||||
if (pos < 0)
|
||||
return false;
|
||||
if (len <= 0)
|
||||
return false;
|
||||
if ((pos + len) > Length())
|
||||
@ -1236,7 +1306,7 @@ int Document::GetColumn(int pos) {
|
||||
return column;
|
||||
}
|
||||
|
||||
int Document::CountCharacters(int startPos, int endPos) {
|
||||
int Document::CountCharacters(int startPos, int endPos) const {
|
||||
startPos = MovePositionOutsideChar(startPos, 1, false);
|
||||
endPos = MovePositionOutsideChar(endPos, -1, false);
|
||||
int count = 0;
|
||||
@ -1525,6 +1595,25 @@ void Document::SetCaseFolder(CaseFolder *pcf_) {
|
||||
pcf = pcf_;
|
||||
}
|
||||
|
||||
Document::CharacterExtracted Document::ExtractCharacter(int position) const {
|
||||
const unsigned char leadByte = static_cast<unsigned char>(cb.CharAt(position));
|
||||
if (UTF8IsAscii(leadByte)) {
|
||||
// Common case: ASCII character
|
||||
return CharacterExtracted(leadByte, 1);
|
||||
}
|
||||
const int widthCharBytes = UTF8BytesOfLead[leadByte];
|
||||
unsigned char charBytes[UTF8MaxBytes] = { leadByte, 0, 0, 0 };
|
||||
for (int b=1; b<widthCharBytes; b++)
|
||||
charBytes[b] = static_cast<unsigned char>(cb.CharAt(position + b));
|
||||
int utf8status = UTF8Classify(charBytes, widthCharBytes);
|
||||
if (utf8status & UTF8MaskInvalid) {
|
||||
// Treat as invalid and use up just one byte
|
||||
return CharacterExtracted(unicodeReplacementChar, 1);
|
||||
} else {
|
||||
return CharacterExtracted(UnicodeFromBytes(charBytes), utf8status & UTF8MaskWidth);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Find text in document, supporting both forward and backward
|
||||
* searches (just pass minPos > maxPos to do a backward search)
|
||||
@ -2116,6 +2205,61 @@ private:
|
||||
std::string substituted;
|
||||
};
|
||||
|
||||
namespace {
|
||||
|
||||
/**
|
||||
* RESearchRange keeps track of search range.
|
||||
*/
|
||||
class RESearchRange {
|
||||
public:
|
||||
const Document *doc;
|
||||
int increment;
|
||||
int startPos;
|
||||
int endPos;
|
||||
int lineRangeStart;
|
||||
int lineRangeEnd;
|
||||
int lineRangeBreak;
|
||||
RESearchRange(const Document *doc_, int minPos, int maxPos) : doc(doc_) {
|
||||
increment = (minPos <= maxPos) ? 1 : -1;
|
||||
|
||||
// Range endpoints should not be inside DBCS characters, but just in case, move them.
|
||||
startPos = doc->MovePositionOutsideChar(minPos, 1, false);
|
||||
endPos = doc->MovePositionOutsideChar(maxPos, 1, false);
|
||||
|
||||
lineRangeStart = doc->LineFromPosition(startPos);
|
||||
lineRangeEnd = doc->LineFromPosition(endPos);
|
||||
if ((increment == 1) &&
|
||||
(startPos >= doc->LineEnd(lineRangeStart)) &&
|
||||
(lineRangeStart < lineRangeEnd)) {
|
||||
// the start position is at end of line or between line end characters.
|
||||
lineRangeStart++;
|
||||
startPos = doc->LineStart(lineRangeStart);
|
||||
} else if ((increment == -1) &&
|
||||
(startPos <= doc->LineStart(lineRangeStart)) &&
|
||||
(lineRangeStart > lineRangeEnd)) {
|
||||
// the start position is at beginning of line.
|
||||
lineRangeStart--;
|
||||
startPos = doc->LineEnd(lineRangeStart);
|
||||
}
|
||||
lineRangeBreak = lineRangeEnd + increment;
|
||||
}
|
||||
Range LineRange(int line) const {
|
||||
Range range(doc->LineStart(line), doc->LineEnd(line));
|
||||
if (increment == 1) {
|
||||
if (line == lineRangeStart)
|
||||
range.start = startPos;
|
||||
if (line == lineRangeEnd)
|
||||
range.end = endPos;
|
||||
} else {
|
||||
if (line == lineRangeEnd)
|
||||
range.start = endPos;
|
||||
if (line == lineRangeStart)
|
||||
range.end = startPos;
|
||||
}
|
||||
return range;
|
||||
}
|
||||
};
|
||||
|
||||
// Define a way for the Regular Expression code to access the document
|
||||
class DocumentIndexer : public CharacterIndexer {
|
||||
Document *pdoc;
|
||||
@ -2136,18 +2280,375 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
#ifdef CXX11_REGEX
|
||||
|
||||
class ByteIterator : public std::iterator<std::bidirectional_iterator_tag, char> {
|
||||
public:
|
||||
const Document *doc;
|
||||
Position position;
|
||||
ByteIterator(const Document *doc_ = 0, Position position_ = 0) : doc(doc_), position(position_) {
|
||||
}
|
||||
ByteIterator(const ByteIterator &other) {
|
||||
doc = other.doc;
|
||||
position = other.position;
|
||||
}
|
||||
ByteIterator &operator=(const ByteIterator &other) {
|
||||
if (this != &other) {
|
||||
doc = other.doc;
|
||||
position = other.position;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
char operator*() const {
|
||||
return doc->CharAt(position);
|
||||
}
|
||||
ByteIterator &operator++() {
|
||||
position++;
|
||||
return *this;
|
||||
}
|
||||
ByteIterator operator++(int) {
|
||||
ByteIterator retVal(*this);
|
||||
position++;
|
||||
return retVal;
|
||||
}
|
||||
ByteIterator &operator--() {
|
||||
position--;
|
||||
return *this;
|
||||
}
|
||||
bool operator==(const ByteIterator &other) const {
|
||||
return doc == other.doc && position == other.position;
|
||||
}
|
||||
bool operator!=(const ByteIterator &other) const {
|
||||
return doc != other.doc || position != other.position;
|
||||
}
|
||||
int Pos() const {
|
||||
return position;
|
||||
}
|
||||
int PosRoundUp() const {
|
||||
return position;
|
||||
}
|
||||
};
|
||||
|
||||
// On Windows, wchar_t is 16 bits wide and on Unix it is 32 bits wide.
|
||||
// Would be better to use sizeof(wchar_t) or similar to differentiate
|
||||
// but easier for now to hard-code platforms.
|
||||
// C++11 has char16_t and char32_t but neither Clang nor Visual C++
|
||||
// appear to allow specializing basic_regex over these.
|
||||
|
||||
#ifdef _WIN32
|
||||
#define WCHAR_T_IS_16 1
|
||||
#else
|
||||
#define WCHAR_T_IS_16 0
|
||||
#endif
|
||||
|
||||
#if WCHAR_T_IS_16
|
||||
|
||||
// On Windows, report non-BMP characters as 2 separate surrogates as that
|
||||
// matches wregex since it is based on wchar_t.
|
||||
class UTF8Iterator : public std::iterator<std::bidirectional_iterator_tag, wchar_t> {
|
||||
// These 3 fields determine the iterator position and are used for comparisons
|
||||
const Document *doc;
|
||||
Position position;
|
||||
size_t characterIndex;
|
||||
// Remaining fields are derived from the determining fields so are excluded in comparisons
|
||||
unsigned int lenBytes;
|
||||
size_t lenCharacters;
|
||||
wchar_t buffered[2];
|
||||
public:
|
||||
UTF8Iterator(const Document *doc_ = 0, Position position_ = 0) :
|
||||
doc(doc_), position(position_), characterIndex(0), lenBytes(0), lenCharacters(0) {
|
||||
buffered[0] = 0;
|
||||
buffered[1] = 0;
|
||||
}
|
||||
UTF8Iterator(const UTF8Iterator &other) {
|
||||
doc = other.doc;
|
||||
position = other.position;
|
||||
characterIndex = other.characterIndex;
|
||||
lenBytes = other.lenBytes;
|
||||
lenCharacters = other.lenCharacters;
|
||||
buffered[0] = other.buffered[0];
|
||||
buffered[1] = other.buffered[1];
|
||||
}
|
||||
UTF8Iterator &operator=(const UTF8Iterator &other) {
|
||||
if (this != &other) {
|
||||
doc = other.doc;
|
||||
position = other.position;
|
||||
characterIndex = other.characterIndex;
|
||||
lenBytes = other.lenBytes;
|
||||
lenCharacters = other.lenCharacters;
|
||||
buffered[0] = other.buffered[0];
|
||||
buffered[1] = other.buffered[1];
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
wchar_t operator*() {
|
||||
if (lenCharacters == 0) {
|
||||
ReadCharacter();
|
||||
}
|
||||
return buffered[characterIndex];
|
||||
}
|
||||
UTF8Iterator &operator++() {
|
||||
if ((characterIndex + 1) < (lenCharacters)) {
|
||||
characterIndex++;
|
||||
} else {
|
||||
position += lenBytes;
|
||||
ReadCharacter();
|
||||
characterIndex = 0;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
UTF8Iterator operator++(int) {
|
||||
UTF8Iterator retVal(*this);
|
||||
if ((characterIndex + 1) < (lenCharacters)) {
|
||||
characterIndex++;
|
||||
} else {
|
||||
position += lenBytes;
|
||||
ReadCharacter();
|
||||
characterIndex = 0;
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
UTF8Iterator &operator--() {
|
||||
if (characterIndex) {
|
||||
characterIndex--;
|
||||
} else {
|
||||
position = doc->NextPosition(position, -1);
|
||||
ReadCharacter();
|
||||
characterIndex = lenCharacters - 1;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
bool operator==(const UTF8Iterator &other) const {
|
||||
// Only test the determining fields, not the character widths and values derived from this
|
||||
return doc == other.doc &&
|
||||
position == other.position &&
|
||||
characterIndex == other.characterIndex;
|
||||
}
|
||||
bool operator!=(const UTF8Iterator &other) const {
|
||||
// Only test the determining fields, not the character widths and values derived from this
|
||||
return doc != other.doc ||
|
||||
position != other.position ||
|
||||
characterIndex != other.characterIndex;
|
||||
}
|
||||
int Pos() const {
|
||||
return position;
|
||||
}
|
||||
int PosRoundUp() const {
|
||||
if (characterIndex)
|
||||
return position + lenBytes; // Force to end of character
|
||||
else
|
||||
return position;
|
||||
}
|
||||
private:
|
||||
void ReadCharacter() {
|
||||
Document::CharacterExtracted charExtracted = doc->ExtractCharacter(position);
|
||||
lenBytes = charExtracted.widthBytes;
|
||||
if (charExtracted.character == unicodeReplacementChar) {
|
||||
lenCharacters = 1;
|
||||
buffered[0] = static_cast<wchar_t>(charExtracted.character);
|
||||
} else {
|
||||
lenCharacters = UTF16FromUTF32Character(charExtracted.character, buffered);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
#else
|
||||
|
||||
// On Unix, report non-BMP characters as single characters
|
||||
|
||||
class UTF8Iterator : public std::iterator<std::bidirectional_iterator_tag, wchar_t> {
|
||||
const Document *doc;
|
||||
Position position;
|
||||
public:
|
||||
UTF8Iterator(const Document *doc_=0, Position position_=0) : doc(doc_), position(position_) {
|
||||
}
|
||||
UTF8Iterator(const UTF8Iterator &other) {
|
||||
doc = other.doc;
|
||||
position = other.position;
|
||||
}
|
||||
UTF8Iterator &operator=(const UTF8Iterator &other) {
|
||||
if (this != &other) {
|
||||
doc = other.doc;
|
||||
position = other.position;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
wchar_t operator*() const {
|
||||
Document::CharacterExtracted charExtracted = doc->ExtractCharacter(position);
|
||||
return charExtracted.character;
|
||||
}
|
||||
UTF8Iterator &operator++() {
|
||||
position = doc->NextPosition(position, 1);
|
||||
return *this;
|
||||
}
|
||||
UTF8Iterator operator++(int) {
|
||||
UTF8Iterator retVal(*this);
|
||||
position = doc->NextPosition(position, 1);
|
||||
return retVal;
|
||||
}
|
||||
UTF8Iterator &operator--() {
|
||||
position = doc->NextPosition(position, -1);
|
||||
return *this;
|
||||
}
|
||||
bool operator==(const UTF8Iterator &other) const {
|
||||
return doc == other.doc && position == other.position;
|
||||
}
|
||||
bool operator!=(const UTF8Iterator &other) const {
|
||||
return doc != other.doc || position != other.position;
|
||||
}
|
||||
int Pos() const {
|
||||
return position;
|
||||
}
|
||||
int PosRoundUp() const {
|
||||
return position;
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
std::regex_constants::match_flag_type MatchFlags(const Document *doc, int startPos, int endPos) {
|
||||
std::regex_constants::match_flag_type flagsMatch = std::regex_constants::match_default;
|
||||
if (!doc->IsLineStartPosition(startPos))
|
||||
flagsMatch |= std::regex_constants::match_not_bol;
|
||||
if (!doc->IsLineEndPosition(endPos))
|
||||
flagsMatch |= std::regex_constants::match_not_eol;
|
||||
return flagsMatch;
|
||||
}
|
||||
|
||||
template<typename Iterator, typename Regex>
|
||||
bool MatchOnLines(const Document *doc, const Regex ®exp, const RESearchRange &resr, RESearch &search) {
|
||||
bool matched = false;
|
||||
std::match_results<Iterator> match;
|
||||
|
||||
// MSVC and libc++ have problems with ^ and $ matching line ends inside a range
|
||||
// If they didn't then the line by line iteration could be removed for the forwards
|
||||
// case and replaced with the following 4 lines:
|
||||
// Iterator uiStart(doc, startPos);
|
||||
// Iterator uiEnd(doc, endPos);
|
||||
// flagsMatch = MatchFlags(doc, startPos, endPos);
|
||||
// matched = std::regex_search(uiStart, uiEnd, match, regexp, flagsMatch);
|
||||
|
||||
// Line by line.
|
||||
for (int line = resr.lineRangeStart; line != resr.lineRangeBreak; line += resr.increment) {
|
||||
const Range lineRange = resr.LineRange(line);
|
||||
Iterator itStart(doc, lineRange.start);
|
||||
Iterator itEnd(doc, lineRange.end);
|
||||
std::regex_constants::match_flag_type flagsMatch = MatchFlags(doc, lineRange.start, lineRange.end);
|
||||
matched = std::regex_search(itStart, itEnd, match, regexp, flagsMatch);
|
||||
// Check for the last match on this line.
|
||||
if (matched) {
|
||||
if (resr.increment == -1) {
|
||||
while (matched) {
|
||||
Iterator itNext(doc, match[0].second.PosRoundUp());
|
||||
flagsMatch = MatchFlags(doc, itNext.Pos(), lineRange.end);
|
||||
std::match_results<Iterator> matchNext;
|
||||
matched = std::regex_search(itNext, itEnd, matchNext, regexp, flagsMatch);
|
||||
if (matched) {
|
||||
if (match[0].first == match[0].second) {
|
||||
// Empty match means failure so exit
|
||||
return false;
|
||||
}
|
||||
match = matchNext;
|
||||
}
|
||||
}
|
||||
matched = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (matched) {
|
||||
for (size_t co = 0; co < match.size(); co++) {
|
||||
search.bopat[co] = match[co].first.Pos();
|
||||
search.eopat[co] = match[co].second.PosRoundUp();
|
||||
size_t lenMatch = search.eopat[co] - search.bopat[co];
|
||||
search.pat[co].resize(lenMatch);
|
||||
for (size_t iPos = 0; iPos < lenMatch; iPos++) {
|
||||
search.pat[co][iPos] = doc->CharAt(iPos + search.bopat[co]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return matched;
|
||||
}
|
||||
|
||||
long Cxx11RegexFindText(Document *doc, int minPos, int maxPos, const char *s,
|
||||
bool caseSensitive, int *length, RESearch &search) {
|
||||
const RESearchRange resr(doc, minPos, maxPos);
|
||||
try {
|
||||
//ElapsedTime et;
|
||||
std::regex::flag_type flagsRe = std::regex::ECMAScript;
|
||||
// Flags that apper to have no effect:
|
||||
// | std::regex::collate | std::regex::extended;
|
||||
if (!caseSensitive)
|
||||
flagsRe = flagsRe | std::regex::icase;
|
||||
|
||||
// Clear the RESearch so can fill in matches
|
||||
search.Clear();
|
||||
|
||||
bool matched = false;
|
||||
if (SC_CP_UTF8 == doc->dbcsCodePage) {
|
||||
unsigned int lenS = static_cast<unsigned int>(strlen(s));
|
||||
std::vector<wchar_t> ws(lenS + 1);
|
||||
#if WCHAR_T_IS_16
|
||||
size_t outLen = UTF16FromUTF8(s, lenS, &ws[0], lenS);
|
||||
#else
|
||||
size_t outLen = UTF32FromUTF8(s, lenS, reinterpret_cast<unsigned int *>(&ws[0]), lenS);
|
||||
#endif
|
||||
ws[outLen] = 0;
|
||||
std::wregex regexp;
|
||||
#if defined(__APPLE__)
|
||||
// Using a UTF-8 locale doesn't change to Unicode over a byte buffer so '.'
|
||||
// is one byte not one character.
|
||||
// However, on OS X this makes wregex act as Unicode
|
||||
std::locale localeU("en_US.UTF-8");
|
||||
regexp.imbue(localeU);
|
||||
#endif
|
||||
regexp.assign(&ws[0], flagsRe);
|
||||
matched = MatchOnLines<UTF8Iterator>(doc, regexp, resr, search);
|
||||
|
||||
} else {
|
||||
std::regex regexp;
|
||||
regexp.assign(s, flagsRe);
|
||||
matched = MatchOnLines<ByteIterator>(doc, regexp, resr, search);
|
||||
}
|
||||
|
||||
int posMatch = -1;
|
||||
if (matched) {
|
||||
posMatch = search.bopat[0];
|
||||
*length = search.eopat[0] - search.bopat[0];
|
||||
}
|
||||
// Example - search in doc/ScintillaHistory.html for
|
||||
// [[:upper:]]eta[[:space:]]
|
||||
// On MacBook, normally around 1 second but with locale imbued -> 14 seconds.
|
||||
//double durSearch = et.Duration(true);
|
||||
//Platform::DebugPrintf("Search:%9.6g \n", durSearch);
|
||||
return posMatch;
|
||||
} catch (std::regex_error &) {
|
||||
// Failed to create regular expression
|
||||
throw RegexError();
|
||||
} catch (...) {
|
||||
// Failed in some other way
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
long BuiltinRegex::FindText(Document *doc, int minPos, int maxPos, const char *s,
|
||||
bool caseSensitive, bool, bool, int flags,
|
||||
int *length) {
|
||||
bool posix = (flags & SCFIND_POSIX) != 0;
|
||||
int increment = (minPos <= maxPos) ? 1 : -1;
|
||||
|
||||
int startPos = minPos;
|
||||
int endPos = maxPos;
|
||||
#ifdef CXX11_REGEX
|
||||
if (flags & SCFIND_CXX11REGEX) {
|
||||
return Cxx11RegexFindText(doc, minPos, maxPos, s,
|
||||
caseSensitive, length, search);
|
||||
}
|
||||
#endif
|
||||
|
||||
// Range endpoints should not be inside DBCS characters, but just in case, move them.
|
||||
startPos = doc->MovePositionOutsideChar(startPos, 1, false);
|
||||
endPos = doc->MovePositionOutsideChar(endPos, 1, false);
|
||||
const RESearchRange resr(doc, minPos, maxPos);
|
||||
|
||||
const bool posix = (flags & SCFIND_POSIX) != 0;
|
||||
|
||||
const char *errmsg = search.Compile(s, *length, caseSensitive, posix);
|
||||
if (errmsg) {
|
||||
@ -2157,50 +2658,34 @@ long BuiltinRegex::FindText(Document *doc, int minPos, int maxPos, const char *s
|
||||
// Replace first '.' with '-' in each property file variable reference:
|
||||
// Search: \$(\([A-Za-z0-9_-]+\)\.\([A-Za-z0-9_.]+\))
|
||||
// Replace: $(\1-\2)
|
||||
int lineRangeStart = doc->LineFromPosition(startPos);
|
||||
int lineRangeEnd = doc->LineFromPosition(endPos);
|
||||
if ((increment == 1) &&
|
||||
(startPos >= doc->LineEnd(lineRangeStart)) &&
|
||||
(lineRangeStart < lineRangeEnd)) {
|
||||
// the start position is at end of line or between line end characters.
|
||||
lineRangeStart++;
|
||||
startPos = doc->LineStart(lineRangeStart);
|
||||
} else if ((increment == -1) &&
|
||||
(startPos <= doc->LineStart(lineRangeStart)) &&
|
||||
(lineRangeStart > lineRangeEnd)) {
|
||||
// the start position is at beginning of line.
|
||||
lineRangeStart--;
|
||||
startPos = doc->LineEnd(lineRangeStart);
|
||||
}
|
||||
int pos = -1;
|
||||
int lenRet = 0;
|
||||
char searchEnd = s[*length - 1];
|
||||
char searchEndPrev = (*length > 1) ? s[*length - 2] : '\0';
|
||||
int lineRangeBreak = lineRangeEnd + increment;
|
||||
for (int line = lineRangeStart; line != lineRangeBreak; line += increment) {
|
||||
const char searchEnd = s[*length - 1];
|
||||
const char searchEndPrev = (*length > 1) ? s[*length - 2] : '\0';
|
||||
for (int line = resr.lineRangeStart; line != resr.lineRangeBreak; line += resr.increment) {
|
||||
int startOfLine = doc->LineStart(line);
|
||||
int endOfLine = doc->LineEnd(line);
|
||||
if (increment == 1) {
|
||||
if (line == lineRangeStart) {
|
||||
if ((startPos != startOfLine) && (s[0] == '^'))
|
||||
if (resr.increment == 1) {
|
||||
if (line == resr.lineRangeStart) {
|
||||
if ((resr.startPos != startOfLine) && (s[0] == '^'))
|
||||
continue; // Can't match start of line if start position after start of line
|
||||
startOfLine = startPos;
|
||||
startOfLine = resr.startPos;
|
||||
}
|
||||
if (line == lineRangeEnd) {
|
||||
if ((endPos != endOfLine) && (searchEnd == '$') && (searchEndPrev != '\\'))
|
||||
if (line == resr.lineRangeEnd) {
|
||||
if ((resr.endPos != endOfLine) && (searchEnd == '$') && (searchEndPrev != '\\'))
|
||||
continue; // Can't match end of line if end position before end of line
|
||||
endOfLine = endPos;
|
||||
endOfLine = resr.endPos;
|
||||
}
|
||||
} else {
|
||||
if (line == lineRangeEnd) {
|
||||
if ((endPos != startOfLine) && (s[0] == '^'))
|
||||
if (line == resr.lineRangeEnd) {
|
||||
if ((resr.endPos != startOfLine) && (s[0] == '^'))
|
||||
continue; // Can't match start of line if end position after start of line
|
||||
startOfLine = endPos;
|
||||
startOfLine = resr.endPos;
|
||||
}
|
||||
if (line == lineRangeStart) {
|
||||
if ((startPos != endOfLine) && (searchEnd == '$') && (searchEndPrev != '\\'))
|
||||
if (line == resr.lineRangeStart) {
|
||||
if ((resr.startPos != endOfLine) && (searchEnd == '$') && (searchEndPrev != '\\'))
|
||||
continue; // Can't match end of line if start position before end of line
|
||||
endOfLine = startPos;
|
||||
endOfLine = resr.startPos;
|
||||
}
|
||||
}
|
||||
|
||||
@ -2212,7 +2697,7 @@ long BuiltinRegex::FindText(Document *doc, int minPos, int maxPos, const char *s
|
||||
search.eopat[0] = doc->MovePositionOutsideChar(search.eopat[0], 1, false);
|
||||
lenRet = search.eopat[0] - search.bopat[0];
|
||||
// There can be only one start of a line, so no need to look for last match in line
|
||||
if ((increment == -1) && (s[0] != '^')) {
|
||||
if ((resr.increment == -1) && (s[0] != '^')) {
|
||||
// Check for the last match on this line.
|
||||
int repetitions = 1000; // Break out of infinite loop
|
||||
while (success && (search.eopat[0] <= endOfLine) && (repetitions--)) {
|
||||
|
@ -188,6 +188,10 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
struct RegexError : public std::runtime_error {
|
||||
RegexError() : std::runtime_error("regex failure") {}
|
||||
};
|
||||
|
||||
/**
|
||||
*/
|
||||
class Document : PerLine, public IDocumentWithLineEnd, public ILoader {
|
||||
@ -271,7 +275,7 @@ public:
|
||||
bool IsCrLf(int pos) const;
|
||||
int LenChar(int pos);
|
||||
bool InGoodUTF8(int pos, int &start, int &end) const;
|
||||
int MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd=true);
|
||||
int MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd=true) const;
|
||||
int NextPosition(int pos, int moveDir) const;
|
||||
bool NextCharacter(int &pos, int moveDir) const; // Returns true if pos changed
|
||||
int SCI_METHOD GetRelativePosition(int positionStart, int characterOffset) const;
|
||||
@ -303,6 +307,12 @@ public:
|
||||
void AddUndoAction(int token, bool mayCoalesce) { cb.AddUndoAction(token, mayCoalesce); }
|
||||
void SetSavePoint();
|
||||
bool IsSavePoint() const { return cb.IsSavePoint(); }
|
||||
|
||||
void TentativeStart() { cb.TentativeStart(); }
|
||||
void TentativeCommit() { cb.TentativeCommit(); }
|
||||
void TentativeUndo();
|
||||
bool TentativeActive() const { return cb.TentativeActive(); }
|
||||
|
||||
const char * SCI_METHOD BufferPointer() { return cb.BufferPointer(); }
|
||||
const char *RangePointer(int position, int rangeLength) { return cb.RangePointer(position, rangeLength); }
|
||||
int GapPosition() const { return cb.GapPosition(); }
|
||||
@ -311,7 +321,7 @@ public:
|
||||
int SetLineIndentation(int line, int indent);
|
||||
int GetLineIndentPosition(int line) const;
|
||||
int GetColumn(int position);
|
||||
int CountCharacters(int startPos, int endPos);
|
||||
int CountCharacters(int startPos, int endPos) const;
|
||||
int FindColumn(int line, int column);
|
||||
void Indent(bool forwards, int lineBottom, int lineTop);
|
||||
static std::string TransformLineEnds(const char *s, size_t len, int eolModeWanted);
|
||||
@ -339,6 +349,7 @@ public:
|
||||
void DeleteAllMarks(int markerNum);
|
||||
int LineFromHandle(int markerHandle);
|
||||
int SCI_METHOD LineStart(int line) const;
|
||||
bool IsLineStartPosition(int position) const;
|
||||
int SCI_METHOD LineEnd(int line) const;
|
||||
int LineEndPosition(int position) const;
|
||||
bool IsLineEndPosition(int position) const;
|
||||
@ -358,6 +369,16 @@ public:
|
||||
int NextWordEnd(int pos, int delta);
|
||||
int SCI_METHOD Length() const { return cb.Length(); }
|
||||
void Allocate(int newSize) { cb.Allocate(newSize); }
|
||||
|
||||
struct CharacterExtracted {
|
||||
unsigned int character;
|
||||
unsigned int widthBytes;
|
||||
CharacterExtracted(unsigned int character_, unsigned int widthBytes_) :
|
||||
character(character_), widthBytes(widthBytes_) {
|
||||
}
|
||||
};
|
||||
CharacterExtracted ExtractCharacter(int position) const;
|
||||
|
||||
bool MatchesWordOptions(bool word, bool wordStart, int pos, int length) const;
|
||||
bool HasCaseFolder(void) const;
|
||||
void SetCaseFolder(CaseFolder *pcf_);
|
||||
@ -368,7 +389,7 @@ public:
|
||||
|
||||
void SetDefaultCharClasses(bool includeWordClass);
|
||||
void SetCharClasses(const unsigned char *chars, CharClassify::cc newCharClass);
|
||||
int GetCharsOfClass(CharClassify::cc charClass, unsigned char *buffer);
|
||||
int GetCharsOfClass(CharClassify::cc characterClass, unsigned char *buffer);
|
||||
void SCI_METHOD StartStyling(int position, char mask);
|
||||
bool SCI_METHOD SetStyleFor(int length, char style);
|
||||
bool SCI_METHOD SetStyles(int length, const char *styles);
|
||||
|
76
src/stc/scintilla/src/EditModel.cxx
Normal file
76
src/stc/scintilla/src/EditModel.cxx
Normal file
@ -0,0 +1,76 @@
|
||||
// Scintilla source code edit control
|
||||
/** @file EditModel.cxx
|
||||
** Defines the editor state that must be visible to EditorView.
|
||||
**/
|
||||
// Copyright 1998-2014 by Neil Hodgson <neilh@scintilla.org>
|
||||
// The License.txt file describes the conditions under which this software may be distributed.
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include <assert.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <algorithm>
|
||||
#include <memory>
|
||||
|
||||
#include "Platform.h"
|
||||
|
||||
#include "ILexer.h"
|
||||
#include "Scintilla.h"
|
||||
|
||||
#include "StringCopy.h"
|
||||
#include "SplitVector.h"
|
||||
#include "Partitioning.h"
|
||||
#include "RunStyles.h"
|
||||
#include "ContractionState.h"
|
||||
#include "CellBuffer.h"
|
||||
#include "KeyMap.h"
|
||||
#include "Indicator.h"
|
||||
#include "XPM.h"
|
||||
#include "LineMarker.h"
|
||||
#include "Style.h"
|
||||
#include "ViewStyle.h"
|
||||
#include "CharClassify.h"
|
||||
#include "Decoration.h"
|
||||
#include "CaseFolder.h"
|
||||
#include "Document.h"
|
||||
#include "UniConversion.h"
|
||||
#include "Selection.h"
|
||||
#include "PositionCache.h"
|
||||
#include "EditModel.h"
|
||||
|
||||
#ifdef SCI_NAMESPACE
|
||||
using namespace Scintilla;
|
||||
#endif
|
||||
|
||||
Caret::Caret() :
|
||||
active(false), on(false), period(500) {}
|
||||
|
||||
EditModel::EditModel() {
|
||||
inOverstrike = false;
|
||||
xOffset = 0;
|
||||
trackLineWidth = false;
|
||||
posDrag = SelectionPosition(invalidPosition);
|
||||
braces[0] = invalidPosition;
|
||||
braces[1] = invalidPosition;
|
||||
bracesMatchStyle = STYLE_BRACEBAD;
|
||||
highlightGuideColumn = 0;
|
||||
primarySelection = true;
|
||||
imeInteraction = imeWindowed;
|
||||
foldFlags = 0;
|
||||
hotspot = Range(invalidPosition);
|
||||
wrapWidth = LineLayout::wrapWidthInfinite;
|
||||
pdoc = new Document();
|
||||
pdoc->AddRef();
|
||||
}
|
||||
|
||||
EditModel::~EditModel() {
|
||||
pdoc->Release();
|
||||
pdoc = 0;
|
||||
}
|
69
src/stc/scintilla/src/EditModel.h
Normal file
69
src/stc/scintilla/src/EditModel.h
Normal file
@ -0,0 +1,69 @@
|
||||
// Scintilla source code edit control
|
||||
/** @file EditModel.h
|
||||
** Defines the editor state that must be visible to EditorView.
|
||||
**/
|
||||
// Copyright 1998-2014 by Neil Hodgson <neilh@scintilla.org>
|
||||
// The License.txt file describes the conditions under which this software may be distributed.
|
||||
|
||||
#ifndef EDITMODEL_H
|
||||
#define EDITMODEL_H
|
||||
|
||||
#ifdef SCI_NAMESPACE
|
||||
namespace Scintilla {
|
||||
#endif
|
||||
|
||||
/**
|
||||
*/
|
||||
class Caret {
|
||||
public:
|
||||
bool active;
|
||||
bool on;
|
||||
int period;
|
||||
|
||||
Caret();
|
||||
};
|
||||
|
||||
class EditModel {
|
||||
// Private so EditModel objects can not be copied
|
||||
EditModel(const EditModel &);
|
||||
EditModel &operator=(const EditModel &);
|
||||
|
||||
public:
|
||||
bool inOverstrike;
|
||||
int xOffset; ///< Horizontal scrolled amount in pixels
|
||||
bool trackLineWidth;
|
||||
|
||||
SpecialRepresentations reprs;
|
||||
Caret caret;
|
||||
SelectionPosition posDrag;
|
||||
Position braces[2];
|
||||
int bracesMatchStyle;
|
||||
int highlightGuideColumn;
|
||||
Selection sel;
|
||||
bool primarySelection;
|
||||
|
||||
enum IMEInteraction { imeWindowed, imeInline } imeInteraction;
|
||||
|
||||
int foldFlags;
|
||||
ContractionState cs;
|
||||
// Hotspot support
|
||||
Range hotspot;
|
||||
|
||||
// Wrapping support
|
||||
int wrapWidth;
|
||||
|
||||
Document *pdoc;
|
||||
|
||||
EditModel();
|
||||
virtual ~EditModel();
|
||||
virtual int TopLineOfMain() const = 0;
|
||||
virtual Point GetVisibleOriginInMain() const = 0;
|
||||
virtual int LinesOnScreen() const = 0;
|
||||
virtual Range GetHotSpotRange() const = 0;
|
||||
};
|
||||
|
||||
#ifdef SCI_NAMESPACE
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
2088
src/stc/scintilla/src/EditView.cxx
Normal file
2088
src/stc/scintilla/src/EditView.cxx
Normal file
File diff suppressed because it is too large
Load Diff
173
src/stc/scintilla/src/EditView.h
Normal file
173
src/stc/scintilla/src/EditView.h
Normal file
@ -0,0 +1,173 @@
|
||||
// Scintilla source code edit control
|
||||
/** @file EditView.h
|
||||
** Defines the appearance of the main text area of the editor window.
|
||||
**/
|
||||
// Copyright 1998-2014 by Neil Hodgson <neilh@scintilla.org>
|
||||
// The License.txt file describes the conditions under which this software may be distributed.
|
||||
|
||||
#ifndef EDITVIEW_H
|
||||
#define EDITVIEW_H
|
||||
|
||||
#ifdef SCI_NAMESPACE
|
||||
namespace Scintilla {
|
||||
#endif
|
||||
|
||||
struct PrintParameters {
|
||||
int magnification;
|
||||
int colourMode;
|
||||
WrapMode wrapState;
|
||||
PrintParameters();
|
||||
};
|
||||
|
||||
/**
|
||||
* The view may be drawn in separate phases.
|
||||
*/
|
||||
enum DrawPhase {
|
||||
drawBack = 0x1,
|
||||
drawIndicatorsBack = 0x2,
|
||||
drawText = 0x4,
|
||||
drawIndentationGuides = 0x8,
|
||||
drawIndicatorsFore = 0x10,
|
||||
drawSelectionTranslucent = 0x20,
|
||||
drawLineTranslucent = 0x40,
|
||||
drawFoldLines = 0x80,
|
||||
drawCarets = 0x100,
|
||||
drawAll = 0x1FF
|
||||
};
|
||||
|
||||
bool ValidStyledText(const ViewStyle &vs, size_t styleOffset, const StyledText &st);
|
||||
int WidestLineWidth(Surface *surface, const ViewStyle &vs, int styleOffset, const StyledText &st);
|
||||
void DrawTextNoClipPhase(Surface *surface, PRectangle rc, const Style &style, XYPOSITION ybase,
|
||||
const char *s, int len, DrawPhase phase);
|
||||
void DrawStyledText(Surface *surface, const ViewStyle &vs, int styleOffset, PRectangle rcText,
|
||||
const StyledText &st, size_t start, size_t length, DrawPhase phase);
|
||||
|
||||
typedef void (*DrawTabArrowFn)(Surface *surface, PRectangle rcTab, int ymid);
|
||||
|
||||
/**
|
||||
* EditView draws the main text area.
|
||||
*/
|
||||
class EditView {
|
||||
public:
|
||||
PrintParameters printParameters;
|
||||
PerLine *ldTabstops;
|
||||
|
||||
bool hideSelection;
|
||||
bool drawOverstrikeCaret;
|
||||
|
||||
/** In bufferedDraw mode, graphics operations are drawn to a pixmap and then copied to
|
||||
* the screen. This avoids flashing but is about 30% slower. */
|
||||
bool bufferedDraw;
|
||||
/** In phasesTwo mode, drawing is performed in two phases, first the background
|
||||
* and then the foreground. This avoids chopping off characters that overlap the next run.
|
||||
* In multiPhaseDraw mode, drawing is performed in multiple phases with each phase drawing
|
||||
* one feature over the whole drawing area, instead of within one line. This allows text to
|
||||
* overlap from one line to the next. */
|
||||
enum PhasesDraw { phasesOne, phasesTwo, phasesMultiple };
|
||||
PhasesDraw phasesDraw;
|
||||
|
||||
int lineWidthMaxSeen;
|
||||
|
||||
bool additionalCaretsBlink;
|
||||
bool additionalCaretsVisible;
|
||||
|
||||
bool imeCaretBlockOverride;
|
||||
|
||||
Surface *pixmapLine;
|
||||
Surface *pixmapIndentGuide;
|
||||
Surface *pixmapIndentGuideHighlight;
|
||||
|
||||
LineLayoutCache llc;
|
||||
PositionCache posCache;
|
||||
|
||||
int tabArrowHeight; // draw arrow heads this many pixels above/below line midpoint
|
||||
/** Some platforms, notably PLAT_CURSES, do not support Scintilla's native
|
||||
* DrawTabArrow function for drawing tab characters. Allow those platforms to
|
||||
* override it instead of creating a new method in the Surface class that
|
||||
* existing platforms must implement as empty. */
|
||||
DrawTabArrowFn customDrawTabArrow;
|
||||
DrawWrapMarkerFn customDrawWrapMarker;
|
||||
|
||||
EditView();
|
||||
virtual ~EditView();
|
||||
|
||||
bool SetTwoPhaseDraw(bool twoPhaseDraw);
|
||||
bool SetPhasesDraw(int phases);
|
||||
bool LinesOverlap() const;
|
||||
|
||||
void ClearAllTabstops();
|
||||
XYPOSITION NextTabstopPos(int line, XYPOSITION x, XYPOSITION tabWidth) const;
|
||||
bool ClearTabstops(int line);
|
||||
bool AddTabstop(int line, int x);
|
||||
int GetNextTabstop(int line, int x) const;
|
||||
void LinesAddedOrRemoved(int lineOfPos, int linesAdded);
|
||||
|
||||
void DropGraphics(bool freeObjects);
|
||||
void AllocateGraphics(const ViewStyle &vsDraw);
|
||||
void RefreshPixMaps(Surface *surfaceWindow, WindowID wid, const ViewStyle &vsDraw);
|
||||
|
||||
LineLayout *RetrieveLineLayout(int lineNumber, const EditModel &model);
|
||||
void LayoutLine(const EditModel &model, int line, Surface *surface, const ViewStyle &vstyle,
|
||||
LineLayout *ll, int width = LineLayout::wrapWidthInfinite);
|
||||
|
||||
Point LocationFromPosition(Surface *surface, const EditModel &model, SelectionPosition pos, int topLine, const ViewStyle &vs);
|
||||
SelectionPosition SPositionFromLocation(Surface *surface, const EditModel &model, Point pt, bool canReturnInvalid,
|
||||
bool charPosition, bool virtualSpace, const ViewStyle &vs);
|
||||
SelectionPosition SPositionFromLineX(Surface *surface, const EditModel &model, int lineDoc, int x, const ViewStyle &vs);
|
||||
int DisplayFromPosition(Surface *surface, const EditModel &model, int pos, const ViewStyle &vs);
|
||||
int StartEndDisplayLine(Surface *surface, const EditModel &model, int pos, bool start, const ViewStyle &vs);
|
||||
|
||||
void DrawIndentGuide(Surface *surface, int lineVisible, int lineHeight, int start, PRectangle rcSegment, bool highlight);
|
||||
void DrawEOL(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, PRectangle rcLine,
|
||||
int line, int lineEnd, int xStart, int subLine, XYACCUMULATOR subLineStart,
|
||||
ColourOptional background);
|
||||
void DrawAnnotation(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll,
|
||||
int line, int xStart, PRectangle rcLine, int subLine, DrawPhase phase);
|
||||
void DrawCarets(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, int line,
|
||||
int xStart, PRectangle rcLine, int subLine) const;
|
||||
void DrawBackground(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, PRectangle rcLine,
|
||||
Range lineRange, int posLineStart, int xStart,
|
||||
int subLine, ColourOptional background) const;
|
||||
void DrawForeground(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, int lineVisible,
|
||||
PRectangle rcLine, Range lineRange, int posLineStart, int xStart,
|
||||
int subLine, ColourOptional background);
|
||||
void DrawIndentGuidesOverEmpty(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll,
|
||||
int line, int lineVisible, PRectangle rcLine, int xStart, int subLine);
|
||||
void DrawLine(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, int line,
|
||||
int lineVisible, int xStart, PRectangle rcLine, int subLine, DrawPhase phase);
|
||||
void PaintText(Surface *surfaceWindow, const EditModel &model, PRectangle rcArea, PRectangle rcClient,
|
||||
const ViewStyle &vsDraw);
|
||||
long FormatRange(bool draw, Sci_RangeToFormat *pfr, Surface *surface, Surface *surfaceMeasure,
|
||||
const EditModel &model, const ViewStyle &vs);
|
||||
};
|
||||
|
||||
/**
|
||||
* Convenience class to ensure LineLayout objects are always disposed.
|
||||
*/
|
||||
class AutoLineLayout {
|
||||
LineLayoutCache &llc;
|
||||
LineLayout *ll;
|
||||
AutoLineLayout &operator=(const AutoLineLayout &);
|
||||
public:
|
||||
AutoLineLayout(LineLayoutCache &llc_, LineLayout *ll_) : llc(llc_), ll(ll_) {}
|
||||
~AutoLineLayout() {
|
||||
llc.Dispose(ll);
|
||||
ll = 0;
|
||||
}
|
||||
LineLayout *operator->() const {
|
||||
return ll;
|
||||
}
|
||||
operator LineLayout *() const {
|
||||
return ll;
|
||||
}
|
||||
void Set(LineLayout *ll_) {
|
||||
llc.Dispose(ll);
|
||||
ll = ll_;
|
||||
}
|
||||
};
|
||||
|
||||
#ifdef SCI_NAMESPACE
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
@ -12,17 +12,6 @@
|
||||
namespace Scintilla {
|
||||
#endif
|
||||
|
||||
/**
|
||||
*/
|
||||
class Caret {
|
||||
public:
|
||||
bool active;
|
||||
bool on;
|
||||
int period;
|
||||
|
||||
Caret();
|
||||
};
|
||||
|
||||
/**
|
||||
*/
|
||||
class Timer {
|
||||
@ -160,16 +149,9 @@ struct WrapPending {
|
||||
}
|
||||
};
|
||||
|
||||
struct PrintParameters {
|
||||
int magnification;
|
||||
int colourMode;
|
||||
WrapMode wrapState;
|
||||
PrintParameters();
|
||||
};
|
||||
|
||||
/**
|
||||
*/
|
||||
class Editor : public DocWatcher {
|
||||
class Editor : public EditModel, public DocWatcher {
|
||||
// Private so Editor objects can not be copied
|
||||
Editor(const Editor &);
|
||||
Editor &operator=(const Editor &);
|
||||
@ -189,32 +171,17 @@ protected: // ScintillaBase subclass needs access to much of Editor
|
||||
Point sizeRGBAImage;
|
||||
float scaleRGBAImage;
|
||||
|
||||
PrintParameters printParameters;
|
||||
MarginView marginView;
|
||||
EditView view;
|
||||
|
||||
int cursorMode;
|
||||
|
||||
// Highlight current folding block
|
||||
HighlightDelimiter highlightDelimiter;
|
||||
|
||||
bool hasFocus;
|
||||
bool hideSelection;
|
||||
bool inOverstrike;
|
||||
bool drawOverstrikeCaret;
|
||||
bool mouseDownCaptures;
|
||||
|
||||
/** In bufferedDraw mode, graphics operations are drawn to a pixmap and then copied to
|
||||
* the screen. This avoids flashing but is about 30% slower. */
|
||||
bool bufferedDraw;
|
||||
/** In twoPhaseDraw mode, drawing is performed in two phases, first the background
|
||||
* and then the foreground. This avoids chopping off characters that overlap the next run. */
|
||||
bool twoPhaseDraw;
|
||||
|
||||
int xOffset; ///< Horizontal scrolled amount in pixels
|
||||
int xCaretMargin; ///< Ensure this many pixels visible on both sides of caret
|
||||
bool horizontalScrollBarVisible;
|
||||
int scrollWidth;
|
||||
bool trackLineWidth;
|
||||
int lineWidthMaxSeen;
|
||||
bool verticalScrollBarVisible;
|
||||
bool endAtLastLine;
|
||||
int caretSticky;
|
||||
@ -223,25 +190,11 @@ protected: // ScintillaBase subclass needs access to much of Editor
|
||||
bool multipleSelection;
|
||||
bool additionalSelectionTyping;
|
||||
int multiPasteMode;
|
||||
bool additionalCaretsBlink;
|
||||
bool additionalCaretsVisible;
|
||||
|
||||
int virtualSpaceOptions;
|
||||
|
||||
Surface *pixmapLine;
|
||||
Surface *pixmapSelMargin;
|
||||
Surface *pixmapSelPattern;
|
||||
Surface *pixmapSelPatternOffset1;
|
||||
Surface *pixmapIndentGuide;
|
||||
Surface *pixmapIndentGuideHighlight;
|
||||
|
||||
LineLayoutCache llc;
|
||||
PositionCache posCache;
|
||||
SpecialRepresentations reprs;
|
||||
|
||||
KeyMap kmap;
|
||||
|
||||
Caret caret;
|
||||
Timer timer;
|
||||
Timer autoScrollTimer;
|
||||
enum { autoScrollDelay = 200 };
|
||||
@ -250,6 +203,7 @@ protected: // ScintillaBase subclass needs access to much of Editor
|
||||
|
||||
Point lastClick;
|
||||
unsigned int lastClickTime;
|
||||
Point doubleClickCloseThreshold;
|
||||
int dwellDelay;
|
||||
int ticksToDwell;
|
||||
bool dwelling;
|
||||
@ -257,7 +211,6 @@ protected: // ScintillaBase subclass needs access to much of Editor
|
||||
Point ptMouseLast;
|
||||
enum { ddNone, ddInitial, ddDragging } inDragDrop;
|
||||
bool dropWentOutside;
|
||||
SelectionPosition posDrag;
|
||||
SelectionPosition posDrop;
|
||||
int hotSpotClickPos;
|
||||
int lastXChosen;
|
||||
@ -274,9 +227,6 @@ protected: // ScintillaBase subclass needs access to much of Editor
|
||||
int lengthForEncode;
|
||||
|
||||
int needUpdateUI;
|
||||
Position braces[2];
|
||||
int bracesMatchStyle;
|
||||
int highlightGuideColumn;
|
||||
|
||||
enum { notPainting, painting, paintAbandoned } paintState;
|
||||
bool paintAbandonedByStyling;
|
||||
@ -288,8 +238,6 @@ protected: // ScintillaBase subclass needs access to much of Editor
|
||||
int modEventMask;
|
||||
|
||||
SelectionText drag;
|
||||
Selection sel;
|
||||
bool primarySelection;
|
||||
|
||||
int caretXPolicy;
|
||||
int caretXSlop; ///< Ensure this many pixels visible on both sides of caret
|
||||
@ -304,21 +252,13 @@ protected: // ScintillaBase subclass needs access to much of Editor
|
||||
|
||||
bool recordingMacro;
|
||||
|
||||
int foldFlags;
|
||||
int foldAutomatic;
|
||||
ContractionState cs;
|
||||
|
||||
// Hotspot support
|
||||
Range hotspot;
|
||||
|
||||
// Wrapping support
|
||||
int wrapWidth;
|
||||
WrapPending wrapPending;
|
||||
|
||||
bool convertPastes;
|
||||
|
||||
Document *pdoc;
|
||||
|
||||
Editor();
|
||||
virtual ~Editor();
|
||||
virtual void Initialise() = 0;
|
||||
@ -333,23 +273,23 @@ protected: // ScintillaBase subclass needs access to much of Editor
|
||||
|
||||
// The top left visible point in main window coordinates. Will be 0,0 except for
|
||||
// scroll views where it will be equivalent to the current scroll position.
|
||||
virtual Point GetVisibleOriginInMain();
|
||||
Point DocumentPointFromView(Point ptView); // Convert a point from view space to document
|
||||
virtual Point GetVisibleOriginInMain() const;
|
||||
Point DocumentPointFromView(Point ptView) const; // Convert a point from view space to document
|
||||
int TopLineOfMain() const; // Return the line at Main's y coordinate 0
|
||||
virtual PRectangle GetClientRectangle();
|
||||
virtual PRectangle GetClientRectangle() const;
|
||||
virtual PRectangle GetClientDrawingRectangle();
|
||||
PRectangle GetTextRectangle();
|
||||
PRectangle GetTextRectangle() const;
|
||||
|
||||
int LinesOnScreen();
|
||||
int LinesToScroll();
|
||||
int MaxScrollPos();
|
||||
virtual int LinesOnScreen() const;
|
||||
int LinesToScroll() const;
|
||||
int MaxScrollPos() const;
|
||||
SelectionPosition ClampPositionIntoDocument(SelectionPosition sp) const;
|
||||
Point LocationFromPosition(SelectionPosition pos);
|
||||
Point LocationFromPosition(int pos);
|
||||
int XFromPosition(int pos);
|
||||
int XFromPosition(SelectionPosition sp);
|
||||
SelectionPosition SPositionFromLocation(Point pt, bool canReturnInvalid=false, bool charPosition=false, bool virtualSpace=true);
|
||||
int PositionFromLocation(Point pt, bool canReturnInvalid=false, bool charPosition=false);
|
||||
int PositionFromLocation(Point pt, bool canReturnInvalid = false, bool charPosition = false);
|
||||
SelectionPosition SPositionFromLineX(int lineDoc, int x);
|
||||
int PositionFromLineX(int line, int x);
|
||||
int LineFromLocation(Point pt) const;
|
||||
@ -360,7 +300,7 @@ protected: // ScintillaBase subclass needs access to much of Editor
|
||||
virtual void DiscardOverdraw();
|
||||
virtual void Redraw();
|
||||
void RedrawSelMargin(int line=-1, bool allAfter=false);
|
||||
PRectangle RectangleFromRange(Range r);
|
||||
PRectangle RectangleFromRange(Range r, int overlap);
|
||||
void InvalidateRange(int start, int end);
|
||||
|
||||
bool UserVirtualSpace() const {
|
||||
@ -383,8 +323,8 @@ protected: // ScintillaBase subclass needs access to much of Editor
|
||||
bool SelectionContainsProtected();
|
||||
int MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd=true) const;
|
||||
SelectionPosition MovePositionOutsideChar(SelectionPosition pos, int moveDir, bool checkLineEnd=true) const;
|
||||
int MovePositionTo(SelectionPosition newPos, Selection::selTypes sel=Selection::noSel, bool ensureVisible=true);
|
||||
int MovePositionTo(int newPos, Selection::selTypes sel=Selection::noSel, bool ensureVisible=true);
|
||||
int MovePositionTo(SelectionPosition newPos, Selection::selTypes selt=Selection::noSel, bool ensureVisible=true);
|
||||
int MovePositionTo(int newPos, Selection::selTypes selt=Selection::noSel, bool ensureVisible=true);
|
||||
SelectionPosition MovePositionSoVisible(SelectionPosition pos, int moveDir);
|
||||
SelectionPosition MovePositionSoVisible(int pos, int moveDir);
|
||||
Point PointMainCaret();
|
||||
@ -431,30 +371,7 @@ protected: // ScintillaBase subclass needs access to much of Editor
|
||||
void LinesJoin();
|
||||
void LinesSplit(int pixelWidth);
|
||||
|
||||
int SubstituteMarkerIfEmpty(int markerCheck, int markerDefault) const;
|
||||
void PaintSelMargin(Surface *surface, PRectangle &rc);
|
||||
LineLayout *RetrieveLineLayout(int lineNumber);
|
||||
void LayoutLine(int line, Surface *surface, const ViewStyle &vstyle, LineLayout *ll,
|
||||
int width=LineLayout::wrapWidthInfinite);
|
||||
ColourDesired SelectionBackground(const ViewStyle &vsDraw, bool main) const;
|
||||
ColourDesired TextBackground(const ViewStyle &vsDraw, ColourOptional background, int inSelection, bool inHotspot, int styleMain, int i, LineLayout *ll) const;
|
||||
void DrawIndentGuide(Surface *surface, int lineVisible, int lineHeight, int start, PRectangle rcSegment, bool highlight);
|
||||
static void DrawWrapMarker(Surface *surface, PRectangle rcPlace, bool isEndMarker, ColourDesired wrapColour);
|
||||
void DrawEOL(Surface *surface, const ViewStyle &vsDraw, PRectangle rcLine, LineLayout *ll,
|
||||
int line, int lineEnd, int xStart, int subLine, XYACCUMULATOR subLineStart,
|
||||
ColourOptional background);
|
||||
static void DrawIndicator(int indicNum, int startPos, int endPos, Surface *surface, const ViewStyle &vsDraw,
|
||||
int xStart, PRectangle rcLine, LineLayout *ll, int subLine);
|
||||
void DrawIndicators(Surface *surface, const ViewStyle &vsDraw, int line, int xStart,
|
||||
PRectangle rcLine, LineLayout *ll, int subLine, int lineEnd, bool under);
|
||||
void DrawAnnotation(Surface *surface, const ViewStyle &vsDraw, int line, int xStart,
|
||||
PRectangle rcLine, LineLayout *ll, int subLine);
|
||||
void DrawLine(Surface *surface, const ViewStyle &vsDraw, int line, int lineVisible, int xStart,
|
||||
PRectangle rcLine, LineLayout *ll, int subLine);
|
||||
void DrawBlockCaret(Surface *surface, const ViewStyle &vsDraw, LineLayout *ll, int subLine,
|
||||
int xStart, int offset, int posCaret, PRectangle rcCaret, ColourDesired caretColour) const;
|
||||
void DrawCarets(Surface *surface, const ViewStyle &vsDraw, int line, int xStart,
|
||||
PRectangle rcLine, LineLayout *ll, int subLine);
|
||||
void RefreshPixMaps(Surface *surfaceWindow);
|
||||
void Paint(Surface *surfaceWindow, PRectangle rcArea);
|
||||
long FormatRange(bool draw, Sci_RangeToFormat *pfr);
|
||||
@ -470,7 +387,7 @@ protected: // ScintillaBase subclass needs access to much of Editor
|
||||
void FilterSelections();
|
||||
int InsertSpace(int position, unsigned int spaces);
|
||||
void AddChar(char ch);
|
||||
virtual void AddCharUTF(char *s, unsigned int len, bool treatAsDBCS=false);
|
||||
virtual void AddCharUTF(const char *s, unsigned int len, bool treatAsDBCS=false);
|
||||
void InsertPaste(const char *text, int len);
|
||||
enum PasteShape { pasteStream=0, pasteRectangular = 1, pasteLine = 2 };
|
||||
void InsertPasteShape(const char *text, int len, PasteShape shape);
|
||||
@ -487,7 +404,6 @@ protected: // ScintillaBase subclass needs access to much of Editor
|
||||
void SelectAll();
|
||||
void Undo();
|
||||
void Redo();
|
||||
void DelChar();
|
||||
void DelCharBack(bool allowLineStartDeletion);
|
||||
virtual void ClaimSelection() = 0;
|
||||
|
||||
@ -530,7 +446,7 @@ protected: // ScintillaBase subclass needs access to much of Editor
|
||||
void NotifyMacroRecord(unsigned int iMessage, uptr_t wParam, sptr_t lParam);
|
||||
|
||||
void ContainerNeedsUpdate(int flags);
|
||||
void PageMove(int direction, Selection::selTypes sel=Selection::noSel, bool stuttered = false);
|
||||
void PageMove(int direction, Selection::selTypes selt=Selection::noSel, bool stuttered = false);
|
||||
enum { cmSame, cmUpper, cmLower };
|
||||
virtual std::string CaseMapString(const std::string &s, int caseMapping);
|
||||
void ChangeCaseOfSelection(int caseMapping);
|
||||
@ -538,8 +454,8 @@ protected: // ScintillaBase subclass needs access to much of Editor
|
||||
void Duplicate(bool forLine);
|
||||
virtual void CancelModes();
|
||||
void NewLine();
|
||||
void CursorUpOrDown(int direction, Selection::selTypes sel=Selection::noSel);
|
||||
void ParaUpOrDown(int direction, Selection::selTypes sel=Selection::noSel);
|
||||
void CursorUpOrDown(int direction, Selection::selTypes selt=Selection::noSel);
|
||||
void ParaUpOrDown(int direction, Selection::selTypes selt=Selection::noSel);
|
||||
int StartEndDisplayLine(int pos, bool start);
|
||||
virtual int KeyCommand(unsigned int iMessage);
|
||||
virtual int KeyDefault(int /* key */, int /*modifiers*/);
|
||||
@ -569,7 +485,7 @@ protected: // ScintillaBase subclass needs access to much of Editor
|
||||
/** PositionInSelection returns true if position in selection. */
|
||||
bool PositionInSelection(int pos);
|
||||
bool PointInSelection(Point pt);
|
||||
bool PointInSelMargin(Point pt);
|
||||
bool PointInSelMargin(Point pt) const;
|
||||
Window::Cursor GetMarginCursor(Point pt) const;
|
||||
void TrimAndSetSelection(int currentPos_, int anchor_);
|
||||
void LineSelection(int lineCurrentPos_, int lineAnchorPos_, bool wholeLine);
|
||||
@ -584,7 +500,13 @@ protected: // ScintillaBase subclass needs access to much of Editor
|
||||
|
||||
void Tick();
|
||||
bool Idle();
|
||||
virtual void SetTicking(bool on) = 0;
|
||||
virtual void SetTicking(bool on);
|
||||
enum TickReason { tickCaret, tickScroll, tickWiden, tickDwell, tickPlatform };
|
||||
virtual void TickFor(TickReason reason);
|
||||
virtual bool FineTickerAvailable();
|
||||
virtual bool FineTickerRunning(TickReason reason);
|
||||
virtual void FineTickerStart(TickReason reason, int millis, int tolerance);
|
||||
virtual void FineTickerCancel(TickReason reason);
|
||||
virtual bool SetIdle(bool) { return false; }
|
||||
virtual void SetMouseCapture(bool on) = 0;
|
||||
virtual bool HaveMouseCapture() = 0;
|
||||
|
@ -17,11 +17,14 @@ namespace Scintilla {
|
||||
class Indicator {
|
||||
public:
|
||||
int style;
|
||||
bool under;
|
||||
ColourDesired fore;
|
||||
bool under;
|
||||
int fillAlpha;
|
||||
int outlineAlpha;
|
||||
Indicator() : style(INDIC_PLAIN), under(false), fore(ColourDesired(0,0,0)), fillAlpha(30), outlineAlpha(50) {
|
||||
Indicator() : style(INDIC_PLAIN), fore(ColourDesired(0,0,0)), under(false), fillAlpha(30), outlineAlpha(50) {
|
||||
}
|
||||
Indicator(int style_, ColourDesired fore_=ColourDesired(0,0,0), bool under_=false, int fillAlpha_=30, int outlineAlpha_=50) :
|
||||
style(style_), fore(fore_), under(under_), fillAlpha(fillAlpha_), outlineAlpha(outlineAlpha_) {
|
||||
}
|
||||
void Draw(Surface *surface, const PRectangle &rc, const PRectangle &rcLine) const;
|
||||
};
|
||||
|
@ -72,23 +72,28 @@ static void DrawMinus(Surface *surface, int centreX, int centreY, int armSize, C
|
||||
}
|
||||
|
||||
void LineMarker::Draw(Surface *surface, PRectangle &rcWhole, Font &fontForCharacter, typeOfFold tFold, int marginStyle) const {
|
||||
ColourDesired head = back;
|
||||
ColourDesired body = back;
|
||||
ColourDesired tail = back;
|
||||
if (customDraw != NULL) {
|
||||
customDraw(surface, rcWhole, fontForCharacter, tFold, marginStyle, this);
|
||||
return;
|
||||
}
|
||||
|
||||
ColourDesired colourHead = back;
|
||||
ColourDesired colourBody = back;
|
||||
ColourDesired colourTail = back;
|
||||
|
||||
switch (tFold) {
|
||||
case LineMarker::head :
|
||||
case LineMarker::headWithTail :
|
||||
head = backSelected;
|
||||
tail = backSelected;
|
||||
colourHead = backSelected;
|
||||
colourTail = backSelected;
|
||||
break;
|
||||
case LineMarker::body :
|
||||
head = backSelected;
|
||||
body = backSelected;
|
||||
colourHead = backSelected;
|
||||
colourBody = backSelected;
|
||||
break;
|
||||
case LineMarker::tail :
|
||||
body = backSelected;
|
||||
tail = backSelected;
|
||||
colourBody = backSelected;
|
||||
colourTail = backSelected;
|
||||
break;
|
||||
default :
|
||||
// LineMarker::undefined
|
||||
@ -192,69 +197,69 @@ void LineMarker::Draw(Surface *surface, PRectangle &rcWhole, Font &fontForCharac
|
||||
// An invisible marker so don't draw anything
|
||||
|
||||
} else if (markType == SC_MARK_VLINE) {
|
||||
surface->PenColour(body);
|
||||
surface->PenColour(colourBody);
|
||||
surface->MoveTo(centreX, static_cast<int>(rcWhole.top));
|
||||
surface->LineTo(centreX, static_cast<int>(rcWhole.bottom));
|
||||
|
||||
} else if (markType == SC_MARK_LCORNER) {
|
||||
surface->PenColour(tail);
|
||||
surface->PenColour(colourTail);
|
||||
surface->MoveTo(centreX, static_cast<int>(rcWhole.top));
|
||||
surface->LineTo(centreX, centreY);
|
||||
surface->LineTo(static_cast<int>(rc.right) - 1, centreY);
|
||||
|
||||
} else if (markType == SC_MARK_TCORNER) {
|
||||
surface->PenColour(tail);
|
||||
surface->PenColour(colourTail);
|
||||
surface->MoveTo(centreX, centreY);
|
||||
surface->LineTo(static_cast<int>(rc.right) - 1, centreY);
|
||||
|
||||
surface->PenColour(body);
|
||||
surface->PenColour(colourBody);
|
||||
surface->MoveTo(centreX, static_cast<int>(rcWhole.top));
|
||||
surface->LineTo(centreX, centreY + 1);
|
||||
|
||||
surface->PenColour(head);
|
||||
surface->PenColour(colourHead);
|
||||
surface->LineTo(centreX, static_cast<int>(rcWhole.bottom));
|
||||
|
||||
} else if (markType == SC_MARK_LCORNERCURVE) {
|
||||
surface->PenColour(tail);
|
||||
surface->PenColour(colourTail);
|
||||
surface->MoveTo(centreX, static_cast<int>(rcWhole.top));
|
||||
surface->LineTo(centreX, centreY-3);
|
||||
surface->LineTo(centreX+3, centreY);
|
||||
surface->LineTo(static_cast<int>(rc.right) - 1, centreY);
|
||||
|
||||
} else if (markType == SC_MARK_TCORNERCURVE) {
|
||||
surface->PenColour(tail);
|
||||
surface->PenColour(colourTail);
|
||||
surface->MoveTo(centreX, centreY-3);
|
||||
surface->LineTo(centreX+3, centreY);
|
||||
surface->LineTo(static_cast<int>(rc.right) - 1, centreY);
|
||||
|
||||
surface->PenColour(body);
|
||||
surface->PenColour(colourBody);
|
||||
surface->MoveTo(centreX, static_cast<int>(rcWhole.top));
|
||||
surface->LineTo(centreX, centreY-2);
|
||||
|
||||
surface->PenColour(head);
|
||||
surface->PenColour(colourHead);
|
||||
surface->LineTo(centreX, static_cast<int>(rcWhole.bottom));
|
||||
|
||||
} else if (markType == SC_MARK_BOXPLUS) {
|
||||
DrawBox(surface, centreX, centreY, blobSize, fore, head);
|
||||
DrawPlus(surface, centreX, centreY, blobSize, tail);
|
||||
DrawBox(surface, centreX, centreY, blobSize, fore, colourHead);
|
||||
DrawPlus(surface, centreX, centreY, blobSize, colourTail);
|
||||
|
||||
} else if (markType == SC_MARK_BOXPLUSCONNECTED) {
|
||||
if (tFold == LineMarker::headWithTail)
|
||||
surface->PenColour(tail);
|
||||
surface->PenColour(colourTail);
|
||||
else
|
||||
surface->PenColour(body);
|
||||
surface->PenColour(colourBody);
|
||||
surface->MoveTo(centreX, centreY + blobSize);
|
||||
surface->LineTo(centreX, static_cast<int>(rcWhole.bottom));
|
||||
|
||||
surface->PenColour(body);
|
||||
surface->PenColour(colourBody);
|
||||
surface->MoveTo(centreX, static_cast<int>(rcWhole.top));
|
||||
surface->LineTo(centreX, centreY - blobSize);
|
||||
|
||||
DrawBox(surface, centreX, centreY, blobSize, fore, head);
|
||||
DrawPlus(surface, centreX, centreY, blobSize, tail);
|
||||
DrawBox(surface, centreX, centreY, blobSize, fore, colourHead);
|
||||
DrawPlus(surface, centreX, centreY, blobSize, colourTail);
|
||||
|
||||
if (tFold == LineMarker::body) {
|
||||
surface->PenColour(tail);
|
||||
surface->PenColour(colourTail);
|
||||
surface->MoveTo(centreX + 1, centreY + blobSize);
|
||||
surface->LineTo(centreX + blobSize + 1, centreY + blobSize);
|
||||
|
||||
@ -265,27 +270,27 @@ void LineMarker::Draw(Surface *surface, PRectangle &rcWhole, Font &fontForCharac
|
||||
surface->LineTo(centreX + blobSize + 1, centreY - blobSize);
|
||||
}
|
||||
} else if (markType == SC_MARK_BOXMINUS) {
|
||||
DrawBox(surface, centreX, centreY, blobSize, fore, head);
|
||||
DrawMinus(surface, centreX, centreY, blobSize, tail);
|
||||
DrawBox(surface, centreX, centreY, blobSize, fore, colourHead);
|
||||
DrawMinus(surface, centreX, centreY, blobSize, colourTail);
|
||||
|
||||
surface->PenColour(head);
|
||||
surface->PenColour(colourHead);
|
||||
surface->MoveTo(centreX, centreY + blobSize);
|
||||
surface->LineTo(centreX, static_cast<int>(rcWhole.bottom));
|
||||
|
||||
} else if (markType == SC_MARK_BOXMINUSCONNECTED) {
|
||||
DrawBox(surface, centreX, centreY, blobSize, fore, head);
|
||||
DrawMinus(surface, centreX, centreY, blobSize, tail);
|
||||
DrawBox(surface, centreX, centreY, blobSize, fore, colourHead);
|
||||
DrawMinus(surface, centreX, centreY, blobSize, colourTail);
|
||||
|
||||
surface->PenColour(head);
|
||||
surface->PenColour(colourHead);
|
||||
surface->MoveTo(centreX, centreY + blobSize);
|
||||
surface->LineTo(centreX, static_cast<int>(rcWhole.bottom));
|
||||
|
||||
surface->PenColour(body);
|
||||
surface->PenColour(colourBody);
|
||||
surface->MoveTo(centreX, static_cast<int>(rcWhole.top));
|
||||
surface->LineTo(centreX, centreY - blobSize);
|
||||
|
||||
if (tFold == LineMarker::body) {
|
||||
surface->PenColour(tail);
|
||||
surface->PenColour(colourTail);
|
||||
surface->MoveTo(centreX + 1, centreY + blobSize);
|
||||
surface->LineTo(centreX + blobSize + 1, centreY + blobSize);
|
||||
|
||||
@ -296,43 +301,43 @@ void LineMarker::Draw(Surface *surface, PRectangle &rcWhole, Font &fontForCharac
|
||||
surface->LineTo(centreX + blobSize + 1, centreY - blobSize);
|
||||
}
|
||||
} else if (markType == SC_MARK_CIRCLEPLUS) {
|
||||
DrawCircle(surface, centreX, centreY, blobSize, fore, head);
|
||||
DrawPlus(surface, centreX, centreY, blobSize, tail);
|
||||
DrawCircle(surface, centreX, centreY, blobSize, fore, colourHead);
|
||||
DrawPlus(surface, centreX, centreY, blobSize, colourTail);
|
||||
|
||||
} else if (markType == SC_MARK_CIRCLEPLUSCONNECTED) {
|
||||
if (tFold == LineMarker::headWithTail)
|
||||
surface->PenColour(tail);
|
||||
surface->PenColour(colourTail);
|
||||
else
|
||||
surface->PenColour(body);
|
||||
surface->PenColour(colourBody);
|
||||
surface->MoveTo(centreX, centreY + blobSize);
|
||||
surface->LineTo(centreX, static_cast<int>(rcWhole.bottom));
|
||||
|
||||
surface->PenColour(body);
|
||||
surface->PenColour(colourBody);
|
||||
surface->MoveTo(centreX, static_cast<int>(rcWhole.top));
|
||||
surface->LineTo(centreX, centreY - blobSize);
|
||||
|
||||
DrawCircle(surface, centreX, centreY, blobSize, fore, head);
|
||||
DrawPlus(surface, centreX, centreY, blobSize, tail);
|
||||
DrawCircle(surface, centreX, centreY, blobSize, fore, colourHead);
|
||||
DrawPlus(surface, centreX, centreY, blobSize, colourTail);
|
||||
|
||||
} else if (markType == SC_MARK_CIRCLEMINUS) {
|
||||
surface->PenColour(head);
|
||||
surface->PenColour(colourHead);
|
||||
surface->MoveTo(centreX, centreY + blobSize);
|
||||
surface->LineTo(centreX, static_cast<int>(rcWhole.bottom));
|
||||
|
||||
DrawCircle(surface, centreX, centreY, blobSize, fore, head);
|
||||
DrawMinus(surface, centreX, centreY, blobSize, tail);
|
||||
DrawCircle(surface, centreX, centreY, blobSize, fore, colourHead);
|
||||
DrawMinus(surface, centreX, centreY, blobSize, colourTail);
|
||||
|
||||
} else if (markType == SC_MARK_CIRCLEMINUSCONNECTED) {
|
||||
surface->PenColour(head);
|
||||
surface->PenColour(colourHead);
|
||||
surface->MoveTo(centreX, centreY + blobSize);
|
||||
surface->LineTo(centreX, static_cast<int>(rcWhole.bottom));
|
||||
|
||||
surface->PenColour(body);
|
||||
surface->PenColour(colourBody);
|
||||
surface->MoveTo(centreX, static_cast<int>(rcWhole.top));
|
||||
surface->LineTo(centreX, centreY - blobSize);
|
||||
|
||||
DrawCircle(surface, centreX, centreY, blobSize, fore, head);
|
||||
DrawMinus(surface, centreX, centreY, blobSize, tail);
|
||||
DrawCircle(surface, centreX, centreY, blobSize, fore, colourHead);
|
||||
DrawMinus(surface, centreX, centreY, blobSize, colourTail);
|
||||
|
||||
} else if (markType >= SC_MARK_CHARACTER) {
|
||||
char character[1];
|
||||
|
@ -12,6 +12,8 @@
|
||||
namespace Scintilla {
|
||||
#endif
|
||||
|
||||
typedef void (*DrawLineMarkerFn)(Surface *surface, PRectangle &rcWhole, Font &fontForCharacter, int tFold, int marginStyle, const void *lineMarker);
|
||||
|
||||
/**
|
||||
*/
|
||||
class LineMarker {
|
||||
@ -25,6 +27,11 @@ public:
|
||||
int alpha;
|
||||
XPM *pxpm;
|
||||
RGBAImage *image;
|
||||
/** Some platforms, notably PLAT_CURSES, do not support Scintilla's native
|
||||
* Draw function for drawing line markers. Allow those platforms to override
|
||||
* it instead of creating a new method(s) in the Surface class that existing
|
||||
* platforms must implement as empty. */
|
||||
DrawLineMarkerFn customDraw;
|
||||
LineMarker() {
|
||||
markType = SC_MARK_CIRCLE;
|
||||
fore = ColourDesired(0,0,0);
|
||||
@ -33,6 +40,7 @@ public:
|
||||
alpha = SC_ALPHA_NOALPHA;
|
||||
pxpm = NULL;
|
||||
image = NULL;
|
||||
customDraw = NULL;
|
||||
}
|
||||
LineMarker(const LineMarker &) {
|
||||
// Defined to avoid pxpm being blindly copied, not as a complete copy constructor
|
||||
@ -43,6 +51,7 @@ public:
|
||||
alpha = SC_ALPHA_NOALPHA;
|
||||
pxpm = NULL;
|
||||
image = NULL;
|
||||
customDraw = NULL;
|
||||
}
|
||||
~LineMarker() {
|
||||
delete pxpm;
|
||||
@ -60,6 +69,7 @@ public:
|
||||
pxpm = NULL;
|
||||
delete image;
|
||||
image = NULL;
|
||||
customDraw = NULL;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
462
src/stc/scintilla/src/MarginView.cxx
Normal file
462
src/stc/scintilla/src/MarginView.cxx
Normal file
@ -0,0 +1,462 @@
|
||||
// Scintilla source code edit control
|
||||
/** @file MarginView.cxx
|
||||
** Defines the appearance of the editor margin.
|
||||
**/
|
||||
// Copyright 1998-2014 by Neil Hodgson <neilh@scintilla.org>
|
||||
// The License.txt file describes the conditions under which this software may be distributed.
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include <assert.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <algorithm>
|
||||
#include <memory>
|
||||
|
||||
#include "Platform.h"
|
||||
|
||||
#include "ILexer.h"
|
||||
#include "Scintilla.h"
|
||||
|
||||
#include "StringCopy.h"
|
||||
#include "SplitVector.h"
|
||||
#include "Partitioning.h"
|
||||
#include "RunStyles.h"
|
||||
#include "ContractionState.h"
|
||||
#include "CellBuffer.h"
|
||||
#include "KeyMap.h"
|
||||
#include "Indicator.h"
|
||||
#include "XPM.h"
|
||||
#include "LineMarker.h"
|
||||
#include "Style.h"
|
||||
#include "ViewStyle.h"
|
||||
#include "CharClassify.h"
|
||||
#include "Decoration.h"
|
||||
#include "CaseFolder.h"
|
||||
#include "Document.h"
|
||||
#include "UniConversion.h"
|
||||
#include "Selection.h"
|
||||
#include "PositionCache.h"
|
||||
#include "EditModel.h"
|
||||
#include "MarginView.h"
|
||||
#include "EditView.h"
|
||||
|
||||
#ifdef SCI_NAMESPACE
|
||||
using namespace Scintilla;
|
||||
#endif
|
||||
|
||||
#ifdef SCI_NAMESPACE
|
||||
namespace Scintilla {
|
||||
#endif
|
||||
|
||||
void DrawWrapMarker(Surface *surface, PRectangle rcPlace,
|
||||
bool isEndMarker, ColourDesired wrapColour) {
|
||||
surface->PenColour(wrapColour);
|
||||
|
||||
enum { xa = 1 }; // gap before start
|
||||
int w = static_cast<int>(rcPlace.right - rcPlace.left) - xa - 1;
|
||||
|
||||
bool xStraight = isEndMarker; // x-mirrored symbol for start marker
|
||||
|
||||
int x0 = static_cast<int>(xStraight ? rcPlace.left : rcPlace.right - 1);
|
||||
int y0 = static_cast<int>(rcPlace.top);
|
||||
|
||||
int dy = static_cast<int>(rcPlace.bottom - rcPlace.top) / 5;
|
||||
int y = static_cast<int>(rcPlace.bottom - rcPlace.top) / 2 + dy;
|
||||
|
||||
struct Relative {
|
||||
Surface *surface;
|
||||
int xBase;
|
||||
int xDir;
|
||||
int yBase;
|
||||
int yDir;
|
||||
void MoveTo(int xRelative, int yRelative) {
|
||||
surface->MoveTo(xBase + xDir * xRelative, yBase + yDir * yRelative);
|
||||
}
|
||||
void LineTo(int xRelative, int yRelative) {
|
||||
surface->LineTo(xBase + xDir * xRelative, yBase + yDir * yRelative);
|
||||
}
|
||||
};
|
||||
Relative rel = { surface, x0, xStraight ? 1 : -1, y0, 1 };
|
||||
|
||||
// arrow head
|
||||
rel.MoveTo(xa, y);
|
||||
rel.LineTo(xa + 2 * w / 3, y - dy);
|
||||
rel.MoveTo(xa, y);
|
||||
rel.LineTo(xa + 2 * w / 3, y + dy);
|
||||
|
||||
// arrow body
|
||||
rel.MoveTo(xa, y);
|
||||
rel.LineTo(xa + w, y);
|
||||
rel.LineTo(xa + w, y - 2 * dy);
|
||||
rel.LineTo(xa - 1, // on windows lineto is exclusive endpoint, perhaps GTK not...
|
||||
y - 2 * dy);
|
||||
}
|
||||
|
||||
MarginView::MarginView() {
|
||||
pixmapSelMargin = 0;
|
||||
pixmapSelPattern = 0;
|
||||
pixmapSelPatternOffset1 = 0;
|
||||
wrapMarkerPaddingRight = 3;
|
||||
customDrawWrapMarker = NULL;
|
||||
}
|
||||
|
||||
void MarginView::DropGraphics(bool freeObjects) {
|
||||
if (freeObjects) {
|
||||
delete pixmapSelMargin;
|
||||
pixmapSelMargin = 0;
|
||||
delete pixmapSelPattern;
|
||||
pixmapSelPattern = 0;
|
||||
delete pixmapSelPatternOffset1;
|
||||
pixmapSelPatternOffset1 = 0;
|
||||
} else {
|
||||
if (pixmapSelMargin)
|
||||
pixmapSelMargin->Release();
|
||||
if (pixmapSelPattern)
|
||||
pixmapSelPattern->Release();
|
||||
if (pixmapSelPatternOffset1)
|
||||
pixmapSelPatternOffset1->Release();
|
||||
}
|
||||
}
|
||||
|
||||
void MarginView::AllocateGraphics(const ViewStyle &vsDraw) {
|
||||
if (!pixmapSelMargin)
|
||||
pixmapSelMargin = Surface::Allocate(vsDraw.technology);
|
||||
if (!pixmapSelPattern)
|
||||
pixmapSelPattern = Surface::Allocate(vsDraw.technology);
|
||||
if (!pixmapSelPatternOffset1)
|
||||
pixmapSelPatternOffset1 = Surface::Allocate(vsDraw.technology);
|
||||
}
|
||||
|
||||
void MarginView::RefreshPixMaps(Surface *surfaceWindow, WindowID wid, const ViewStyle &vsDraw) {
|
||||
if (!pixmapSelPattern->Initialised()) {
|
||||
const int patternSize = 8;
|
||||
pixmapSelPattern->InitPixMap(patternSize, patternSize, surfaceWindow, wid);
|
||||
pixmapSelPatternOffset1->InitPixMap(patternSize, patternSize, surfaceWindow, wid);
|
||||
// This complex procedure is to reproduce the checkerboard dithered pattern used by windows
|
||||
// for scroll bars and Visual Studio for its selection margin. The colour of this pattern is half
|
||||
// way between the chrome colour and the chrome highlight colour making a nice transition
|
||||
// between the window chrome and the content area. And it works in low colour depths.
|
||||
PRectangle rcPattern = PRectangle::FromInts(0, 0, patternSize, patternSize);
|
||||
|
||||
// Initialize default colours based on the chrome colour scheme. Typically the highlight is white.
|
||||
ColourDesired colourFMFill = vsDraw.selbar;
|
||||
ColourDesired colourFMStripes = vsDraw.selbarlight;
|
||||
|
||||
if (!(vsDraw.selbarlight == ColourDesired(0xff, 0xff, 0xff))) {
|
||||
// User has chosen an unusual chrome colour scheme so just use the highlight edge colour.
|
||||
// (Typically, the highlight colour is white.)
|
||||
colourFMFill = vsDraw.selbarlight;
|
||||
}
|
||||
|
||||
if (vsDraw.foldmarginColour.isSet) {
|
||||
// override default fold margin colour
|
||||
colourFMFill = vsDraw.foldmarginColour;
|
||||
}
|
||||
if (vsDraw.foldmarginHighlightColour.isSet) {
|
||||
// override default fold margin highlight colour
|
||||
colourFMStripes = vsDraw.foldmarginHighlightColour;
|
||||
}
|
||||
|
||||
pixmapSelPattern->FillRectangle(rcPattern, colourFMFill);
|
||||
pixmapSelPatternOffset1->FillRectangle(rcPattern, colourFMStripes);
|
||||
for (int y = 0; y < patternSize; y++) {
|
||||
for (int x = y % 2; x < patternSize; x += 2) {
|
||||
PRectangle rcPixel = PRectangle::FromInts(x, y, x + 1, y + 1);
|
||||
pixmapSelPattern->FillRectangle(rcPixel, colourFMStripes);
|
||||
pixmapSelPatternOffset1->FillRectangle(rcPixel, colourFMFill);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int SubstituteMarkerIfEmpty(int markerCheck, int markerDefault, const ViewStyle &vs) {
|
||||
if (vs.markers[markerCheck].markType == SC_MARK_EMPTY)
|
||||
return markerDefault;
|
||||
return markerCheck;
|
||||
}
|
||||
|
||||
void MarginView::PaintMargin(Surface *surface, int topLine, PRectangle rc, PRectangle rcMargin,
|
||||
const EditModel &model, const ViewStyle &vs) {
|
||||
|
||||
PRectangle rcSelMargin = rcMargin;
|
||||
rcSelMargin.right = rcMargin.left;
|
||||
if (rcSelMargin.bottom < rc.bottom)
|
||||
rcSelMargin.bottom = rc.bottom;
|
||||
|
||||
Point ptOrigin = model.GetVisibleOriginInMain();
|
||||
FontAlias fontLineNumber = vs.styles[STYLE_LINENUMBER].font;
|
||||
for (int margin = 0; margin <= SC_MAX_MARGIN; margin++) {
|
||||
if (vs.ms[margin].width > 0) {
|
||||
|
||||
rcSelMargin.left = rcSelMargin.right;
|
||||
rcSelMargin.right = rcSelMargin.left + vs.ms[margin].width;
|
||||
|
||||
if (vs.ms[margin].style != SC_MARGIN_NUMBER) {
|
||||
if (vs.ms[margin].mask & SC_MASK_FOLDERS) {
|
||||
// Required because of special way brush is created for selection margin
|
||||
// Ensure patterns line up when scrolling with separate margin view
|
||||
// by choosing correctly aligned variant.
|
||||
bool invertPhase = static_cast<int>(ptOrigin.y) & 1;
|
||||
surface->FillRectangle(rcSelMargin,
|
||||
invertPhase ? *pixmapSelPattern : *pixmapSelPatternOffset1);
|
||||
} else {
|
||||
ColourDesired colour;
|
||||
switch (vs.ms[margin].style) {
|
||||
case SC_MARGIN_BACK:
|
||||
colour = vs.styles[STYLE_DEFAULT].back;
|
||||
break;
|
||||
case SC_MARGIN_FORE:
|
||||
colour = vs.styles[STYLE_DEFAULT].fore;
|
||||
break;
|
||||
default:
|
||||
colour = vs.styles[STYLE_LINENUMBER].back;
|
||||
break;
|
||||
}
|
||||
surface->FillRectangle(rcSelMargin, colour);
|
||||
}
|
||||
} else {
|
||||
surface->FillRectangle(rcSelMargin, vs.styles[STYLE_LINENUMBER].back);
|
||||
}
|
||||
|
||||
const int lineStartPaint = static_cast<int>(rcMargin.top + ptOrigin.y) / vs.lineHeight;
|
||||
int visibleLine = model.TopLineOfMain() + lineStartPaint;
|
||||
int yposScreen = lineStartPaint * vs.lineHeight - static_cast<int>(ptOrigin.y);
|
||||
// Work out whether the top line is whitespace located after a
|
||||
// lessening of fold level which implies a 'fold tail' but which should not
|
||||
// be displayed until the last of a sequence of whitespace.
|
||||
bool needWhiteClosure = false;
|
||||
if (vs.ms[margin].mask & SC_MASK_FOLDERS) {
|
||||
int level = model.pdoc->GetLevel(model.cs.DocFromDisplay(visibleLine));
|
||||
if (level & SC_FOLDLEVELWHITEFLAG) {
|
||||
int lineBack = model.cs.DocFromDisplay(visibleLine);
|
||||
int levelPrev = level;
|
||||
while ((lineBack > 0) && (levelPrev & SC_FOLDLEVELWHITEFLAG)) {
|
||||
lineBack--;
|
||||
levelPrev = model.pdoc->GetLevel(lineBack);
|
||||
}
|
||||
if (!(levelPrev & SC_FOLDLEVELHEADERFLAG)) {
|
||||
if ((level & SC_FOLDLEVELNUMBERMASK) < (levelPrev & SC_FOLDLEVELNUMBERMASK))
|
||||
needWhiteClosure = true;
|
||||
}
|
||||
}
|
||||
if (highlightDelimiter.isEnabled) {
|
||||
int lastLine = model.cs.DocFromDisplay(topLine + model.LinesOnScreen()) + 1;
|
||||
model.pdoc->GetHighlightDelimiters(highlightDelimiter, model.pdoc->LineFromPosition(model.sel.MainCaret()), lastLine);
|
||||
}
|
||||
}
|
||||
|
||||
// Old code does not know about new markers needed to distinguish all cases
|
||||
const int folderOpenMid = SubstituteMarkerIfEmpty(SC_MARKNUM_FOLDEROPENMID,
|
||||
SC_MARKNUM_FOLDEROPEN, vs);
|
||||
const int folderEnd = SubstituteMarkerIfEmpty(SC_MARKNUM_FOLDEREND,
|
||||
SC_MARKNUM_FOLDER, vs);
|
||||
|
||||
while ((visibleLine < model.cs.LinesDisplayed()) && yposScreen < rc.bottom) {
|
||||
|
||||
PLATFORM_ASSERT(visibleLine < model.cs.LinesDisplayed());
|
||||
const int lineDoc = model.cs.DocFromDisplay(visibleLine);
|
||||
PLATFORM_ASSERT(model.cs.GetVisible(lineDoc));
|
||||
const bool firstSubLine = visibleLine == model.cs.DisplayFromDoc(lineDoc);
|
||||
const bool lastSubLine = visibleLine == model.cs.DisplayLastFromDoc(lineDoc);
|
||||
|
||||
int marks = model.pdoc->GetMark(lineDoc);
|
||||
if (!firstSubLine)
|
||||
marks = 0;
|
||||
|
||||
bool headWithTail = false;
|
||||
|
||||
if (vs.ms[margin].mask & SC_MASK_FOLDERS) {
|
||||
// Decide which fold indicator should be displayed
|
||||
const int level = model.pdoc->GetLevel(lineDoc);
|
||||
const int levelNext = model.pdoc->GetLevel(lineDoc + 1);
|
||||
const int levelNum = level & SC_FOLDLEVELNUMBERMASK;
|
||||
const int levelNextNum = levelNext & SC_FOLDLEVELNUMBERMASK;
|
||||
if (level & SC_FOLDLEVELHEADERFLAG) {
|
||||
if (firstSubLine) {
|
||||
if (levelNum < levelNextNum) {
|
||||
if (model.cs.GetExpanded(lineDoc)) {
|
||||
if (levelNum == SC_FOLDLEVELBASE)
|
||||
marks |= 1 << SC_MARKNUM_FOLDEROPEN;
|
||||
else
|
||||
marks |= 1 << folderOpenMid;
|
||||
} else {
|
||||
if (levelNum == SC_FOLDLEVELBASE)
|
||||
marks |= 1 << SC_MARKNUM_FOLDER;
|
||||
else
|
||||
marks |= 1 << folderEnd;
|
||||
}
|
||||
} else if (levelNum > SC_FOLDLEVELBASE) {
|
||||
marks |= 1 << SC_MARKNUM_FOLDERSUB;
|
||||
}
|
||||
} else {
|
||||
if (levelNum < levelNextNum) {
|
||||
if (model.cs.GetExpanded(lineDoc)) {
|
||||
marks |= 1 << SC_MARKNUM_FOLDERSUB;
|
||||
} else if (levelNum > SC_FOLDLEVELBASE) {
|
||||
marks |= 1 << SC_MARKNUM_FOLDERSUB;
|
||||
}
|
||||
} else if (levelNum > SC_FOLDLEVELBASE) {
|
||||
marks |= 1 << SC_MARKNUM_FOLDERSUB;
|
||||
}
|
||||
}
|
||||
needWhiteClosure = false;
|
||||
const int firstFollowupLine = model.cs.DocFromDisplay(model.cs.DisplayFromDoc(lineDoc + 1));
|
||||
const int firstFollowupLineLevel = model.pdoc->GetLevel(firstFollowupLine);
|
||||
const int secondFollowupLineLevelNum = model.pdoc->GetLevel(firstFollowupLine + 1) & SC_FOLDLEVELNUMBERMASK;
|
||||
if (!model.cs.GetExpanded(lineDoc)) {
|
||||
if ((firstFollowupLineLevel & SC_FOLDLEVELWHITEFLAG) &&
|
||||
(levelNum > secondFollowupLineLevelNum))
|
||||
needWhiteClosure = true;
|
||||
|
||||
if (highlightDelimiter.IsFoldBlockHighlighted(firstFollowupLine))
|
||||
headWithTail = true;
|
||||
}
|
||||
} else if (level & SC_FOLDLEVELWHITEFLAG) {
|
||||
if (needWhiteClosure) {
|
||||
if (levelNext & SC_FOLDLEVELWHITEFLAG) {
|
||||
marks |= 1 << SC_MARKNUM_FOLDERSUB;
|
||||
} else if (levelNextNum > SC_FOLDLEVELBASE) {
|
||||
marks |= 1 << SC_MARKNUM_FOLDERMIDTAIL;
|
||||
needWhiteClosure = false;
|
||||
} else {
|
||||
marks |= 1 << SC_MARKNUM_FOLDERTAIL;
|
||||
needWhiteClosure = false;
|
||||
}
|
||||
} else if (levelNum > SC_FOLDLEVELBASE) {
|
||||
if (levelNextNum < levelNum) {
|
||||
if (levelNextNum > SC_FOLDLEVELBASE) {
|
||||
marks |= 1 << SC_MARKNUM_FOLDERMIDTAIL;
|
||||
} else {
|
||||
marks |= 1 << SC_MARKNUM_FOLDERTAIL;
|
||||
}
|
||||
} else {
|
||||
marks |= 1 << SC_MARKNUM_FOLDERSUB;
|
||||
}
|
||||
}
|
||||
} else if (levelNum > SC_FOLDLEVELBASE) {
|
||||
if (levelNextNum < levelNum) {
|
||||
needWhiteClosure = false;
|
||||
if (levelNext & SC_FOLDLEVELWHITEFLAG) {
|
||||
marks |= 1 << SC_MARKNUM_FOLDERSUB;
|
||||
needWhiteClosure = true;
|
||||
} else if (lastSubLine) {
|
||||
if (levelNextNum > SC_FOLDLEVELBASE) {
|
||||
marks |= 1 << SC_MARKNUM_FOLDERMIDTAIL;
|
||||
} else {
|
||||
marks |= 1 << SC_MARKNUM_FOLDERTAIL;
|
||||
}
|
||||
} else {
|
||||
marks |= 1 << SC_MARKNUM_FOLDERSUB;
|
||||
}
|
||||
} else {
|
||||
marks |= 1 << SC_MARKNUM_FOLDERSUB;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
marks &= vs.ms[margin].mask;
|
||||
|
||||
PRectangle rcMarker = rcSelMargin;
|
||||
rcMarker.top = static_cast<XYPOSITION>(yposScreen);
|
||||
rcMarker.bottom = static_cast<XYPOSITION>(yposScreen + vs.lineHeight);
|
||||
if (vs.ms[margin].style == SC_MARGIN_NUMBER) {
|
||||
if (firstSubLine) {
|
||||
char number[100] = "";
|
||||
if (lineDoc >= 0)
|
||||
sprintf(number, "%d", lineDoc + 1);
|
||||
if (model.foldFlags & (SC_FOLDFLAG_LEVELNUMBERS | SC_FOLDFLAG_LINESTATE)) {
|
||||
if (model.foldFlags & SC_FOLDFLAG_LEVELNUMBERS) {
|
||||
int lev = model.pdoc->GetLevel(lineDoc);
|
||||
sprintf(number, "%c%c %03X %03X",
|
||||
(lev & SC_FOLDLEVELHEADERFLAG) ? 'H' : '_',
|
||||
(lev & SC_FOLDLEVELWHITEFLAG) ? 'W' : '_',
|
||||
lev & SC_FOLDLEVELNUMBERMASK,
|
||||
lev >> 16
|
||||
);
|
||||
} else {
|
||||
int state = model.pdoc->GetLineState(lineDoc);
|
||||
sprintf(number, "%0X", state);
|
||||
}
|
||||
}
|
||||
PRectangle rcNumber = rcMarker;
|
||||
// Right justify
|
||||
XYPOSITION width = surface->WidthText(fontLineNumber, number, static_cast<int>(strlen(number)));
|
||||
XYPOSITION xpos = rcNumber.right - width - vs.marginNumberPadding;
|
||||
rcNumber.left = xpos;
|
||||
DrawTextNoClipPhase(surface, rcNumber, vs.styles[STYLE_LINENUMBER],
|
||||
rcNumber.top + vs.maxAscent, number, static_cast<int>(strlen(number)), drawAll);
|
||||
} else if (vs.wrapVisualFlags & SC_WRAPVISUALFLAG_MARGIN) {
|
||||
PRectangle rcWrapMarker = rcMarker;
|
||||
rcWrapMarker.right -= wrapMarkerPaddingRight;
|
||||
rcWrapMarker.left = rcWrapMarker.right - vs.styles[STYLE_LINENUMBER].aveCharWidth;
|
||||
if (customDrawWrapMarker == NULL) {
|
||||
DrawWrapMarker(surface, rcWrapMarker, false, vs.styles[STYLE_LINENUMBER].fore);
|
||||
} else {
|
||||
customDrawWrapMarker(surface, rcWrapMarker, false, vs.styles[STYLE_LINENUMBER].fore);
|
||||
}
|
||||
}
|
||||
} else if (vs.ms[margin].style == SC_MARGIN_TEXT || vs.ms[margin].style == SC_MARGIN_RTEXT) {
|
||||
if (firstSubLine) {
|
||||
const StyledText stMargin = model.pdoc->MarginStyledText(lineDoc);
|
||||
if (stMargin.text && ValidStyledText(vs, vs.marginStyleOffset, stMargin)) {
|
||||
surface->FillRectangle(rcMarker,
|
||||
vs.styles[stMargin.StyleAt(0) + vs.marginStyleOffset].back);
|
||||
if (vs.ms[margin].style == SC_MARGIN_RTEXT) {
|
||||
int width = WidestLineWidth(surface, vs, vs.marginStyleOffset, stMargin);
|
||||
rcMarker.left = rcMarker.right - width - 3;
|
||||
}
|
||||
DrawStyledText(surface, vs, vs.marginStyleOffset, rcMarker,
|
||||
stMargin, 0, stMargin.length, drawAll);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (marks) {
|
||||
for (int markBit = 0; (markBit < 32) && marks; markBit++) {
|
||||
if (marks & 1) {
|
||||
LineMarker::typeOfFold tFold = LineMarker::undefined;
|
||||
if ((vs.ms[margin].mask & SC_MASK_FOLDERS) && highlightDelimiter.IsFoldBlockHighlighted(lineDoc)) {
|
||||
if (highlightDelimiter.IsBodyOfFoldBlock(lineDoc)) {
|
||||
tFold = LineMarker::body;
|
||||
} else if (highlightDelimiter.IsHeadOfFoldBlock(lineDoc)) {
|
||||
if (firstSubLine) {
|
||||
tFold = headWithTail ? LineMarker::headWithTail : LineMarker::head;
|
||||
} else {
|
||||
if (model.cs.GetExpanded(lineDoc) || headWithTail) {
|
||||
tFold = LineMarker::body;
|
||||
} else {
|
||||
tFold = LineMarker::undefined;
|
||||
}
|
||||
}
|
||||
} else if (highlightDelimiter.IsTailOfFoldBlock(lineDoc)) {
|
||||
tFold = LineMarker::tail;
|
||||
}
|
||||
}
|
||||
vs.markers[markBit].Draw(surface, rcMarker, fontLineNumber, tFold, vs.ms[margin].style);
|
||||
}
|
||||
marks >>= 1;
|
||||
}
|
||||
}
|
||||
|
||||
visibleLine++;
|
||||
yposScreen += vs.lineHeight;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PRectangle rcBlankMargin = rcMargin;
|
||||
rcBlankMargin.left = rcSelMargin.right;
|
||||
surface->FillRectangle(rcBlankMargin, vs.styles[STYLE_DEFAULT].back);
|
||||
}
|
||||
|
||||
#ifdef SCI_NAMESPACE
|
||||
}
|
||||
#endif
|
||||
|
50
src/stc/scintilla/src/MarginView.h
Normal file
50
src/stc/scintilla/src/MarginView.h
Normal file
@ -0,0 +1,50 @@
|
||||
// Scintilla source code edit control
|
||||
/** @file MarginView.h
|
||||
** Defines the appearance of the editor margin.
|
||||
**/
|
||||
// Copyright 1998-2014 by Neil Hodgson <neilh@scintilla.org>
|
||||
// The License.txt file describes the conditions under which this software may be distributed.
|
||||
|
||||
#ifndef MARGINVIEW_H
|
||||
#define MARGINVIEW_H
|
||||
|
||||
#ifdef SCI_NAMESPACE
|
||||
namespace Scintilla {
|
||||
#endif
|
||||
|
||||
void DrawWrapMarker(Surface *surface, PRectangle rcPlace, bool isEndMarker, ColourDesired wrapColour);
|
||||
|
||||
typedef void (*DrawWrapMarkerFn)(Surface *surface, PRectangle rcPlace, bool isEndMarker, ColourDesired wrapColour);
|
||||
|
||||
/**
|
||||
* MarginView draws the margins.
|
||||
*/
|
||||
class MarginView {
|
||||
public:
|
||||
Surface *pixmapSelMargin;
|
||||
Surface *pixmapSelPattern;
|
||||
Surface *pixmapSelPatternOffset1;
|
||||
// Highlight current folding block
|
||||
HighlightDelimiter highlightDelimiter;
|
||||
|
||||
int wrapMarkerPaddingRight; // right-most pixel padding of wrap markers
|
||||
/** Some platforms, notably PLAT_CURSES, do not support Scintilla's native
|
||||
* DrawWrapMarker function for drawing wrap markers. Allow those platforms to
|
||||
* override it instead of creating a new method in the Surface class that
|
||||
* existing platforms must implement as empty. */
|
||||
DrawWrapMarkerFn customDrawWrapMarker;
|
||||
|
||||
MarginView();
|
||||
|
||||
void DropGraphics(bool freeObjects);
|
||||
void AllocateGraphics(const ViewStyle &vsDraw);
|
||||
void RefreshPixMaps(Surface *surfaceWindow, WindowID wid, const ViewStyle &vsDraw);
|
||||
void PaintMargin(Surface *surface, int topLine, PRectangle rc, PRectangle rcMargin,
|
||||
const EditModel &model, const ViewStyle &vs);
|
||||
};
|
||||
|
||||
#ifdef SCI_NAMESPACE
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -7,6 +7,7 @@
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
|
||||
#include "Platform.h"
|
||||
@ -484,3 +485,72 @@ int LineAnnotation::Lines(int line) const {
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
LineTabstops::~LineTabstops() {
|
||||
Init();
|
||||
}
|
||||
|
||||
void LineTabstops::Init() {
|
||||
for (int line = 0; line < tabstops.Length(); line++) {
|
||||
delete tabstops[line];
|
||||
}
|
||||
tabstops.DeleteAll();
|
||||
}
|
||||
|
||||
void LineTabstops::InsertLine(int line) {
|
||||
if (tabstops.Length()) {
|
||||
tabstops.EnsureLength(line);
|
||||
tabstops.Insert(line, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void LineTabstops::RemoveLine(int line) {
|
||||
if (tabstops.Length() > line) {
|
||||
delete tabstops[line];
|
||||
tabstops.Delete(line);
|
||||
}
|
||||
}
|
||||
|
||||
bool LineTabstops::ClearTabstops(int line) {
|
||||
if (line < tabstops.Length()) {
|
||||
TabstopList *tl = tabstops[line];
|
||||
if (tl) {
|
||||
tl->clear();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool LineTabstops::AddTabstop(int line, int x) {
|
||||
tabstops.EnsureLength(line + 1);
|
||||
if (!tabstops[line]) {
|
||||
tabstops[line] = new TabstopList();
|
||||
}
|
||||
|
||||
TabstopList *tl = tabstops[line];
|
||||
if (tl) {
|
||||
// tabstop positions are kept in order - insert in the right place
|
||||
std::vector<int>::iterator it = std::lower_bound(tl->begin(), tl->end(), x);
|
||||
// don't insert duplicates
|
||||
if (it == tl->end() || *it != x) {
|
||||
tl->insert(it, x);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
int LineTabstops::GetNextTabstop(int line, int x) const {
|
||||
if (line < tabstops.Length()) {
|
||||
TabstopList *tl = tabstops[line];
|
||||
if (tl) {
|
||||
for (size_t i = 0; i < tl->size(); i++) {
|
||||
if ((*tl)[i] > x) {
|
||||
return (*tl)[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -112,6 +112,23 @@ public:
|
||||
int Lines(int line) const;
|
||||
};
|
||||
|
||||
typedef std::vector<int> TabstopList;
|
||||
|
||||
class LineTabstops : public PerLine {
|
||||
SplitVector<TabstopList *> tabstops;
|
||||
public:
|
||||
LineTabstops() {
|
||||
}
|
||||
virtual ~LineTabstops();
|
||||
virtual void Init();
|
||||
virtual void InsertLine(int line);
|
||||
virtual void RemoveLine(int line);
|
||||
|
||||
bool ClearTabstops(int line);
|
||||
bool AddTabstop(int line, int x);
|
||||
int GetNextTabstop(int line, int x) const;
|
||||
};
|
||||
|
||||
#ifdef SCI_NAMESPACE
|
||||
}
|
||||
#endif
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
@ -438,13 +439,12 @@ void BreakFinder::Insert(int val) {
|
||||
}
|
||||
}
|
||||
|
||||
BreakFinder::BreakFinder(const LineLayout *ll_, const Selection *psel, int lineStart_, int lineEnd_, int posLineStart_,
|
||||
BreakFinder::BreakFinder(const LineLayout *ll_, const Selection *psel, Range lineRange_, int posLineStart_,
|
||||
int xStart, bool breakForSelection, const Document *pdoc_, const SpecialRepresentations *preprs_) :
|
||||
ll(ll_),
|
||||
lineStart(lineStart_),
|
||||
lineEnd(lineEnd_),
|
||||
lineRange(lineRange_),
|
||||
posLineStart(posLineStart_),
|
||||
nextBreak(lineStart_),
|
||||
nextBreak(lineRange_.start),
|
||||
saeCurrentPos(0),
|
||||
saeNext(0),
|
||||
subBreak(-1),
|
||||
@ -455,15 +455,15 @@ BreakFinder::BreakFinder(const LineLayout *ll_, const Selection *psel, int lineS
|
||||
// Search for first visible break
|
||||
// First find the first visible character
|
||||
if (xStart > 0.0f)
|
||||
nextBreak = ll->FindBefore(static_cast<XYPOSITION>(xStart), lineStart, lineEnd);
|
||||
nextBreak = ll->FindBefore(static_cast<XYPOSITION>(xStart), lineRange.start, lineRange.end);
|
||||
// Now back to a style break
|
||||
while ((nextBreak > lineStart) && (ll->styles[nextBreak] == ll->styles[nextBreak - 1])) {
|
||||
while ((nextBreak > lineRange.start) && (ll->styles[nextBreak] == ll->styles[nextBreak - 1])) {
|
||||
nextBreak--;
|
||||
}
|
||||
|
||||
if (breakForSelection) {
|
||||
SelectionPosition posStart(posLineStart);
|
||||
SelectionPosition posEnd(posLineStart + lineEnd);
|
||||
SelectionPosition posEnd(posLineStart + lineRange.end);
|
||||
SelectionSegment segmentLine(posStart, posEnd);
|
||||
for (size_t r=0; r<psel->Count(); r++) {
|
||||
SelectionSegment portion = psel->Range(r).Intersect(segmentLine);
|
||||
@ -477,7 +477,7 @@ BreakFinder::BreakFinder(const LineLayout *ll_, const Selection *psel, int lineS
|
||||
}
|
||||
|
||||
Insert(ll->edgeColumn);
|
||||
Insert(lineEnd);
|
||||
Insert(lineRange.end);
|
||||
saeNext = (!selAndEdge.empty()) ? selAndEdge[0] : -1;
|
||||
}
|
||||
|
||||
@ -487,19 +487,19 @@ BreakFinder::~BreakFinder() {
|
||||
TextSegment BreakFinder::Next() {
|
||||
if (subBreak == -1) {
|
||||
int prev = nextBreak;
|
||||
while (nextBreak < lineEnd) {
|
||||
while (nextBreak < lineRange.end) {
|
||||
int charWidth = 1;
|
||||
if (encodingFamily == efUnicode)
|
||||
charWidth = UTF8DrawBytes(reinterpret_cast<unsigned char *>(ll->chars) + nextBreak, lineEnd - nextBreak);
|
||||
charWidth = UTF8DrawBytes(reinterpret_cast<unsigned char *>(ll->chars) + nextBreak, lineRange.end - nextBreak);
|
||||
else if (encodingFamily == efDBCS)
|
||||
charWidth = pdoc->IsDBCSLeadByte(ll->chars[nextBreak]) ? 2 : 1;
|
||||
const Representation *repr = preprs->RepresentationFromCharacter(ll->chars + nextBreak, charWidth);
|
||||
if (((nextBreak > 0) && (ll->styles[nextBreak] != ll->styles[nextBreak - 1])) ||
|
||||
repr ||
|
||||
(nextBreak == saeNext)) {
|
||||
while ((nextBreak >= saeNext) && (saeNext < lineEnd)) {
|
||||
while ((nextBreak >= saeNext) && (saeNext < lineRange.end)) {
|
||||
saeCurrentPos++;
|
||||
saeNext = (saeCurrentPos < selAndEdge.size()) ? selAndEdge[saeCurrentPos] : lineEnd;
|
||||
saeNext = (saeCurrentPos < selAndEdge.size()) ? selAndEdge[saeCurrentPos] : lineRange.end;
|
||||
}
|
||||
if ((nextBreak > prev) || repr) {
|
||||
// Have a segment to report
|
||||
@ -540,7 +540,7 @@ TextSegment BreakFinder::Next() {
|
||||
}
|
||||
|
||||
bool BreakFinder::More() const {
|
||||
return (subBreak >= 0) || (nextBreak < lineEnd);
|
||||
return (subBreak >= 0) || (nextBreak < lineRange.end);
|
||||
}
|
||||
|
||||
PositionCacheEntry::PositionCacheEntry() :
|
||||
|
@ -104,7 +104,7 @@ class PositionCacheEntry {
|
||||
public:
|
||||
PositionCacheEntry();
|
||||
~PositionCacheEntry();
|
||||
void Set(unsigned int styleNumber_, const char *s_, unsigned int len_, XYPOSITION *positions_, unsigned int clock);
|
||||
void Set(unsigned int styleNumber_, const char *s_, unsigned int len_, XYPOSITION *positions_, unsigned int clock_);
|
||||
void Clear();
|
||||
bool Retrieve(unsigned int styleNumber_, const char *s_, unsigned int len_, XYPOSITION *positions_) const;
|
||||
static unsigned int Hash(unsigned int styleNumber_, const char *s, unsigned int len);
|
||||
@ -148,8 +148,7 @@ struct TextSegment {
|
||||
// Class to break a line of text into shorter runs at sensible places.
|
||||
class BreakFinder {
|
||||
const LineLayout *ll;
|
||||
int lineStart;
|
||||
int lineEnd;
|
||||
Range lineRange;
|
||||
int posLineStart;
|
||||
int nextBreak;
|
||||
std::vector<int> selAndEdge;
|
||||
@ -168,7 +167,7 @@ public:
|
||||
enum { lengthStartSubdivision = 300 };
|
||||
// Try to make each subdivided run lengthEachSubdivision or shorter.
|
||||
enum { lengthEachSubdivision = 100 };
|
||||
BreakFinder(const LineLayout *ll_, const Selection *psel, int lineStart_, int lineEnd_, int posLineStart_,
|
||||
BreakFinder(const LineLayout *ll_, const Selection *psel, Range rangeLine_, int posLineStart_,
|
||||
int xStart, bool breakForSelection, const Document *pdoc_, const SpecialRepresentations *preprs_);
|
||||
~BreakFinder();
|
||||
TextSegment Next();
|
||||
|
@ -203,6 +203,7 @@
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <string>
|
||||
#include <algorithm>
|
||||
|
||||
#include "CharClassify.h"
|
||||
#include "RESearch.h"
|
||||
@ -251,22 +252,18 @@ const char bitarr[] = { 1, 2, 4, 8, 16, 32, 64, '\200' };
|
||||
RESearch::RESearch(CharClassify *charClassTable) {
|
||||
failure = 0;
|
||||
charClass = charClassTable;
|
||||
Init();
|
||||
sta = NOP; /* status of lastpat */
|
||||
bol = 0;
|
||||
std::fill(bittab, bittab + BITBLK, 0);
|
||||
std::fill(tagstk, tagstk + MAXTAG, 0);
|
||||
std::fill(nfa, nfa + MAXNFA, 0);
|
||||
Clear();
|
||||
}
|
||||
|
||||
RESearch::~RESearch() {
|
||||
Clear();
|
||||
}
|
||||
|
||||
void RESearch::Init() {
|
||||
sta = NOP; /* status of lastpat */
|
||||
bol = 0;
|
||||
for (int i = 0; i < MAXTAG; i++)
|
||||
pat[i].clear();
|
||||
for (int j = 0; j < BITBLK; j++)
|
||||
bittab[j] = 0;
|
||||
}
|
||||
|
||||
void RESearch::Clear() {
|
||||
for (int i = 0; i < MAXTAG; i++) {
|
||||
pat[i].clear();
|
||||
@ -279,10 +276,9 @@ void RESearch::GrabMatches(CharacterIndexer &ci) {
|
||||
for (unsigned int i = 0; i < MAXTAG; i++) {
|
||||
if ((bopat[i] != NOTFOUND) && (eopat[i] != NOTFOUND)) {
|
||||
unsigned int len = eopat[i] - bopat[i];
|
||||
pat[i] = std::string(len+1, '\0');
|
||||
pat[i].resize(len);
|
||||
for (unsigned int j = 0; j < len; j++)
|
||||
pat[i][j] = ci.CharAt(bopat[i] + j);
|
||||
pat[i][len] = '\0';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -33,6 +33,7 @@ class RESearch {
|
||||
public:
|
||||
explicit RESearch(CharClassify *charClassTable);
|
||||
~RESearch();
|
||||
void Clear();
|
||||
void GrabMatches(CharacterIndexer &ci);
|
||||
const char *Compile(const char *pattern, int length, bool caseSensitive, bool posix);
|
||||
int Execute(CharacterIndexer &ci, int lp, int endp);
|
||||
@ -46,8 +47,6 @@ public:
|
||||
std::string pat[MAXTAG];
|
||||
|
||||
private:
|
||||
void Init();
|
||||
void Clear();
|
||||
void ChSet(unsigned char c);
|
||||
void ChSetWithCase(unsigned char c, bool caseSensitive);
|
||||
int GetBackslashExpression(const char *pattern, int &incr);
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include <assert.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
@ -50,6 +51,9 @@
|
||||
#include "Document.h"
|
||||
#include "Selection.h"
|
||||
#include "PositionCache.h"
|
||||
#include "EditModel.h"
|
||||
#include "MarginView.h"
|
||||
#include "EditView.h"
|
||||
#include "Editor.h"
|
||||
#include "AutoComplete.h"
|
||||
#include "ScintillaBase.h"
|
||||
@ -73,7 +77,7 @@ void ScintillaBase::Finalise() {
|
||||
popup.Destroy();
|
||||
}
|
||||
|
||||
void ScintillaBase::AddCharUTF(char *s, unsigned int len, bool treatAsDBCS) {
|
||||
void ScintillaBase::AddCharUTF(const char *s, unsigned int len, bool treatAsDBCS) {
|
||||
bool isFillUp = ac.Active() && ac.IsFillUpChar(*s);
|
||||
if (!isFillUp) {
|
||||
Editor::AddCharUTF(s, len, treatAsDBCS);
|
||||
|
@ -38,6 +38,8 @@ protected:
|
||||
idcmdSelectAll=16
|
||||
};
|
||||
|
||||
enum { maxLenInputIME = 200 };
|
||||
|
||||
bool displayPopupMenu;
|
||||
Menu popup;
|
||||
AutoComplete ac;
|
||||
@ -60,7 +62,7 @@ protected:
|
||||
virtual void Initialise() = 0;
|
||||
virtual void Finalise();
|
||||
|
||||
virtual void AddCharUTF(char *s, unsigned int len, bool treatAsDBCS=false);
|
||||
virtual void AddCharUTF(const char *s, unsigned int len, bool treatAsDBCS=false);
|
||||
void Command(int cmdId);
|
||||
virtual void CancelModes();
|
||||
virtual int KeyCommand(unsigned int iMessage);
|
||||
|
@ -81,6 +81,11 @@ int SelectionRange::Length() const {
|
||||
}
|
||||
}
|
||||
|
||||
void SelectionRange::MoveForInsertDelete(bool insertion, int startChange, int length) {
|
||||
caret.MoveForInsertDelete(insertion, startChange, length);
|
||||
anchor.MoveForInsertDelete(insertion, startChange, length);
|
||||
}
|
||||
|
||||
bool SelectionRange::Contains(int pos) const {
|
||||
if (anchor > caret)
|
||||
return (pos >= caret.Position()) && (pos <= anchor.Position());
|
||||
@ -283,9 +288,11 @@ int Selection::Length() const {
|
||||
|
||||
void Selection::MovePositions(bool insertion, int startChange, int length) {
|
||||
for (size_t i=0; i<ranges.size(); i++) {
|
||||
ranges[i].caret.MoveForInsertDelete(insertion, startChange, length);
|
||||
ranges[i].anchor.MoveForInsertDelete(insertion, startChange, length);
|
||||
ranges[i].MoveForInsertDelete(insertion, startChange, length);
|
||||
}
|
||||
if (selType == selRectangle) {
|
||||
rangeRectangular.MoveForInsertDelete(insertion, startChange, length);
|
||||
}
|
||||
}
|
||||
|
||||
void Selection::TrimSelection(SelectionRange range) {
|
||||
|
@ -115,6 +115,7 @@ struct SelectionRange {
|
||||
anchor.SetVirtualSpace(0);
|
||||
caret.SetVirtualSpace(0);
|
||||
}
|
||||
void MoveForInsertDelete(bool insertion, int startChange, int length);
|
||||
bool Contains(int pos) const;
|
||||
bool Contains(SelectionPosition sp) const;
|
||||
bool ContainsCharacter(int posCharacter) const;
|
||||
|
@ -20,6 +20,7 @@ namespace Scintilla {
|
||||
enum { SURROGATE_LEAD_FIRST = 0xD800 };
|
||||
enum { SURROGATE_TRAIL_FIRST = 0xDC00 };
|
||||
enum { SURROGATE_TRAIL_LAST = 0xDFFF };
|
||||
enum { SUPPLEMENTAL_PLANE_FIRST = 0x10000 };
|
||||
|
||||
unsigned int UTF8Length(const wchar_t *uptr, unsigned int tlen) {
|
||||
unsigned int len = 0;
|
||||
@ -138,6 +139,51 @@ unsigned int UTF16FromUTF8(const char *s, unsigned int len, wchar_t *tbuf, unsig
|
||||
return ui;
|
||||
}
|
||||
|
||||
unsigned int UTF32FromUTF8(const char *s, unsigned int len, unsigned int *tbuf, unsigned int tlen) {
|
||||
unsigned int ui=0;
|
||||
const unsigned char *us = reinterpret_cast<const unsigned char *>(s);
|
||||
unsigned int i=0;
|
||||
while ((i<len) && (ui<tlen)) {
|
||||
unsigned char ch = us[i++];
|
||||
wchar_t value = 0;
|
||||
if (ch < 0x80) {
|
||||
value = ch;
|
||||
} else if (((len-i) >= 1) && (ch < 0x80 + 0x40 + 0x20)) {
|
||||
value = (ch & 0x1F) << 6;
|
||||
ch = us[i++];
|
||||
value += ch & 0x7F;
|
||||
} else if (((len-i) >= 2) && (ch < 0x80 + 0x40 + 0x20 + 0x10)) {
|
||||
value = (ch & 0xF) << 12;
|
||||
ch = us[i++];
|
||||
value += (ch & 0x7F) << 6;
|
||||
ch = us[i++];
|
||||
value += ch & 0x7F;
|
||||
} else if ((len-i) >= 3) {
|
||||
value = (ch & 0x7) << 18;
|
||||
ch = us[i++];
|
||||
value += (ch & 0x3F) << 12;
|
||||
ch = us[i++];
|
||||
value += (ch & 0x3F) << 6;
|
||||
ch = us[i++];
|
||||
value += ch & 0x3F;
|
||||
}
|
||||
tbuf[ui] = value;
|
||||
ui++;
|
||||
}
|
||||
return ui;
|
||||
}
|
||||
|
||||
unsigned int UTF16FromUTF32Character(unsigned int val, wchar_t *tbuf) {
|
||||
if (val < SUPPLEMENTAL_PLANE_FIRST) {
|
||||
tbuf[0] = static_cast<wchar_t>(val);
|
||||
return 1;
|
||||
} else {
|
||||
tbuf[0] = static_cast<wchar_t>(((val - SUPPLEMENTAL_PLANE_FIRST) >> 10) + SURROGATE_LEAD_FIRST);
|
||||
tbuf[1] = static_cast<wchar_t>((val & 0x3ff) + SURROGATE_TRAIL_FIRST);
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
|
||||
int UTF8BytesOfLead[256];
|
||||
static bool initialisedBytesOfLead = false;
|
||||
|
||||
|
@ -14,11 +14,15 @@ namespace Scintilla {
|
||||
|
||||
const int UTF8MaxBytes = 4;
|
||||
|
||||
const int unicodeReplacementChar = 0xFFFD;
|
||||
|
||||
unsigned int UTF8Length(const wchar_t *uptr, unsigned int tlen);
|
||||
void UTF8FromUTF16(const wchar_t *uptr, unsigned int tlen, char *putf, unsigned int len);
|
||||
unsigned int UTF8CharLength(unsigned char ch);
|
||||
unsigned int UTF16Length(const char *s, unsigned int len);
|
||||
unsigned int UTF16FromUTF8(const char *s, unsigned int len, wchar_t *tbuf, unsigned int tlen);
|
||||
unsigned int UTF32FromUTF8(const char *s, unsigned int len, unsigned int *tbuf, unsigned int tlen);
|
||||
unsigned int UTF16FromUTF32Character(unsigned int val, wchar_t *tbuf);
|
||||
|
||||
extern int UTF8BytesOfLead[256];
|
||||
void UTF8BytesOfLeadInitialise();
|
||||
|
@ -192,18 +192,13 @@ void ViewStyle::Init(size_t stylesSize_) {
|
||||
// There are no image markers by default, so no need for calling CalcLargestMarkerHeight()
|
||||
largestMarkerHeight = 0;
|
||||
|
||||
indicators[0].style = INDIC_SQUIGGLE;
|
||||
indicators[0].under = false;
|
||||
indicators[0].fore = ColourDesired(0, 0x7f, 0);
|
||||
indicators[1].style = INDIC_TT;
|
||||
indicators[1].under = false;
|
||||
indicators[1].fore = ColourDesired(0, 0, 0xff);
|
||||
indicators[2].style = INDIC_PLAIN;
|
||||
indicators[2].under = false;
|
||||
indicators[2].fore = ColourDesired(0xff, 0, 0);
|
||||
indicators[0] = Indicator(INDIC_SQUIGGLE, ColourDesired(0, 0x7f, 0));
|
||||
indicators[1] = Indicator(INDIC_TT, ColourDesired(0, 0, 0xff));
|
||||
indicators[2] = Indicator(INDIC_PLAIN, ColourDesired(0xff, 0, 0));
|
||||
|
||||
technology = SC_TECHNOLOGY_DEFAULT;
|
||||
lineHeight = 1;
|
||||
lineOverlap = 0;
|
||||
maxAscent = 1;
|
||||
maxDescent = 1;
|
||||
aveCharWidth = 8;
|
||||
@ -329,6 +324,11 @@ void ViewStyle::Refresh(Surface &surface, int tabInChars) {
|
||||
maxAscent += extraAscent;
|
||||
maxDescent += extraDescent;
|
||||
lineHeight = maxAscent + maxDescent;
|
||||
lineOverlap = lineHeight / 10;
|
||||
if (lineOverlap < 2)
|
||||
lineOverlap = 2;
|
||||
if (lineOverlap > lineHeight)
|
||||
lineOverlap = lineHeight;
|
||||
|
||||
someStylesProtected = false;
|
||||
someStylesForceCase = false;
|
||||
@ -470,6 +470,14 @@ ColourOptional ViewStyle::Background(int marksOfLine, bool caretActive, bool lin
|
||||
return background;
|
||||
}
|
||||
|
||||
bool ViewStyle::SelectionBackgroundDrawn() const {
|
||||
return selColours.back.isSet &&
|
||||
((selAlpha == SC_ALPHA_NOALPHA) || (selAdditionalAlpha == SC_ALPHA_NOALPHA));
|
||||
}
|
||||
|
||||
bool ViewStyle::WhitespaceBackgroundDrawn() const {
|
||||
return (viewWhitespace != wsInvisible) && (whitespaceColours.back.isSet);
|
||||
}
|
||||
|
||||
ColourDesired ViewStyle::WrapColour() const {
|
||||
if (whitespaceColours.fore.isSet)
|
||||
|
@ -85,6 +85,7 @@ public:
|
||||
Indicator indicators[INDIC_MAX + 1];
|
||||
int technology;
|
||||
int lineHeight;
|
||||
int lineOverlap;
|
||||
unsigned int maxAscent;
|
||||
unsigned int maxDescent;
|
||||
XYPOSITION aveCharWidth;
|
||||
@ -170,7 +171,10 @@ public:
|
||||
bool ValidStyle(size_t styleIndex) const;
|
||||
void CalcLargestMarkerHeight();
|
||||
ColourOptional Background(int marksOfLine, bool caretActive, bool lineContainsCaret) const;
|
||||
bool SelectionBackgroundDrawn() const;
|
||||
bool WhitespaceBackgroundDrawn() const;
|
||||
ColourDesired WrapColour() const;
|
||||
|
||||
bool SetWrapState(int wrapState_);
|
||||
bool SetWrapVisualFlags(int wrapVisualFlags_);
|
||||
bool SetWrapVisualFlagsLocation(int wrapVisualFlagsLocation_);
|
||||
|
@ -529,6 +529,24 @@ int wxStyledTextCtrl::GetTabWidth() const
|
||||
return SendMsg(SCI_GETTABWIDTH, 0, 0);
|
||||
}
|
||||
|
||||
// Clear explicit tabstops on a line.
|
||||
void wxStyledTextCtrl::ClearTabStops(int line)
|
||||
{
|
||||
SendMsg(SCI_CLEARTABSTOPS, line, 0);
|
||||
}
|
||||
|
||||
// Add an explicit tab stop for a line.
|
||||
void wxStyledTextCtrl::AddTabStop(int line, int x)
|
||||
{
|
||||
SendMsg(SCI_ADDTABSTOP, line, x);
|
||||
}
|
||||
|
||||
// Find the next explicit tab stop position on a line after a position.
|
||||
int wxStyledTextCtrl::GetNextTabStop(int line, int x)
|
||||
{
|
||||
return SendMsg(SCI_GETNEXTTABSTOP, line, x);
|
||||
}
|
||||
|
||||
// Set the code page used to interpret the bytes of the document as characters.
|
||||
void wxStyledTextCtrl::SetCodePage(int codePage) {
|
||||
#if wxUSE_UNICODE
|
||||
@ -541,6 +559,18 @@ void wxStyledTextCtrl::SetCodePage(int codePage) {
|
||||
SendMsg(SCI_SETCODEPAGE, codePage);
|
||||
}
|
||||
|
||||
// Is the IME displayed in a winow or inline?
|
||||
int wxStyledTextCtrl::GetIMEInteraction() const
|
||||
{
|
||||
return SendMsg(SCI_GETIMEINTERACTION, 0, 0);
|
||||
}
|
||||
|
||||
// Choose to display the the IME in a winow or inline.
|
||||
void wxStyledTextCtrl::SetIMEInteraction(int imeInteraction)
|
||||
{
|
||||
SendMsg(SCI_SETIMEINTERACTION, imeInteraction, 0);
|
||||
}
|
||||
|
||||
// Set the symbol used for a particular marker number,
|
||||
// and optionally the fore and background colours.
|
||||
void wxStyledTextCtrl::MarkerDefine(int markerNumber, int markerSymbol,
|
||||
@ -2243,7 +2273,7 @@ void wxStyledTextCtrl::AppendText(const wxString& text) {
|
||||
SendMsg(SCI_APPENDTEXT, wx2stclen(text, buf), (sptr_t)(const char*)buf);
|
||||
}
|
||||
|
||||
// Is drawing done in two phases with backgrounds drawn before faoregrounds?
|
||||
// Is drawing done in two phases with backgrounds drawn before foregrounds?
|
||||
bool wxStyledTextCtrl::GetTwoPhaseDraw() const
|
||||
{
|
||||
return SendMsg(SCI_GETTWOPHASEDRAW, 0, 0) != 0;
|
||||
@ -2256,6 +2286,21 @@ void wxStyledTextCtrl::SetTwoPhaseDraw(bool twoPhase)
|
||||
SendMsg(SCI_SETTWOPHASEDRAW, twoPhase, 0);
|
||||
}
|
||||
|
||||
// How many phases is drawing done in?
|
||||
int wxStyledTextCtrl::GetPhasesDraw() const
|
||||
{
|
||||
return SendMsg(SCI_GETPHASESDRAW, 0, 0);
|
||||
}
|
||||
|
||||
// In one phase draw, text is drawn in a series of rectangular blocks with no overlap.
|
||||
// In two phase draw, text is drawn in a series of lines allowing runs to overlap horizontally.
|
||||
// In multiple phase draw, each element is drawn over the whole drawing area, allowing text
|
||||
// to overlap from one line to the next.
|
||||
void wxStyledTextCtrl::SetPhasesDraw(int phases)
|
||||
{
|
||||
SendMsg(SCI_SETPHASESDRAW, phases, 0);
|
||||
}
|
||||
|
||||
// Scroll so that a display line is at the top of the display.
|
||||
void wxStyledTextCtrl::SetFirstVisibleLine(int lineDisplay)
|
||||
{
|
||||
@ -5335,7 +5380,7 @@ wxStyledTextEvent::wxStyledTextEvent(const wxStyledTextEvent& event):
|
||||
|
||||
/*static*/ wxVersionInfo wxStyledTextCtrl::GetLibraryVersionInfo()
|
||||
{
|
||||
return wxVersionInfo("Scintilla", 3, 4, 4, "Scintilla 3.4.4");
|
||||
return wxVersionInfo("Scintilla", 3, 5, 2, "Scintilla 3.5.2");
|
||||
}
|
||||
|
||||
#endif // wxUSE_STC
|
||||
|
@ -1205,7 +1205,7 @@ wxStyledTextEvent::wxStyledTextEvent(const wxStyledTextEvent& event):
|
||||
|
||||
/*static*/ wxVersionInfo wxStyledTextCtrl::GetLibraryVersionInfo()
|
||||
{
|
||||
return wxVersionInfo("Scintilla", 3, 4, 4, "Scintilla 3.4.4");
|
||||
return wxVersionInfo("Scintilla", 3, 5, 2, "Scintilla 3.5.2");
|
||||
}
|
||||
|
||||
#endif // wxUSE_STC
|
||||
|
Loading…
Reference in New Issue
Block a user