diff options
-rw-r--r-- | gtk/makefile | 8 | ||||
-rw-r--r-- | include/Accessor.h | 102 | ||||
-rw-r--r-- | include/KeyWords.h | 4 | ||||
-rw-r--r-- | src/KeyWords.cxx | 2 | ||||
-rw-r--r-- | src/LexCPP.cxx | 4 | ||||
-rw-r--r-- | src/LexHTML.cxx | 20 | ||||
-rw-r--r-- | src/LexOthers.cxx | 16 | ||||
-rw-r--r-- | src/LexPerl.cxx | 6 | ||||
-rw-r--r-- | src/LexPython.cxx | 6 | ||||
-rw-r--r-- | src/LexSQL.cxx | 4 | ||||
-rw-r--r-- | src/LexVB.cxx | 4 | ||||
-rw-r--r-- | src/ScintillaBase.cxx | 5 | ||||
-rw-r--r-- | vcbuild/SciLexer.dsp | 16 | ||||
-rw-r--r-- | win32/PlatWin.cxx | 47 | ||||
-rw-r--r-- | win32/makefile | 9 | ||||
-rw-r--r-- | win32/makefile_bor | 15 | ||||
-rw-r--r-- | win32/makefile_vc | 16 |
17 files changed, 149 insertions, 135 deletions
diff --git a/gtk/makefile b/gtk/makefile index b1b07c92f..51e317957 100644 --- a/gtk/makefile +++ b/gtk/makefile @@ -26,14 +26,12 @@ LEXOBJS = LexCPP.o LexHTML.o LexOthers.o LexPerl.o LexPython.o LexSQL.o LexVB.o all: $(COMPLIB) $(LEXOBJS) -$(COMPLIB): Accessor.o KeyWords.o Document.o CallTip.o \ +$(COMPLIB): DocumentAccessor.o WindowAccessor.o KeyWords.o Document.o CallTip.o \ ScintillaBase.o ContractionState.o Editor.o PropSet.o PlatGTK.o \ KeyMap.o LineMarker.o ScintillaGTK.o CellBuffer.o ViewStyle.o \ Style.o Indicator.o AutoComplete.o $(AR) rc $@ $^ -Accessor.o: Accessor.cxx Platform.h PropSet.h Accessor.h Scintilla.h \ - WinDefs.h AutoComplete.o: AutoComplete.cxx Platform.h AutoComplete.h CallTip.o: CallTip.cxx Platform.h CallTip.h CellBuffer.o: CellBuffer.cxx Platform.h Scintilla.h WinDefs.h \ @@ -41,6 +39,8 @@ CellBuffer.o: CellBuffer.cxx Platform.h Scintilla.h WinDefs.h \ ContractionState.o: ContractionState.cxx Platform.h ContractionState.h Document.o: Document.cxx Platform.h Scintilla.h WinDefs.h CellBuffer.h \ Document.h +DocumentAccessor.o: Accessor.cxx Platform.h PropSet.h Accessor.h \ + DocumentAccessor.h Scintilla.h WinDefs.h Editor.o: Editor.cxx Platform.h Scintilla.h WinDefs.h \ ContractionState.h CellBuffer.h KeyMap.h Indicator.h LineMarker.h \ Style.h ViewStyle.h Document.h Editor.h @@ -82,6 +82,8 @@ ScintillaGTK.o: ScintillaGTK.cxx Platform.h Scintilla.h WinDefs.h \ Style.o: Style.cxx Platform.h Style.h ViewStyle.o: ViewStyle.cxx Platform.h Scintilla.h WinDefs.h \ Indicator.h LineMarker.h Style.h ViewStyle.h +WindowAccessor.o: WindowAccessor.cxx Platform.h PropSet.h Accessor.h \ + WindowAccessor.h Scintilla.h WinDefs.h clean: rm -f *.o SciTE diff --git a/include/Accessor.h b/include/Accessor.h index 031ad7a91..fc67f07c0 100644 --- a/include/Accessor.h +++ b/include/Accessor.h @@ -5,84 +5,34 @@ enum { wsSpace = 1, wsTab = 2, wsSpaceTab = 4, wsInconsistent=8}; -class Accessor { -protected: - // bufferSize is a trade off between time taken to copy the characters and SendMessage overhead - // slopSize positions the buffer before the desired position in case there is some backtracking - enum {bufferSize=4000, slopSize=bufferSize/8}; - char buf[bufferSize+1]; - WindowID id; - PropSet &props; - int startPos; - int endPos; - int lenDoc; - int offset; // Optional but including an offset makes GCC generate better code - int codePage; - bool InternalIsLeadByte(char ch); - void Fill(int position); -public: - Accessor(WindowID id_, PropSet &props_, int offset_=0) : - id(id_), props(props_), startPos(0x7FFFFFFF), endPos(0), - lenDoc(-1), offset(offset_), codePage(0) { - } - void SetCodePage(int codePage_) { codePage = codePage_; } - char operator[](int position) { - position += offset; - if (position < startPos || position >= endPos) { - Fill(position); - } - return buf[position - startPos]; - } - char SafeGetCharAt(int position, char chDefault=' ') { - // Safe version of operator[], returning a defined value for invalid position - position += offset; - if (position < startPos || position >= endPos) { - Fill(position); - if (position < startPos || position >= endPos) { - // Position is outside range of document - return chDefault; - } - } - return buf[position - startPos]; - } - bool IsLeadByte(char ch) { - return codePage && InternalIsLeadByte(ch); - } - char StyleAt(int position); - int GetLine(int position); - int LineStart(int line); - int LevelAt(int line); - int Length(); - void Flush() { - startPos = 0x7FFFFFFF; - lenDoc = -1; - } - int GetLineState(int line); - int SetLineState(int line, int state); - PropSet &GetPropSet() { return props; } -}; +class BufferAccess; -class StylingContext; +typedef bool (*PFNIsCommentLeader)(BufferAccess &styler, int pos, int len); -typedef bool (*PFNIsCommentLeader)(StylingContext &styler, int pos, int len); - -class StylingContext : public Accessor { - char styleBuf[bufferSize]; - int validLen; - char chFlags; - char chWhile; - unsigned int startSeg; +// Interface to data in a Scintilla +class BufferAccess { public: - StylingContext(WindowID id_, PropSet &props_, int offset_=0) : - Accessor(id_,props_,offset_), validLen(0), chFlags(0) {} - void StartAt(unsigned int start, char chMask=31); - void SetFlags(char chFlags_, char chWhile_) {chFlags = chFlags_; chWhile = chWhile_; }; - unsigned int GetStartSegment() { return startSeg; } - void StartSegment(unsigned int pos); - void ColourTo(unsigned int pos, int chAttr); - int GetLine(int position); - void SetLevel(int line, int level); - void Flush(); - int IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader = 0); + virtual void SetCodePage(int codePage_)=0; + virtual char operator[](int position)=0; + virtual char SafeGetCharAt(int position, char chDefault=' ')=0; + virtual bool IsLeadByte(char ch)=0; + virtual char StyleAt(int position)=0; + virtual int GetLine(int position)=0; + virtual int LineStart(int line)=0; + virtual int LevelAt(int line)=0; + virtual int Length()=0; + virtual void Flush()=0; + virtual int GetLineState(int line)=0; + virtual int SetLineState(int line, int state)=0; + virtual PropSet &GetPropSet()=0; + + // Style setting + virtual void StartAt(unsigned int start, char chMask=31)=0; + virtual void SetFlags(char chFlags_, char chWhile_)=0; + virtual unsigned int GetStartSegment()=0; + virtual void StartSegment(unsigned int pos)=0; + virtual void ColourTo(unsigned int pos, int chAttr)=0; + virtual void SetLevel(int line, int level)=0; + virtual int IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader = 0)=0; }; diff --git a/include/KeyWords.h b/include/KeyWords.h index 1b42ecdd9..65c54379b 100644 --- a/include/KeyWords.h +++ b/include/KeyWords.h @@ -4,7 +4,7 @@ // The License.txt file describes the conditions under which this software may be distributed. typedef void (*LexerFunction)(unsigned int startPos, int lengthDoc, int initStyle, - WordList *keywordlists[], StylingContext &styler); + WordList *keywordlists[], BufferAccess &styler); class LexerModule { static LexerModule *base; @@ -14,7 +14,7 @@ class LexerModule { public: LexerModule(int language_, LexerFunction fn_); static void Colourise(unsigned int startPos, int lengthDoc, int initStyle, - int language, WordList *keywordlists[], StylingContext &styler); + int language, WordList *keywordlists[], BufferAccess &styler); }; inline bool iswordchar(char ch) { diff --git a/src/KeyWords.cxx b/src/KeyWords.cxx index 5d6d9c6cf..7cc69bd28 100644 --- a/src/KeyWords.cxx +++ b/src/KeyWords.cxx @@ -26,7 +26,7 @@ LexerModule::LexerModule(int language_, LexerFunction fn_) : } void LexerModule::Colourise(unsigned int startPos, int lengthDoc, int initStyle, - int language, WordList *keywordlists[], StylingContext &styler) { + int language, WordList *keywordlists[], BufferAccess &styler) { LexerModule *lm = base; while (lm) { if (lm->language == language) { diff --git a/src/LexCPP.cxx b/src/LexCPP.cxx index 4afae231f..d3c00164f 100644 --- a/src/LexCPP.cxx +++ b/src/LexCPP.cxx @@ -17,7 +17,7 @@ #include "Scintilla.h" #include "SciLexer.h" -static bool classifyWordCpp(unsigned int start, unsigned int end, WordList &keywords, StylingContext &styler) { +static bool classifyWordCpp(unsigned int start, unsigned int end, WordList &keywords, BufferAccess &styler) { char s[100]; bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.'); bool wordIsUUID = false; @@ -39,7 +39,7 @@ static bool classifyWordCpp(unsigned int start, unsigned int end, WordList &keyw } static void ColouriseCppDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], - StylingContext &styler) { + BufferAccess &styler) { WordList &keywords = *keywordlists[0]; diff --git a/src/LexHTML.cxx b/src/LexHTML.cxx index ae2de8ff2..490bed6ee 100644 --- a/src/LexHTML.cxx +++ b/src/LexHTML.cxx @@ -18,7 +18,7 @@ #include "SciLexer.h" enum { eScriptNone, eScriptJS, eScriptVBS, eScriptPython }; -static int segIsScriptingIndicator(StylingContext &styler, unsigned int start, unsigned int end, int prevValue) { +static int segIsScriptingIndicator(BufferAccess &styler, unsigned int start, unsigned int end, int prevValue) { char s[100]; s[0] = '\0'; for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { @@ -38,7 +38,7 @@ static int segIsScriptingIndicator(StylingContext &styler, unsigned int start, u return prevValue; } -static void classifyAttribHTML(unsigned int start, unsigned int end, WordList &keywords, StylingContext &styler) { +static void classifyAttribHTML(unsigned int start, unsigned int end, WordList &keywords, BufferAccess &styler) { bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.') || (styler[start] == '-') || (styler[start] == '#'); char chAttr = SCE_H_ATTRIBUTEUNKNOWN; @@ -58,7 +58,7 @@ static void classifyAttribHTML(unsigned int start, unsigned int end, WordList &k } static int classifyTagHTML(unsigned int start, unsigned int end, - WordList &keywords, StylingContext &styler) { + WordList &keywords, BufferAccess &styler) { char s[100]; // Copy after the '<' unsigned int i = 0; @@ -86,7 +86,7 @@ static int classifyTagHTML(unsigned int start, unsigned int end, } static void classifyWordHTJS(unsigned int start, unsigned int end, - WordList &keywords, StylingContext &styler) { + WordList &keywords, BufferAccess &styler) { char s[100]; bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.'); for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { @@ -104,7 +104,7 @@ static void classifyWordHTJS(unsigned int start, unsigned int end, } static void classifyWordHTJSA(unsigned int start, unsigned int end, - WordList &keywords, StylingContext &styler) { + WordList &keywords, BufferAccess &styler) { char s[100]; bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.'); for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { @@ -121,7 +121,7 @@ static void classifyWordHTJSA(unsigned int start, unsigned int end, styler.ColourTo(end, chAttr); } -static int classifyWordHTVB(unsigned int start, unsigned int end, WordList &keywords, StylingContext &styler) { +static int classifyWordHTVB(unsigned int start, unsigned int end, WordList &keywords, BufferAccess &styler) { char s[100]; bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.'); for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { @@ -145,7 +145,7 @@ static int classifyWordHTVB(unsigned int start, unsigned int end, WordList &keyw return SCE_HB_DEFAULT; } -static int classifyWordHTVBA(unsigned int start, unsigned int end, WordList &keywords, StylingContext &styler) { +static int classifyWordHTVBA(unsigned int start, unsigned int end, WordList &keywords, BufferAccess &styler) { char s[100]; bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.'); for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { @@ -169,7 +169,7 @@ static int classifyWordHTVBA(unsigned int start, unsigned int end, WordList &key return SCE_HBA_DEFAULT; } -static void classifyWordHTPy(unsigned int start, unsigned int end, WordList &keywords, StylingContext &styler, char *prevWord) { +static void classifyWordHTPy(unsigned int start, unsigned int end, WordList &keywords, BufferAccess &styler, char *prevWord) { char s[100]; bool wordIsNumber = isdigit(styler[start]); for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { @@ -189,7 +189,7 @@ static void classifyWordHTPy(unsigned int start, unsigned int end, WordList &key strcpy(prevWord, s); } -static void classifyWordHTPyA(unsigned int start, unsigned int end, WordList &keywords, StylingContext &styler, char *prevWord) { +static void classifyWordHTPyA(unsigned int start, unsigned int end, WordList &keywords, BufferAccess &styler, char *prevWord) { char s[100]; bool wordIsNumber = isdigit(styler[start]); for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { @@ -226,7 +226,7 @@ static bool isLineEnd(char ch) { } static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], - StylingContext &styler) { + BufferAccess &styler) { WordList &keywords=*keywordlists[0]; WordList &keywords2=*keywordlists[1]; diff --git a/src/LexOthers.cxx b/src/LexOthers.cxx index d2a0d563b..abaf3ce75 100644 --- a/src/LexOthers.cxx +++ b/src/LexOthers.cxx @@ -17,7 +17,7 @@ #include "Scintilla.h" #include "SciLexer.h" -static void ColouriseBatchLine(char *lineBuffer, int endLine, StylingContext &styler) { +static void ColouriseBatchLine(char *lineBuffer, int endLine, BufferAccess &styler) { if (0 == strncmp(lineBuffer, "REM", 3)) { styler.ColourTo(endLine, 1); } else if (0 == strncmp(lineBuffer, "rem", 3)) { @@ -33,7 +33,7 @@ static void ColouriseBatchLine(char *lineBuffer, int endLine, StylingContext &st } } -static void ColouriseBatchDoc(unsigned int startPos, int length, int, WordList *[], StylingContext &styler) { +static void ColouriseBatchDoc(unsigned int startPos, int length, int, WordList *[], BufferAccess &styler) { char lineBuffer[1024]; styler.StartAt(startPos); styler.StartSegment(startPos); @@ -49,7 +49,7 @@ static void ColouriseBatchDoc(unsigned int startPos, int length, int, WordList * ColouriseBatchLine(lineBuffer, startPos + length, styler); } -static void ColourisePropsLine(char *lineBuffer, int lengthLine, int startLine, int endPos, StylingContext &styler) { +static void ColourisePropsLine(char *lineBuffer, int lengthLine, int startLine, int endPos, BufferAccess &styler) { int i = 0; while (isspace(lineBuffer[i]) && (i < lengthLine)) // Skip initial spaces i++; @@ -75,7 +75,7 @@ static void ColourisePropsLine(char *lineBuffer, int lengthLine, int startLine, } } -static void ColourisePropsDoc(unsigned int startPos, int length, int, WordList *[], StylingContext &styler) { +static void ColourisePropsDoc(unsigned int startPos, int length, int, WordList *[], BufferAccess &styler) { char lineBuffer[1024]; styler.StartAt(startPos); styler.StartSegment(startPos); @@ -96,7 +96,7 @@ static void ColourisePropsDoc(unsigned int startPos, int length, int, WordList * ColourisePropsLine(lineBuffer, linePos, startLine, startPos + length, styler); } -static void ColouriseMakeLine(char *lineBuffer, int lengthLine, int endPos, StylingContext &styler) { +static void ColouriseMakeLine(char *lineBuffer, int lengthLine, int endPos, BufferAccess &styler) { int i = 0; while (isspace(lineBuffer[i]) && (i < lengthLine)) i++; @@ -107,7 +107,7 @@ static void ColouriseMakeLine(char *lineBuffer, int lengthLine, int endPos, Styl } } -static void ColouriseMakeDoc(unsigned int startPos, int length, int, WordList *[], StylingContext &styler) { +static void ColouriseMakeDoc(unsigned int startPos, int length, int, WordList *[], BufferAccess &styler) { char lineBuffer[1024]; styler.StartAt(startPos); styler.StartSegment(startPos); @@ -123,7 +123,7 @@ static void ColouriseMakeDoc(unsigned int startPos, int length, int, WordList *[ ColouriseMakeLine(lineBuffer, linePos, startPos + length, styler); } -static void ColouriseErrorListLine(char *lineBuffer, int lengthLine, int endPos, StylingContext &styler) { +static void ColouriseErrorListLine(char *lineBuffer, int lengthLine, int endPos, BufferAccess &styler) { if (lineBuffer[0] == '>') { // Command or return status styler.ColourTo(endPos, 4); @@ -178,7 +178,7 @@ static void ColouriseErrorListLine(char *lineBuffer, int lengthLine, int endPos, } } -static void ColouriseErrorListDoc(unsigned int startPos, int length, int, WordList *[], StylingContext &styler) { +static void ColouriseErrorListDoc(unsigned int startPos, int length, int, WordList *[], BufferAccess &styler) { char lineBuffer[1024]; styler.StartAt(startPos); styler.StartSegment(startPos); diff --git a/src/LexPerl.cxx b/src/LexPerl.cxx index f9170b9c3..c52aa8c4f 100644 --- a/src/LexPerl.cxx +++ b/src/LexPerl.cxx @@ -31,7 +31,7 @@ inline bool isPerlOperator(char ch) { return false; } -static int classifyWordPerl(unsigned int start, unsigned int end, WordList &keywords, StylingContext &styler) { +static int classifyWordPerl(unsigned int start, unsigned int end, WordList &keywords, BufferAccess &styler) { char s[100]; bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.'); for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { @@ -54,7 +54,7 @@ static bool isEndVar(char ch) { ch != '_' && ch != '\''; } -static bool isMatch(StylingContext &styler, int lengthDoc, int pos, const char *val) { +static bool isMatch(BufferAccess &styler, int lengthDoc, int pos, const char *val) { if ((pos + static_cast<int>(strlen(val))) >= lengthDoc) { return false; } @@ -90,7 +90,7 @@ static char opposite(char ch) { } static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle, - WordList *keywordlists[], StylingContext &styler) { + WordList *keywordlists[], BufferAccess &styler) { // Lexer for perl often has to backtrack to start of current style to determine // which characters are being used as quotes, how deeply nested is the diff --git a/src/LexPython.cxx b/src/LexPython.cxx index d7830b0b7..fcaa541ac 100644 --- a/src/LexPython.cxx +++ b/src/LexPython.cxx @@ -17,7 +17,7 @@ #include "Scintilla.h" #include "SciLexer.h" -static void classifyWordPy(unsigned int start, unsigned int end, WordList &keywords, StylingContext &styler, char *prevWord) { +static void classifyWordPy(unsigned int start, unsigned int end, WordList &keywords, BufferAccess &styler, char *prevWord) { char s[100]; bool wordIsNumber = isdigit(styler[start]); for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { @@ -37,12 +37,12 @@ static void classifyWordPy(unsigned int start, unsigned int end, WordList &keywo strcpy(prevWord, s); } -static bool IsPyComment(StylingContext &styler, int pos, int len) { +static bool IsPyComment(BufferAccess &styler, int pos, int len) { return len>0 && styler[pos]=='#'; } static void ColourisePyDoc(unsigned int startPos, int length, int initStyle, - WordList *keywordlists[], StylingContext &styler) { + WordList *keywordlists[], BufferAccess &styler) { // Python uses a different mask because bad indentation is marked by oring with 32 styler.StartAt(startPos, 127); diff --git a/src/LexSQL.cxx b/src/LexSQL.cxx index 900f8ddc2..6433776ca 100644 --- a/src/LexSQL.cxx +++ b/src/LexSQL.cxx @@ -17,7 +17,7 @@ #include "Scintilla.h" #include "SciLexer.h" -static void classifyWordSQL(unsigned int start, unsigned int end, WordList &keywords, StylingContext &styler) { +static void classifyWordSQL(unsigned int start, unsigned int end, WordList &keywords, BufferAccess &styler) { char s[100]; bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.'); for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { @@ -35,7 +35,7 @@ static void classifyWordSQL(unsigned int start, unsigned int end, WordList &keyw } static void ColouriseSQLDoc(unsigned int startPos, int length, - int initStyle, WordList *keywordlists[], StylingContext &styler) { + int initStyle, WordList *keywordlists[], BufferAccess &styler) { WordList &keywords = *keywordlists[0]; diff --git a/src/LexVB.cxx b/src/LexVB.cxx index a78ea07b5..2b2154f21 100644 --- a/src/LexVB.cxx +++ b/src/LexVB.cxx @@ -17,7 +17,7 @@ #include "Scintilla.h" #include "SciLexer.h" -static int classifyWordVB(unsigned int start, unsigned int end, WordList &keywords, StylingContext &styler) { +static int classifyWordVB(unsigned int start, unsigned int end, WordList &keywords, BufferAccess &styler) { char s[100]; bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.'); @@ -43,7 +43,7 @@ static int classifyWordVB(unsigned int start, unsigned int end, WordList &keywor } static void ColouriseVBDoc(unsigned int startPos, int length, int initStyle, - WordList *keywordlists[], StylingContext &styler) { + WordList *keywordlists[], BufferAccess &styler) { WordList &keywords = *keywordlists[0]; diff --git a/src/ScintillaBase.cxx b/src/ScintillaBase.cxx index 21f984044..76177f242 100644 --- a/src/ScintillaBase.cxx +++ b/src/ScintillaBase.cxx @@ -15,6 +15,8 @@ #include "SciLexer.h" #include "PropSet.h" #include "Accessor.h" +#include "WindowAccessor.h" +#include "DocumentAccessor.h" #include "KeyWords.h" #endif #include "ContractionState.h" @@ -276,7 +278,8 @@ void ScintillaBase::Colourise(int start, int end) { end = lengthDoc; int len = end - start; - StylingContext styler(wMain.GetID(), props); + //WindowAccessor styler(wMain.GetID(), props); + DocumentAccessor styler(pdoc, props); int styleStart = 0; if (start > 0) diff --git a/vcbuild/SciLexer.dsp b/vcbuild/SciLexer.dsp index 678ba7d3e..b0a7e20d3 100644 --- a/vcbuild/SciLexer.dsp +++ b/vcbuild/SciLexer.dsp @@ -54,7 +54,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib imm32.lib comctl32.lib /nologo /dll /machine:I386 /out:"Release/SciLexer.dll" +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib imm32.lib comctl32.lib /nologo /dll /machine:I386 !ELSEIF "$(CFG)" == "SciLexer - Win32 Debug" @@ -81,7 +81,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib imm32.lib comctl32.lib /nologo /dll /debug /machine:I386 /out:"Debug/SciLexer.dll" /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib imm32.lib comctl32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept !ENDIF @@ -94,10 +94,6 @@ LINK32=link.exe # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File -SOURCE=..\src\Accessor.cxx -# End Source File -# Begin Source File - SOURCE=..\src\AutoComplete.cxx # End Source File # Begin Source File @@ -118,6 +114,10 @@ SOURCE=..\src\Document.cxx # End Source File # Begin Source File +SOURCE=..\src\DocumentAccessor.cxx +# End Source File +# Begin Source File + SOURCE=..\src\Editor.cxx # End Source File # Begin Source File @@ -192,6 +192,10 @@ SOURCE=..\src\Style.cxx SOURCE=..\src\ViewStyle.cxx # End Source File +# Begin Source File + +SOURCE=..\src\WindowAccessor.cxx +# End Source File # End Group # Begin Group "Header Files" diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx index f5a4f98e2..17ca7cc03 100644 --- a/win32/PlatWin.cxx +++ b/win32/PlatWin.cxx @@ -323,12 +323,20 @@ void Surface::Copy(PRectangle rc, Point from, Surface &surfaceSource) { surfaceSource.hdc, from.x, from.y, SRCCOPY); } +#define ASCII_ONLY 1 + void Surface::DrawText(PRectangle rc, Font &font_, int ybase, const char *s, int len, Colour fore, Colour back) { SetFont(font_); ::SetTextColor(hdc, fore.AsLong()); ::SetBkColor(hdc, back.AsLong()); RECT rcw = RectFromPRectangle(rc); +#ifdef ASCII_ONLY ::ExtTextOut(hdc, rc.left, ybase, ETO_OPAQUE, &rcw, s, len, NULL); +#else + wchar_t tbuf[20000]; + int tlen = MultiByteToWideChar(CP_UTF8, 0, s, len, tbuf, sizeof(tbuf)); + ::ExtTextOutW(hdc, rc.left, ybase, ETO_OPAQUE, &rcw, tbuf, tlen, NULL); +#endif } void Surface::DrawTextClipped(PRectangle rc, Font &font_, int ybase, const char *s, int len, Colour fore, Colour back) { @@ -336,13 +344,25 @@ void Surface::DrawTextClipped(PRectangle rc, Font &font_, int ybase, const char ::SetTextColor(hdc, fore.AsLong()); ::SetBkColor(hdc, back.AsLong()); RECT rcw = RectFromPRectangle(rc); +#ifdef ASCII_ONLY ::ExtTextOut(hdc, rc.left, ybase, ETO_OPAQUE | ETO_CLIPPED, &rcw, s, len, NULL); +#else + wchar_t tbuf[20000]; + int tlen = MultiByteToWideChar(CP_UTF8, 0, s, len, tbuf, sizeof(tbuf)); + ::ExtTextOutW(hdc, rc.left, ybase, ETO_OPAQUE | ETO_CLIPPED, &rcw, tbuf, tlen, NULL); +#endif } int Surface::WidthText(Font &font_, const char *s, int len) { SetFont(font_); SIZE sz; +#ifdef ASCII_ONLY ::GetTextExtentPoint32(hdc, s, len, &sz); +#else + wchar_t tbuf[20000]; + int tlen = MultiByteToWideChar(CP_UTF8, 0, s, len, tbuf, sizeof(tbuf)); + ::GetTextExtentPoint32W(hdc, tbuf, tlen, &sz); +#endif return sz.cx; } @@ -350,7 +370,34 @@ void Surface::MeasureWidths(Font &font_, const char *s, int len, int *positions) SetFont(font_); SIZE sz; int fit = 0; +#ifdef ASCII_ONLY ::GetTextExtentExPoint(hdc, s, len, 30000, &fit, positions, &sz); +#else + wchar_t tbuf[20000]; + int poses[20000]; + int tlen = MultiByteToWideChar(CP_UTF8, 0, s, len, tbuf, sizeof(tbuf)); + ::GetTextExtentExPointW(hdc, tbuf, tlen, 30000, &fit, poses, &sz); + int ui=0; + const unsigned char *us = reinterpret_cast<const unsigned char *>(s); + int i=0; + while (i<len) { + positions[i] = poses[ui]; + if (us[i] < 128) { + ui++; + } else if (us[i] < (128 + 64 + 32)) { + positions[i+1] = poses[ui]; + ui++; + i++; + } else { + positions[i+1] = poses[ui]; + positions[i+2] = poses[ui]; + ui++; + i++; + i++; + } + i++; + } +#endif } int Surface::WidthChar(Font &font_, char ch) { diff --git a/win32/makefile b/win32/makefile index 9dfb6be57..2fc51baae 100644 --- a/win32/makefile +++ b/win32/makefile @@ -24,7 +24,7 @@ CXXFLAGS = -pedantic $(INCLUDEDIRS) -Os -fno-exceptions -fvtable-thunks -fno-rtt .cxx.o: $(CC) $(CXXFLAGS) -c $< -o $@ -ALL: $(COMPONENT) $(LEXCOMPONENT) ScintillaWinS.o +ALL: $(COMPONENT) $(LEXCOMPONENT) ScintillaWinS.o WindowAccessor.o clean: del /q *.exe *.o *.obj *.dll *.res *.map @@ -41,17 +41,17 @@ $(COMPONENT): $(SOBJS) LOBJS = ScintillaWinL.o ScintillaBaseL.o Editor.o Document.o \ ContractionState.o CellBuffer.o CallTip.o \ ScintRes.o PlatWin.o KeyMap.o Indicator.o LineMarker.o Style.o \ - ViewStyle.o AutoComplete.o KeyWords.o Accessor.o PropSet.o $(LEXOBJS) + ViewStyle.o AutoComplete.o KeyWords.o DocumentAccessor.o PropSet.o $(LEXOBJS) $(LEXCOMPONENT): $(LOBJS) $(DLLWRAP) --target i386-mingw32 -o $(LEXCOMPONENT) $(LOBJS) $(LDFLAGS) -s --relocatable -Accessor.o: Accessor.cxx Platform.h PropSet.h Accessor.h Scintilla.h AutoComplete.o: AutoComplete.cxx Platform.h AutoComplete.h CallTip.o: CallTip.cxx Platform.h CallTip.h CellBuffer.o: CellBuffer.cxx Platform.h Scintilla.h CellBuffer.h ContractionState.o: ContractionState.cxx Platform.h ContractionState.h Document.o: Document.cxx Platform.h Scintilla.h CellBuffer.h \ Document.h +DocumentAccessor.o: DocumentAccessor.cxx Platform.h PropSet.h Accessor.h DocumentAccessor.h Scintilla.h Editor.o: Editor.cxx Platform.h Scintilla.h ContractionState.h \ CellBuffer.h KeyMap.h Indicator.h LineMarker.h Style.h ViewStyle.h \ Document.h Editor.h @@ -83,7 +83,7 @@ ScintillaBase.o: ScintillaBase.cxx Platform.h Scintilla.h \ ScintillaBaseL.o: ScintillaBase.cxx Platform.h Scintilla.h SciLexer.h \ ContractionState.h CellBuffer.h CallTip.h KeyMap.h Indicator.h \ LineMarker.h Style.h AutoComplete.h ViewStyle.h Document.h Editor.h \ - ScintillaBase.h PropSet.h Accessor.h KeyWords.h + ScintillaBase.h PropSet.h Accessor.h DocumentAccessor.h KeyWords.h ScintillaWin.o: ScintillaWin.cxx Platform.h Scintilla.h \ ContractionState.h CellBuffer.h CallTip.h KeyMap.h Indicator.h \ LineMarker.h Style.h AutoComplete.h ViewStyle.h Document.h Editor.h \ @@ -99,6 +99,7 @@ ScintillaWinS.o: ScintillaWin.cxx Platform.h Scintilla.h \ Style.o: Style.cxx Platform.h Style.h ViewStyle.o: ViewStyle.cxx Platform.h Scintilla.h Indicator.h \ LineMarker.h Style.h ViewStyle.h +WindowAccessor.o: DocumentAccessor.cxx Platform.h PropSet.h Accessor.h WindowAccessor.h Scintilla.h ScintillaBaseL.o: $(CC) $(CXXFLAGS) -D SCI_LEXER -c $< -o ScintillaBaseL.o diff --git a/win32/makefile_bor b/win32/makefile_bor index 51234e092..363f7693f 100644 --- a/win32/makefile_bor +++ b/win32/makefile_bor @@ -23,7 +23,7 @@ CXXFLAGS = -P -tW -w -RT- -x- -v .rc.res: $(RC) /r $*.rc -ALL: $(COMPONENT) $(LEXCOMPONENT) ScintillaWinS.obj +ALL: $(COMPONENT) $(LEXCOMPONENT) ScintillaWinS.obj WindowAccessor.obj clean: del /q *.exe *.o *.obj *.dll *.res *.map @@ -40,13 +40,10 @@ LEXOBJS = LexCPP.obj LexHTML.obj LexOthers.obj LexPerl.obj LexPython.obj LexSQL. LOBJS = ScintillaWinL.obj ScintillaBaseL.obj Editor.obj Document.obj \ ContractionState.obj CellBuffer.obj CallTip.obj \ PlatWin.obj KeyMap.obj Indicator.obj LineMarker.obj Style.obj \ - ViewStyle.obj AutoComplete.obj KeyWords.obj Accessor.obj PropSet.obj $(LEXOBJS) + ViewStyle.obj AutoComplete.obj KeyWords.obj DocumentAccessor.obj PropSet.obj $(LEXOBJS) $(LEXCOMPONENT): $(LOBJS) $(LD) -Tpd /c c0d32 $(LOBJS), $(LEXCOMPONENT), ,$(LDFLAGS), , ScintRes.res -Accessor.obj: ..\src\Accessor.cxx ..\include\Platform.h ..\include\PropSet.h ..\include\Accessor.h ..\include\Scintilla.h - $(CC) $(INCLUDEDIRS) $(CXXFLAGS) -c ..\src\$*.cxx -o$* - AutoComplete.obj: ..\src\AutoComplete.cxx ..\include\Platform.h ..\src\AutoComplete.h $(CC) $(INCLUDEDIRS) $(CXXFLAGS) -c ..\src\$*.cxx -o$* @@ -63,6 +60,9 @@ Document.obj: ..\src\Document.cxx ..\include\Platform.h ..\include\Scintilla.h . ..\src\Document.h $(CC) $(INCLUDEDIRS) $(CXXFLAGS) -c ..\src\$*.cxx -o$* +DocumentAccessor.obj: ..\src\DocumentAccessor.cxx ..\include\Platform.h ..\include\PropSet.h ..\include\Accessor.h ..\src\DocumentAccessor.h ..\include\Scintilla.h + $(CC) $(INCLUDEDIRS) $(CXXFLAGS) -c ..\src\$*.cxx -o$* + Editor.obj: ..\src\Editor.cxx ..\include\Platform.h ..\include\Scintilla.h ..\src\ContractionState.h \ ..\src\CellBuffer.h ..\src\KeyMap.h ..\src\Indicator.h ..\src\LineMarker.h ..\src\Style.h ..\src\ViewStyle.h \ ..\src\Document.h ..\src\Editor.h @@ -123,7 +123,7 @@ ScintillaBase.obj: ..\src\ScintillaBase.cxx ..\include\Platform.h ..\include\Sci ScintillaBaseL.obj: ..\src\ScintillaBase.cxx ..\include\Platform.h ..\include\Scintilla.h ..\include\SciLexer.h \ ..\src\ContractionState.h ..\src\CellBuffer.h ..\src\CallTip.h ..\src\KeyMap.h ..\src\Indicator.h \ ..\src\LineMarker.h ..\src\Style.h ..\src\AutoComplete.h ..\src\ViewStyle.h ..\src\Document.h ..\src\Editor.h \ - ..\src\ScintillaBase.h ..\include\PropSet.h ..\include\Accessor.h ..\include\KeyWords.h + ..\src\ScintillaBase.h ..\include\PropSet.h ..\include\Accessor.h ..\src\DocumentAccessor.h ..\include\KeyWords.h $(CC) $(INCLUDEDIRS) $(CXXFLAGS) /DSCI_LEXER -o$* /c ..\src\ScintillaBase.cxx ScintillaWin.obj: ScintillaWin.cxx ..\include\Platform.h ..\include\Scintilla.h \ @@ -149,3 +149,6 @@ Style.obj: ..\src\Style.cxx ..\include\Platform.h ..\src\Style.h ViewStyle.obj: ..\src\ViewStyle.cxx ..\include\Platform.h ..\include\Scintilla.h ..\src\Indicator.h \ ..\src\LineMarker.h ..\src\Style.h ..\src\ViewStyle.h $(CC) $(INCLUDEDIRS) $(CXXFLAGS) -c ..\src\$*.cxx -o$@ + +WindowAccessor.obj: ..\src\WindowAccessor.cxx ..\include\Platform.h ..\include\PropSet.h ..\include\Accessor.h ..\include\WindowAccessor.h ..\include\Scintilla.h + $(CC) $(INCLUDEDIRS) $(CXXFLAGS) -c ..\src\$*.cxx -o$* diff --git a/win32/makefile_vc b/win32/makefile_vc index c7a31347f..6070cf7ac 100644 --- a/win32/makefile_vc +++ b/win32/makefile_vc @@ -32,7 +32,7 @@ CXXFLAGS=$(CXXFLAGS) /Ox /MD .rc.res: $(RC) $*.rc -ALL: $(COMPONENT) $(LEXCOMPONENT) $(DIR_O)\ScintillaWinS.obj +ALL: $(COMPONENT) $(LEXCOMPONENT) $(DIR_O)\ScintillaWinS.obj $(DIR_O)\WindowAccessor.obj clean: del /q $(DIR_O)\*.obj $(COMPONENT) $(LEXCOMPONENT) $(DIR_O)\*.res $(DIR_BIN)\*.map @@ -61,7 +61,7 @@ LOBJS = $(DIR_O)\ScintillaWinL.obj $(DIR_O)\ScintillaBaseL.obj \ $(DIR_O)\PlatWin.obj $(DIR_O)\KeyMap.obj $(DIR_O)\Indicator.obj \ $(DIR_O)\LineMarker.obj $(DIR_O)\Style.obj \ $(DIR_O)\ViewStyle.obj $(DIR_O)\AutoComplete.obj \ - $(DIR_O)\KeyWords.obj $(DIR_O)\Accessor.obj \ + $(DIR_O)\KeyWords.obj $(DIR_O)\DocumentAccessor.obj \ $(DIR_O)\PropSet.obj $(LEXOBJS) $(DIR_O)\ScintRes.res : ScintRes.rc @@ -70,9 +70,6 @@ $(DIR_O)\ScintRes.res : ScintRes.rc $(LEXCOMPONENT): $(LOBJS) $(DIR_O)\ScintRes.res $(LD) /DLL /OUT:$(LEXCOMPONENT) $(LOBJS) $(DIR_O)\ScintRes.res $(LDFLAGS) -$(DIR_O)\Accessor.obj: ..\src\Accessor.cxx ..\include\Platform.h ..\include\PropSet.h ..\include\Accessor.h ..\include\Scintilla.h - $(CC) $(INCLUDEDIRS) $(CXXFLAGS) /Fo$@ /c ..\src\$(@B).cxx - $(DIR_O)\AutoComplete.obj: ..\src\AutoComplete.cxx ..\include\Platform.h ..\src\AutoComplete.h $(CC) $(INCLUDEDIRS) $(CXXFLAGS) /Fo$@ /c ..\src\$(@B).cxx @@ -89,6 +86,9 @@ $(DIR_O)\Document.obj: ..\src\Document.cxx ..\include\Platform.h ..\include\Scin ..\src\Document.h $(CC) $(INCLUDEDIRS) $(CXXFLAGS) /Fo$@ /c ..\src\$(@B).cxx +$(DIR_O)\DocumentAccessor.obj: ..\src\DocumentAccessor.cxx ..\include\Platform.h ..\include\PropSet.h ..\include\Accessor.h ..\src\DocumentAccessor.h ..\include\Scintilla.h + $(CC) $(INCLUDEDIRS) $(CXXFLAGS) /Fo$@ /c ..\src\$(@B).cxx + $(DIR_O)\Editor.obj: ..\src\Editor.cxx ..\include\Platform.h ..\include\Scintilla.h ..\src\ContractionState.h \ ..\src\CellBuffer.h ..\src\KeyMap.h ..\src\Indicator.h ..\src\LineMarker.h ..\src\Style.h ..\src\ViewStyle.h \ ..\src\Document.h ..\src\Editor.h @@ -150,7 +150,7 @@ $(DIR_O)\ScintillaBase.obj: ..\src\ScintillaBase.cxx ..\include\Platform.h ..\in $(DIR_O)\ScintillaBaseL.obj: ..\src\ScintillaBase.cxx ..\include\Platform.h ..\include\Scintilla.h ..\include\SciLexer.h \ ..\src\ContractionState.h ..\src\CellBuffer.h ..\src\CallTip.h ..\src\KeyMap.h ..\src\Indicator.h \ ..\src\LineMarker.h ..\src\Style.h ..\src\AutoComplete.h ..\src\ViewStyle.h ..\src\Document.h ..\src\Editor.h \ - ..\src\ScintillaBase.h ..\include\PropSet.h ..\include\Accessor.h ..\include\KeyWords.h + ..\src\ScintillaBase.h ..\include\PropSet.h ..\include\Accessor.h ..\src\DocumentAccessor.h ..\include\KeyWords.h $(CC) $(INCLUDEDIRS) $(CXXFLAGS) /D SCI_LEXER /c ..\src\ScintillaBase.cxx /Fo$@ $(DIR_O)\ScintillaWin.obj: ScintillaWin.cxx ..\include\Platform.h ..\include\Scintilla.h \ @@ -177,3 +177,7 @@ $(DIR_O)\Style.obj: ..\src\Style.cxx ..\include\Platform.h ..\src\Style.h $(DIR_O)\ViewStyle.obj: ..\src\ViewStyle.cxx ..\include\Platform.h ..\include\Scintilla.h ..\src\Indicator.h \ ..\src\LineMarker.h ..\src\Style.h ..\src\ViewStyle.h $(CC) $(INCLUDEDIRS) $(CXXFLAGS) /Fo$@ /c ..\src\$(@B).cxx + +$(DIR_O)\WindowAccessor.obj: ..\src\WindowAccessor.cxx ..\include\Platform.h ..\include\PropSet.h ..\include\Accessor.h ..\include\WindowAccessor.h ..\include\Scintilla.h + $(CC) $(INCLUDEDIRS) $(CXXFLAGS) /Fo$@ /c ..\src\$(@B).cxx + |