Updated to version 1.40 of Scintilla

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@12050 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn 2001-10-18 01:24:58 +00:00
parent 2fe212b033
commit b8b0e4022e
62 changed files with 2874 additions and 3196 deletions

View File

@ -72,6 +72,7 @@
#define wxSTC_MARK_CIRCLEPLUSCONNECTED 19
#define wxSTC_MARK_CIRCLEMINUS 20
#define wxSTC_MARK_CIRCLEMINUSCONNECTED 21
#define wxSTC_MARK_CHARACTER 10000
// Markers used for outlining column
#define wxSTC_MARKNUM_FOLDEREND 25
@ -83,12 +84,16 @@
#define wxSTC_MARKNUM_FOLDEROPEN 31
#define wxSTC_MARGIN_SYMBOL 0
#define wxSTC_MARGIN_NUMBER 1
// Styles in range 32..37 are predefined for parts of the UI and are not used as normal styles.
// Styles 38 and 39 are for future use.
#define wxSTC_STYLE_DEFAULT 32
#define wxSTC_STYLE_LINENUMBER 33
#define wxSTC_STYLE_BRACELIGHT 34
#define wxSTC_STYLE_BRACEBAD 35
#define wxSTC_STYLE_CONTROLCHAR 36
#define wxSTC_STYLE_INDENTGUIDE 37
#define wxSTC_STYLE_LASTPREDEFINED 39
#define wxSTC_STYLE_MAX 127
// Character set identifiers are used in StyleSetCharacterSet.
@ -295,6 +300,7 @@
#define wxSTC_LEX_EIFFEL 23
#define wxSTC_LEX_EIFFELKW 24
#define wxSTC_LEX_TCL 25
#define wxSTC_LEX_NNCRONTAB 26
// When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
// value assigned in sequence from SCLEX_AUTOMATIC+1.
@ -334,6 +340,8 @@
#define wxSTC_C_REGEX 14
#define wxSTC_C_COMMENTLINEDOC 15
#define wxSTC_C_WORD2 16
#define wxSTC_C_COMMENTDOCKEYWORD 17
#define wxSTC_C_COMMENTDOCKEYWORDERROR 18
// Lexical states for SCLEX_HTML, SCLEX_XML
#define wxSTC_H_DEFAULT 0
@ -365,7 +373,17 @@
#define wxSTC_H_XCCOMMENT 20
// SGML
#define wxSTC_H_SGML 21
#define wxSTC_H_SGML_DEFAULT 21
#define wxSTC_H_SGML_COMMAND 22
#define wxSTC_H_SGML_1ST_PARAM 23
#define wxSTC_H_SGML_DOUBLESTRING 24
#define wxSTC_H_SGML_SIMPLESTRING 25
#define wxSTC_H_SGML_ERROR 26
#define wxSTC_H_SGML_SPECIAL 27
#define wxSTC_H_SGML_ENTITY 28
#define wxSTC_H_SGML_COMMENT 29
#define wxSTC_H_SGML_1ST_PARAM_COMMENT 30
#define wxSTC_H_SGML_BLOCK_DEFAULT 31
// Embedded Javascript
#define wxSTC_HJ_START 40
@ -604,6 +622,19 @@
#define wxSTC_EIFFEL_IDENTIFIER 7
#define wxSTC_EIFFEL_STRINGEOL 8
// Lexical states for the SCLEX_NNCRONTAB (nnCron crontab Lexer)
#define wxSTC_NNCRONTAB_DEFAULT 0
#define wxSTC_NNCRONTAB_COMMENT 1
#define wxSTC_NNCRONTAB_TASK 2
#define wxSTC_NNCRONTAB_SECTION 3
#define wxSTC_NNCRONTAB_KEYWORD 4
#define wxSTC_NNCRONTAB_MODIFIER 5
#define wxSTC_NNCRONTAB_ASTERISK 6
#define wxSTC_NNCRONTAB_NUMBER 7
#define wxSTC_NNCRONTAB_STRING 8
#define wxSTC_NNCRONTAB_ENVIRONMENT 9
#define wxSTC_NNCRONTAB_IDENTIFIER 10
// END of generated section
//----------------------------------------------------------------------
// Others
@ -1223,10 +1254,12 @@ public:
int GetTargetEnd();
// Replace the target text with the argument text.
// Text is counted so it can contain nulls.
// Returns the length of the replacement text.
int ReplaceTarget(const wxString& text);
// Replace the target text with the argument text after \d processing.
// Text is counted so it can contain nulls.
// Looks for \d where d is between 1 and 9 and replaces these with the strings
// matched in the last search operation which were surrounded by \( and \).
// Returns the length of the replacement text including any change
@ -1234,7 +1267,7 @@ public:
int ReplaceTargetRE(const wxString& text);
// Search for a counted string in the target and set the target to the found
// range.
// range. Text is counted so it can contain nulls.
// Returns length of range or -1 for failure in which case target is not moved.
int SearchInTarget(const wxString& text);

View File

@ -37,6 +37,7 @@ OBJECTS=PlatWX.o ScintillaWX.o stc.o \
LexAda.o \
LexCPP.o \
LexConf.o \
LexCrontab.o \
LexEiffel.o \
LexHTML.o \
LexLisp.o \
@ -53,6 +54,7 @@ OBJECTS=PlatWX.o ScintillaWX.o stc.o \
RESearch.o \
ScintillaBase.o \
Style.o \
StyleContext.o \
UniConversion.o \
ViewStyle.o \
WindowAccessor.o \

View File

@ -531,24 +531,20 @@ ListBox::~ListBox() {
void ListBox::Create(Window &parent, int ctrlID) {
id = new wxSTCListBox(parent.id, ctrlID);
// id = new wxListBox(parent.id, ctrlID, wxDefaultPosition, wxDefaultSize,
// 0, NULL, wxLB_SINGLE | wxLB_SORT | wxSIMPLE_BORDER);
}
void ListBox::SetVisibleRows(int rows) {
desiredVisibleRows = rows;
printf("SetVisibleRows: %d\n", rows);
}
PRectangle ListBox::GetDesiredRect() {
wxSize sz = ((wxListBox*)id)->GetBestSize();
printf("GetDesiredRect: %d, %d\n", sz.x, sz.y);
PRectangle rc;
rc.top = 0;
rc.left = 0;
if (sz.x > 400)
sz.x = 400;
if (sz.y > 150)
if (sz.y > 150) // TODO: Use desiredVisibleRows??
sz.y = 150;
rc.right = sz.x;
rc.bottom = sz.y;
@ -592,13 +588,7 @@ int ListBox::GetSelection() {
}
int ListBox::Find(const char *prefix) {
if (prefix) {
for (int x=0; x < ((wxListBox*)id)->GetCount(); x++) {
wxString text = ((wxListBox*)id)->GetString(x);
if (text.StartsWith(prefix))
return x;
}
}
// No longer used
return -1;
}

View File

@ -122,9 +122,10 @@ void ScintillaWX::Finalise() {
void ScintillaWX::StartDrag() {
wxDropSource source(wMain.GetID());
wxTextDataObject data(dragChars);
wxTextDataObject data(wxString(drag.s, drag.len));
wxDragResult result;
dropWentOutside = true;
source.SetData(data);
result = source.DoDragDrop(TRUE);
if (result == wxDragMove && dropWentOutside)
@ -217,9 +218,10 @@ void ScintillaWX::NotifyParent(SCNotification scn) {
void ScintillaWX::Copy() {
if (currentPos != anchor) {
char* text = CopySelectionRange();
SelectionText st;
CopySelectionRange(&st);
wxTheClipboard->Open();
wxTheClipboard->SetData(new wxTextDataObject(text));
wxTheClipboard->SetData(new wxTextDataObject(wxString(st.s, st.len)));
wxTheClipboard->Close();
}
}
@ -494,14 +496,15 @@ bool ScintillaWX::DoDropText(long x, long y, const wxString& data) {
wxDragResult ScintillaWX::DoDragEnter(wxCoord x, wxCoord y, wxDragResult def) {
return def;
dragResult = def;
return dragResult;
}
wxDragResult ScintillaWX::DoDragOver(wxCoord x, wxCoord y, wxDragResult def) {
SetDragPosition(PositionFromLocation(Point(x, y)));
dragResult = def;
return def;
return dragResult;
}

View File

@ -22,36 +22,45 @@ STCEXTRACPPFLAGS=-D__WX__ -DSCI_LEXER -I$(SCINTILLA)/include -I$(S)
LIBTARGET=$(WXDIR)\contrib\lib\stc.lib
OBJECTS = \
AutoComplete.obj \
CallTip.obj \
CellBuffer.obj \
ContractionState.obj \
Document.obj \
DocumentAccessor.obj \
Editor.obj \
Indicator.obj \
KeyMap.obj \
KeyWords.obj \
LexCPP.obj \
LexHTML.obj \
LexLua.obj \
LexOthers.obj \
LexPerl.obj \
LexPython.obj \
LexSQL.obj \
LexVB.obj \
LineMarker.obj \
PosRegExp.obj \
PropSet.obj \
ScintillaBase.obj \
Style.obj \
UniConversion.obj \
ViewStyle.obj \
WindowAccessor.obj \
\
PlatWX.obj \
ScintillaWX.obj \
stc.obj \
AutoComplete.obj \
CallTip.obj \
CellBuffer.obj \
ContractionState.obj \
Document.obj \
DocumentAccessor.obj \
Editor.obj \
Indicator.obj \
KeyMap.obj \
KeyWords.obj \
LexAVE.obj \
LexAda.obj \
LexCPP.obj \
LexConf.obj \
LexCrontab.obj \
LexEiffel.obj \
LexHTML.obj \
LexLisp.obj \
LexLua.obj \
LexOthers.obj \
LexPascal.obj \
LexPerl.obj \
LexPython.obj \
LexRuby.obj \
LexSQL.obj \
LexVB.obj \
LineMarker.obj \
PropSet.obj \
RESearch.obj \
ScintillaBase.obj \
Style.obj \
StyleContext.obj \
UniConversion.obj \
ViewStyle.obj \
WindowAccessor.obj \
\
PlatWX.obj \
ScintillaWX.obj \
stc.obj \
!include $(WXDIR)\src\makelib.b32

View File

@ -10,32 +10,42 @@ S=$(SCINTILLA)/src
EXTRAINC=-D__WX__ -DSCI_LEXER -I$(SCINTILLA)/include -I$(S) -I. -I$(WXDIR)/contrib/include
OBJECTS = \
$(S)/AutoComplete.$(OBJSUFF) \
$(S)/CallTip.$(OBJSUFF) \
$(S)/CellBuffer.$(OBJSUFF) \
$(S)/ContractionState.$(OBJSUFF)\
$(S)/Document.$(OBJSUFF) \
$(S)/Editor.$(OBJSUFF) \
$(S)/Indicator.$(OBJSUFF) \
$(S)/KeyMap.$(OBJSUFF) \
$(S)/KeyWords.$(OBJSUFF) \
$(S)/LineMarker.$(OBJSUFF) \
$(S)/PropSet.$(OBJSUFF) \
$(S)/ScintillaBase.$(OBJSUFF) \
$(S)/Style.$(OBJSUFF) \
$(S)/ViewStyle.$(OBJSUFF) \
$(S)/LexCPP.$(OBJSUFF) \
$(S)/LexHTML.$(OBJSUFF) \
$(S)/LexLua.$(OBJSUFF) \
$(S)/LexOthers.$(OBJSUFF) \
$(S)/LexPerl.$(OBJSUFF) \
$(S)/LexPython.$(OBJSUFF) \
$(S)/LexSQL.$(OBJSUFF) \
$(S)/LexVB.$(OBJSUFF) \
$(S)/DocumentAccessor.$(OBJSUFF)\
$(S)/AutoComplete.$(OBJSUFF) \
$(S)/CallTip.$(OBJSUFF) \
$(S)/CellBuffer.$(OBJSUFF) \
$(S)/ContractionState.$(OBJSUFF) \
$(S)/Document.$(OBJSUFF) \
$(S)/DocumentAccessor.$(OBJSUFF) \
$(S)/Editor.$(OBJSUFF) \
$(S)/Indicator.$(OBJSUFF) \
$(S)/KeyMap.$(OBJSUFF) \
$(S)/KeyWords.$(OBJSUFF) \
$(S)/LexAVE.$(OBJSUFF) \
$(S)/LexAda.$(OBJSUFF) \
$(S)/LexCPP.$(OBJSUFF) \
$(S)/LexConf.$(OBJSUFF) \
$(S)/LexCrontab.$(OBJSUFF) \
$(S)/LexEiffel.$(OBJSUFF) \
$(S)/LexHTML.$(OBJSUFF) \
$(S)/LexLisp.$(OBJSUFF) \
$(S)/LexLua.$(OBJSUFF) \
$(S)/LexOthers.$(OBJSUFF) \
$(S)/LexPascal.$(OBJSUFF) \
$(S)/LexPerl.$(OBJSUFF) \
$(S)/LexPython.$(OBJSUFF) \
$(S)/LexRuby.$(OBJSUFF) \
$(S)/LexSQL.$(OBJSUFF) \
$(S)/LexVB.$(OBJSUFF) \
$(S)/LineMarker.$(OBJSUFF) \
$(S)/PropSet.$(OBJSUFF) \
$(S)/RESearch.$(OBJSUFF) \
$(S)/ScintillaBase.$(OBJSUFF) \
$(S)/Style.$(OBJSUFF) \
$(S)/StyleContext.$(OBJSUFF) \
$(S)/UniConversion.$(OBJSUFF) \
$(S)/ViewStyle.$(OBJSUFF) \
$(S)/WindowAccessor.$(OBJSUFF) \
$(S)/PosRegExp.$(OBJSUFF) \
\
PlatWX.$(OBJSUFF) \
ScintillaWX.$(OBJSUFF) \
stc.$(OBJSUFF)

View File

@ -15,40 +15,41 @@ NOPCH=1
!include $(WXDIR)\src\makevc.env
OBJECTS = \
$(D)\AutoComplete.obj \
$(D)\CallTip.obj \
$(D)\CellBuffer.obj \
$(D)\ContractionState.obj\
$(D)\Document.obj \
$(D)\DocumentAccessor.obj\
$(D)\Editor.obj \
$(D)\Indicator.obj \
$(D)\KeyMap.obj \
$(D)\KeyWords.obj \
$(D)\LineMarker.obj \
$(D)\PropSet.obj \
$(D)\RESearch.obj \
$(D)\ScintillaBase.obj \
$(D)\Style.obj \
$(D)\UniConversion.obj \
$(D)\ViewStyle.obj \
$(D)\WindowAccessor.obj \
\
$(D)\LexAda.obj \
$(D)\LexAVE.obj \
$(D)\LexConf.obj \
$(D)\LexCPP.obj \
$(D)\LexEiffel.obj \
$(D)\LexHTML.obj \
$(D)\LexLisp.obj \
$(D)\LexLua.obj \
$(D)\LexOthers.obj \
$(D)\LexPascal.obj \
$(D)\LexPerl.obj \
$(D)\LexPython.obj \
$(D)\LexRuby.obj \
$(D)\LexSQL.obj \
$(D)\LexVB.obj \
$(D)\AutoComplete.obj \
$(D)\CallTip.obj \
$(D)\CellBuffer.obj \
$(D)\ContractionState.obj \
$(D)\Document.obj \
$(D)\DocumentAccessor.obj \
$(D)\Editor.obj \
$(D)\Indicator.obj \
$(D)\KeyMap.obj \
$(D)\KeyWords.obj \
$(D)\LexAVE.obj \
$(D)\LexAda.obj \
$(D)\LexCPP.obj \
$(D)\LexConf.obj \
$(D)\LexCrontab.obj \
$(D)\LexEiffel.obj \
$(D)\LexHTML.obj \
$(D)\LexLisp.obj \
$(D)\LexLua.obj \
$(D)\LexOthers.obj \
$(D)\LexPascal.obj \
$(D)\LexPerl.obj \
$(D)\LexPython.obj \
$(D)\LexRuby.obj \
$(D)\LexSQL.obj \
$(D)\LexVB.obj \
$(D)\LineMarker.obj \
$(D)\PropSet.obj \
$(D)\RESearch.obj \
$(D)\ScintillaBase.obj \
$(D)\Style.obj \
$(D)\StyleContext.obj \
$(D)\UniConversion.obj \
$(D)\ViewStyle.obj \
$(D)\WindowAccessor.obj \
\
$(D)\PlatWX.obj \
$(D)\ScintillaWX.obj \

View File

@ -3,5 +3,5 @@ scintilla/include directories from the Scintilla/SCiTE source
distribution. All other code needed to implement Scintilla on top of
wxWindows is located in the directory above this one.
The current version of the Scintilla code is 1.39
The current version of the Scintilla code is 1.40

View File

@ -40,6 +40,7 @@
#define SCLEX_EIFFEL 23
#define SCLEX_EIFFELKW 24
#define SCLEX_TCL 25
#define SCLEX_NNCRONTAB 26
#define SCLEX_AUTOMATIC 1000
#define SCE_P_DEFAULT 0
#define SCE_P_COMMENTLINE 1
@ -72,6 +73,8 @@
#define SCE_C_REGEX 14
#define SCE_C_COMMENTLINEDOC 15
#define SCE_C_WORD2 16
#define SCE_C_COMMENTDOCKEYWORD 17
#define SCE_C_COMMENTDOCKEYWORDERROR 18
#define SCE_H_DEFAULT 0
#define SCE_H_TAG 1
#define SCE_H_TAGUNKNOWN 2
@ -93,7 +96,17 @@
#define SCE_H_QUESTION 18
#define SCE_H_VALUE 19
#define SCE_H_XCCOMMENT 20
#define SCE_H_SGML 21
#define SCE_H_SGML_DEFAULT 21
#define SCE_H_SGML_COMMAND 22
#define SCE_H_SGML_1ST_PARAM 23
#define SCE_H_SGML_DOUBLESTRING 24
#define SCE_H_SGML_SIMPLESTRING 25
#define SCE_H_SGML_ERROR 26
#define SCE_H_SGML_SPECIAL 27
#define SCE_H_SGML_ENTITY 28
#define SCE_H_SGML_COMMENT 29
#define SCE_H_SGML_1ST_PARAM_COMMENT 30
#define SCE_H_SGML_BLOCK_DEFAULT 31
#define SCE_HJ_START 40
#define SCE_HJ_DEFAULT 41
#define SCE_HJ_COMMENT 42
@ -295,6 +308,17 @@
#define SCE_EIFFEL_OPERATOR 6
#define SCE_EIFFEL_IDENTIFIER 7
#define SCE_EIFFEL_STRINGEOL 8
#define SCE_NNCRONTAB_DEFAULT 0
#define SCE_NNCRONTAB_COMMENT 1
#define SCE_NNCRONTAB_TASK 2
#define SCE_NNCRONTAB_SECTION 3
#define SCE_NNCRONTAB_KEYWORD 4
#define SCE_NNCRONTAB_MODIFIER 5
#define SCE_NNCRONTAB_ASTERISK 6
#define SCE_NNCRONTAB_NUMBER 7
#define SCE_NNCRONTAB_STRING 8
#define SCE_NNCRONTAB_ENVIRONMENT 9
#define SCE_NNCRONTAB_IDENTIFIER 10
//--Autogenerated -- end of section automatically generated from Scintilla.iface
#endif

View File

@ -11,9 +11,6 @@
#ifndef SCINTILLA_H
#define SCINTILLA_H
// Compile-time configuration options
#define MACRO_SUPPORT 1 // Comment out to remove macro hooks
#if PLAT_WIN
#ifdef STATIC_BUILD
void Scintilla_RegisterClasses(HINSTANCE hInstance);
@ -102,6 +99,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
#define SC_MARK_CIRCLEPLUSCONNECTED 19
#define SC_MARK_CIRCLEMINUS 20
#define SC_MARK_CIRCLEMINUSCONNECTED 21
#define SC_MARK_CHARACTER 10000
#define SC_MARKNUM_FOLDEREND 25
#define SC_MARKNUM_FOLDEROPENMID 26
#define SC_MARKNUM_FOLDERMIDTAIL 27
@ -134,6 +132,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
#define STYLE_BRACEBAD 35
#define STYLE_CONTROLCHAR 36
#define STYLE_INDENTGUIDE 37
#define STYLE_LASTPREDEFINED 39
#define STYLE_MAX 127
#define SC_CHARSET_ANSI 0
#define SC_CHARSET_DEFAULT 1
@ -507,12 +506,6 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
#define SCN_DWELLEND 2017
//--Autogenerated -- end of section automatically generated from Scintilla.iface
// Optional module for macro recording
#ifdef MACRO_SUPPORT
typedef void (tMacroRecorder)(unsigned int iMessage, unsigned long wParam,
long lParam, void *userData);
#endif
// These structures are defined to be exactly the same shape as the Win32
// CHARRANGE, TEXTRANGE, FINDTEXTEX, FORMATRANGE, and NMHDR structs.
// So older code that treats Scintilla as a RichEdit will work.
@ -566,11 +559,9 @@ struct SCNotification {
const char *text; // SCN_MODIFIED
int length; // SCN_MODIFIED
int linesAdded; // SCN_MODIFIED
#ifdef MACRO_SUPPORT
int message; // SCN_MACRORECORD
uptr_t wParam; // SCN_MACRORECORD
sptr_t lParam; // SCN_MACRORECORD
#endif
sptr_t lParam; // SCN_MACRORECORD
int line; // SCN_MODIFIED
int foldLevelNow; // SCN_MODIFIED
int foldLevelPrev; // SCN_MODIFIED

View File

@ -229,6 +229,8 @@ val SC_MARK_CIRCLEPLUSCONNECTED=19
val SC_MARK_CIRCLEMINUS=20
val SC_MARK_CIRCLEMINUSCONNECTED=21
val SC_MARK_CHARACTER=10000
# Markers used for outlining column
val SC_MARKNUM_FOLDEREND=25
val SC_MARKNUM_FOLDEROPENMID=26
@ -292,12 +294,15 @@ set void SetMarginSensitiveN=2246(int margin, bool sensitive)
# Retrieve the mouse click sensitivity of a margin.
get bool GetMarginSensitiveN=2247(int margin,)
# Styles in range 32..37 are predefined for parts of the UI and are not used as normal styles.
# Styles 38 and 39 are for future use.
val STYLE_DEFAULT=32
val STYLE_LINENUMBER=33
val STYLE_BRACELIGHT=34
val STYLE_BRACEBAD=35
val STYLE_CONTROLCHAR=36
val STYLE_INDENTGUIDE=37
val STYLE_LASTPREDEFINED=39
val STYLE_MAX=127
# Character set identifiers are used in StyleSetCharacterSet.
@ -759,10 +764,12 @@ set void SetTargetEnd=2192(position pos,)
get position GetTargetEnd=2193(,)
# Replace the target text with the argument text.
# Text is counted so it can contain nulls.
# Returns the length of the replacement text.
fun int ReplaceTarget=2194(int length, string text)
# Replace the target text with the argument text after \d processing.
# Text is counted so it can contain nulls.
# Looks for \d where d is between 1 and 9 and replaces these with the strings
# matched in the last search operation which were surrounded by \( and \).
# Returns the length of the replacement text including any change
@ -770,7 +777,7 @@ fun int ReplaceTarget=2194(int length, string text)
fun int ReplaceTargetRE=2195(int length, string text)
# Search for a counted string in the target and set the target to the found
# range.
# range. Text is counted so it can contain nulls.
# Returns length of range or -1 for failure in which case target is not moved.
fun int SearchInTarget=2197(int length, string text)
@ -1265,6 +1272,7 @@ val SCLEX_RUBY=22
val SCLEX_EIFFEL=23
val SCLEX_EIFFELKW=24
val SCLEX_TCL=25
val SCLEX_NNCRONTAB=26
# When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
# value assigned in sequence from SCLEX_AUTOMATIC+1.
val SCLEX_AUTOMATIC=1000
@ -1301,6 +1309,8 @@ val SCE_C_VERBATIM=13
val SCE_C_REGEX=14
val SCE_C_COMMENTLINEDOC=15
val SCE_C_WORD2=16
val SCE_C_COMMENTDOCKEYWORD=17
val SCE_C_COMMENTDOCKEYWORDERROR=18
# Lexical states for SCLEX_HTML, SCLEX_XML
val SCE_H_DEFAULT=0
val SCE_H_TAG=1
@ -1327,7 +1337,17 @@ val SCE_H_VALUE=19
# X-Code
val SCE_H_XCCOMMENT=20
# SGML
val SCE_H_SGML=21
val SCE_H_SGML_DEFAULT=21
val SCE_H_SGML_COMMAND=22
val SCE_H_SGML_1ST_PARAM=23
val SCE_H_SGML_DOUBLESTRING=24
val SCE_H_SGML_SIMPLESTRING=25
val SCE_H_SGML_ERROR=26
val SCE_H_SGML_SPECIAL=27
val SCE_H_SGML_ENTITY=28
val SCE_H_SGML_COMMENT=29
val SCE_H_SGML_1ST_PARAM_COMMENT=30
val SCE_H_SGML_BLOCK_DEFAULT=31
# Embedded Javascript
val SCE_HJ_START=40
val SCE_HJ_DEFAULT=41
@ -1547,6 +1567,18 @@ val SCE_EIFFEL_CHARACTER=5
val SCE_EIFFEL_OPERATOR=6
val SCE_EIFFEL_IDENTIFIER=7
val SCE_EIFFEL_STRINGEOL=8
# Lexical states for the SCLEX_NNCRONTAB (nnCron crontab Lexer)
val SCE_NNCRONTAB_DEFAULT=0
val SCE_NNCRONTAB_COMMENT=1
val SCE_NNCRONTAB_TASK=2
val SCE_NNCRONTAB_SECTION=3
val SCE_NNCRONTAB_KEYWORD=4
val SCE_NNCRONTAB_MODIFIER=5
val SCE_NNCRONTAB_ASTERISK=6
val SCE_NNCRONTAB_NUMBER=7
val SCE_NNCRONTAB_STRING=8
val SCE_NNCRONTAB_ENVIRONMENT=9
val SCE_NNCRONTAB_IDENTIFIER=10
# Events
@ -1574,171 +1606,3 @@ evt void DwellStart=2016(int position)
evt void DwellEnd=2017(int position)
cat Deprecated
val SCFIND_DOWN=1
################################################
# From WinDefs.h
# ***** DEPRECATED from here to end of file ******
# Will a paste succeed?
fun bool EM_CanPaste=1074(,)
# Are there any undoable actions in the undo history.
fun bool EM_CanUndo=198(,)
# Find the position and line from a point within the window.
fun int EM_CharFromPos=215(,point pt)
# Delete the undo history.
fun void EM_EmptyUndoBuffer=205(,)
# Retrieve the selection range.
fun void EM_ExGetSel=1076(,charrangeresult cr)
# Retrieve the line number of a position in the document.
get int EM_ExLineFromChar=1078(,position pos)
# Select a range of text.
fun void EM_ExSetSel=1079(,charrange cr)
# Find some text in the document.
fun position EM_FindText=1080(int flags, findtext ft)
# Find some text in the document. Returns range of found text in ft argument.
fun position EM_FindTextEx=1103(int flags, findtextex ft)
# On Windows will draw the document into a display context such as a printer.
fun void EM_FormatRange=1081(bool draw, formatrange fr)
# Retrieve the line at the top of the display.
get int EM_GetFirstVisibleLine=206(,)
# Retrieve the contents of a line.
# Returns the length of the line.
fun int EM_GetLine=196(int line, countedstring text)
# Returns the number of lines in the document. There is always at least one.
fun int EM_GetLineCount=186(,)
# Returns the size in pixels of left and right margins packed into one integer.
# The left margin is in the low half and the right margin in the high half.
fun int EM_GetMargins=212(,)
# Is the document different from when it was last saved?
get bool EM_GetModify=184(,)
# Get the area used to display the document.
fun void EM_GetRect=178(,rectangle r)
# Return the selection packed into one integer with the start of the selection
# in the low half and the end in the high half.
fun int EM_GetSel=176(,)
# Retrieve the selected text.
# Return the length of the text.
fun int EM_GetSelText=1086(,stringresult text)
# Retrieve a range of text.
# Return the length of the text.
fun int EM_GetTextRange=1099(, textrange tr)
# Draw the selection in normal style or with selection highlighted.
fun void EM_HideSelection=1087(bool normal,)
# Retrieve the line of a position.
fun int EM_LineFromChar=201(position pos,)
# Retrieve the position at the start of a line.
fun position EM_LineIndex=187(int line,)
# Retrieve the number of characters on a line not including end of line characters.
fun int EM_LineLength=193(int line,)
# Scroll horizontally and vertically.
fun void EM_LineScroll=182(int columns, int lines)
# Retrieve the point in the window where a position is displayed.
fun void EM_PosFromChar=214(pointresult pt, position pos)
# Replace the selected text with the argument text.
fun void EM_ReplaceSel=194(, string text)
# Ensure the caret is visible.
fun void EM_ScrollCaret=183(,)
# Returns SEL_EMPTY if selection contains no characters, otherwise SEL_TEXT.
fun void EM_SelectionType=1090(,)
# Set the width of the left and right margins
fun void EM_SetMargins=211(int flags, int values)
# Set to read only or read write.
set void EM_SetReadOnly=207(bool readOnly,)
# Select the range of text from start to end.
fun void EM_SetSel=177(position start, position end)
# Undo one action in the undo history.
fun void EM_Undo=199(,)
# Null operation.
fun void WM_Null=0(,)
# Clear the selection.
fun void WM_Clear=771(,)
fun void WM_Command=273(,)
# Copy the selection to the clipboard.
fun void WM_Copy=769(,)
# Cut the selection to the clipboard.
fun void WM_Cut=768(,)
# Retrieve all the text in the document.
# Returns number of characters retrieved.
fun int WM_GetText=13(int length, stringresult text)
# Retrieve the number of characters in the document.
fun int WM_GetTextLength=14(,)
# Notification back to container
fun void WM_Notify=78(int id, int stuff)
# Paste the contents of the clipboard into the document replacing the selection.
fun void WM_Paste=770(,)
# Replace the contents of the document with the argument text.
fun void WM_SetText=12(, string text)
# Undo one action in the undo history.
fun void WM_Undo=772(,)
# Notification codes
val EN_CHANGE=768
val EN_KILLFOCUS=512
val EN_SETFOCUS=256
# Flags for setting margins.
val EC_LEFTMARGIN=1
val EC_RIGHTMARGIN=2
val EC_USEFONTINFO=0xffff
# Selection type.
val SEL_EMPTY=0
val SEL_TEXT=1
# Find replace mask constants
val FR_MATCHCASE=0x4
val FR_WHOLEWORD=0x2
val FR_DOWN=0x1
# Key modifier flag.
val SHIFT_PRESSED=1
val LEFT_CTRL_PRESSED=2
val LEFT_ALT_PRESSED=4
#events
evt void EN_Change=768(void)

View File

@ -11,17 +11,6 @@
#if PLAT_GTK
#ifndef SCINTILLA_H
#ifdef _MSC_VER
#pragma message(__FILE__ "(1) : warning : Scintilla.h should be included before ScintillaWidget.h")
#pragma message("This will be required in the next version of Scintilla")
#else
#warning Scintilla.h should be included before ScintillaWidget.h
#warning This will be required in the next version of Scintilla
#endif
#include "Scintilla.h"
#endif
#ifdef __cplusplus
extern "C" {
#endif

View File

@ -1,197 +0,0 @@
// Scintilla source code edit control
/** @file WinDefs.h
** The subset of definitions from Windows needed by Scintilla for GTK+.
**/
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
#ifndef WINDEFS_H
#define WINDEFS_H
/* Running GTK version on win32 */
#if PLAT_GTK_WIN32
#include "Windows.h"
#include "Richedit.h"
/* Name conflicts */
#undef DrawText
#undef FindText
#else
#define WORD short
#define WPARAM unsigned long
#define LPARAM long
#define LRESULT long
#define DWORD long
#define UINT unsigned int
#define LPSTR char *
#define LONG long
//#if 0
/* RTF control */
#define EM_CANPASTE (1074)
#define EM_CANUNDO (198)
#define EM_CHARFROMPOS (215)
#define EM_EMPTYUNDOBUFFER (205)
#define EM_EXGETSEL (1076)
#define EM_EXLINEFROMCHAR (1078)
#define EM_EXSETSEL (1079)
#define EM_FINDTEXT (1080)
#define EM_FINDTEXTEX (1103)
#define EM_FORMATRANGE (1081)
#define EM_GETFIRSTVISIBLELINE (206)
#define EM_GETLINE (196)
#define EM_GETLINECOUNT (186)
#define EM_GETMARGINS (212)
#define EM_GETMODIFY (184)
#define EM_GETRECT (178)
#define EM_GETSEL (176)
#define EM_GETSELTEXT (1086)
#define EM_GETTEXTRANGE (1099)
#define EM_HIDESELECTION (1087)
#define EM_LINEFROMCHAR (201)
#define EM_LINEINDEX (187)
#define EM_LINELENGTH (193)
#define EM_LINESCROLL (182)
#define EM_POSFROMCHAR (214)
#define EM_REPLACESEL (194)
#define EM_SCROLLCARET (183)
#define EM_SELECTIONTYPE (1090)
#define EM_SETMARGINS (211)
#define EM_SETREADONLY (207)
#define EM_SETSEL (177)
#define EM_UNDO (199)
#define WM_NULL (0)
#define WM_CLEAR (771)
#define WM_COPY (769)
#define WM_CUT (768)
#define WM_GETTEXT (13)
#define WM_GETTEXTLENGTH (14)
#define WM_PASTE (770)
#define WM_SETTEXT (12)
#define WM_UNDO (772)
#define EN_CHANGE (768)
#define EN_KILLFOCUS (512)
#define EN_SETFOCUS (256)
#define EC_LEFTMARGIN 1
#define EC_RIGHTMARGIN 2
#define EC_USEFONTINFO 0xffff
//#endif
#if 0
#if PLAT_GTK
#define VK_DOWN GDK_Down
#define VK_UP GDK_Up
#define VK_LEFT GDK_Left
#define VK_RIGHT GDK_Right
#define VK_HOME GDK_Home
#define VK_END GDK_End
#define VK_PRIOR GDK_Page_Up
#define VK_NEXT GDK_Page_Down
#define VK_DELETE GDK_Delete
#define VK_INSERT GDK_Insert
#define VK_ESCAPE GDK_Escape
#define VK_BACK GDK_BackSpace
#define VK_TAB GDK_Tab
#define VK_RETURN GDK_Return
#define VK_ADD GDK_KP_Add
#define VK_SUBTRACT GDK_KP_Subtract
#define VK_DIVIDE GDK_KP_Divide
#endif
#if PLAT_WX
#define VK_DOWN WXK_DOWN
#define VK_UP WXK_UP
#define VK_LEFT WXK_LEFT
#define VK_RIGHT WXK_RIGHT
#define VK_HOME WXK_HOME
#define VK_END WXK_END
#define VK_PRIOR WXK_PRIOR
#define VK_NEXT WXK_NEXT
#define VK_DELETE WXK_DELETE
#define VK_INSERT WXK_INSERT
#define VK_ESCAPE WXK_ESCAPE
#define VK_BACK WXK_BACK
#define VK_TAB WXK_TAB
#define VK_RETURN WXK_RETURN
#define VK_ADD WXK_ADD
#define VK_SUBTRACT WXK_SUBTRACT
//TODO:
#define VK_DIVIDE WXK_DIVIDE
#endif
#define SHIFT_PRESSED 1
#define LEFT_CTRL_PRESSED 2
#define LEFT_ALT_PRESSED 4
// Are these needed any more
#define LPSTR char *
#define LONG long
#define LPDWORD (long *)
/* SELCHANGE structure */
#define SEL_EMPTY (0)
#define SEL_TEXT (1)
#define SEL_OBJECT (2)
#define SEL_MULTICHAR (4)
#define SEL_MULTIOBJECT (8)
struct RECT {
LONG left;
LONG top;
LONG right;
LONG bottom;
};
/* FINDREPLACE structure */
#define FR_MATCHCASE (0x4)
#define FR_WHOLEWORD (0x2)
#define FR_DOWN (0x1)
#endif
#if 0
struct CHARRANGE {
LONG cpMin;
LONG cpMax;
};
struct TEXTRANGE {
CHARRANGE chrg;
LPSTR lpstrText;
};
struct FINDTEXTEX {
CHARRANGE chrg;
LPSTR lpstrText;
CHARRANGE chrgText;
};
struct NMHDR {
WindowID hwndFrom;
UINT idFrom;
UINT code;
};
struct FORMATRANGE {
SurfaceID hdc;
SurfaceID hdcTarget;
RECT rc;
RECT rcPage;
CHARRANGE chrg;
};
#endif
//#define MAKELONG(a, b) ((a) | ((b) << 16))
//#define LOWORD(x) (x & 0xffff)
//#define HIWORD(x) (x >> 16)
#endif /* !_MSC_VER */
#endif

View File

@ -357,8 +357,10 @@ void Document::ModifiedAt(int pos) {
// Unlike Undo, Redo, and InsertStyledString, the pos argument is a cell number not a char number
void Document::DeleteChars(int pos, int len) {
if (len == 0)
return;
if ((pos + len) > Length())
return ;
return;
if (cb.IsReadOnly() && enteredReadOnlyCount == 0) {
enteredReadOnlyCount++;
NotifyModifyAttempt();

View File

@ -14,10 +14,6 @@
#include "Scintilla.h"
#if PLAT_WX || PLAT_GTK
#include "WinDefs.h"
#endif
#include "ContractionState.h"
#include "SVector.h"
#include "CellBuffer.h"
@ -58,7 +54,6 @@ Editor::Editor() {
dwelling = false;
ptMouseLast.x = 0;
ptMouseLast.y = 0;
firstExpose = true;
inDragDrop = false;
dropWentOutside = false;
posDrag = invalidPosition;
@ -69,9 +64,6 @@ Editor::Editor() {
lineAnchor = 0;
originalAnchorPos = 0;
dragChars = 0;
lenDrag = 0;
dragIsRectangle = false;
selType = selStream;
xStartSelect = 0;
xEndSelect = 0;
@ -85,9 +77,6 @@ Editor::Editor() {
searchAnchor = 0;
ucWheelScrollLines = 0;
cWheelDelta = 0; //wheel delta from roll
xOffset = 0;
xCaretMargin = 50;
horizontalScrollBarVisible = true;
@ -114,15 +103,11 @@ Editor::Editor() {
modEventMask = SC_MODEVENTMASKALL;
displayPopupMenu = true;
pdoc = new Document();
pdoc ->AddRef();
pdoc->AddWatcher(this, 0);
#ifdef MACRO_SUPPORT
recordingMacro = 0;
#endif
recordingMacro = false;
foldFlags = 0;
}
@ -131,10 +116,6 @@ Editor::~Editor() {
pdoc->Release();
pdoc = 0;
DropGraphics();
delete []dragChars;
dragChars = 0;
lenDrag = 0;
}
void Editor::Finalise() {
@ -874,7 +855,7 @@ void Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) {
if (marks) {
for (int markBit = 0; (markBit < 32) && marks; markBit++) {
if (marks & 1) {
vs.markers[markBit].Draw(surface, rcMarker);
vs.markers[markBit].Draw(surface, rcMarker, vs.styles[STYLE_LINENUMBER].font);
}
marks >>= 1;
}
@ -1917,14 +1898,12 @@ void Editor::NotifyChar(int ch) {
scn.nmhdr.code = SCN_CHARADDED;
scn.ch = ch;
NotifyParent(scn);
#ifdef MACRO_SUPPORT
if (recordingMacro) {
char txt[2];
txt[0] = static_cast<char>(ch);
txt[1] = '\0';
NotifyMacroRecord(SCI_REPLACESEL, 0, reinterpret_cast<long>(txt));
}
#endif
}
void Editor::NotifySavePoint(bool isSavePoint) {
@ -2150,7 +2129,6 @@ void Editor::NotifyDeleted(Document *, void *) {
/* Do nothing */
}
#ifdef MACRO_SUPPORT
void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long lParam) {
// Enumerates all macroable messages
@ -2159,10 +2137,6 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long
case SCI_COPY:
case SCI_PASTE:
case SCI_CLEAR:
case WM_CUT:
case WM_COPY:
case WM_PASTE:
case WM_CLEAR:
case SCI_REPLACESEL:
case SCI_ADDTEXT:
case SCI_INSERTTEXT:
@ -2236,7 +2210,6 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long
scn.lParam = lParam;
NotifyParent(scn);
}
#endif
// Force scroll and keep position relative to top of window
void Editor::PageMove(int direction, bool extend) {
@ -2674,7 +2647,6 @@ void Editor::Indent(bool forwards) {
* @return The position of the found text, -1 if not found.
*/
long Editor::FindText(
unsigned int iMessage, ///< Can be @c EM_FINDTEXT or @c EM_FINDTEXTEX or @c SCI_FINDTEXT.
unsigned long wParam, ///< Search modes : @c SCFIND_MATCHCASE, @c SCFIND_WHOLEWORD,
///< @c SCFIND_WORDSTART or @c SCFIND_REGEXP.
long lParam) { ///< @c TextToFind structure: The text to search for in the given range.
@ -2688,10 +2660,8 @@ long Editor::FindText(
wParam & SCFIND_REGEXP,
&lengthFound);
if (pos != -1) {
if (iMessage != EM_FINDTEXT) {
ft->chrgText.cpMin = pos;
ft->chrgText.cpMax = pos + lengthFound;
}
ft->chrgText.cpMin = pos;
ft->chrgText.cpMax = pos + lengthFound;
}
return pos;
}
@ -2800,33 +2770,23 @@ char *Editor::CopyRange(int start, int end) {
return text;
}
int Editor::SelectionRangeLength() {
void Editor::CopySelectionRange(SelectionText *ss) {
char *text = 0;
int size = 0;
if (selType == selRectangle) {
int lineStart = pdoc->LineFromPosition(SelectionStart());
int lineEnd = pdoc->LineFromPosition(SelectionEnd());
int totalSize = 0;
for (int line = lineStart; line <= lineEnd; line++) {
totalSize += SelectionEnd(line) - SelectionStart(line) + 1;
int line;
for (line = lineStart; line <= lineEnd; line++) {
size += SelectionEnd(line) - SelectionStart(line) + 1;
if (pdoc->eolMode == SC_EOL_CRLF)
totalSize++;
size++;
}
return totalSize;
} else {
return SelectionEnd() - SelectionStart();
}
}
char *Editor::CopySelectionRange() {
if (selType == selRectangle) {
char *text = 0;
int lineStart = pdoc->LineFromPosition(SelectionStart());
int lineEnd = pdoc->LineFromPosition(SelectionEnd());
int totalSize = SelectionRangeLength();
if (totalSize > 0) {
text = new char[totalSize + 1];
if (size > 0) {
text = new char[size + 1];
if (text) {
int j = 0;
for (int line = lineStart; line <= lineEnd; line++) {
for (line = lineStart; line <= lineEnd; line++) {
for (int i = SelectionStart(line);i < SelectionEnd(line);i++) {
text[j++] = pdoc->CharAt(i);
}
@ -2835,24 +2795,14 @@ char *Editor::CopySelectionRange() {
if (pdoc->eolMode != SC_EOL_CR)
text[j++] = '\n';
}
text[totalSize] = '\0';
text[size] = '\0';
}
}
return text;
} else {
return CopyRange(SelectionStart(), SelectionEnd());
}
}
void Editor::CopySelectionIntoDrag() {
delete []dragChars;
dragChars = 0;
lenDrag = SelectionRangeLength();
dragChars = CopySelectionRange();
dragIsRectangle = selType == selRectangle;
if (!dragChars) {
lenDrag = 0;
size = SelectionEnd() - SelectionStart();
text = CopyRange(SelectionStart(), SelectionEnd());
}
ss->Set(text, size, selType == selRectangle);
}
void Editor::SetDragPosition(int newPos) {
@ -2882,8 +2832,6 @@ void Editor::StartDrag() {
//DisplayCursor(Window::cursorArrow);
}
void Editor::DropAt(int position, const char *value, bool moving, bool rectangular) {
//Platform::DebugPrintf("DropAt %d\n", inDragDrop);
if (inDragDrop)
@ -3115,7 +3063,7 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b
if (inDragDrop) {
SetMouseCapture(false);
SetDragPosition(newPos);
CopySelectionIntoDrag();
CopySelectionRange(&drag);
StartDrag();
} else {
xStartSelect = pt.x - vs.fixedColumnWidth + xOffset;
@ -3220,25 +3168,23 @@ void Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) {
int selStart = SelectionStart();
int selEnd = SelectionEnd();
if (selStart < selEnd) {
if (dragChars && lenDrag) {
if (drag.len) {
if (ctrl) {
pdoc->InsertString(newPos, dragChars, lenDrag);
SetSelection(newPos, newPos + lenDrag);
pdoc->InsertString(newPos, drag.s, drag.len);
SetSelection(newPos, newPos + drag.len);
} else if (newPos < selStart) {
pdoc->DeleteChars(selStart, lenDrag);
pdoc->InsertString(newPos, dragChars, lenDrag);
SetSelection(newPos, newPos + lenDrag);
pdoc->DeleteChars(selStart, drag.len);
pdoc->InsertString(newPos, drag.s, drag.len);
SetSelection(newPos, newPos + drag.len);
} else if (newPos > selEnd) {
pdoc->DeleteChars(selStart, lenDrag);
newPos -= lenDrag;
pdoc->InsertString(newPos, dragChars, lenDrag);
SetSelection(newPos, newPos + lenDrag);
pdoc->DeleteChars(selStart, drag.len);
newPos -= drag.len;
pdoc->InsertString(newPos, drag.s, drag.len);
SetSelection(newPos, newPos + drag.len);
} else {
SetEmptySelection(newPos);
}
delete []dragChars;
dragChars = 0;
lenDrag = 0;
drag.Set(0, 0);
}
selectionType = selChar;
}
@ -3545,14 +3491,11 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
//Platform::DebugPrintf("S start wnd proc %d %d %d\n",iMessage, wParam, lParam);
// Optional macro recording hook
#ifdef MACRO_SUPPORT
if (recordingMacro)
NotifyMacroRecord(iMessage, wParam, lParam);
#endif
switch (iMessage) {
case WM_GETTEXT:
case SCI_GETTEXT:
{
if (lParam == 0)
@ -3565,7 +3508,6 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
return iChar;
}
case WM_SETTEXT:
case SCI_SETTEXT:
{
if (lParam == 0)
@ -3576,130 +3518,45 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
return TRUE;
}
case WM_GETTEXTLENGTH:
case SCI_GETTEXTLENGTH:
return pdoc->Length();
case WM_CUT:
case SCI_CUT:
Cut();
SetLastXChosen();
break;
case WM_COPY:
case SCI_COPY:
Copy();
break;
case WM_PASTE:
case SCI_PASTE:
Paste();
SetLastXChosen();
EnsureCaretVisible();
break;
case WM_CLEAR:
case SCI_CLEAR:
Clear();
SetLastXChosen();
break;
case WM_UNDO:
case SCI_UNDO:
Undo();
SetLastXChosen();
break;
// Edit control messages
// Not supported (no-ops):
// EM_GETWORDBREAKPROC
// EM_GETWORDBREAKPROCEX
// EM_SETWORDBREAKPROC
// EM_SETWORDBREAKPROCEX
// EM_GETWORDWRAPMODE
// EM_SETWORDWRAPMODE
// EM_LIMITTEXT
// EM_EXLIMITTEXT
// EM_SETRECT
// EM_SETRECTNP
// EM_FMTLINES
// EM_GETHANDLE
// EM_SETHANDLE
// EM_GETPASSWORDCHAR
// EM_SETPASSWORDCHAR
// EM_SETTABSTOPS
// EM_FINDWORDBREAK
// EM_GETCHARFORMAT
// EM_SETCHARFORMAT
// EM_GETOLEINTERFACE
// EM_SETOLEINTERFACE
// EM_SETOLECALLBACK
// EM_GETPARAFORMAT
// EM_SETPARAFORMAT
// EM_PASTESPECIAL
// EM_REQUESTRESIZE
// EM_GETBKGNDCOLOR
// EM_SETBKGNDCOLOR
// EM_STREAMIN
// EM_STREAMOUT
// EM_GETIMECOLOR
// EM_SETIMECOLOR
// EM_GETIMEOPTIONS
// EM_SETIMEOPTIONS
// EM_GETOPTIONS
// EM_SETOPTIONS
// EM_GETPUNCTUATION
// EM_SETPUNCTUATION
// EM_GETTHUMB
// EM_SETTARGETDEVICE
// Not supported but should be:
// EM_GETEVENTMASK
// EM_SETEVENTMASK
// For printing:
// EM_DISPLAYBAND
case EM_CANUNDO:
case SCI_CANUNDO:
return pdoc->CanUndo() ? TRUE : FALSE;
case EM_UNDO:
Undo();
SetLastXChosen();
break;
case EM_EMPTYUNDOBUFFER:
case SCI_EMPTYUNDOBUFFER:
pdoc->DeleteUndoHistory();
return 0;
case EM_GETFIRSTVISIBLELINE:
case SCI_GETFIRSTVISIBLELINE:
return topLine;
case EM_GETLINE: {
if (lParam == 0) {
return 0;
}
char *ptr = reinterpret_cast<char *>(lParam);
short *pBufSize = reinterpret_cast<short *>(lParam);
short bufSize = *pBufSize;
ptr[0] = '\0'; // If no characters copied, have to put a NUL into buffer
if (static_cast<int>(wParam) > pdoc->LinesTotal()) {
return 0;
}
int lineStart = pdoc->LineStart(wParam);
int lineEnd = pdoc->LineStart(wParam + 1);
// The first word of the buffer is the size, in TCHARs, of the buffer
int iPlace = 0;
for (int iChar = lineStart; iChar < lineEnd && iPlace < bufSize; iChar++) {
ptr[iPlace++] = pdoc->CharAt(iChar);
}
return iPlace;
}
case SCI_GETLINE: { // Simpler than EM_GETLINE, but with risk of overwriting the end of the buffer
case SCI_GETLINE: { // Risk of overwriting the end of the buffer
if (lParam == 0) {
return 0;
}
@ -3713,42 +3570,15 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
return iPlace;
}
case EM_GETLINECOUNT:
case SCI_GETLINECOUNT:
if (pdoc->LinesTotal() == 0)
return 1;
else
return pdoc->LinesTotal();
case EM_GETMODIFY:
case SCI_GETMODIFY:
return !pdoc->IsSavePoint();
case EM_GETRECT:
if (lParam == 0)
return 0;
*(reinterpret_cast<PRectangle *>(lParam)) = GetClientRectangle();
break;
case EM_GETSEL:
if (wParam)
*reinterpret_cast<int *>(wParam) = SelectionStart();
if (lParam)
*reinterpret_cast<int *>(lParam) = SelectionEnd();
return Platform::LongFromTwoShorts(
static_cast<short>(SelectionStart()),
static_cast<short>(SelectionEnd()));
case EM_EXGETSEL: {
if (lParam == 0)
return 0;
CharacterRange *pCR = reinterpret_cast<CharacterRange *>(lParam);
pCR->cpMin = SelectionStart();
pCR->cpMax = SelectionEnd();
}
break;
case EM_SETSEL:
case SCI_SETSEL: {
int nStart = static_cast<int>(wParam);
int nEnd = static_cast<int>(lParam);
@ -3762,55 +3592,28 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
}
break;
case EM_EXSETSEL: {
if (lParam == 0)
return 0;
CharacterRange *pCR = reinterpret_cast<CharacterRange *>(lParam);
selType = selStream;
if (pCR->cpMax == -1) {
SetSelection(pCR->cpMin, pdoc->Length());
} else {
SetSelection(pCR->cpMin, pCR->cpMax);
}
EnsureCaretVisible();
return pdoc->LineFromPosition(SelectionStart());
}
case EM_GETSELTEXT:
case SCI_GETSELTEXT: {
if (lParam == 0)
return 0;
SelectionText selectedText;
CopySelectionRange(&selectedText);
char *ptr = reinterpret_cast<char *>(lParam);
int selSize = SelectionRangeLength();
char *text = CopySelectionRange();
int iChar = 0;
if (text) {
for (; iChar < selSize; iChar++)
ptr[iChar] = text[iChar];
if (selectedText.len) {
for (; iChar < selectedText.len; iChar++)
ptr[iChar] = selectedText.s[iChar];
ptr[iChar] = '\0';
delete []text;
} else {
ptr[0] = '\0';
}
return iChar;
}
case EM_LINEFROMCHAR:
if (static_cast<int>(wParam) < 0)
wParam = SelectionStart();
return pdoc->LineFromPosition(wParam);
case EM_EXLINEFROMCHAR:
if (static_cast<int>(lParam) < 0)
lParam = SelectionStart(); // Not specified, but probably OK
return pdoc->LineFromPosition(lParam);
case SCI_LINEFROMPOSITION:
if (static_cast<int>(wParam) < 0)
return 0;
return pdoc->LineFromPosition(wParam);
case EM_LINEINDEX:
case SCI_POSITIONFROMLINE:
if (static_cast<int>(wParam) < 0)
wParam = pdoc->LineFromPosition(SelectionStart());
@ -3822,28 +3625,13 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
// return -1;
return pdoc->LineStart(wParam);
case EM_LINELENGTH: {
if (static_cast<int>(wParam) < 0) // Who use this anyway?
return 0; // Should be... Too complex to describe here, see MS specs!
if (static_cast<int>(wParam) > pdoc->Length()) // Useful test, anyway...
return 0;
int line = pdoc->LineFromPosition(wParam);
int charsOnLine = 0;
for (int pos = pdoc->LineStart(line); pos < pdoc->LineStart(line + 1); pos++) {
if ((pdoc->CharAt(pos) != '\r') && (pdoc->CharAt(pos) != '\n'))
charsOnLine++;
}
return charsOnLine;
}
// Replacement of the old Scintilla interpretation of EM_LINELENGTH
// Replacement of the old Scintilla interpretation of EM_LINELENGTH
case SCI_LINELENGTH:
if ((static_cast<int>(wParam) < 0) ||
(static_cast<int>(wParam) > pdoc->LineFromPosition(pdoc->Length())))
return 0;
return pdoc->LineStart(wParam + 1) - pdoc->LineStart(wParam);
case EM_REPLACESEL:
case SCI_REPLACESEL: {
if (lParam == 0)
return 0;
@ -3890,18 +3678,15 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
case SCI_GETSEARCHFLAGS:
return searchFlags;
case EM_LINESCROLL:
case SCI_LINESCROLL:
ScrollTo(topLine + lParam);
HorizontalScrollTo(xOffset + wParam * vs.spaceWidth);
return TRUE;
case EM_SCROLLCARET:
case SCI_SCROLLCARET:
EnsureCaretVisible();
break;
case EM_SETREADONLY:
case SCI_SETREADONLY:
pdoc->SetReadOnly(wParam);
return TRUE;
@ -3909,33 +3694,9 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
case SCI_GETREADONLY:
return pdoc->IsReadOnly();
case EM_CANPASTE:
case SCI_CANPASTE:
return CanPaste();
case EM_CHARFROMPOS: {
if (lParam == 0)
return 0;
Point *ppt = reinterpret_cast<Point *>(lParam);
int pos = PositionFromLocation(*ppt);
int line = pdoc->LineFromPosition(pos);
return Platform::LongFromTwoShorts(
static_cast<short>(pos), static_cast < short > (line));
}
case EM_POSFROMCHAR: {
// The MS specs for this have changed 3 times: using the RichEdit 3 version
if (wParam == 0)
return 0;
Point *ppt = reinterpret_cast<Point *>(wParam);
if (lParam < 0) {
*ppt = Point(0, 0);
} else {
*ppt = LocationFromPosition(lParam);
}
return 0;
}
case SCI_POINTXFROMPOSITION:
if (lParam < 0) {
return 0;
@ -3952,14 +3713,9 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
return pt.y;
}
case EM_FINDTEXT:
return FindText(iMessage, wParam, lParam);
case EM_FINDTEXTEX:
case SCI_FINDTEXT:
return FindText(iMessage, wParam, lParam);
return FindText(wParam, lParam);
case EM_GETTEXTRANGE:
case SCI_GETTEXTRANGE: {
if (lParam == 0)
return 0;
@ -3974,53 +3730,20 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
return len; // Not including NUL
}
case EM_SELECTIONTYPE:
#ifdef SEL_EMPTY
if (currentPos == anchor)
return SEL_EMPTY;
else
return SEL_TEXT;
#else
return 0;
#endif
case EM_HIDESELECTION:
case SCI_HIDESELECTION:
hideSelection = wParam;
Redraw();
break;
case EM_FORMATRANGE:
case SCI_FORMATRANGE:
return FormatRange(wParam, reinterpret_cast<RangeToFormat *>(lParam));
case EM_GETMARGINS:
return Platform::LongFromTwoShorts(static_cast<short>(vs.leftMarginWidth),
static_cast<short>(vs.rightMarginWidth));
case SCI_GETMARGINLEFT:
return vs.leftMarginWidth;
case SCI_GETMARGINRIGHT:
return vs.rightMarginWidth;
case EM_SETMARGINS:
#ifdef EC_LEFTMARGIN
if (wParam & EC_LEFTMARGIN) {
vs.leftMarginWidth = Platform::LowShortFromLong(lParam);
}
if (wParam & EC_RIGHTMARGIN) {
vs.rightMarginWidth = Platform::HighShortFromLong(lParam);
}
if (wParam == EC_USEFONTINFO) {
vs.leftMarginWidth = vs.aveCharWidth / 2;
vs.rightMarginWidth = vs.aveCharWidth / 2;
}
InvalidateStyleRedraw();
#endif
break;
case SCI_SETMARGINLEFT:
vs.leftMarginWidth = lParam;
InvalidateStyleRedraw();
@ -4667,10 +4390,6 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
case SCI_LINESONSCREEN:
return LinesOnScreen();
case SCI_USEPOPUP:
displayPopupMenu = wParam;
break;
case SCI_SETSELFORE:
vs.selforeset = wParam;
vs.selforeground.desired = Colour(lParam);
@ -4711,7 +4430,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
case SCI_CLEARCMDKEY:
kmap.AssignCmdKey(Platform::LowShortFromLong(wParam),
Platform::HighShortFromLong(wParam), WM_NULL);
Platform::HighShortFromLong(wParam), SCI_NULL);
break;
case SCI_CLEARALLCMDKEYS:
@ -4915,15 +4634,13 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
case SCI_GETCURSOR:
return cursorMode;
#ifdef MACRO_SUPPORT
case SCI_STARTRECORD:
recordingMacro = 1;
recordingMacro = true;
return 0;
case SCI_STOPRECORD:
recordingMacro = 0;
recordingMacro = false;
return 0;
#endif
case SCI_MOVECARETINSIDEVIEW:
MoveCaretInsideView();

View File

@ -50,6 +50,26 @@ public:
int positions[maxLineLength+1];
};
class SelectionText {
public:
char *s;
int len;
bool rectangular;
SelectionText() : s(0), len(0), rectangular(false) {}
~SelectionText() {
Set(0, 0);
}
void Set(char *s_, int len_, bool rectangular_=false) {
delete []s;
s = s_;
if (s)
len = len_;
else
len = 0;
rectangular = rectangular_;
}
};
/**
*/
class Editor : public DocWatcher {
@ -68,6 +88,7 @@ protected: // ScintillaBase subclass needs access to much of Editor
bool stylesValid;
ViewStyle vs;
Palette palette;
int printMagnification;
int printColourMode;
int cursorMode;
@ -91,9 +112,6 @@ protected: // ScintillaBase subclass needs access to much of Editor
Surface pixmapSelPattern;
Surface pixmapIndentGuide;
Surface pixmapIndentGuideHighlight;
// Intellimouse support - currently only implemented for Windows
unsigned int ucWheelScrollLines;
int cWheelDelta; ///< Wheel delta from roll
KeyMap kmap;
@ -109,7 +127,6 @@ protected: // ScintillaBase subclass needs access to much of Editor
bool dwelling;
enum { selChar, selWord, selLine } selectionType;
Point ptMouseLast;
bool firstExpose;
bool inDragDrop;
bool dropWentOutside;
int posDrag;
@ -138,9 +155,7 @@ protected: // ScintillaBase subclass needs access to much of Editor
int modEventMask;
char *dragChars;
int lenDrag;
bool dragIsRectangle;
SelectionText drag;
enum { selStream, selRectangle, selRectangleFixed } selType;
int xStartSelect;
int xEndSelect;
@ -154,11 +169,7 @@ protected: // ScintillaBase subclass needs access to much of Editor
int searchAnchor;
int displayPopupMenu;
#ifdef MACRO_SUPPORT
int recordingMacro;
#endif
bool recordingMacro;
int foldFlags;
ContractionState cs;
@ -270,11 +281,7 @@ protected: // ScintillaBase subclass needs access to much of Editor
void NotifyModified(Document *document, DocModification mh, void *userData);
void NotifyDeleted(Document *document, void *userData);
void NotifyStyleNeeded(Document *doc, void *userData, int endPos);
#ifdef MACRO_SUPPORT
void NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long lParam);
#endif
void PageMove(int direction, bool extend=false);
void ChangeCaseOfSelection(bool makeUpperCase);
@ -289,16 +296,14 @@ protected: // ScintillaBase subclass needs access to much of Editor
void Indent(bool forwards);
long FindText(unsigned int iMessage, unsigned long wParam, long lParam);
long FindText(unsigned long wParam, long lParam);
void SearchAnchor();
long SearchText(unsigned int iMessage, unsigned long wParam, long lParam);
long SearchInTarget(const char *text, int length);
void GoToLine(int lineNo);
char *CopyRange(int start, int end);
int SelectionRangeLength();
char *CopySelectionRange();
void CopySelectionIntoDrag();
void CopySelectionRange(SelectionText *ss);
void SetDragPosition(int newPos);
void DisplayCursor(Window::Cursor c);
virtual void StartDrag();

View File

@ -108,22 +108,26 @@ LexerModule lmNull(SCLEX_NULL, ColouriseNullDoc, "null");
int wxForceScintillaLexers(void) {
extern LexerModule lmAda;
extern LexerModule lmAVE;
extern LexerModule lmConf;
extern LexerModule lmDiff;
extern LexerModule lmLatex;
extern LexerModule lmPascal;
extern LexerModule lmCPP;
extern LexerModule lmHTML;
extern LexerModule lmXML;
extern LexerModule lmProps;
extern LexerModule lmErrorList;
extern LexerModule lmMake;
extern LexerModule lmBatch;
extern LexerModule lmConf;
extern LexerModule lmCPP;
extern LexerModule lmDiff;
extern LexerModule lmEiffel;
extern LexerModule lmEiffelkw;
extern LexerModule lmErrorList;
extern LexerModule lmHTML;
extern LexerModule lmLatex;
extern LexerModule lmLISP;
extern LexerModule lmLua;
extern LexerModule lmMake;
extern LexerModule lmPascal;
extern LexerModule lmPerl;
extern LexerModule lmProps;
extern LexerModule lmPython;
extern LexerModule lmRuby;
extern LexerModule lmSQL;
extern LexerModule lmVB;
extern LexerModule lmRuby;
extern LexerModule lmXML;
if (
&lmAda
@ -143,7 +147,12 @@ int wxForceScintillaLexers(void) {
&& &lmPython
&& &lmSQL
&& &lmVB
&& &lmRuby
&& &lmRuby
&& &lmEiffel
&& &lmEiffelkw
&& &lmLISP
&& &lmLua
&& &lmNull
)
{
return 1;

View File

@ -15,317 +15,255 @@
#include "PropSet.h"
#include "Accessor.h"
#include "StyleContext.h"
#include "KeyWords.h"
#include "Scintilla.h"
#include "SciLexer.h"
static bool IsOKBeforeRE(int ch) {
static bool IsOKBeforeRE(const int ch) {
return (ch == '(') || (ch == '=') || (ch == ',');
}
static void getRange(unsigned int start,
unsigned int end,
Accessor &styler,
char *s,
unsigned int len) {
unsigned int i = 0;
while ((i < end - start + 1) && (i < len-1)) {
s[i] = styler[start + i];
i++;
}
s[i] = '\0';
}
inline bool IsASpace(int ch) {
return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d));
}
inline bool IsAWordChar(int ch) {
inline bool IsAWordChar(const int ch) {
return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
}
inline bool IsAWordStart(int ch) {
inline bool IsAWordStart(const int ch) {
return (ch < 0x80) && (isalnum(ch) || ch == '_');
}
inline bool IsADigit(int ch) {
return (ch >= '0') && (ch <= '9');
inline bool IsADoxygenChar(const int ch) {
return (islower(ch) || ch == '$' || ch == '@' ||
ch == '\\' || ch == '&' || ch == '<' ||
ch == '>' || ch == '#' || ch == '{' ||
ch == '}' || ch == '[' || ch == ']');
}
// All languages handled so far can treat all characters >= 0x80 as one class
// which just continues the current token or starts an identifier if in default.
// DBCS treated specially as the second character can be < 0x80 and hence
// syntactically significant. UTF-8 avoids this as all trail bytes are >= 0x80
class ColouriseContext {
Accessor &styler;
int lengthDoc;
int currentPos;
ColouriseContext& operator=(const ColouriseContext&) {
return *this;
}
public:
bool atEOL;
int state;
int chPrev;
int ch;
int chNext;
inline bool IsStateComment(const int state) {
return ((state == SCE_C_COMMENT) ||
(state == SCE_C_COMMENTLINE) ||
(state == SCE_C_COMMENTDOC) ||
(state == SCE_C_COMMENTDOCKEYWORD) ||
(state == SCE_C_COMMENTDOCKEYWORDERROR));
}
ColouriseContext(unsigned int startPos, int length,
int initStyle, Accessor &styler_) :
styler(styler_),
lengthDoc(startPos + length),
currentPos(startPos),
atEOL(false),
state(initStyle),
chPrev(0),
ch(0),
chNext(0) {
styler.StartAt(startPos);
styler.StartSegment(startPos);
int pos = currentPos;
ch = static_cast<unsigned char>(styler.SafeGetCharAt(pos));
if (styler.IsLeadByte(static_cast<char>(ch))) {
pos++;
ch = ch << 8;
ch |= static_cast<unsigned char>(styler.SafeGetCharAt(pos));
}
chNext = static_cast<unsigned char>(styler.SafeGetCharAt(pos+1));
if (styler.IsLeadByte(static_cast<char>(chNext))) {
chNext = chNext << 8;
chNext |= static_cast<unsigned char>(styler.SafeGetCharAt(pos+2));
}
atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
}
void Complete() {
styler.ColourTo(currentPos - 1, state);
}
bool More() {
return currentPos <= lengthDoc;
}
void Forward() {
// A lot of this is repeated from the constructor - TODO: merge code
chPrev = ch;
currentPos++;
if (ch >= 0x100)
currentPos++;
ch = chNext;
chNext = static_cast<unsigned char>(styler.SafeGetCharAt(currentPos+1));
if (styler.IsLeadByte(static_cast<char>(chNext))) {
chNext = chNext << 8;
chNext |= static_cast<unsigned char>(styler.SafeGetCharAt(currentPos + 2));
}
// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)
// Avoid triggering two times on Dos/Win
// End of line
atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
}
void ChangeState(int state_) {
state = state_;
}
void SetState(int state_) {
styler.ColourTo(currentPos - 1, state);
state = state_;
}
void ForwardSetState(int state_) {
Forward();
styler.ColourTo(currentPos - 1, state);
state = state_;
}
void GetCurrent(char *s, int len) {
getRange(styler.GetStartSegment(), currentPos - 1, styler, s, len);
}
int LengthCurrent() {
return currentPos - styler.GetStartSegment();
}
bool Match(char ch0) {
return ch == ch0;
}
bool Match(char ch0, char ch1) {
return (ch == ch0) && (chNext == ch1);
}
bool Match(const char *s) {
if (ch != *s)
return false;
s++;
if (chNext != *s)
return false;
s++;
for (int n=2; *s; n++) {
if (*s != styler.SafeGetCharAt(currentPos+n))
return false;
s++;
}
return true;
}
};
inline bool IsStateString(const int state) {
return ((state == SCE_C_STRING) || (state == SCE_C_VERBATIM));
}
static void ColouriseCppDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
Accessor &styler) {
WordList &keywords = *keywordlists[0];
WordList &keywords2 = *keywordlists[1];
WordList &keywords3 = *keywordlists[2];
bool stylingWithinPreprocessor = styler.GetPropertyInt("styling.within.preprocessor");
if (initStyle == SCE_C_STRINGEOL) // Does not leak onto next line
// Do not leak onto next line
if (initStyle == SCE_C_STRINGEOL)
initStyle = SCE_C_DEFAULT;
int chPrevNonWhite = ' ';
int visibleChars = 0;
int noDocChars = 0;
bool lastWordWasUUID = false;
ColouriseContext cc(startPos, length, initStyle, styler);
StyleContext sc(startPos, length, initStyle, styler);
for (; cc.More(); cc.Forward()) {
for (; sc.More(); sc.Forward()) {
// Handle line continuation generically.
if (sc.ch == '\\') {
if (sc.Match("\\\n")) {
sc.Forward();
sc.Forward();
continue;
}
if (sc.Match("\\\r\n")) {
sc.Forward();
sc.Forward();
sc.Forward();
continue;
}
}
if (cc.state == SCE_C_STRINGEOL) {
if (cc.atEOL) {
cc.SetState(SCE_C_DEFAULT);
// Determine if the current state should terminate.
if (sc.state == SCE_C_OPERATOR) {
sc.SetState(SCE_C_DEFAULT);
} else if (sc.state == SCE_C_NUMBER) {
if (!IsAWordChar(sc.ch)) {
sc.SetState(SCE_C_DEFAULT);
}
} else if (cc.state == SCE_C_OPERATOR) {
cc.SetState(SCE_C_DEFAULT);
} else if (cc.state == SCE_C_NUMBER) {
if (!IsAWordChar(cc.ch)) {
cc.SetState(SCE_C_DEFAULT);
}
} else if (cc.state == SCE_C_IDENTIFIER) {
if (!IsAWordChar(cc.ch) || (cc.ch == '.')) {
} else if (sc.state == SCE_C_IDENTIFIER) {
if (!IsAWordChar(sc.ch) || (sc.ch == '.')) {
char s[100];
cc.GetCurrent(s, sizeof(s));
sc.GetCurrent(s, sizeof(s));
if (keywords.InList(s)) {
lastWordWasUUID = strcmp(s, "uuid") == 0;
cc.ChangeState(SCE_C_WORD);
sc.ChangeState(SCE_C_WORD);
} else if (keywords2.InList(s)) {
cc.ChangeState(SCE_C_WORD2);
sc.ChangeState(SCE_C_WORD2);
}
cc.SetState(SCE_C_DEFAULT);
sc.SetState(SCE_C_DEFAULT);
}
} if (cc.state == SCE_C_PREPROCESSOR) {
} else if (sc.state == SCE_C_PREPROCESSOR) {
if (stylingWithinPreprocessor) {
if (IsASpace(cc.ch)) {
cc.SetState(SCE_C_DEFAULT);
if (IsASpace(sc.ch)) {
sc.SetState(SCE_C_DEFAULT);
}
} else {
if (cc.atEOL && (cc.chPrev != '\\')) {
cc.SetState(SCE_C_DEFAULT);
if (sc.atLineEnd) {
sc.SetState(SCE_C_DEFAULT);
}
}
} else if (cc.state == SCE_C_COMMENT) {
if (cc.Match('*', '/')) {
cc.Forward();
cc.ForwardSetState(SCE_C_DEFAULT);
} else if (sc.state == SCE_C_COMMENT) {
if (sc.Match('*', '/')) {
sc.Forward();
sc.ForwardSetState(SCE_C_DEFAULT);
}
} else if (cc.state == SCE_C_COMMENTDOC) {
if (cc.Match('*', '/')) {
cc.Forward();
cc.ForwardSetState(SCE_C_DEFAULT);
} else if (sc.state == SCE_C_COMMENTDOC) {
if (sc.Match('*', '/')) {
sc.Forward();
sc.ForwardSetState(SCE_C_DEFAULT);
} else if ((sc.ch == '@' || sc.ch == '\\') && (noDocChars == 0)) {
sc.SetState(SCE_C_COMMENTDOCKEYWORD);
} else if (sc.atLineEnd) {
noDocChars = 0;
} else if (!isspace(sc.ch) && (sc.ch != '*')) {
noDocChars++;
}
} else if (cc.state == SCE_C_COMMENTLINE || cc.state == SCE_C_COMMENTLINEDOC) {
if (cc.ch == '\r' || cc.ch == '\n') {
cc.SetState(SCE_C_DEFAULT);
} else if (sc.state == SCE_C_COMMENTLINE || sc.state == SCE_C_COMMENTLINEDOC) {
if (sc.atLineEnd) {
sc.SetState(SCE_C_DEFAULT);
visibleChars = 0;
}
} else if (cc.state == SCE_C_STRING) {
if (cc.ch == '\\') {
if (cc.chNext == '\"' || cc.chNext == '\'' || cc.chNext == '\\') {
cc.Forward();
} else if (sc.state == SCE_C_COMMENTDOCKEYWORD) {
if (sc.Match('*', '/')) {
sc.ChangeState(SCE_C_COMMENTDOCKEYWORDERROR);
sc.Forward();
sc.ForwardSetState(SCE_C_DEFAULT);
} else if (!IsADoxygenChar(sc.ch)) {
char s[100];
sc.GetCurrent(s, sizeof(s));
if (!isspace(sc.ch) || !keywords3.InList(s+1)) {
sc.ChangeState(SCE_C_COMMENTDOCKEYWORDERROR);
}
} else if (cc.ch == '\"') {
cc.ForwardSetState(SCE_C_DEFAULT);
} else if ((cc.atEOL) && (cc.chPrev != '\\')) {
cc.ChangeState(SCE_C_STRINGEOL);
sc.SetState(SCE_C_COMMENTDOC);
}
} else if (cc.state == SCE_C_CHARACTER) {
if ((cc.ch == '\r' || cc.ch == '\n') && (cc.chPrev != '\\')) {
cc.ChangeState(SCE_C_STRINGEOL);
} else if (cc.ch == '\\') {
if (cc.chNext == '\"' || cc.chNext == '\'' || cc.chNext == '\\') {
cc.Forward();
} else if (sc.state == SCE_C_STRING) {
if (sc.ch == '\\') {
if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {
sc.Forward();
}
} else if (cc.ch == '\'') {
cc.ForwardSetState(SCE_C_DEFAULT);
} else if (sc.ch == '\"') {
sc.ForwardSetState(SCE_C_DEFAULT);
} else if (sc.atLineEnd) {
sc.ChangeState(SCE_C_STRINGEOL);
sc.ForwardSetState(SCE_C_DEFAULT);
visibleChars = 0;
}
} else if (cc.state == SCE_C_REGEX) {
if (cc.ch == '\r' || cc.ch == '\n' || cc.ch == '/') {
cc.ForwardSetState(SCE_C_DEFAULT);
} else if (cc.ch == '\\') {
} else if (sc.state == SCE_C_CHARACTER) {
if (sc.atLineEnd) {
sc.ChangeState(SCE_C_STRINGEOL);
sc.ForwardSetState(SCE_C_DEFAULT);
visibleChars = 0;
} else if (sc.ch == '\\') {
if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {
sc.Forward();
}
} else if (sc.ch == '\'') {
sc.ForwardSetState(SCE_C_DEFAULT);
}
} else if (sc.state == SCE_C_REGEX) {
if (sc.ch == '\r' || sc.ch == '\n' || sc.ch == '/') {
sc.ForwardSetState(SCE_C_DEFAULT);
} else if (sc.ch == '\\') {
// Gobble up the quoted character
if (cc.chNext == '\\' || cc.chNext == '/') {
cc.Forward();
if (sc.chNext == '\\' || sc.chNext == '/') {
sc.Forward();
}
}
} else if (cc.state == SCE_C_VERBATIM) {
if (cc.ch == '\"') {
if (cc.chNext == '\"') {
cc.Forward();
} else if (sc.state == SCE_C_VERBATIM) {
if (sc.ch == '\"') {
if (sc.chNext == '\"') {
sc.Forward();
} else {
cc.ForwardSetState(SCE_C_DEFAULT);
sc.ForwardSetState(SCE_C_DEFAULT);
}
}
} else if (cc.state == SCE_C_UUID) {
if (cc.ch == '\r' || cc.ch == '\n' || cc.ch == ')') {
cc.SetState(SCE_C_DEFAULT);
} else if (sc.state == SCE_C_UUID) {
if (sc.ch == '\r' || sc.ch == '\n' || sc.ch == ')') {
sc.SetState(SCE_C_DEFAULT);
}
}
if (cc.state == SCE_C_DEFAULT) {
if (cc.Match('@', '\"')) {
cc.SetState(SCE_C_VERBATIM);
cc.Forward();
} else if (IsADigit(cc.ch) || (cc.ch == '.' && IsADigit(cc.chNext))) {
// Determine if a new state should be entered.
if (sc.state == SCE_C_DEFAULT) {
if (sc.Match('@', '\"')) {
sc.SetState(SCE_C_VERBATIM);
sc.Forward();
} else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
if (lastWordWasUUID) {
cc.SetState(SCE_C_UUID);
sc.SetState(SCE_C_UUID);
lastWordWasUUID = false;
} else {
cc.SetState(SCE_C_NUMBER);
sc.SetState(SCE_C_NUMBER);
}
} else if (IsAWordStart(cc.ch) || (cc.ch == '@')) {
} else if (IsAWordStart(sc.ch) || (sc.ch == '@')) {
if (lastWordWasUUID) {
cc.SetState(SCE_C_UUID);
sc.SetState(SCE_C_UUID);
lastWordWasUUID = false;
} else {
cc.SetState(SCE_C_IDENTIFIER);
sc.SetState(SCE_C_IDENTIFIER);
}
} else if (cc.Match('/', '*')) {
if (cc.Match("/**") || cc.Match("/*!")) // Support of Qt/Doxygen doc. style
cc.SetState(SCE_C_COMMENTDOC);
} else if (sc.Match('/', '*')) {
if (sc.Match("/**") || sc.Match("/*!")) { // Support of Qt/Doxygen doc. style
noDocChars = 0;
sc.SetState(SCE_C_COMMENTDOC);
} else {
sc.SetState(SCE_C_COMMENT);
}
sc.Forward(); // Eat the * so it isn't used for the end of the comment
} else if (sc.Match('/', '/')) {
if (sc.Match("///") || sc.Match("//!")) // Support of Qt/Doxygen doc. style
sc.SetState(SCE_C_COMMENTLINEDOC);
else
cc.SetState(SCE_C_COMMENT);
cc.Forward(); // Eat the * so it isn't used for the end of the comment
} else if (cc.Match('/', '/')) {
if (cc.Match("///") || cc.Match("//!")) // Support of Qt/Doxygen doc. style
cc.SetState(SCE_C_COMMENTLINEDOC);
else
cc.SetState(SCE_C_COMMENTLINE);
} else if (cc.ch == '/' && IsOKBeforeRE(chPrevNonWhite)) {
cc.SetState(SCE_C_REGEX);
} else if (cc.ch == '\"') {
cc.SetState(SCE_C_STRING);
} else if (cc.ch == '\'') {
cc.SetState(SCE_C_CHARACTER);
} else if (cc.ch == '#' && visibleChars == 0) {
sc.SetState(SCE_C_COMMENTLINE);
} else if (sc.ch == '/' && IsOKBeforeRE(chPrevNonWhite)) {
sc.SetState(SCE_C_REGEX);
} else if (sc.ch == '\"') {
sc.SetState(SCE_C_STRING);
} else if (sc.ch == '\'') {
sc.SetState(SCE_C_CHARACTER);
} else if (sc.ch == '#' && visibleChars == 0) {
// Preprocessor commands are alone on their line
cc.SetState(SCE_C_PREPROCESSOR);
sc.SetState(SCE_C_PREPROCESSOR);
// Skip whitespace between # and preprocessor word
do {
cc.Forward();
} while (IsASpace(cc.ch) && cc.More());
} else if (isoperator(static_cast<char>(cc.ch))) {
cc.SetState(SCE_C_OPERATOR);
sc.Forward();
} while ((sc.ch == ' ') && (sc.ch == '\t') && sc.More());
if (sc.atLineEnd) {
sc.SetState(SCE_C_DEFAULT);
}
} else if (isoperator(static_cast<char>(sc.ch))) {
sc.SetState(SCE_C_OPERATOR);
}
}
if (cc.atEOL) {
if (sc.atLineEnd) {
// Reset states to begining of colourise so no surprises
// if different sets of lines lexed.
chPrevNonWhite = ' ';
visibleChars = 0;
lastWordWasUUID = false;
}
if (!IsASpace(cc.ch)) {
chPrevNonWhite = cc.ch;
if (!IsASpace(sc.ch)) {
chPrevNonWhite = sc.ch;
visibleChars++;
}
}
cc.Complete();
sc.Complete();
}
static void FoldCppDoc(unsigned int startPos, int length, int initStyle, WordList *[],

View File

@ -0,0 +1,204 @@
// Scintilla source code edit control
/** @file LexCrontab.cxx
** Lexer to use with extended crontab files used by a powerful
** Windows scheduler/event monitor/automation manager nnCron.
** (http://nemtsev.virtualave.net/)
**/
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <stdarg.h>
#include "Platform.h"
#include "PropSet.h"
#include "Accessor.h"
#include "KeyWords.h"
#include "Scintilla.h"
#include "SciLexer.h"
static void ColouriseNncrontabDoc(unsigned int startPos, int length, int, WordList
*keywordLists[], Accessor &styler)
{
int state = SCE_NNCRONTAB_DEFAULT;
char chNext = styler[startPos];
int lengthDoc = startPos + length;
// create a buffer large enough to take the largest chunk...
char *buffer = new char[length];
int bufferCount = 0;
// used when highliting environment variables inside quoted string:
bool insideString = false;
// this assumes that we have 3 keyword list in conf.properties
WordList &section = *keywordLists[0];
WordList &keyword = *keywordLists[1];
WordList &modifier = *keywordLists[2];
// go through all provided text segment
// using the hand-written state machine shown below
styler.StartAt(startPos);
styler.StartSegment(startPos);
for (int i = startPos; i < lengthDoc; i++) {
char ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
if (styler.IsLeadByte(ch)) {
chNext = styler.SafeGetCharAt(i + 2);
i++;
continue;
}
switch(state) {
case SCE_NNCRONTAB_DEFAULT:
if( ch == '\n' || ch == '\r' || ch == '\t' || ch == ' ') {
// whitespace is simply ignored here...
styler.ColourTo(i,SCE_NNCRONTAB_DEFAULT);
break;
} else if( ch == '#' && styler.SafeGetCharAt(i+1) == '(') {
// signals the start of a task...
state = SCE_NNCRONTAB_TASK;
styler.ColourTo(i,SCE_NNCRONTAB_TASK);
}
else if( ch == '\\' && styler.SafeGetCharAt(i+1) == ' ') {
// signals the start of an extended comment...
state = SCE_NNCRONTAB_COMMENT;
styler.ColourTo(i,SCE_NNCRONTAB_COMMENT);
} else if( ch == '#' ) {
// signals the start of a plain comment...
state = SCE_NNCRONTAB_COMMENT;
styler.ColourTo(i,SCE_NNCRONTAB_COMMENT);
} else if( ch == ')' && styler.SafeGetCharAt(i+1) == '#') {
// signals the end of a task...
state = SCE_NNCRONTAB_TASK;
styler.ColourTo(i,SCE_NNCRONTAB_TASK);
} else if( ch == '"') {
state = SCE_NNCRONTAB_STRING;
styler.ColourTo(i,SCE_NNCRONTAB_STRING);
} else if( ch == '%') {
// signals environment variables
state = SCE_NNCRONTAB_ENVIRONMENT;
styler.ColourTo(i,SCE_NNCRONTAB_ENVIRONMENT);
} else if( ch == '*' ) {
// signals an asterisk
// no state jump necessary for this simple case...
styler.ColourTo(i,SCE_NNCRONTAB_ASTERISK);
} else if( isalpha(ch) || ch == '<' ) {
// signals the start of an identifier
bufferCount = 0;
buffer[bufferCount++] = ch;
state = SCE_NNCRONTAB_IDENTIFIER;
} else if( isdigit(ch) ) {
// signals the start of a number
bufferCount = 0;
buffer[bufferCount++] = ch;
state = SCE_NNCRONTAB_NUMBER;
} else {
// style it the default style..
styler.ColourTo(i,SCE_NNCRONTAB_DEFAULT);
}
break;
case SCE_NNCRONTAB_COMMENT:
// if we find a newline here,
// we simply go to default state
// else continue to work on it...
if( ch == '\n' || ch == '\r' ) {
state = SCE_NNCRONTAB_DEFAULT;
} else {
styler.ColourTo(i,SCE_NNCRONTAB_COMMENT);
}
break;
case SCE_NNCRONTAB_TASK:
// if we find a newline here,
// we simply go to default state
// else continue to work on it...
if( ch == '\n' || ch == '\r' ) {
state = SCE_NNCRONTAB_DEFAULT;
} else {
styler.ColourTo(i,SCE_NNCRONTAB_TASK);
}
break;
case SCE_NNCRONTAB_STRING:
if( ch == '%' ) {
state = SCE_NNCRONTAB_ENVIRONMENT;
insideString = true;
styler.ColourTo(i-1,SCE_NNCRONTAB_STRING);
break;
}
// if we find the end of a string char, we simply go to default state
// else we're still dealing with an string...
if( (ch == '"' && styler.SafeGetCharAt(i-1)!='\\') ||
(ch == '\n') || (ch == '\r') ) {
state = SCE_NNCRONTAB_DEFAULT;
}
styler.ColourTo(i,SCE_NNCRONTAB_STRING);
break;
case SCE_NNCRONTAB_ENVIRONMENT:
// if we find the end of a string char, we simply go to default state
// else we're still dealing with an string...
if( ch == '%' && insideString ) {
state = SCE_NNCRONTAB_STRING;
insideString = false;
break;
}
if( (ch == '%' && styler.SafeGetCharAt(i-1)!='\\')
|| (ch == '\n') || (ch == '\r') ) {
state = SCE_NNCRONTAB_DEFAULT;
styler.ColourTo(i,SCE_NNCRONTAB_ENVIRONMENT);
break;
}
styler.ColourTo(i+1,SCE_NNCRONTAB_ENVIRONMENT);
break;
case SCE_NNCRONTAB_IDENTIFIER:
// stay in CONF_IDENTIFIER state until we find a non-alphanumeric
if( isalnum(ch) || (ch == '_') || (ch == '-') || (ch == '/') ||
(ch == '$') || (ch == '.') || (ch == '<') || (ch == '>') ) {
buffer[bufferCount++] = ch;
} else {
state = SCE_NNCRONTAB_DEFAULT;
buffer[bufferCount] = '\0';
// check if the buffer contains a keyword,
// and highlight it if it is a keyword...
if(section.InList(buffer)) {
styler.ColourTo(i,SCE_NNCRONTAB_SECTION );
} else if(keyword.InList(buffer)) {
styler.ColourTo(i-1,SCE_NNCRONTAB_KEYWORD );
} // else if(strchr(buffer,'/') || strchr(buffer,'.')) {
// styler.ColourTo(i-1,SCE_NNCRONTAB_EXTENSION);
// }
else if(modifier.InList(buffer)) {
styler.ColourTo(i-1,SCE_NNCRONTAB_MODIFIER );
} else {
styler.ColourTo(i-1,SCE_NNCRONTAB_DEFAULT);
}
// push back the faulty character
chNext = styler[i--];
}
break;
case SCE_NNCRONTAB_NUMBER:
// stay in CONF_NUMBER state until we find a non-numeric
if( isdigit(ch) /* || ch == '.' */ ) {
buffer[bufferCount++] = ch;
} else {
state = SCE_NNCRONTAB_DEFAULT;
buffer[bufferCount] = '\0';
// Colourize here... (normal number)
styler.ColourTo(i-1,SCE_NNCRONTAB_NUMBER);
// push back a character
chNext = styler[i--];
}
break;
}
}
}
LexerModule lmNncrontab(SCLEX_NNCRONTAB, ColouriseNncrontabDoc, "nncrontab");

View File

@ -16,6 +16,7 @@
#include "PropSet.h"
#include "Accessor.h"
#include "StyleContext.h"
#include "KeyWords.h"
#include "Scintilla.h"
#include "SciLexer.h"
@ -31,23 +32,6 @@ inline bool isEiffelOperator(unsigned int ch) {
ch == '!' || ch == '@' || ch == '?';
}
static void getRangeLowered(unsigned int start,
unsigned int end,
Accessor &styler,
char *s,
unsigned int len) {
unsigned int i = 0;
while ((i < end - start + 1) && (i < len-1)) {
s[i] = static_cast<char>(tolower(styler[start + i]));
i++;
}
s[i] = '\0';
}
inline bool IsASpace(unsigned int ch) {
return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d));
}
inline bool IsAWordChar(unsigned int ch) {
return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
}
@ -56,81 +40,6 @@ inline bool IsAWordStart(unsigned int ch) {
return (ch < 0x80) && (isalnum(ch) || ch == '_');
}
inline bool IsADigit(unsigned int ch) {
return (ch >= '0') && (ch <= '9');
}
// All languages handled so far can treat all characters >= 0x80 as one class
// which just continues the current token or starts an identifier if in default.
// DBCS treated specially as the second character can be < 0x80 and hence
// syntactically significant. UTF-8 avoids this as all trail bytes are >= 0x80
class xColouriseContext {
Accessor &styler;
int lengthDoc;
int currentPos;
xColouriseContext& operator=(const xColouriseContext&) {
return *this;
}
public:
int state;
unsigned int chPrev;
unsigned int ch;
unsigned int chNext;
xColouriseContext(unsigned int startPos, int length,
int initStyle, Accessor &styler_) :
styler(styler_),
lengthDoc(startPos + length),
currentPos(startPos),
state(initStyle),
chPrev(0),
ch(0),
chNext(0) {
styler.StartAt(startPos);
styler.StartSegment(startPos);
int pos = currentPos;
ch = static_cast<unsigned char>(styler.SafeGetCharAt(pos));
if (styler.IsLeadByte(static_cast<char>(ch))) {
pos++;
ch = ch << 8;
ch |= static_cast<unsigned char>(styler.SafeGetCharAt(pos));
}
chNext = static_cast<unsigned char>(styler.SafeGetCharAt(pos+1));
if (styler.IsLeadByte(static_cast<char>(chNext))) {
chNext = chNext << 8;
chNext |= static_cast<unsigned char>(styler.SafeGetCharAt(pos+2));
}
}
void Complete() {
styler.ColourTo(currentPos - 1, state);
}
bool More() {
return currentPos <= lengthDoc;
}
void Forward() {
chPrev = ch;
currentPos++;
if (ch >= 0x100)
currentPos++;
ch = chNext;
chNext = static_cast<unsigned char>(styler.SafeGetCharAt(currentPos+1));
if (styler.IsLeadByte(static_cast<char>(chNext))) {
chNext = chNext << 8;
chNext |= static_cast<unsigned char>(styler.SafeGetCharAt(currentPos + 2));
}
}
void ChangeState(int state_) {
state = state_;
}
void SetState(int state_) {
styler.ColourTo(currentPos - 1, state);
state = state_;
}
void GetCurrentLowered(char *s, int len) {
getRangeLowered(styler.GetStartSegment(), currentPos - 1, styler, s, len);
}
};
static void ColouriseEiffelDoc(unsigned int startPos,
int length,
int initStyle,
@ -139,68 +48,68 @@ static void ColouriseEiffelDoc(unsigned int startPos,
WordList &keywords = *keywordlists[0];
xColouriseContext lc(startPos, length, initStyle, styler);
StyleContext sc(startPos, length, initStyle, styler);
for (; lc.More(); lc.Forward()) {
for (; sc.More(); sc.Forward()) {
if (lc.state == SCE_EIFFEL_STRINGEOL) {
if (lc.ch != '\r' && lc.ch != '\n') {
lc.SetState(SCE_EIFFEL_DEFAULT);
if (sc.state == SCE_EIFFEL_STRINGEOL) {
if (sc.ch != '\r' && sc.ch != '\n') {
sc.SetState(SCE_EIFFEL_DEFAULT);
}
} else if (lc.state == SCE_EIFFEL_OPERATOR) {
lc.SetState(SCE_EIFFEL_DEFAULT);
} else if (lc.state == SCE_EIFFEL_WORD) {
if (!IsAWordChar(lc.ch)) {
} else if (sc.state == SCE_EIFFEL_OPERATOR) {
sc.SetState(SCE_EIFFEL_DEFAULT);
} else if (sc.state == SCE_EIFFEL_WORD) {
if (!IsAWordChar(sc.ch)) {
char s[100];
lc.GetCurrentLowered(s, sizeof(s));
sc.GetCurrentLowered(s, sizeof(s));
if (!keywords.InList(s)) {
lc.ChangeState(SCE_EIFFEL_IDENTIFIER);
sc.ChangeState(SCE_EIFFEL_IDENTIFIER);
}
lc.SetState(SCE_EIFFEL_DEFAULT);
sc.SetState(SCE_EIFFEL_DEFAULT);
}
} else if (lc.state == SCE_EIFFEL_NUMBER) {
if (!IsAWordChar(lc.ch)) {
lc.SetState(SCE_EIFFEL_DEFAULT);
} else if (sc.state == SCE_EIFFEL_NUMBER) {
if (!IsAWordChar(sc.ch)) {
sc.SetState(SCE_EIFFEL_DEFAULT);
}
} else if (lc.state == SCE_EIFFEL_COMMENTLINE) {
if (lc.ch == '\r' || lc.ch == '\n') {
lc.SetState(SCE_EIFFEL_DEFAULT);
} else if (sc.state == SCE_EIFFEL_COMMENTLINE) {
if (sc.ch == '\r' || sc.ch == '\n') {
sc.SetState(SCE_EIFFEL_DEFAULT);
}
} else if (lc.state == SCE_EIFFEL_STRING) {
if (lc.ch == '%') {
lc.Forward();
} else if (lc.ch == '\"') {
lc.Forward();
lc.SetState(SCE_EIFFEL_DEFAULT);
} else if (sc.state == SCE_EIFFEL_STRING) {
if (sc.ch == '%') {
sc.Forward();
} else if (sc.ch == '\"') {
sc.Forward();
sc.SetState(SCE_EIFFEL_DEFAULT);
}
} else if (lc.state == SCE_EIFFEL_CHARACTER) {
if (lc.ch == '\r' || lc.ch == '\n') {
lc.SetState(SCE_EIFFEL_STRINGEOL);
} else if (lc.ch == '%') {
lc.Forward();
} else if (lc.ch == '\'') {
lc.Forward();
lc.SetState(SCE_EIFFEL_DEFAULT);
} else if (sc.state == SCE_EIFFEL_CHARACTER) {
if (sc.ch == '\r' || sc.ch == '\n') {
sc.SetState(SCE_EIFFEL_STRINGEOL);
} else if (sc.ch == '%') {
sc.Forward();
} else if (sc.ch == '\'') {
sc.Forward();
sc.SetState(SCE_EIFFEL_DEFAULT);
}
}
if (lc.state == SCE_EIFFEL_DEFAULT) {
if (lc.ch == '-' && lc.chNext == '-') {
lc.SetState(SCE_EIFFEL_COMMENTLINE);
} else if (lc.ch == '\"') {
lc.SetState(SCE_EIFFEL_STRING);
} else if (lc.ch == '\'') {
lc.SetState(SCE_EIFFEL_CHARACTER);
} else if (IsADigit(lc.ch) || (lc.ch == '.')) {
lc.SetState(SCE_EIFFEL_NUMBER);
} else if (IsAWordStart(lc.ch)) {
lc.SetState(SCE_EIFFEL_WORD);
} else if (isEiffelOperator(lc.ch)) {
lc.SetState(SCE_EIFFEL_OPERATOR);
if (sc.state == SCE_EIFFEL_DEFAULT) {
if (sc.ch == '-' && sc.chNext == '-') {
sc.SetState(SCE_EIFFEL_COMMENTLINE);
} else if (sc.ch == '\"') {
sc.SetState(SCE_EIFFEL_STRING);
} else if (sc.ch == '\'') {
sc.SetState(SCE_EIFFEL_CHARACTER);
} else if (IsADigit(sc.ch) || (sc.ch == '.')) {
sc.SetState(SCE_EIFFEL_NUMBER);
} else if (IsAWordStart(sc.ch)) {
sc.SetState(SCE_EIFFEL_WORD);
} else if (isEiffelOperator(sc.ch)) {
sc.SetState(SCE_EIFFEL_OPERATOR);
}
}
}
lc.Complete();
sc.Complete();
}
static bool IsEiffelComment(Accessor &styler, int pos, int len) {

View File

@ -1,7 +1,7 @@
// Scintilla source code edit control
/** @file LexHTML.cxx
** Lexer for HTML.
**/
**/
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
@ -23,16 +23,16 @@
#define SCE_HA_VBS (SCE_HBA_START - SCE_HB_START)
#define SCE_HA_PYTHON (SCE_HPA_START - SCE_HP_START)
enum { eScriptNone = 0, eScriptJS, eScriptVBS, eScriptPython, eScriptPHP, eScriptXML };
enum { eScriptNone = 0, eScriptJS, eScriptVBS, eScriptPython, eScriptPHP, eScriptXML, eScriptSGML, eScriptSGMLblock };
enum { eHtml = 0, eNonHtmlScript, eNonHtmlPreProc, eNonHtmlScriptPreProc };
static int segIsScriptingIndicator(Accessor &styler, unsigned int start, unsigned int end, int prevValue) {
char s[30 + 1];
s[0] = '\0';
for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
unsigned int i = 0;
for (; i < end - start + 1 && i < 30; i++) {
s[i] = static_cast<char>(tolower(styler[start + i]));
s[i + 1] = '\0';
}
s[i] = '\0';
//Platform::DebugPrintf("Scripting indicator [%s]\n", s);
if (strstr(s, "src")) // External script
return eScriptNone;
@ -55,11 +55,11 @@ static int segIsScriptingIndicator(Accessor &styler, unsigned int start, unsigne
static int PrintScriptingIndicatorOffset(Accessor &styler, unsigned int start, unsigned int end) {
int iResult = 0;
char s[30 + 1];
s[0] = '\0';
for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
unsigned int i = 0;
for (; i < end - start + 1 && i < 30; i++) {
s[i] = static_cast<char>(tolower(styler[start + i]));
s[i + 1] = '\0';
}
s[i] = '\0';
if (0 == strncmp(s, "php", 3)) {
iResult = 3;
}
@ -68,22 +68,21 @@ static int PrintScriptingIndicatorOffset(Accessor &styler, unsigned int start, u
}
static int ScriptOfState(int state) {
int scriptLanguage;
if ((state >= SCE_HP_START) && (state <= SCE_HP_IDENTIFIER)) {
scriptLanguage = eScriptPython;
return eScriptPython;
} else if ((state >= SCE_HB_START) && (state <= SCE_HB_STRINGEOL)) {
scriptLanguage = eScriptVBS;
return eScriptVBS;
} else if ((state >= SCE_HJ_START) && (state <= SCE_HJ_REGEX)) {
scriptLanguage = eScriptJS;
return eScriptJS;
} else if ((state >= SCE_HPHP_DEFAULT) && (state <= SCE_HPHP_COMMENTLINE)) {
scriptLanguage = eScriptPHP;
return eScriptPHP;
} else if ((state >= SCE_H_SGML_DEFAULT) && (state <= SCE_H_SGML_BLOCK_DEFAULT)) {
return eScriptSGML;
} else if (state == SCE_H_SGML_BLOCK_DEFAULT) {
return eScriptSGMLblock;
} else {
// scriptLanguage = defaultScript;
scriptLanguage = eScriptNone;
return eScriptNone;
}
return scriptLanguage;
}
static int statePrintForState(int state, int inScriptType) {
@ -174,11 +173,11 @@ static void classifyAttribHTML(unsigned int start, unsigned int end, WordList &k
chAttr = SCE_H_NUMBER;
} else {
char s[30 + 1];
s[0] = '\0';
for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
unsigned int i = 0;
for (; i < end - start + 1 && i < 30; i++) {
s[i] = static_cast<char>(tolower(styler[start + i]));
s[i + 1] = '\0';
}
s[i] = '\0';
if (keywords.InList(s))
chAttr = SCE_H_ATTRIBUTE;
}
@ -195,18 +194,14 @@ static int classifyTagHTML(unsigned int start, unsigned int end,
unsigned int i = 0;
for (unsigned int cPos = start; cPos <= end && i < 30; cPos++) {
char ch = styler[cPos];
if (ch != '<')
if ((ch != '<') && (ch != '/'))
s[i++] = static_cast<char>(tolower(ch));
}
s[i] = '\0';
bool isScript = false;
char chAttr = SCE_H_TAGUNKNOWN;
if (s[0] == '!' && s[1] == '-' && s[2] == '-') { //Comment
chAttr = SCE_H_COMMENT;
} else if (strcmp(s, "![cdata[") == 0) { // In lower case because already converted
chAttr = SCE_H_CDATA;
} else if (s[0] == '!') {
chAttr = SCE_H_SGML;
if (s[0] == '!') {
chAttr = SCE_H_SGML_DEFAULT;
} else if (s[0] == '/') { // Closing tag
if (keywords.InList(s + 1))
chAttr = SCE_H_TAG;
@ -231,10 +226,11 @@ static void classifyWordHTJS(unsigned int start, unsigned int end,
chAttr = SCE_HJ_NUMBER;
else {
char s[30 + 1];
for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
unsigned int i = 0;
for (; i < end - start + 1 && i < 30; i++) {
s[i] = styler[start + i];
s[i + 1] = '\0';
}
s[i] = '\0';
if (keywords.InList(s))
chAttr = SCE_HJ_KEYWORD;
}
@ -248,10 +244,11 @@ static int classifyWordHTVB(unsigned int start, unsigned int end, WordList &keyw
chAttr = SCE_HB_NUMBER;
else {
char s[30 + 1];
for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
unsigned int i = 0;
for (; i < end - start + 1 && i < 30; i++) {
s[i] = static_cast<char>(tolower(styler[start + i]));
s[i + 1] = '\0';
}
s[i] = '\0';
if (keywords.InList(s)) {
chAttr = SCE_HB_WORD;
if (strcmp(s, "rem") == 0)
@ -268,10 +265,11 @@ static int classifyWordHTVB(unsigned int start, unsigned int end, WordList &keyw
static void classifyWordHTPy(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord, int inScriptType) {
bool wordIsNumber = isdigit(styler[start]);
char s[30 + 1];
for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
unsigned int i = 0;
for (; i < end - start + 1 && i < 30; i++) {
s[i] = styler[start + i];
s[i + 1] = '\0';
}
s[i] = '\0';
char chAttr = SCE_HP_IDENTIFIER;
if (0 == strcmp(prevWord, "class"))
chAttr = SCE_HP_CLASSNAME;
@ -294,16 +292,37 @@ static void classifyWordHTPHP(unsigned int start, unsigned int end, WordList &ke
chAttr = SCE_HPHP_NUMBER;
else {
char s[30 + 1];
for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
unsigned int i = 0;
for (; i < end - start + 1 && i < 30; i++) {
s[i] = styler[start + i];
s[i + 1] = '\0';
}
s[i] = '\0';
if (keywords.InList(s))
chAttr = SCE_HPHP_WORD;
}
styler.ColourTo(end, chAttr);
}
static bool isWordHSGML(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {
char s[30 + 1];
unsigned int i = 0;
for (; i < end - start + 1 && i < 30; i++) {
s[i] = styler[start + i];
}
s[i] = '\0';
return keywords.InList(s);
}
static bool isWordCdata(unsigned int start, unsigned int end, Accessor &styler) {
char s[30 + 1];
unsigned int i = 0;
for (; i < end - start + 1 && i < 30; i++) {
s[i] = styler[start + i];
}
s[i] = '\0';
return (0 == strcmp(s, "[CDATA["));
}
// Return the first state to reach when entering a scripting language
static int StateForScript(int scriptLanguage) {
int Result;
@ -320,6 +339,9 @@ static int StateForScript(int scriptLanguage) {
case eScriptXML:
Result = SCE_H_TAGUNKNOWN;
break;
case eScriptSGML:
Result = SCE_H_SGML_DEFAULT;
break;
default :
Result = SCE_HJ_START;
break;
@ -331,6 +353,10 @@ inline bool ishtmlwordchar(char ch) {
return isalnum(ch) || ch == '.' || ch == '-' || ch == '_' || ch == ':' || ch == '!' || ch == '#';
}
inline bool issgmlwordchar(char ch) {
return isalnum(ch) || ch == '.' || ch == '_' || ch == ':' || ch == '!' || ch == '#' || ch == '[';
}
static bool InTagState(int state) {
return state == SCE_H_TAG || state == SCE_H_TAGUNKNOWN ||
state == SCE_H_SCRIPT ||
@ -339,6 +365,10 @@ static bool InTagState(int state) {
state == SCE_H_DOUBLESTRING || state == SCE_H_SINGLESTRING;
}
static bool IsCommentState(const int state) {
return state == SCE_H_COMMENT || state == SCE_H_SGML_COMMENT;
}
static bool isLineEnd(char ch) {
return ch == '\r' || ch == '\n';
}
@ -348,23 +378,23 @@ static bool isOKBeforeRE(char ch) {
}
static bool isPHPStringState(int state) {
return
(state == SCE_HPHP_HSTRING) ||
(state == SCE_HPHP_SIMPLESTRING) ||
(state == SCE_HPHP_HSTRING_VARIABLE);
return
(state == SCE_HPHP_HSTRING) ||
(state == SCE_HPHP_SIMPLESTRING) ||
(state == SCE_HPHP_HSTRING_VARIABLE);
}
static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
Accessor &styler) {
WordList &keywords = *keywordlists[0];
WordList &keywords2 = *keywordlists[1];
WordList &keywords3 = *keywordlists[2];
WordList &keywords4 = *keywordlists[3];
WordList &keywords5 = *keywordlists[4];
WordList &keywords6 = *keywordlists[5]; // SGML (DTD) keywords
// Lexer for HTML requires more lexical states (7 bits worth) than most lexers
styler.StartAt(startPos, 127);
styler.StartAt(startPos, STYLE_MAX);
char prevWord[200];
prevWord[0] = '\0';
int StateToPrint = initStyle;
@ -374,49 +404,51 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
if (InTagState(state)) {
while ((startPos > 0) && (InTagState(styler.StyleAt(startPos - 1)))) {
startPos--;
length++;
length++;
}
state = SCE_H_DEFAULT;
}
styler.StartAt(startPos, 127);
styler.StartAt(startPos, STYLE_MAX);
int lineState = eScriptVBS;
int lineCurrent = styler.GetLine(startPos);
if (lineCurrent > 0)
int lineState;
if (lineCurrent > 0) {
lineState = styler.GetLineState(lineCurrent);
int inScriptType = (lineState >> 0) & 0x03; // 2 bits of scripting type
bool tagOpened = (lineState >> 2) & 0x01; // 1 bit to know if we are in an opened tag
bool tagClosing = (lineState >> 3) & 0x01; // 1 bit to know if we are in a closing tag
int defaultScript = (lineState >> 4) & 0x0F; // 4 bits of script name
int beforePreProc = (lineState >> 8) & 0xFF; // 8 bits of state
} else {
// Default client and ASP scripting language is JavaScript
lineState = eScriptJS << 8;
lineState |= styler.GetPropertyInt("asp.default.language", eScriptJS) << 4;
}
int inScriptType = (lineState >> 0) & 0x03; // 2 bits of scripting type
bool tagOpened = (lineState >> 2) & 0x01; // 1 bit to know if we are in an opened tag
bool tagClosing = (lineState >> 3) & 0x01; // 1 bit to know if we are in a closing tag
int aspScript = (lineState >> 4) & 0x0F; // 4 bits of script name
int clientScript = (lineState >> 8) & 0x0F; // 4 bits of script name
int beforePreProc = (lineState >> 12) & 0xFF; // 8 bits of state
int scriptLanguage = ScriptOfState(state);
bool fold = styler.GetPropertyInt("fold");
bool foldHTML = styler.GetPropertyInt("fold.html",0);
bool foldCompact = styler.GetPropertyInt("fold.compact",1);
fold = foldHTML && fold;
const bool foldHTML = styler.GetPropertyInt("fold.html", 0);
const bool fold = foldHTML && styler.GetPropertyInt("fold");
const bool foldCompact = styler.GetPropertyInt("fold.compact", 1);
int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
int levelCurrent = levelPrev;
int visibleChars;
visibleChars = 0;
int visibleChars = 0;
char chPrev = ' ';
char ch = ' ';
char chPrevNonWhite = ' ';
styler.StartSegment(startPos);
int lengthDoc = startPos + length;
const int lengthDoc = startPos + length;
for (int i = startPos; i < lengthDoc; i++) {
char chPrev2 = chPrev;
const char chPrev2 = chPrev;
chPrev = ch;
if (ch != ' ' && ch != '\t')
chPrevNonWhite = ch;
ch = styler[i];
char chNext = styler.SafeGetCharAt(i + 1);
char chNext2 = styler.SafeGetCharAt(i + 2);
const char chNext2 = styler.SafeGetCharAt(i + 2);
// Handle DBCS codepages
if (styler.IsLeadByte(ch)) {
@ -451,18 +483,21 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
} else if ((ch == '\n') && !((chNext == '\r') && (chNext2 == '\n')) && (chNext != '\n')) {
// check if the number of tabs is lower than the level
int Findlevel = (levelCurrent & ~SC_FOLDLEVELBASE) * 8;
for (int j = 0;Findlevel > 0;j++) {
for (int j = 0; Findlevel > 0; j++) {
char chTmp = styler.SafeGetCharAt(i + j + 1);
if (chTmp == '\t') {
Findlevel -= 8;
} else if (chTmp == ' ') {
} else if (chTmp == ' ') {
Findlevel--;
} else break;
} else {
break;
}
}
if (Findlevel > 0) {
levelCurrent -= Findlevel / 8;
if (Findlevel % 8) levelCurrent--;
if (Findlevel % 8)
levelCurrent--;
}
}
}
@ -487,11 +522,12 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
}
lineCurrent++;
styler.SetLineState(lineCurrent,
((inScriptType & 0x03) << 0) |
((tagOpened & 0x01) << 2) |
((tagClosing & 0x01) << 3) |
((defaultScript & 0x0F) << 4) |
((beforePreProc & 0xFF) << 8));
((inScriptType & 0x03) << 0) |
((tagOpened & 0x01) << 2) |
((tagClosing & 0x01) << 3) |
((aspScript & 0x0F) << 4) |
((clientScript & 0x0F) << 8) |
((beforePreProc & 0xFF) << 12));
}
// generic end of script processing
@ -503,9 +539,9 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
case SCE_H_SINGLESTRING:
case SCE_HJ_COMMENT:
case SCE_HJ_COMMENTDOC:
// SCE_HJ_COMMENTLINE removed as this is a common thing done to hide
// the end of script marker from some JS interpreters.
//case SCE_HJ_COMMENTLINE:
// SCE_HJ_COMMENTLINE removed as this is a common thing done to hide
// the end of script marker from some JS interpreters.
//case SCE_HJ_COMMENTLINE:
case SCE_HJ_DOUBLESTRING:
case SCE_HJ_SINGLESTRING:
case SCE_HB_STRING:
@ -514,29 +550,31 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
case SCE_HP_TRIPLEDOUBLE:
break;
default :
// maybe we should check here if it's a tag and if it's SCRIPT
// closing tag of the script (it's a closing HTML tag anyway)
styler.ColourTo(i - 1, StateToPrint);
state = SCE_H_TAGUNKNOWN;
inScriptType = eHtml;
scriptLanguage = eScriptNone;
clientScript = eScriptJS;
i += 2;
// unfold closing script
levelCurrent--;
visibleChars += 2;
tagClosing = true;
continue;
}
}
/////////////////////////////////////
// handle the start of PHP pre-processor = Non-HTML
else if ((state != SCE_H_ASPAT) &&
!isPHPStringState(state) &&
(state != SCE_HPHP_COMMENT) &&
(ch == '<') &&
(chNext == '?')) {
else if ((state != SCE_H_ASPAT) &&
!isPHPStringState(state) &&
(state != SCE_HPHP_COMMENT) &&
(ch == '<') &&
(chNext == '?')) {
styler.ColourTo(i - 1, StateToPrint);
beforePreProc = state;
scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment() + 2, i + 10, eScriptPHP);
i++;
visibleChars++;
i += PrintScriptingIndicatorOffset(styler, styler.GetStartSegment() + 2, i + 10);
if (scriptLanguage == eScriptXML)
styler.ColourTo(i, SCE_H_XMLSTART);
@ -567,6 +605,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
if (chNext2 == '@') {
i += 2; // place as if it was the second next char treated
visibleChars += 2;
state = SCE_H_ASPAT;
} else if ((chNext2 == '-') && (styler.SafeGetCharAt(i + 3) == '-')) {
styler.ColourTo(i + 3, SCE_H_ASP);
@ -576,11 +615,13 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
} else {
if (chNext2 == '=') {
i += 2; // place as if it was the second next char treated
visibleChars += 2;
} else {
i++; // place as if it was the next char treated
visibleChars++;
}
state = StateForScript(defaultScript);
state = StateForScript(aspScript);
}
scriptLanguage = eScriptVBS;
styler.ColourTo(i, SCE_H_ASP);
@ -591,17 +632,42 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
continue;
}
/////////////////////////////////////
// handle the start of SGML language (DTD)
else if (((scriptLanguage == eScriptNone) || (scriptLanguage == eScriptXML)) &&
(chPrev == '<') &&
(ch == '!') &&
(StateToPrint != SCE_H_CDATA) && (!IsCommentState(StateToPrint))) {
beforePreProc = state;
styler.ColourTo(i - 2, StateToPrint);
if ((chNext == '-') && (chNext2 == '-')) {
state = SCE_H_COMMENT; // wait for a pending command
}
else if (isWordCdata(i + 1, i + 7, styler)) {
state = SCE_H_CDATA;
} else {
styler.ColourTo(i, SCE_H_SGML_DEFAULT); // <! is default
scriptLanguage = eScriptSGML;
state = SCE_H_SGML_COMMAND; // wait for a pending command
}
// fold whole tag (-- when closing the tag)
levelCurrent++;
continue;
}
// handle the end of a pre-processor = Non-HTML
else if (
((inScriptType == eNonHtmlPreProc)
|| (inScriptType == eNonHtmlScriptPreProc)) && (
((scriptLanguage == eScriptPHP) && (ch == '?') && !isPHPStringState(state) && (state != SCE_HPHP_COMMENT)) ||
((scriptLanguage != eScriptNone) && !isStringState(state) &&
(ch == '%'))
) && (chNext == '>')) {
else if ((
((inScriptType == eNonHtmlPreProc)
|| (inScriptType == eNonHtmlScriptPreProc)) && (
((scriptLanguage == eScriptPHP) && (ch == '?') && !isPHPStringState(state) && (state != SCE_HPHP_COMMENT)) ||
((scriptLanguage != eScriptNone) && !isStringState(state) &&
(ch == '%'))
) && (chNext == '>')) ||
((scriptLanguage == eScriptSGML) && (ch == '>') && (state != SCE_H_SGML_COMMENT))) {
if (state == SCE_H_ASPAT) {
defaultScript = segIsScriptingIndicator(styler,
styler.GetStartSegment(), i - 1, defaultScript);
aspScript = segIsScriptingIndicator(styler,
styler.GetStartSegment(), i - 1, aspScript);
}
// Bounce out of any ASP mode
switch (state) {
@ -624,11 +690,16 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
styler.ColourTo(i - 1, StateToPrint);
break;
}
i++;
if (scriptLanguage != eScriptSGML) {
i++;
visibleChars++;
}
if (ch == '%')
styler.ColourTo(i, SCE_H_ASP);
else if (scriptLanguage == eScriptXML)
styler.ColourTo(i, SCE_H_XMLEND);
else if (scriptLanguage == eScriptSGML)
styler.ColourTo(i, SCE_H_SGML_DEFAULT);
else
styler.ColourTo(i, SCE_H_QUESTION);
state = beforePreProc;
@ -648,47 +719,156 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
if (ch == '<') {
// in HTML, fold on tag open and unfold on tag close
tagOpened = true;
if (chNext == '/') {
tagClosing = true;
} else {
tagClosing = false;
}
tagClosing = (chNext == '/');
styler.ColourTo(i - 1, StateToPrint);
if (chNext == '!' && chNext2 == '-' && styler.SafeGetCharAt(i + 3) == '-') {
// should be better
i += 3;
levelCurrent++;
state = SCE_H_COMMENT;
} else
if (chNext != '!')
state = SCE_H_TAGUNKNOWN;
} else if (ch == '&') {
styler.ColourTo(i - 1, SCE_H_DEFAULT);
state = SCE_H_ENTITY;
}
break;
case SCE_H_COMMENT:
if ((ch == '>') && (chPrev == '-') && (chPrev2 == '-')) {
// unfold HTML comment
levelCurrent--;
case SCE_H_SGML_DEFAULT:
if (scriptLanguage == eScriptSGMLblock)
StateToPrint = SCE_H_SGML_BLOCK_DEFAULT;
if (ch == '\"') {
styler.ColourTo(i - 1, StateToPrint);
state = SCE_H_SGML_DOUBLESTRING;
} else if (ch == '\'') {
styler.ColourTo(i - 1, StateToPrint);
state = SCE_H_SGML_SIMPLESTRING;
} else if ((ch == '-') && (chPrev == '-')) {
styler.ColourTo(i - 2, StateToPrint);
state = SCE_H_SGML_COMMENT;
} else if (isalpha(ch) && (chPrev == '%')) {
styler.ColourTo(i - 2, StateToPrint);
state = SCE_H_SGML_ENTITY;
} else if (ch == '#') {
styler.ColourTo(i - 1, StateToPrint);
state = SCE_H_SGML_SPECIAL;
} else if (ch == '[') {
styler.ColourTo(i - 1, StateToPrint);
scriptLanguage = eScriptSGMLblock;
} else if (ch == ']') {
if (scriptLanguage == eScriptSGMLblock) {
styler.ColourTo(i, StateToPrint);
scriptLanguage = eScriptSGML;
} else {
styler.ColourTo(i - 1, StateToPrint);
styler.ColourTo(i, SCE_H_SGML_ERROR);
}
} else if (scriptLanguage == eScriptSGMLblock) {
if ((ch == '!') && (chPrev == '<')) {
styler.ColourTo(i - 2, StateToPrint);
styler.ColourTo(i, SCE_H_SGML_DEFAULT);
state = SCE_H_SGML_COMMAND;
} else if (ch == '>') {
styler.ColourTo(i - 1, StateToPrint);
styler.ColourTo(i, SCE_H_SGML_DEFAULT);
}
}
break;
case SCE_H_SGML_COMMAND:
if ((ch == '-') && (chPrev == '-')) {
styler.ColourTo(i - 2, StateToPrint);
state = SCE_H_SGML_COMMENT;
} else if (!issgmlwordchar(ch)) {
if (isWordHSGML(styler.GetStartSegment(), i - 1, keywords6, styler)) {
styler.ColourTo(i - 1, StateToPrint);
state = SCE_H_SGML_1ST_PARAM;
} else {
state = SCE_H_SGML_ERROR;
}
}
break;
case SCE_H_SGML_1ST_PARAM:
// wait for the beginning of the word
if ((ch == '-') && (chPrev == '-')) {
if (scriptLanguage == eScriptSGMLblock) {
styler.ColourTo(i - 2, SCE_H_SGML_BLOCK_DEFAULT);
} else {
styler.ColourTo(i - 2, SCE_H_SGML_DEFAULT);
}
state = SCE_H_SGML_1ST_PARAM_COMMENT;
} else if (issgmlwordchar(ch)) {
if (scriptLanguage == eScriptSGMLblock) {
styler.ColourTo(i - 1, SCE_H_SGML_BLOCK_DEFAULT);
} else {
styler.ColourTo(i - 1, SCE_H_SGML_DEFAULT);
}
// find the length of the word
int size = 1;
while (ishtmlwordchar(styler.SafeGetCharAt(i + size)))
size++;
styler.ColourTo(i + size - 1, StateToPrint);
i += size - 1;
visibleChars += size - 1;
ch = styler.SafeGetCharAt(i);
state = SCE_H_SGML_DEFAULT;
continue;
}
break;
case SCE_H_SGML_ERROR:
if ((ch == '-') && (chPrev == '-')) {
styler.ColourTo(i - 2, StateToPrint);
state = SCE_H_SGML_COMMENT;
}
case SCE_H_SGML_DOUBLESTRING:
if (ch == '\"') {
styler.ColourTo(i, StateToPrint);
state = SCE_H_DEFAULT;
tagOpened = false;
state = SCE_H_SGML_DEFAULT;
}
break;
case SCE_H_SGML_SIMPLESTRING:
if (ch == '\'') {
styler.ColourTo(i, StateToPrint);
state = SCE_H_SGML_DEFAULT;
}
break;
case SCE_H_SGML_COMMENT:
if ((ch == '-') && (chPrev == '-')) {
styler.ColourTo(i, StateToPrint);
state = SCE_H_SGML_DEFAULT;
}
break;
case SCE_H_CDATA:
if ((ch == '>') && (chPrev == ']') && (chPrev2 == ']')) {
if ((chPrev2 == ']') && (chPrev == ']') && (ch == '>')) {
styler.ColourTo(i, StateToPrint);
state = SCE_H_DEFAULT;
tagOpened = false;
levelCurrent--;
}
break;
case SCE_H_SGML:
if (ch == '>') {
levelCurrent--;
case SCE_H_COMMENT:
if ((chPrev2 == '-') && (chPrev == '-') && (ch == '>')) {
styler.ColourTo(i, StateToPrint);
state = SCE_H_DEFAULT;
tagOpened = false;
levelCurrent--;
}
break;
case SCE_H_SGML_1ST_PARAM_COMMENT:
if ((ch == '-') && (chPrev == '-')) {
styler.ColourTo(i, SCE_H_SGML_COMMENT);
state = SCE_H_SGML_1ST_PARAM;
}
break;
case SCE_H_SGML_SPECIAL:
if (!isupper(ch)) {
styler.ColourTo(i - 1, StateToPrint);
if (isalnum(ch)) {
state = SCE_H_SGML_ERROR;
} else {
state = SCE_H_SGML_DEFAULT;
}
}
break;
case SCE_H_SGML_ENTITY:
if (ch == ';') {
styler.ColourTo(i, StateToPrint);
state = SCE_H_SGML_DEFAULT;
} else if (!isalnum(ch) && ch != '-' && ch != '.') {
styler.ColourTo(i, SCE_H_SGML_ERROR);
state = SCE_H_SGML_DEFAULT;
}
break;
case SCE_H_ENTITY:
@ -705,9 +885,14 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
if (!ishtmlwordchar(ch) && !((ch == '/') && (chPrev == '<')) && ch != '[') {
int eClass = classifyTagHTML(styler.GetStartSegment(), i - 1, keywords, styler);
if (eClass == SCE_H_SCRIPT) {
inScriptType = eNonHtmlScript;
scriptLanguage = defaultScript;
eClass = SCE_H_TAG;
if (!tagClosing) {
inScriptType = eNonHtmlScript;
scriptLanguage = clientScript;
eClass = SCE_H_TAG;
} else {
scriptLanguage = eScriptNone;
eClass = SCE_H_TAG;
}
}
if (ch == '>') {
styler.ColourTo(i, eClass);
@ -717,28 +902,27 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
state = SCE_H_DEFAULT;
}
tagOpened = false;
if (tagClosing)
if (tagClosing) {
levelCurrent--;
else
levelCurrent++;
tagClosing = false;
} else if (ch == '/' && chNext == '>') {
if (eClass == SCE_H_TAGUNKNOWN) {
styler.ColourTo(i + 1, SCE_H_TAGUNKNOWN);
} else {
styler.ColourTo(i - 1, StateToPrint);
styler.ColourTo(i + 1, SCE_H_TAGEND);
levelCurrent++;
}
i++;
ch = chNext;
state = SCE_H_DEFAULT;
tagClosing = false;
} else if (ch == '/' && chNext == '>') {
if (eClass == SCE_H_TAGUNKNOWN) {
styler.ColourTo(i + 1, SCE_H_TAGUNKNOWN);
} else {
styler.ColourTo(i - 1, StateToPrint);
styler.ColourTo(i + 1, SCE_H_TAGEND);
}
i++;
ch = chNext;
state = SCE_H_DEFAULT;
tagOpened = false;
} else {
if (eClass != SCE_H_TAGUNKNOWN) {
if (eClass == SCE_H_CDATA) {
state = SCE_H_CDATA;
} else if (eClass == SCE_H_SGML) {
state = SCE_H_SGML;
if (eClass == SCE_H_SGML_DEFAULT) {
state = SCE_H_SGML_DEFAULT;
} else {
state = SCE_H_OTHER;
}
@ -750,7 +934,8 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
if (!ishtmlwordchar(ch) && ch != '/' && ch != '-') {
if (inScriptType == eNonHtmlScript) {
int scriptLanguagePrev = scriptLanguage;
scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment(), i - 1, scriptLanguage);
clientScript = segIsScriptingIndicator(styler, styler.GetStartSegment(), i - 1, scriptLanguage);
scriptLanguage = clientScript;
if ((scriptLanguagePrev != scriptLanguage) && (scriptLanguage == eScriptNone))
inScriptType = eHtml;
}
@ -1217,18 +1402,18 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
case SCE_HPHP_NUMBER:
if (!isdigit(ch)) {
styler.ColourTo(i - 1, SCE_HPHP_NUMBER);
if (isoperator(ch))
state =SCE_HPHP_OPERATOR;
else
if (isoperator(ch))
state = SCE_HPHP_OPERATOR;
else
state = SCE_HPHP_DEFAULT;
}
break;
case SCE_HPHP_VARIABLE:
if (!iswordstart(ch)) {
styler.ColourTo(i - 1, SCE_HPHP_VARIABLE);
if (isoperator(ch))
state =SCE_HPHP_OPERATOR;
else
if (isoperator(ch))
state = SCE_HPHP_OPERATOR;
else
state = SCE_HPHP_DEFAULT;
}
break;
@ -1249,7 +1434,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
// skip the next char
i++;
} else if (ch == '$') {
styler.ColourTo(i-1, StateToPrint);
styler.ColourTo(i - 1, StateToPrint);
state = SCE_HPHP_HSTRING_VARIABLE;
} else if (ch == '\"') {
styler.ColourTo(i, StateToPrint);
@ -1267,13 +1452,13 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
break;
case SCE_HPHP_HSTRING_VARIABLE:
if (!iswordstart(ch)) {
styler.ColourTo(i-1, StateToPrint);
styler.ColourTo(i - 1, StateToPrint);
i--; // strange but it works
state = SCE_HPHP_HSTRING;
}
break;
case SCE_HPHP_OPERATOR:
case SCE_HPHP_DEFAULT:
case SCE_HPHP_DEFAULT:
styler.ColourTo(i - 1, StateToPrint);
if (isdigit(ch)) {
state = SCE_HPHP_NUMBER;
@ -1304,6 +1489,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
// Some of the above terminated their lexeme but since the same character starts
// the same class again, only reenter if non empty segment.
bool nonEmptySegment = i >= static_cast<int>(styler.GetStartSegment());
if (state == SCE_HB_DEFAULT) { // One of the above succeeded
if ((ch == '\"') && (nonEmptySegment)) {
@ -1335,7 +1521,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
state = SCE_HJ_COMMENTLINE;
} else if ((ch == '\"') && (nonEmptySegment)) {
state = SCE_HJ_DOUBLESTRING;
} else if ((ch == '\'') && (nonEmptySegment)) {
} else if ((ch == '\'') && (nonEmptySegment)) {
state = SCE_HJ_SINGLESTRING;
} else if (iswordstart(ch)) {
state = SCE_HJ_WORD;
@ -1357,4 +1543,3 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
LexerModule lmHTML(SCLEX_HTML, ColouriseHyperTextDoc, "hypertext");
LexerModule lmXML(SCLEX_XML, ColouriseHyperTextDoc, "xml");

View File

@ -15,70 +15,18 @@
#include "PropSet.h"
#include "Accessor.h"
#include "StyleContext.h"
#include "KeyWords.h"
#include "Scintilla.h"
#include "SciLexer.h"
/* Returns true if the "as" word that begins at start follows an import statement */
static bool IsImportAs(unsigned int start, Accessor &styler) {
unsigned int i;
unsigned int j;
char s[10];
/* Find any import before start but after any statement terminator or quote */
i = start;
while (i > 0) {
char ch = styler[i - 1];
if (ch == '\n' || ch == '\r' || ch == ';' || ch == '\'' || ch == '"' || ch == '`')
break;
if (ch == 't' && i > 5) {
for (j = 0; j < 6; j++)
s[j] = styler[(i - 6) + j];
s[j] = '\0';
if (strcmp(s, "import") == 0)
return true;
}
i--;
}
return false;
}
static void ClassifyWordPy(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord) {
char s[100];
bool wordIsNumber = isdigit(styler[start]);
for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
s[i] = styler[start + i];
s[i + 1] = '\0';
}
char chAttr = SCE_P_IDENTIFIER;
if (0 == strcmp(prevWord, "class"))
chAttr = SCE_P_CLASSNAME;
else if (0 == strcmp(prevWord, "def"))
chAttr = SCE_P_DEFNAME;
else if (wordIsNumber)
chAttr = SCE_P_NUMBER;
else if (keywords.InList(s))
chAttr = SCE_P_WORD;
else if (strcmp(s, "as") == 0 && IsImportAs(start, styler))
chAttr = SCE_P_WORD;
// make sure that dot-qualifiers inside the word are lexed correct
else for (unsigned int i = 0; i < end - start + 1; i++) {
if (styler[start + i] == '.') {
styler.ColourTo(start + i - 1, chAttr);
styler.ColourTo(start + i, SCE_P_OPERATOR);
}
}
styler.ColourTo(end, chAttr);
strcpy(prevWord, s);
}
enum kwType { kwOther, kwClass, kwDef, kwImport };
static bool IsPyComment(Accessor &styler, int pos, int len) {
return len>0 && styler[pos]=='#';
}
static bool IsPyStringStart(char ch, char chNext, char chNext2) {
static bool IsPyStringStart(int ch, int chNext, int chNext2) {
if (ch == '\'' || ch == '"')
return true;
if (ch == 'u' || ch == 'U') {
@ -93,10 +41,6 @@ static bool IsPyStringStart(char ch, char chNext, char chNext2) {
return false;
}
static bool IsPyWordStart(char ch, char chNext, char chNext2) {
return (iswordchar(ch) && !IsPyStringStart(ch, chNext, chNext2));
}
/* Return the state to use for the string starting at i; *nextIndex will be set to the first index following the quote(s) */
static int GetPyStringState(Accessor &styler, int i, int *nextIndex) {
char ch = styler.SafeGetCharAt(i);
@ -139,10 +83,18 @@ static int GetPyStringState(Accessor &styler, int i, int *nextIndex) {
}
}
inline bool IsAWordChar(int ch) {
return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
}
inline bool IsAWordStart(int ch) {
return (ch < 0x80) && (isalnum(ch) || ch == '_');
}
static void ColourisePyDoc(unsigned int startPos, int length, int initStyle,
WordList *keywordlists[], Accessor &styler) {
int lengthDoc = startPos + length;
int endPos = startPos + length;
// Backtrack to previous line in case need to fix its tab whinging
int lineCurrent = styler.GetLine(startPos);
@ -156,32 +108,27 @@ static void ColourisePyDoc(unsigned int startPos, int length, int initStyle,
}
}
// Python uses a different mask because bad indentation is marked by oring with 32
styler.StartAt(startPos, 127);
WordList &keywords = *keywordlists[0];
int whingeLevel = styler.GetPropertyInt("tab.timmy.whinge.level");
char prevWord[200];
prevWord[0] = '\0';
if (length == 0)
return ;
const int whingeLevel = styler.GetPropertyInt("tab.timmy.whinge.level");
int state = initStyle & 31;
initStyle = initStyle & 31;
if (initStyle == SCE_P_STRINGEOL) {
initStyle = SCE_P_DEFAULT;
}
int nextIndex = 0;
char chPrev = ' ';
char chPrev2 = ' ';
char chNext = styler[startPos];
styler.StartSegment(startPos);
bool atStartLine = true;
kwType kwLast = kwOther;
int spaceFlags = 0;
styler.IndentAmount(lineCurrent, &spaceFlags, IsPyComment);
for (int i = startPos; i < lengthDoc; i++) {
// Python uses a different mask because bad indentation is marked by oring with 32
StyleContext sc(startPos, endPos-startPos, initStyle, styler, 0x7f);
for (; sc.More(); sc.Forward()) {
if (atStartLine) {
char chBad = static_cast<char>(64);
char chGood = static_cast<char>(0);
if (sc.atLineStart) {
const char chBad = static_cast<char>(64);
const char chGood = static_cast<char>(0);
char chFlags = chGood;
if (whingeLevel == 1) {
chFlags = (spaceFlags & wsInconsistent) ? chBad : chGood;
@ -192,132 +139,117 @@ static void ColourisePyDoc(unsigned int startPos, int length, int initStyle,
} else if (whingeLevel == 4) {
chFlags = (spaceFlags & wsTab) ? chBad : chGood;
}
styler.SetFlags(chFlags, static_cast<char>(state));
atStartLine = false;
styler.SetFlags(chFlags, static_cast<char>(sc.state));
}
char ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
char chNext2 = styler.SafeGetCharAt(i + 2);
if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc)) {
if ((state == SCE_P_DEFAULT) || (state == SCE_P_TRIPLE) || (state == SCE_P_TRIPLEDOUBLE)) {
if (sc.atLineEnd) {
if ((sc.state == SCE_P_DEFAULT) ||
(sc.state == SCE_P_TRIPLE) ||
(sc.state == SCE_P_TRIPLEDOUBLE)) {
// Perform colourisation of white space and triple quoted strings at end of each line to allow
// tab marking to work inside white space and triple quoted strings
styler.ColourTo(i, state);
sc.ForwardSetState(sc.state);
}
lineCurrent++;
styler.IndentAmount(lineCurrent, &spaceFlags, IsPyComment);
atStartLine = true;
if ((sc.state == SCE_P_STRING) || (sc.state == SCE_P_CHARACTER)) {
sc.ChangeState(SCE_P_STRINGEOL);
sc.ForwardSetState(SCE_P_DEFAULT);
}
}
if (styler.IsLeadByte(ch)) {
chNext = styler.SafeGetCharAt(i + 2);
chPrev = ' ';
chPrev2 = ' ';
i += 1;
continue;
// Check for a state end
if (sc.state == SCE_P_OPERATOR) {
kwLast = kwOther;
sc.SetState(SCE_C_DEFAULT);
} else if (sc.state == SCE_P_NUMBER) {
if (!IsAWordChar(sc.ch)) {
sc.SetState(SCE_P_DEFAULT);
}
} else if (sc.state == SCE_P_WORD) {
if ((sc.ch == '.') || (!IsAWordChar(sc.ch))) {
char s[100];
sc.GetCurrent(s, sizeof(s));
int style = SCE_P_IDENTIFIER;
if ((kwLast == kwImport) && (strcmp(s, "as") == 0)) {
style = SCE_P_WORD;
} else if (keywords.InList(s)) {
style = SCE_P_WORD;
} else if (kwLast == kwClass) {
style = SCE_P_CLASSNAME;
} else if (kwLast == kwDef) {
style = SCE_P_DEFNAME;
}
sc.ChangeState(style);
sc.SetState(SCE_P_DEFAULT);
if (style == SCE_P_WORD) {
if (0 == strcmp(s, "class"))
kwLast = kwClass;
else if (0 == strcmp(s, "def"))
kwLast = kwDef;
else if (0 == strcmp(s, "import"))
kwLast = kwImport;
else
kwLast = kwOther;
} else if (style == SCE_P_CLASSNAME) {
kwLast = kwOther;
} else if (style == SCE_P_DEFNAME) {
kwLast = kwOther;
}
}
} else if ((sc.state == SCE_P_COMMENTLINE) || (sc.state == SCE_P_COMMENTBLOCK)) {
if (sc.ch == '\r' || sc.ch == '\n') {
sc.SetState(SCE_P_DEFAULT);
}
} else if ((sc.state == SCE_P_STRING) || (sc.state == SCE_P_CHARACTER)) {
if (sc.ch == '\\') {
if ((sc.chNext == '\r') && (sc.GetRelative(2) == '\n')) {
sc.Forward();
}
sc.Forward();
} else if ((sc.state == SCE_P_STRING) && (sc.ch == '\"')) {
sc.ForwardSetState(SCE_P_DEFAULT);
} else if ((sc.state == SCE_P_CHARACTER) && (sc.ch == '\'')) {
sc.ForwardSetState(SCE_P_DEFAULT);
}
} else if (sc.state == SCE_P_TRIPLE) {
if (sc.ch == '\\') {
sc.Forward();
} else if (sc.Match("\'\'\'")) {
sc.Forward();
sc.Forward();
sc.ForwardSetState(SCE_P_DEFAULT);
}
} else if (sc.state == SCE_P_TRIPLEDOUBLE) {
if (sc.ch == '\\') {
sc.Forward();
} else if (sc.Match("\"\"\"")) {
sc.Forward();
sc.Forward();
sc.ForwardSetState(SCE_P_DEFAULT);
}
}
if (state == SCE_P_STRINGEOL) {
if (ch != '\r' && ch != '\n') {
styler.ColourTo(i - 1, state);
state = SCE_P_DEFAULT;
// Check for a new state starting character
if (sc.state == SCE_P_DEFAULT) {
if (isascii(sc.ch) && isoperator(static_cast<char>(sc.ch)) || sc.ch == '`') {
sc.SetState(SCE_P_OPERATOR);
} else if (sc.ch == '#') {
sc.SetState(sc.chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE);
} else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
sc.SetState(SCE_P_NUMBER);
} else if (IsPyStringStart(sc.ch, sc.chNext, sc.GetRelative(2))) {
int nextIndex = 0;
sc.SetState(GetPyStringState(styler, sc.currentPos, &nextIndex));
while (nextIndex > (sc.currentPos+1)) {
sc.Forward();
}
} else if (IsAWordStart(sc.ch)) {
sc.SetState(SCE_P_WORD);
}
}
if (state == SCE_P_DEFAULT) {
if (IsPyWordStart(ch, chNext, chNext2)) {
styler.ColourTo(i - 1, state);
state = SCE_P_WORD;
} else if (ch == '#') {
styler.ColourTo(i - 1, state);
state = chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE;
} else if (IsPyStringStart(ch, chNext, chNext2)) {
styler.ColourTo(i - 1, state);
state = GetPyStringState(styler, i, &nextIndex);
if (nextIndex != i + 1) {
i = nextIndex - 1;
ch = ' ';
chPrev = ' ';
chNext = styler.SafeGetCharAt(i + 1);
}
} else if (isoperator(ch)) {
styler.ColourTo(i - 1, state);
styler.ColourTo(i, SCE_P_OPERATOR);
}
} else if (state == SCE_P_WORD) {
if (!iswordchar(ch)) {
ClassifyWordPy(styler.GetStartSegment(), i - 1, keywords, styler, prevWord);
state = SCE_P_DEFAULT;
if (ch == '#') {
state = chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE;
} else if (IsPyStringStart(ch, chNext, chNext2)) {
styler.ColourTo(i - 1, state);
state = GetPyStringState(styler, i, &nextIndex);
if (nextIndex != i + 1) {
i = nextIndex - 1;
ch = ' ';
chPrev = ' ';
chNext = styler.SafeGetCharAt(i + 1);
}
} else if (isoperator(ch)) {
styler.ColourTo(i, SCE_P_OPERATOR);
}
}
} else {
if (state == SCE_P_COMMENTLINE || state == SCE_P_COMMENTBLOCK) {
if (ch == '\r' || ch == '\n') {
styler.ColourTo(i - 1, state);
state = SCE_P_DEFAULT;
}
} else if (state == SCE_P_STRING) {
if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) {
styler.ColourTo(i - 1, state);
state = SCE_P_STRINGEOL;
} else if (ch == '\\') {
if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
i++;
ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
}
} else if (ch == '\"') {
styler.ColourTo(i, state);
state = SCE_P_DEFAULT;
}
} else if (state == SCE_P_CHARACTER) {
if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) {
styler.ColourTo(i - 1, state);
state = SCE_P_STRINGEOL;
} else if (ch == '\\') {
if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
i++;
ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
}
} else if (ch == '\'') {
styler.ColourTo(i, state);
state = SCE_P_DEFAULT;
}
} else if (state == SCE_P_TRIPLE) {
if (ch == '\'' && chPrev == '\'' && chPrev2 == '\'') {
styler.ColourTo(i, state);
state = SCE_P_DEFAULT;
}
} else if (state == SCE_P_TRIPLEDOUBLE) {
if (ch == '\"' && chPrev == '\"' && chPrev2 == '\"') {
styler.ColourTo(i, state);
state = SCE_P_DEFAULT;
}
}
}
chPrev2 = chPrev;
chPrev = ch;
}
if (state == SCE_P_WORD) {
ClassifyWordPy(styler.GetStartSegment(), lengthDoc, keywords, styler, prevWord);
} else {
styler.ColourTo(lengthDoc, state);
}
sc.Complete();
}
static bool IsCommentLine(int line, Accessor &styler) {
@ -338,14 +270,15 @@ static bool IsQuoteLine(int line, Accessor &styler) {
return ((style == SCE_P_TRIPLE) || (style== SCE_P_TRIPLEDOUBLE));
}
static void FoldPyDoc(unsigned int startPos, int length, int /*initStyle - unused*/,
WordList *[], Accessor &styler) {
int maxPos = startPos + length;
int maxLines = styler.GetLine(maxPos-1);
bool foldComment = styler.GetPropertyInt("fold.comment.python");
bool foldQuotes = styler.GetPropertyInt("fold.quotes.python");
const int maxPos = startPos + length;
const int maxLines = styler.GetLine(maxPos-1); // Requested last line
const int docLines = styler.GetLine(styler.Length() - 1); // Available last line
const bool foldComment = styler.GetPropertyInt("fold.comment.python");
const bool foldQuotes = styler.GetPropertyInt("fold.quotes.python");
// Backtrack to previous non-blank line so we can determine indent level
// for any white space lines (needed esp. within triple quoted strings)
// and so we can fix any preceding fold level (which is why we go back
@ -363,8 +296,8 @@ static void FoldPyDoc(unsigned int startPos, int length, int /*initStyle - unuse
}
int indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK;
// Set up initial loop state
startPos = styler.LineStart(lineCurrent);
// Set up initial state
int prev_state = SCE_P_DEFAULT & 31;
if (lineCurrent >= 1)
prev_state = styler.StyleAt(startPos-1) & 31;
@ -374,21 +307,27 @@ static void FoldPyDoc(unsigned int startPos, int length, int /*initStyle - unuse
prevComment = foldComment && IsCommentLine(lineCurrent - 1, styler);
// Process all characters to end of requested range or end of any triple quote
// or comment that hangs over the end of the range
while ((lineCurrent <= maxLines) || prevQuote || prevComment) {
// or comment that hangs over the end of the range. Cap processing in all cases
// to end of document (in case of unclosed quote or comment at end).
while ((lineCurrent <= docLines) && ((lineCurrent <= maxLines) || prevQuote || prevComment)) {
// Gather info
int lev = indentCurrent;
int lineNext = lineCurrent + 1;
int style = styler.StyleAt(styler.LineStart(lineNext)) & 31;
int indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);
int quote = foldQuotes && ((style == SCE_P_TRIPLE) || (style== SCE_P_TRIPLEDOUBLE));
int quote_start = (quote && !prevQuote);
int quote_continue = (quote && prevQuote);
int comment = foldComment && IsCommentLine(lineCurrent, styler);
int comment_start = (comment && !prevComment &&
int indentNext = indentCurrent;
int quote = false;
if (lineNext <= docLines) {
// Information about next line is only available if not at end of document
indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);
int style = styler.StyleAt(styler.LineStart(lineNext)) & 31;
quote = foldQuotes && ((style == SCE_P_TRIPLE) || (style== SCE_P_TRIPLEDOUBLE));
}
const int quote_start = (quote && !prevQuote);
const int quote_continue = (quote && prevQuote);
const int comment = foldComment && IsCommentLine(lineCurrent, styler);
const int comment_start = (comment && !prevComment && (lineNext <= docLines) &&
IsCommentLine(lineNext, styler) && (lev > SC_FOLDLEVELBASE));
int comment_continue = (comment && prevComment);
const int comment_continue = (comment && prevComment);
if ((!quote || !prevQuote) && !comment)
indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK;
if (quote)
@ -411,22 +350,35 @@ static void FoldPyDoc(unsigned int startPos, int length, int /*initStyle - unuse
}
// Skip past any blank lines for next indent level info; we skip also comments
// starting in column 0 which effectively folds them into surrounding code
// rather than screwing up folding. Then set indent level on the lines
// we skipped to be same as maximum of current and next indent. This approach
// does a reasonable job of collapsing white space into surrounding code
// without getting confused by white space at the start of an indented level.
// starting in column 0 which effectively folds them into surrounding code rather
// than screwing up folding.
const int saveIndentNext = indentNext;
while (!quote &&
((indentNext & SC_FOLDLEVELWHITEFLAG) || styler[styler.LineStart(lineNext)] == '#') &&
(lineNext < maxLines)) {
int level = Platform::Maximum(indentCurrent, indentNext);
if (indentNext & SC_FOLDLEVELWHITEFLAG)
level = SC_FOLDLEVELWHITEFLAG | indentCurrentLevel;
styler.SetLevel(lineNext, level);
(lineNext < docLines) &&
((indentNext & SC_FOLDLEVELWHITEFLAG) ||
(lineNext <= docLines && styler[styler.LineStart(lineNext)] == '#'))) {
lineNext++;
indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);
}
// Next compute max indent level of current line and next non-blank line.
// This is the level to which we set all the intervening blank or comment lines.
const int skip_level = Platform::Maximum(indentCurrentLevel,
indentNext & SC_FOLDLEVELNUMBERMASK);
// Now set all the indent levels on the lines we skipped
int skipLine = lineCurrent + 1;
int skipIndentNext = saveIndentNext;
while (skipLine < lineNext) {
int skipLineLevel = skip_level;
if (skipIndentNext & SC_FOLDLEVELWHITEFLAG)
skipLineLevel = SC_FOLDLEVELWHITEFLAG | skipLineLevel;
styler.SetLevel(skipLine, skipLineLevel);
skipLine++;
skipIndentNext = styler.IndentAmount(skipLine, &spaceFlags, NULL);
}
// Set fold header on non-quote/non-comment line
if (!quote && !comment && !(indentCurrent & SC_FOLDLEVELWHITEFLAG) ) {
if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK))
@ -443,8 +395,9 @@ static void FoldPyDoc(unsigned int startPos, int length, int /*initStyle - unuse
lineCurrent = lineNext;
}
// Make sure last line indent level is set too
styler.SetLevel(lineCurrent, indentCurrent);
// NOTE: Cannot set level of last line here because indentCurrent doesn't have
// header flag set; the loop above is crafted to take care of this case!
//styler.SetLevel(lineCurrent, indentCurrent);
}
LexerModule lmPython(SCLEX_PYTHON, ColourisePyDoc, "python", FoldPyDoc);

View File

@ -40,7 +40,7 @@ static void DrawMinus(Surface *surface, int centreX, int centreY, int armSize, C
surface->FillRectangle(rcH, fore);
}
void LineMarker::Draw(Surface *surface, PRectangle &rcWhole) {
void LineMarker::Draw(Surface *surface, PRectangle &rcWhole, Font &fontForCharacter) {
// Restrict most shapes a bit
PRectangle rc = rcWhole;
rc.top++;
@ -230,6 +230,15 @@ void LineMarker::Draw(Surface *surface, PRectangle &rcWhole) {
surface->MoveTo(centreX, rcWhole.top);
surface->LineTo(centreX, centreY - blobSize);
} else if (markType >= SC_MARK_CHARACTER) {
char character[1];
character[0] = static_cast<char>(markType - SC_MARK_CHARACTER);
int width = surface->WidthText(fontForCharacter, character, 1);
rc.left += (rc.Width() - width) / 2;
rc.right = rc.left + width;
surface->DrawTextClipped(rc, fontForCharacter, rc.bottom - 2,
character, 1, fore.allocated, back.allocated);
} else { // SC_MARK_SHORTARROW
Point pts[] = {
Point(centreX, centreY + dimOn2),

View File

@ -20,7 +20,7 @@ public:
fore = Colour(0,0,0);
back = Colour(0xff,0xff,0xff);
}
void Draw(Surface *surface, PRectangle &rc);
void Draw(Surface *surface, PRectangle &rc, Font &fontForCharacter);
};
#endif

View File

@ -30,9 +30,8 @@
* Modification history:
*
* $Log$
* Revision 1.1 2001/09/01 03:05:24 RD
* Upgraded to version 1.39 of Scintilla, and upated wxStyledTextCtrl
* accordingly.
* Revision 1.2 2001/10/18 01:24:58 RD
* Updated to version 1.40 of Scintilla
*
* Revision 1.6 2001/04/29 13:32:10 nyamatongwe
* Addition of new target methods - versions of ReplaceTarget that take counted

View File

@ -35,6 +35,7 @@
#include "ScintillaBase.h"
ScintillaBase::ScintillaBase() {
displayPopupMenu = true;
listType = 0;
#ifdef SCI_LEXER
lexLanguage = SCLEX_CONTAINER;
@ -514,6 +515,10 @@ sptr_t ScintillaBase::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lPara
InvalidateStyleRedraw();
break;
case SCI_USEPOPUP:
displayPopupMenu = wParam;
break;
#ifdef SCI_LEXER
case SCI_SETLEXER:
SetLexer(wParam);

View File

@ -30,6 +30,7 @@ protected:
idcmdSelectAll=16
};
bool displayPopupMenu;
Menu popup;
AutoComplete ac;
@ -42,7 +43,7 @@ protected:
int lexLanguage;
LexerModule *lexCurrent;
PropSet props;
enum {numWordLists=5};
enum {numWordLists=6};
WordList *keyWordLists[numWordLists+1];
void SetLexer(uptr_t wParam);
void SetLexerLanguage(const char *languageName);

View File

@ -0,0 +1,51 @@
// Scintilla source code edit control
/** @file StyleContext.cxx
** Lexer infrastructure.
**/
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
// This file is in the public domain.
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include "Platform.h"
#include "PropSet.h"
#include "Accessor.h"
#include "StyleContext.h"
static void getRange(unsigned int start,
unsigned int end,
Accessor &styler,
char *s,
unsigned int len) {
unsigned int i = 0;
while ((i < end - start + 1) && (i < len-1)) {
s[i] = styler[start + i];
i++;
}
s[i] = '\0';
}
void StyleContext::GetCurrent(char *s, int len) {
getRange(styler.GetStartSegment(), currentPos - 1, styler, s, len);
}
static void getRangeLowered(unsigned int start,
unsigned int end,
Accessor &styler,
char *s,
unsigned int len) {
unsigned int i = 0;
while ((i < end - start + 1) && (i < len-1)) {
s[i] = static_cast<char>(tolower(styler[start + i]));
i++;
}
s[i] = '\0';
}
void StyleContext::GetCurrentLowered(char *s, int len) {
getRangeLowered(styler.GetStartSegment(), currentPos - 1, styler, s, len);
}

View File

@ -0,0 +1,127 @@
// Scintilla source code edit control
/** @file StyleContext.cxx
** Lexer infrastructure.
**/
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
// This file is in the public domain.
// All languages handled so far can treat all characters >= 0x80 as one class
// which just continues the current token or starts an identifier if in default.
// DBCS treated specially as the second character can be < 0x80 and hence
// syntactically significant. UTF-8 avoids this as all trail bytes are >= 0x80
class StyleContext {
Accessor &styler;
int endPos;
StyleContext& operator=(const StyleContext&) {
return *this;
}
public:
int currentPos;
bool atLineStart;
bool atLineEnd;
int state;
int chPrev;
int ch;
int chNext;
StyleContext(unsigned int startPos, int length,
int initStyle, Accessor &styler_, char chMask=31) :
styler(styler_),
endPos(startPos + length),
currentPos(startPos),
atLineStart(true),
atLineEnd(false),
state(initStyle),
chPrev(0),
ch(0),
chNext(0) {
styler.StartAt(startPos, chMask);
styler.StartSegment(startPos);
int pos = currentPos;
ch = static_cast<unsigned char>(styler.SafeGetCharAt(pos));
if (styler.IsLeadByte(static_cast<char>(ch))) {
pos++;
ch = ch << 8;
ch |= static_cast<unsigned char>(styler.SafeGetCharAt(pos));
}
chNext = static_cast<unsigned char>(styler.SafeGetCharAt(pos+1));
if (styler.IsLeadByte(static_cast<char>(chNext))) {
chNext = chNext << 8;
chNext |= static_cast<unsigned char>(styler.SafeGetCharAt(pos+2));
}
atLineEnd = (ch == '\r' && chNext != '\n') || (ch == '\n') || (currentPos >= endPos);
}
void Complete() {
styler.ColourTo(currentPos - 1, state);
}
bool More() {
return currentPos <= endPos;
}
void Forward() {
atLineStart = atLineEnd;
// A lot of this is repeated from the constructor - TODO: merge code
chPrev = ch;
currentPos++;
if (ch >= 0x100)
currentPos++;
ch = chNext;
chNext = static_cast<unsigned char>(styler.SafeGetCharAt(currentPos+1));
if (styler.IsLeadByte(static_cast<char>(chNext))) {
chNext = chNext << 8;
chNext |= static_cast<unsigned char>(styler.SafeGetCharAt(currentPos + 2));
}
// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)
// Avoid triggering two times on Dos/Win
// End of line
atLineEnd = (ch == '\r' && chNext != '\n') || (ch == '\n') || (currentPos >= endPos);
}
void ChangeState(int state_) {
state = state_;
}
void SetState(int state_) {
styler.ColourTo(currentPos - 1, state);
state = state_;
}
void ForwardSetState(int state_) {
Forward();
styler.ColourTo(currentPos - 1, state);
state = state_;
}
int LengthCurrent() {
return currentPos - styler.GetStartSegment();
}
int GetRelative(int n) {
return styler.SafeGetCharAt(currentPos+n);
}
bool Match(char ch0) {
return ch == ch0;
}
bool Match(char ch0, char ch1) {
return (ch == ch0) && (chNext == ch1);
}
bool Match(const char *s) {
if (ch != *s)
return false;
s++;
if (chNext != *s)
return false;
s++;
for (int n=2; *s; n++) {
if (*s != styler.SafeGetCharAt(currentPos+n))
return false;
s++;
}
return true;
}
// Non-inline
void GetCurrent(char *s, int len);
void GetCurrentLowered(char *s, int len);
};
inline bool IsASpace(unsigned int ch) {
return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d));
}
inline bool IsADigit(unsigned int ch) {
return (ch >= '0') && (ch <= '9');
}

View File

@ -32,6 +32,7 @@ int wxForceScintillaLexers(void)
extern LexerModule lmAVE;
extern LexerModule lmConf;
extern LexerModule lmCPP;
extern LexerModule lmNncrontab;
extern LexerModule lmEiffel;
extern LexerModule lmHTML;
extern LexerModule lmLISP;
@ -48,6 +49,7 @@ int wxForceScintillaLexers(void)
&& &lmAVE
&& &lmConf
&& &lmCPP
&& &lmNncrontab
&& &lmEiffel
&& &lmHTML
&& &lmLISP
@ -1202,6 +1204,7 @@ int wxStyledTextCtrl::GetTargetEnd() {
}
// Replace the target text with the argument text.
// Text is counted so it can contain nulls.
// Returns the length of the replacement text.
int wxStyledTextCtrl::ReplaceTarget(const wxString& text) {
@ -1210,6 +1213,7 @@ int wxStyledTextCtrl::GetTargetEnd() {
}
// Replace the target text with the argument text after \d processing.
// Text is counted so it can contain nulls.
// Looks for \d where d is between 1 and 9 and replaces these with the strings
// matched in the last search operation which were surrounded by \( and \).
// Returns the length of the replacement text including any change
@ -1221,7 +1225,7 @@ int wxStyledTextCtrl::GetTargetEnd() {
}
// Search for a counted string in the target and set the target to the found
// range.
// range. Text is counted so it can contain nulls.
// Returns length of range or -1 for failure in which case target is not moved.
int wxStyledTextCtrl::SearchInTarget(const wxString& text) {

View File

@ -32,6 +32,7 @@ int wxForceScintillaLexers(void)
extern LexerModule lmAVE;
extern LexerModule lmConf;
extern LexerModule lmCPP;
extern LexerModule lmNncrontab;
extern LexerModule lmEiffel;
extern LexerModule lmHTML;
extern LexerModule lmLISP;
@ -48,6 +49,7 @@ int wxForceScintillaLexers(void)
&& &lmAVE
&& &lmConf
&& &lmCPP
&& &lmNncrontab
&& &lmEiffel
&& &lmHTML
&& &lmLISP

View File

@ -72,6 +72,7 @@
#define wxSTC_MARK_CIRCLEPLUSCONNECTED 19
#define wxSTC_MARK_CIRCLEMINUS 20
#define wxSTC_MARK_CIRCLEMINUSCONNECTED 21
#define wxSTC_MARK_CHARACTER 10000
// Markers used for outlining column
#define wxSTC_MARKNUM_FOLDEREND 25
@ -83,12 +84,16 @@
#define wxSTC_MARKNUM_FOLDEROPEN 31
#define wxSTC_MARGIN_SYMBOL 0
#define wxSTC_MARGIN_NUMBER 1
// Styles in range 32..37 are predefined for parts of the UI and are not used as normal styles.
// Styles 38 and 39 are for future use.
#define wxSTC_STYLE_DEFAULT 32
#define wxSTC_STYLE_LINENUMBER 33
#define wxSTC_STYLE_BRACELIGHT 34
#define wxSTC_STYLE_BRACEBAD 35
#define wxSTC_STYLE_CONTROLCHAR 36
#define wxSTC_STYLE_INDENTGUIDE 37
#define wxSTC_STYLE_LASTPREDEFINED 39
#define wxSTC_STYLE_MAX 127
// Character set identifiers are used in StyleSetCharacterSet.
@ -295,6 +300,7 @@
#define wxSTC_LEX_EIFFEL 23
#define wxSTC_LEX_EIFFELKW 24
#define wxSTC_LEX_TCL 25
#define wxSTC_LEX_NNCRONTAB 26
// When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
// value assigned in sequence from SCLEX_AUTOMATIC+1.
@ -334,6 +340,8 @@
#define wxSTC_C_REGEX 14
#define wxSTC_C_COMMENTLINEDOC 15
#define wxSTC_C_WORD2 16
#define wxSTC_C_COMMENTDOCKEYWORD 17
#define wxSTC_C_COMMENTDOCKEYWORDERROR 18
// Lexical states for SCLEX_HTML, SCLEX_XML
#define wxSTC_H_DEFAULT 0
@ -365,7 +373,17 @@
#define wxSTC_H_XCCOMMENT 20
// SGML
#define wxSTC_H_SGML 21
#define wxSTC_H_SGML_DEFAULT 21
#define wxSTC_H_SGML_COMMAND 22
#define wxSTC_H_SGML_1ST_PARAM 23
#define wxSTC_H_SGML_DOUBLESTRING 24
#define wxSTC_H_SGML_SIMPLESTRING 25
#define wxSTC_H_SGML_ERROR 26
#define wxSTC_H_SGML_SPECIAL 27
#define wxSTC_H_SGML_ENTITY 28
#define wxSTC_H_SGML_COMMENT 29
#define wxSTC_H_SGML_1ST_PARAM_COMMENT 30
#define wxSTC_H_SGML_BLOCK_DEFAULT 31
// Embedded Javascript
#define wxSTC_HJ_START 40
@ -604,6 +622,19 @@
#define wxSTC_EIFFEL_IDENTIFIER 7
#define wxSTC_EIFFEL_STRINGEOL 8
// Lexical states for the SCLEX_NNCRONTAB (nnCron crontab Lexer)
#define wxSTC_NNCRONTAB_DEFAULT 0
#define wxSTC_NNCRONTAB_COMMENT 1
#define wxSTC_NNCRONTAB_TASK 2
#define wxSTC_NNCRONTAB_SECTION 3
#define wxSTC_NNCRONTAB_KEYWORD 4
#define wxSTC_NNCRONTAB_MODIFIER 5
#define wxSTC_NNCRONTAB_ASTERISK 6
#define wxSTC_NNCRONTAB_NUMBER 7
#define wxSTC_NNCRONTAB_STRING 8
#define wxSTC_NNCRONTAB_ENVIRONMENT 9
#define wxSTC_NNCRONTAB_IDENTIFIER 10
// END of generated section
//----------------------------------------------------------------------
// Others
@ -1223,10 +1254,12 @@ public:
int GetTargetEnd();
// Replace the target text with the argument text.
// Text is counted so it can contain nulls.
// Returns the length of the replacement text.
int ReplaceTarget(const wxString& text);
// Replace the target text with the argument text after \d processing.
// Text is counted so it can contain nulls.
// Looks for \d where d is between 1 and 9 and replaces these with the strings
// matched in the last search operation which were surrounded by \( and \).
// Returns the length of the replacement text including any change
@ -1234,7 +1267,7 @@ public:
int ReplaceTargetRE(const wxString& text);
// Search for a counted string in the target and set the target to the found
// range.
// range. Text is counted so it can contain nulls.
// Returns length of range or -1 for failure in which case target is not moved.
int SearchInTarget(const wxString& text);

View File

@ -37,6 +37,7 @@ OBJECTS=PlatWX.o ScintillaWX.o stc.o \
LexAda.o \
LexCPP.o \
LexConf.o \
LexCrontab.o \
LexEiffel.o \
LexHTML.o \
LexLisp.o \
@ -53,6 +54,7 @@ OBJECTS=PlatWX.o ScintillaWX.o stc.o \
RESearch.o \
ScintillaBase.o \
Style.o \
StyleContext.o \
UniConversion.o \
ViewStyle.o \
WindowAccessor.o \

View File

@ -531,24 +531,20 @@ ListBox::~ListBox() {
void ListBox::Create(Window &parent, int ctrlID) {
id = new wxSTCListBox(parent.id, ctrlID);
// id = new wxListBox(parent.id, ctrlID, wxDefaultPosition, wxDefaultSize,
// 0, NULL, wxLB_SINGLE | wxLB_SORT | wxSIMPLE_BORDER);
}
void ListBox::SetVisibleRows(int rows) {
desiredVisibleRows = rows;
printf("SetVisibleRows: %d\n", rows);
}
PRectangle ListBox::GetDesiredRect() {
wxSize sz = ((wxListBox*)id)->GetBestSize();
printf("GetDesiredRect: %d, %d\n", sz.x, sz.y);
PRectangle rc;
rc.top = 0;
rc.left = 0;
if (sz.x > 400)
sz.x = 400;
if (sz.y > 150)
if (sz.y > 150) // TODO: Use desiredVisibleRows??
sz.y = 150;
rc.right = sz.x;
rc.bottom = sz.y;
@ -592,13 +588,7 @@ int ListBox::GetSelection() {
}
int ListBox::Find(const char *prefix) {
if (prefix) {
for (int x=0; x < ((wxListBox*)id)->GetCount(); x++) {
wxString text = ((wxListBox*)id)->GetString(x);
if (text.StartsWith(prefix))
return x;
}
}
// No longer used
return -1;
}

View File

@ -122,9 +122,10 @@ void ScintillaWX::Finalise() {
void ScintillaWX::StartDrag() {
wxDropSource source(wMain.GetID());
wxTextDataObject data(dragChars);
wxTextDataObject data(wxString(drag.s, drag.len));
wxDragResult result;
dropWentOutside = true;
source.SetData(data);
result = source.DoDragDrop(TRUE);
if (result == wxDragMove && dropWentOutside)
@ -217,9 +218,10 @@ void ScintillaWX::NotifyParent(SCNotification scn) {
void ScintillaWX::Copy() {
if (currentPos != anchor) {
char* text = CopySelectionRange();
SelectionText st;
CopySelectionRange(&st);
wxTheClipboard->Open();
wxTheClipboard->SetData(new wxTextDataObject(text));
wxTheClipboard->SetData(new wxTextDataObject(wxString(st.s, st.len)));
wxTheClipboard->Close();
}
}
@ -494,14 +496,15 @@ bool ScintillaWX::DoDropText(long x, long y, const wxString& data) {
wxDragResult ScintillaWX::DoDragEnter(wxCoord x, wxCoord y, wxDragResult def) {
return def;
dragResult = def;
return dragResult;
}
wxDragResult ScintillaWX::DoDragOver(wxCoord x, wxCoord y, wxDragResult def) {
SetDragPosition(PositionFromLocation(Point(x, y)));
dragResult = def;
return def;
return dragResult;
}

View File

@ -22,36 +22,45 @@ STCEXTRACPPFLAGS=-D__WX__ -DSCI_LEXER -I$(SCINTILLA)/include -I$(S)
LIBTARGET=$(WXDIR)\contrib\lib\stc.lib
OBJECTS = \
AutoComplete.obj \
CallTip.obj \
CellBuffer.obj \
ContractionState.obj \
Document.obj \
DocumentAccessor.obj \
Editor.obj \
Indicator.obj \
KeyMap.obj \
KeyWords.obj \
LexCPP.obj \
LexHTML.obj \
LexLua.obj \
LexOthers.obj \
LexPerl.obj \
LexPython.obj \
LexSQL.obj \
LexVB.obj \
LineMarker.obj \
PosRegExp.obj \
PropSet.obj \
ScintillaBase.obj \
Style.obj \
UniConversion.obj \
ViewStyle.obj \
WindowAccessor.obj \
\
PlatWX.obj \
ScintillaWX.obj \
stc.obj \
AutoComplete.obj \
CallTip.obj \
CellBuffer.obj \
ContractionState.obj \
Document.obj \
DocumentAccessor.obj \
Editor.obj \
Indicator.obj \
KeyMap.obj \
KeyWords.obj \
LexAVE.obj \
LexAda.obj \
LexCPP.obj \
LexConf.obj \
LexCrontab.obj \
LexEiffel.obj \
LexHTML.obj \
LexLisp.obj \
LexLua.obj \
LexOthers.obj \
LexPascal.obj \
LexPerl.obj \
LexPython.obj \
LexRuby.obj \
LexSQL.obj \
LexVB.obj \
LineMarker.obj \
PropSet.obj \
RESearch.obj \
ScintillaBase.obj \
Style.obj \
StyleContext.obj \
UniConversion.obj \
ViewStyle.obj \
WindowAccessor.obj \
\
PlatWX.obj \
ScintillaWX.obj \
stc.obj \
!include $(WXDIR)\src\makelib.b32

View File

@ -10,32 +10,42 @@ S=$(SCINTILLA)/src
EXTRAINC=-D__WX__ -DSCI_LEXER -I$(SCINTILLA)/include -I$(S) -I. -I$(WXDIR)/contrib/include
OBJECTS = \
$(S)/AutoComplete.$(OBJSUFF) \
$(S)/CallTip.$(OBJSUFF) \
$(S)/CellBuffer.$(OBJSUFF) \
$(S)/ContractionState.$(OBJSUFF)\
$(S)/Document.$(OBJSUFF) \
$(S)/Editor.$(OBJSUFF) \
$(S)/Indicator.$(OBJSUFF) \
$(S)/KeyMap.$(OBJSUFF) \
$(S)/KeyWords.$(OBJSUFF) \
$(S)/LineMarker.$(OBJSUFF) \
$(S)/PropSet.$(OBJSUFF) \
$(S)/ScintillaBase.$(OBJSUFF) \
$(S)/Style.$(OBJSUFF) \
$(S)/ViewStyle.$(OBJSUFF) \
$(S)/LexCPP.$(OBJSUFF) \
$(S)/LexHTML.$(OBJSUFF) \
$(S)/LexLua.$(OBJSUFF) \
$(S)/LexOthers.$(OBJSUFF) \
$(S)/LexPerl.$(OBJSUFF) \
$(S)/LexPython.$(OBJSUFF) \
$(S)/LexSQL.$(OBJSUFF) \
$(S)/LexVB.$(OBJSUFF) \
$(S)/DocumentAccessor.$(OBJSUFF)\
$(S)/AutoComplete.$(OBJSUFF) \
$(S)/CallTip.$(OBJSUFF) \
$(S)/CellBuffer.$(OBJSUFF) \
$(S)/ContractionState.$(OBJSUFF) \
$(S)/Document.$(OBJSUFF) \
$(S)/DocumentAccessor.$(OBJSUFF) \
$(S)/Editor.$(OBJSUFF) \
$(S)/Indicator.$(OBJSUFF) \
$(S)/KeyMap.$(OBJSUFF) \
$(S)/KeyWords.$(OBJSUFF) \
$(S)/LexAVE.$(OBJSUFF) \
$(S)/LexAda.$(OBJSUFF) \
$(S)/LexCPP.$(OBJSUFF) \
$(S)/LexConf.$(OBJSUFF) \
$(S)/LexCrontab.$(OBJSUFF) \
$(S)/LexEiffel.$(OBJSUFF) \
$(S)/LexHTML.$(OBJSUFF) \
$(S)/LexLisp.$(OBJSUFF) \
$(S)/LexLua.$(OBJSUFF) \
$(S)/LexOthers.$(OBJSUFF) \
$(S)/LexPascal.$(OBJSUFF) \
$(S)/LexPerl.$(OBJSUFF) \
$(S)/LexPython.$(OBJSUFF) \
$(S)/LexRuby.$(OBJSUFF) \
$(S)/LexSQL.$(OBJSUFF) \
$(S)/LexVB.$(OBJSUFF) \
$(S)/LineMarker.$(OBJSUFF) \
$(S)/PropSet.$(OBJSUFF) \
$(S)/RESearch.$(OBJSUFF) \
$(S)/ScintillaBase.$(OBJSUFF) \
$(S)/Style.$(OBJSUFF) \
$(S)/StyleContext.$(OBJSUFF) \
$(S)/UniConversion.$(OBJSUFF) \
$(S)/ViewStyle.$(OBJSUFF) \
$(S)/WindowAccessor.$(OBJSUFF) \
$(S)/PosRegExp.$(OBJSUFF) \
\
PlatWX.$(OBJSUFF) \
ScintillaWX.$(OBJSUFF) \
stc.$(OBJSUFF)

View File

@ -15,40 +15,41 @@ NOPCH=1
!include $(WXDIR)\src\makevc.env
OBJECTS = \
$(D)\AutoComplete.obj \
$(D)\CallTip.obj \
$(D)\CellBuffer.obj \
$(D)\ContractionState.obj\
$(D)\Document.obj \
$(D)\DocumentAccessor.obj\
$(D)\Editor.obj \
$(D)\Indicator.obj \
$(D)\KeyMap.obj \
$(D)\KeyWords.obj \
$(D)\LineMarker.obj \
$(D)\PropSet.obj \
$(D)\RESearch.obj \
$(D)\ScintillaBase.obj \
$(D)\Style.obj \
$(D)\UniConversion.obj \
$(D)\ViewStyle.obj \
$(D)\WindowAccessor.obj \
\
$(D)\LexAda.obj \
$(D)\LexAVE.obj \
$(D)\LexConf.obj \
$(D)\LexCPP.obj \
$(D)\LexEiffel.obj \
$(D)\LexHTML.obj \
$(D)\LexLisp.obj \
$(D)\LexLua.obj \
$(D)\LexOthers.obj \
$(D)\LexPascal.obj \
$(D)\LexPerl.obj \
$(D)\LexPython.obj \
$(D)\LexRuby.obj \
$(D)\LexSQL.obj \
$(D)\LexVB.obj \
$(D)\AutoComplete.obj \
$(D)\CallTip.obj \
$(D)\CellBuffer.obj \
$(D)\ContractionState.obj \
$(D)\Document.obj \
$(D)\DocumentAccessor.obj \
$(D)\Editor.obj \
$(D)\Indicator.obj \
$(D)\KeyMap.obj \
$(D)\KeyWords.obj \
$(D)\LexAVE.obj \
$(D)\LexAda.obj \
$(D)\LexCPP.obj \
$(D)\LexConf.obj \
$(D)\LexCrontab.obj \
$(D)\LexEiffel.obj \
$(D)\LexHTML.obj \
$(D)\LexLisp.obj \
$(D)\LexLua.obj \
$(D)\LexOthers.obj \
$(D)\LexPascal.obj \
$(D)\LexPerl.obj \
$(D)\LexPython.obj \
$(D)\LexRuby.obj \
$(D)\LexSQL.obj \
$(D)\LexVB.obj \
$(D)\LineMarker.obj \
$(D)\PropSet.obj \
$(D)\RESearch.obj \
$(D)\ScintillaBase.obj \
$(D)\Style.obj \
$(D)\StyleContext.obj \
$(D)\UniConversion.obj \
$(D)\ViewStyle.obj \
$(D)\WindowAccessor.obj \
\
$(D)\PlatWX.obj \
$(D)\ScintillaWX.obj \

View File

@ -3,5 +3,5 @@ scintilla/include directories from the Scintilla/SCiTE source
distribution. All other code needed to implement Scintilla on top of
wxWindows is located in the directory above this one.
The current version of the Scintilla code is 1.39
The current version of the Scintilla code is 1.40

View File

@ -40,6 +40,7 @@
#define SCLEX_EIFFEL 23
#define SCLEX_EIFFELKW 24
#define SCLEX_TCL 25
#define SCLEX_NNCRONTAB 26
#define SCLEX_AUTOMATIC 1000
#define SCE_P_DEFAULT 0
#define SCE_P_COMMENTLINE 1
@ -72,6 +73,8 @@
#define SCE_C_REGEX 14
#define SCE_C_COMMENTLINEDOC 15
#define SCE_C_WORD2 16
#define SCE_C_COMMENTDOCKEYWORD 17
#define SCE_C_COMMENTDOCKEYWORDERROR 18
#define SCE_H_DEFAULT 0
#define SCE_H_TAG 1
#define SCE_H_TAGUNKNOWN 2
@ -93,7 +96,17 @@
#define SCE_H_QUESTION 18
#define SCE_H_VALUE 19
#define SCE_H_XCCOMMENT 20
#define SCE_H_SGML 21
#define SCE_H_SGML_DEFAULT 21
#define SCE_H_SGML_COMMAND 22
#define SCE_H_SGML_1ST_PARAM 23
#define SCE_H_SGML_DOUBLESTRING 24
#define SCE_H_SGML_SIMPLESTRING 25
#define SCE_H_SGML_ERROR 26
#define SCE_H_SGML_SPECIAL 27
#define SCE_H_SGML_ENTITY 28
#define SCE_H_SGML_COMMENT 29
#define SCE_H_SGML_1ST_PARAM_COMMENT 30
#define SCE_H_SGML_BLOCK_DEFAULT 31
#define SCE_HJ_START 40
#define SCE_HJ_DEFAULT 41
#define SCE_HJ_COMMENT 42
@ -295,6 +308,17 @@
#define SCE_EIFFEL_OPERATOR 6
#define SCE_EIFFEL_IDENTIFIER 7
#define SCE_EIFFEL_STRINGEOL 8
#define SCE_NNCRONTAB_DEFAULT 0
#define SCE_NNCRONTAB_COMMENT 1
#define SCE_NNCRONTAB_TASK 2
#define SCE_NNCRONTAB_SECTION 3
#define SCE_NNCRONTAB_KEYWORD 4
#define SCE_NNCRONTAB_MODIFIER 5
#define SCE_NNCRONTAB_ASTERISK 6
#define SCE_NNCRONTAB_NUMBER 7
#define SCE_NNCRONTAB_STRING 8
#define SCE_NNCRONTAB_ENVIRONMENT 9
#define SCE_NNCRONTAB_IDENTIFIER 10
//--Autogenerated -- end of section automatically generated from Scintilla.iface
#endif

View File

@ -11,9 +11,6 @@
#ifndef SCINTILLA_H
#define SCINTILLA_H
// Compile-time configuration options
#define MACRO_SUPPORT 1 // Comment out to remove macro hooks
#if PLAT_WIN
#ifdef STATIC_BUILD
void Scintilla_RegisterClasses(HINSTANCE hInstance);
@ -102,6 +99,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
#define SC_MARK_CIRCLEPLUSCONNECTED 19
#define SC_MARK_CIRCLEMINUS 20
#define SC_MARK_CIRCLEMINUSCONNECTED 21
#define SC_MARK_CHARACTER 10000
#define SC_MARKNUM_FOLDEREND 25
#define SC_MARKNUM_FOLDEROPENMID 26
#define SC_MARKNUM_FOLDERMIDTAIL 27
@ -134,6 +132,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
#define STYLE_BRACEBAD 35
#define STYLE_CONTROLCHAR 36
#define STYLE_INDENTGUIDE 37
#define STYLE_LASTPREDEFINED 39
#define STYLE_MAX 127
#define SC_CHARSET_ANSI 0
#define SC_CHARSET_DEFAULT 1
@ -507,12 +506,6 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
#define SCN_DWELLEND 2017
//--Autogenerated -- end of section automatically generated from Scintilla.iface
// Optional module for macro recording
#ifdef MACRO_SUPPORT
typedef void (tMacroRecorder)(unsigned int iMessage, unsigned long wParam,
long lParam, void *userData);
#endif
// These structures are defined to be exactly the same shape as the Win32
// CHARRANGE, TEXTRANGE, FINDTEXTEX, FORMATRANGE, and NMHDR structs.
// So older code that treats Scintilla as a RichEdit will work.
@ -566,11 +559,9 @@ struct SCNotification {
const char *text; // SCN_MODIFIED
int length; // SCN_MODIFIED
int linesAdded; // SCN_MODIFIED
#ifdef MACRO_SUPPORT
int message; // SCN_MACRORECORD
uptr_t wParam; // SCN_MACRORECORD
sptr_t lParam; // SCN_MACRORECORD
#endif
sptr_t lParam; // SCN_MACRORECORD
int line; // SCN_MODIFIED
int foldLevelNow; // SCN_MODIFIED
int foldLevelPrev; // SCN_MODIFIED

View File

@ -229,6 +229,8 @@ val SC_MARK_CIRCLEPLUSCONNECTED=19
val SC_MARK_CIRCLEMINUS=20
val SC_MARK_CIRCLEMINUSCONNECTED=21
val SC_MARK_CHARACTER=10000
# Markers used for outlining column
val SC_MARKNUM_FOLDEREND=25
val SC_MARKNUM_FOLDEROPENMID=26
@ -292,12 +294,15 @@ set void SetMarginSensitiveN=2246(int margin, bool sensitive)
# Retrieve the mouse click sensitivity of a margin.
get bool GetMarginSensitiveN=2247(int margin,)
# Styles in range 32..37 are predefined for parts of the UI and are not used as normal styles.
# Styles 38 and 39 are for future use.
val STYLE_DEFAULT=32
val STYLE_LINENUMBER=33
val STYLE_BRACELIGHT=34
val STYLE_BRACEBAD=35
val STYLE_CONTROLCHAR=36
val STYLE_INDENTGUIDE=37
val STYLE_LASTPREDEFINED=39
val STYLE_MAX=127
# Character set identifiers are used in StyleSetCharacterSet.
@ -759,10 +764,12 @@ set void SetTargetEnd=2192(position pos,)
get position GetTargetEnd=2193(,)
# Replace the target text with the argument text.
# Text is counted so it can contain nulls.
# Returns the length of the replacement text.
fun int ReplaceTarget=2194(int length, string text)
# Replace the target text with the argument text after \d processing.
# Text is counted so it can contain nulls.
# Looks for \d where d is between 1 and 9 and replaces these with the strings
# matched in the last search operation which were surrounded by \( and \).
# Returns the length of the replacement text including any change
@ -770,7 +777,7 @@ fun int ReplaceTarget=2194(int length, string text)
fun int ReplaceTargetRE=2195(int length, string text)
# Search for a counted string in the target and set the target to the found
# range.
# range. Text is counted so it can contain nulls.
# Returns length of range or -1 for failure in which case target is not moved.
fun int SearchInTarget=2197(int length, string text)
@ -1265,6 +1272,7 @@ val SCLEX_RUBY=22
val SCLEX_EIFFEL=23
val SCLEX_EIFFELKW=24
val SCLEX_TCL=25
val SCLEX_NNCRONTAB=26
# When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
# value assigned in sequence from SCLEX_AUTOMATIC+1.
val SCLEX_AUTOMATIC=1000
@ -1301,6 +1309,8 @@ val SCE_C_VERBATIM=13
val SCE_C_REGEX=14
val SCE_C_COMMENTLINEDOC=15
val SCE_C_WORD2=16
val SCE_C_COMMENTDOCKEYWORD=17
val SCE_C_COMMENTDOCKEYWORDERROR=18
# Lexical states for SCLEX_HTML, SCLEX_XML
val SCE_H_DEFAULT=0
val SCE_H_TAG=1
@ -1327,7 +1337,17 @@ val SCE_H_VALUE=19
# X-Code
val SCE_H_XCCOMMENT=20
# SGML
val SCE_H_SGML=21
val SCE_H_SGML_DEFAULT=21
val SCE_H_SGML_COMMAND=22
val SCE_H_SGML_1ST_PARAM=23
val SCE_H_SGML_DOUBLESTRING=24
val SCE_H_SGML_SIMPLESTRING=25
val SCE_H_SGML_ERROR=26
val SCE_H_SGML_SPECIAL=27
val SCE_H_SGML_ENTITY=28
val SCE_H_SGML_COMMENT=29
val SCE_H_SGML_1ST_PARAM_COMMENT=30
val SCE_H_SGML_BLOCK_DEFAULT=31
# Embedded Javascript
val SCE_HJ_START=40
val SCE_HJ_DEFAULT=41
@ -1547,6 +1567,18 @@ val SCE_EIFFEL_CHARACTER=5
val SCE_EIFFEL_OPERATOR=6
val SCE_EIFFEL_IDENTIFIER=7
val SCE_EIFFEL_STRINGEOL=8
# Lexical states for the SCLEX_NNCRONTAB (nnCron crontab Lexer)
val SCE_NNCRONTAB_DEFAULT=0
val SCE_NNCRONTAB_COMMENT=1
val SCE_NNCRONTAB_TASK=2
val SCE_NNCRONTAB_SECTION=3
val SCE_NNCRONTAB_KEYWORD=4
val SCE_NNCRONTAB_MODIFIER=5
val SCE_NNCRONTAB_ASTERISK=6
val SCE_NNCRONTAB_NUMBER=7
val SCE_NNCRONTAB_STRING=8
val SCE_NNCRONTAB_ENVIRONMENT=9
val SCE_NNCRONTAB_IDENTIFIER=10
# Events
@ -1574,171 +1606,3 @@ evt void DwellStart=2016(int position)
evt void DwellEnd=2017(int position)
cat Deprecated
val SCFIND_DOWN=1
################################################
# From WinDefs.h
# ***** DEPRECATED from here to end of file ******
# Will a paste succeed?
fun bool EM_CanPaste=1074(,)
# Are there any undoable actions in the undo history.
fun bool EM_CanUndo=198(,)
# Find the position and line from a point within the window.
fun int EM_CharFromPos=215(,point pt)
# Delete the undo history.
fun void EM_EmptyUndoBuffer=205(,)
# Retrieve the selection range.
fun void EM_ExGetSel=1076(,charrangeresult cr)
# Retrieve the line number of a position in the document.
get int EM_ExLineFromChar=1078(,position pos)
# Select a range of text.
fun void EM_ExSetSel=1079(,charrange cr)
# Find some text in the document.
fun position EM_FindText=1080(int flags, findtext ft)
# Find some text in the document. Returns range of found text in ft argument.
fun position EM_FindTextEx=1103(int flags, findtextex ft)
# On Windows will draw the document into a display context such as a printer.
fun void EM_FormatRange=1081(bool draw, formatrange fr)
# Retrieve the line at the top of the display.
get int EM_GetFirstVisibleLine=206(,)
# Retrieve the contents of a line.
# Returns the length of the line.
fun int EM_GetLine=196(int line, countedstring text)
# Returns the number of lines in the document. There is always at least one.
fun int EM_GetLineCount=186(,)
# Returns the size in pixels of left and right margins packed into one integer.
# The left margin is in the low half and the right margin in the high half.
fun int EM_GetMargins=212(,)
# Is the document different from when it was last saved?
get bool EM_GetModify=184(,)
# Get the area used to display the document.
fun void EM_GetRect=178(,rectangle r)
# Return the selection packed into one integer with the start of the selection
# in the low half and the end in the high half.
fun int EM_GetSel=176(,)
# Retrieve the selected text.
# Return the length of the text.
fun int EM_GetSelText=1086(,stringresult text)
# Retrieve a range of text.
# Return the length of the text.
fun int EM_GetTextRange=1099(, textrange tr)
# Draw the selection in normal style or with selection highlighted.
fun void EM_HideSelection=1087(bool normal,)
# Retrieve the line of a position.
fun int EM_LineFromChar=201(position pos,)
# Retrieve the position at the start of a line.
fun position EM_LineIndex=187(int line,)
# Retrieve the number of characters on a line not including end of line characters.
fun int EM_LineLength=193(int line,)
# Scroll horizontally and vertically.
fun void EM_LineScroll=182(int columns, int lines)
# Retrieve the point in the window where a position is displayed.
fun void EM_PosFromChar=214(pointresult pt, position pos)
# Replace the selected text with the argument text.
fun void EM_ReplaceSel=194(, string text)
# Ensure the caret is visible.
fun void EM_ScrollCaret=183(,)
# Returns SEL_EMPTY if selection contains no characters, otherwise SEL_TEXT.
fun void EM_SelectionType=1090(,)
# Set the width of the left and right margins
fun void EM_SetMargins=211(int flags, int values)
# Set to read only or read write.
set void EM_SetReadOnly=207(bool readOnly,)
# Select the range of text from start to end.
fun void EM_SetSel=177(position start, position end)
# Undo one action in the undo history.
fun void EM_Undo=199(,)
# Null operation.
fun void WM_Null=0(,)
# Clear the selection.
fun void WM_Clear=771(,)
fun void WM_Command=273(,)
# Copy the selection to the clipboard.
fun void WM_Copy=769(,)
# Cut the selection to the clipboard.
fun void WM_Cut=768(,)
# Retrieve all the text in the document.
# Returns number of characters retrieved.
fun int WM_GetText=13(int length, stringresult text)
# Retrieve the number of characters in the document.
fun int WM_GetTextLength=14(,)
# Notification back to container
fun void WM_Notify=78(int id, int stuff)
# Paste the contents of the clipboard into the document replacing the selection.
fun void WM_Paste=770(,)
# Replace the contents of the document with the argument text.
fun void WM_SetText=12(, string text)
# Undo one action in the undo history.
fun void WM_Undo=772(,)
# Notification codes
val EN_CHANGE=768
val EN_KILLFOCUS=512
val EN_SETFOCUS=256
# Flags for setting margins.
val EC_LEFTMARGIN=1
val EC_RIGHTMARGIN=2
val EC_USEFONTINFO=0xffff
# Selection type.
val SEL_EMPTY=0
val SEL_TEXT=1
# Find replace mask constants
val FR_MATCHCASE=0x4
val FR_WHOLEWORD=0x2
val FR_DOWN=0x1
# Key modifier flag.
val SHIFT_PRESSED=1
val LEFT_CTRL_PRESSED=2
val LEFT_ALT_PRESSED=4
#events
evt void EN_Change=768(void)

View File

@ -11,17 +11,6 @@
#if PLAT_GTK
#ifndef SCINTILLA_H
#ifdef _MSC_VER
#pragma message(__FILE__ "(1) : warning : Scintilla.h should be included before ScintillaWidget.h")
#pragma message("This will be required in the next version of Scintilla")
#else
#warning Scintilla.h should be included before ScintillaWidget.h
#warning This will be required in the next version of Scintilla
#endif
#include "Scintilla.h"
#endif
#ifdef __cplusplus
extern "C" {
#endif

View File

@ -1,197 +0,0 @@
// Scintilla source code edit control
/** @file WinDefs.h
** The subset of definitions from Windows needed by Scintilla for GTK+.
**/
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
#ifndef WINDEFS_H
#define WINDEFS_H
/* Running GTK version on win32 */
#if PLAT_GTK_WIN32
#include "Windows.h"
#include "Richedit.h"
/* Name conflicts */
#undef DrawText
#undef FindText
#else
#define WORD short
#define WPARAM unsigned long
#define LPARAM long
#define LRESULT long
#define DWORD long
#define UINT unsigned int
#define LPSTR char *
#define LONG long
//#if 0
/* RTF control */
#define EM_CANPASTE (1074)
#define EM_CANUNDO (198)
#define EM_CHARFROMPOS (215)
#define EM_EMPTYUNDOBUFFER (205)
#define EM_EXGETSEL (1076)
#define EM_EXLINEFROMCHAR (1078)
#define EM_EXSETSEL (1079)
#define EM_FINDTEXT (1080)
#define EM_FINDTEXTEX (1103)
#define EM_FORMATRANGE (1081)
#define EM_GETFIRSTVISIBLELINE (206)
#define EM_GETLINE (196)
#define EM_GETLINECOUNT (186)
#define EM_GETMARGINS (212)
#define EM_GETMODIFY (184)
#define EM_GETRECT (178)
#define EM_GETSEL (176)
#define EM_GETSELTEXT (1086)
#define EM_GETTEXTRANGE (1099)
#define EM_HIDESELECTION (1087)
#define EM_LINEFROMCHAR (201)
#define EM_LINEINDEX (187)
#define EM_LINELENGTH (193)
#define EM_LINESCROLL (182)
#define EM_POSFROMCHAR (214)
#define EM_REPLACESEL (194)
#define EM_SCROLLCARET (183)
#define EM_SELECTIONTYPE (1090)
#define EM_SETMARGINS (211)
#define EM_SETREADONLY (207)
#define EM_SETSEL (177)
#define EM_UNDO (199)
#define WM_NULL (0)
#define WM_CLEAR (771)
#define WM_COPY (769)
#define WM_CUT (768)
#define WM_GETTEXT (13)
#define WM_GETTEXTLENGTH (14)
#define WM_PASTE (770)
#define WM_SETTEXT (12)
#define WM_UNDO (772)
#define EN_CHANGE (768)
#define EN_KILLFOCUS (512)
#define EN_SETFOCUS (256)
#define EC_LEFTMARGIN 1
#define EC_RIGHTMARGIN 2
#define EC_USEFONTINFO 0xffff
//#endif
#if 0
#if PLAT_GTK
#define VK_DOWN GDK_Down
#define VK_UP GDK_Up
#define VK_LEFT GDK_Left
#define VK_RIGHT GDK_Right
#define VK_HOME GDK_Home
#define VK_END GDK_End
#define VK_PRIOR GDK_Page_Up
#define VK_NEXT GDK_Page_Down
#define VK_DELETE GDK_Delete
#define VK_INSERT GDK_Insert
#define VK_ESCAPE GDK_Escape
#define VK_BACK GDK_BackSpace
#define VK_TAB GDK_Tab
#define VK_RETURN GDK_Return
#define VK_ADD GDK_KP_Add
#define VK_SUBTRACT GDK_KP_Subtract
#define VK_DIVIDE GDK_KP_Divide
#endif
#if PLAT_WX
#define VK_DOWN WXK_DOWN
#define VK_UP WXK_UP
#define VK_LEFT WXK_LEFT
#define VK_RIGHT WXK_RIGHT
#define VK_HOME WXK_HOME
#define VK_END WXK_END
#define VK_PRIOR WXK_PRIOR
#define VK_NEXT WXK_NEXT
#define VK_DELETE WXK_DELETE
#define VK_INSERT WXK_INSERT
#define VK_ESCAPE WXK_ESCAPE
#define VK_BACK WXK_BACK
#define VK_TAB WXK_TAB
#define VK_RETURN WXK_RETURN
#define VK_ADD WXK_ADD
#define VK_SUBTRACT WXK_SUBTRACT
//TODO:
#define VK_DIVIDE WXK_DIVIDE
#endif
#define SHIFT_PRESSED 1
#define LEFT_CTRL_PRESSED 2
#define LEFT_ALT_PRESSED 4
// Are these needed any more
#define LPSTR char *
#define LONG long
#define LPDWORD (long *)
/* SELCHANGE structure */
#define SEL_EMPTY (0)
#define SEL_TEXT (1)
#define SEL_OBJECT (2)
#define SEL_MULTICHAR (4)
#define SEL_MULTIOBJECT (8)
struct RECT {
LONG left;
LONG top;
LONG right;
LONG bottom;
};
/* FINDREPLACE structure */
#define FR_MATCHCASE (0x4)
#define FR_WHOLEWORD (0x2)
#define FR_DOWN (0x1)
#endif
#if 0
struct CHARRANGE {
LONG cpMin;
LONG cpMax;
};
struct TEXTRANGE {
CHARRANGE chrg;
LPSTR lpstrText;
};
struct FINDTEXTEX {
CHARRANGE chrg;
LPSTR lpstrText;
CHARRANGE chrgText;
};
struct NMHDR {
WindowID hwndFrom;
UINT idFrom;
UINT code;
};
struct FORMATRANGE {
SurfaceID hdc;
SurfaceID hdcTarget;
RECT rc;
RECT rcPage;
CHARRANGE chrg;
};
#endif
//#define MAKELONG(a, b) ((a) | ((b) << 16))
//#define LOWORD(x) (x & 0xffff)
//#define HIWORD(x) (x >> 16)
#endif /* !_MSC_VER */
#endif

View File

@ -357,8 +357,10 @@ void Document::ModifiedAt(int pos) {
// Unlike Undo, Redo, and InsertStyledString, the pos argument is a cell number not a char number
void Document::DeleteChars(int pos, int len) {
if (len == 0)
return;
if ((pos + len) > Length())
return ;
return;
if (cb.IsReadOnly() && enteredReadOnlyCount == 0) {
enteredReadOnlyCount++;
NotifyModifyAttempt();

View File

@ -14,10 +14,6 @@
#include "Scintilla.h"
#if PLAT_WX || PLAT_GTK
#include "WinDefs.h"
#endif
#include "ContractionState.h"
#include "SVector.h"
#include "CellBuffer.h"
@ -58,7 +54,6 @@ Editor::Editor() {
dwelling = false;
ptMouseLast.x = 0;
ptMouseLast.y = 0;
firstExpose = true;
inDragDrop = false;
dropWentOutside = false;
posDrag = invalidPosition;
@ -69,9 +64,6 @@ Editor::Editor() {
lineAnchor = 0;
originalAnchorPos = 0;
dragChars = 0;
lenDrag = 0;
dragIsRectangle = false;
selType = selStream;
xStartSelect = 0;
xEndSelect = 0;
@ -85,9 +77,6 @@ Editor::Editor() {
searchAnchor = 0;
ucWheelScrollLines = 0;
cWheelDelta = 0; //wheel delta from roll
xOffset = 0;
xCaretMargin = 50;
horizontalScrollBarVisible = true;
@ -114,15 +103,11 @@ Editor::Editor() {
modEventMask = SC_MODEVENTMASKALL;
displayPopupMenu = true;
pdoc = new Document();
pdoc ->AddRef();
pdoc->AddWatcher(this, 0);
#ifdef MACRO_SUPPORT
recordingMacro = 0;
#endif
recordingMacro = false;
foldFlags = 0;
}
@ -131,10 +116,6 @@ Editor::~Editor() {
pdoc->Release();
pdoc = 0;
DropGraphics();
delete []dragChars;
dragChars = 0;
lenDrag = 0;
}
void Editor::Finalise() {
@ -874,7 +855,7 @@ void Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) {
if (marks) {
for (int markBit = 0; (markBit < 32) && marks; markBit++) {
if (marks & 1) {
vs.markers[markBit].Draw(surface, rcMarker);
vs.markers[markBit].Draw(surface, rcMarker, vs.styles[STYLE_LINENUMBER].font);
}
marks >>= 1;
}
@ -1917,14 +1898,12 @@ void Editor::NotifyChar(int ch) {
scn.nmhdr.code = SCN_CHARADDED;
scn.ch = ch;
NotifyParent(scn);
#ifdef MACRO_SUPPORT
if (recordingMacro) {
char txt[2];
txt[0] = static_cast<char>(ch);
txt[1] = '\0';
NotifyMacroRecord(SCI_REPLACESEL, 0, reinterpret_cast<long>(txt));
}
#endif
}
void Editor::NotifySavePoint(bool isSavePoint) {
@ -2150,7 +2129,6 @@ void Editor::NotifyDeleted(Document *, void *) {
/* Do nothing */
}
#ifdef MACRO_SUPPORT
void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long lParam) {
// Enumerates all macroable messages
@ -2159,10 +2137,6 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long
case SCI_COPY:
case SCI_PASTE:
case SCI_CLEAR:
case WM_CUT:
case WM_COPY:
case WM_PASTE:
case WM_CLEAR:
case SCI_REPLACESEL:
case SCI_ADDTEXT:
case SCI_INSERTTEXT:
@ -2236,7 +2210,6 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long
scn.lParam = lParam;
NotifyParent(scn);
}
#endif
// Force scroll and keep position relative to top of window
void Editor::PageMove(int direction, bool extend) {
@ -2674,7 +2647,6 @@ void Editor::Indent(bool forwards) {
* @return The position of the found text, -1 if not found.
*/
long Editor::FindText(
unsigned int iMessage, ///< Can be @c EM_FINDTEXT or @c EM_FINDTEXTEX or @c SCI_FINDTEXT.
unsigned long wParam, ///< Search modes : @c SCFIND_MATCHCASE, @c SCFIND_WHOLEWORD,
///< @c SCFIND_WORDSTART or @c SCFIND_REGEXP.
long lParam) { ///< @c TextToFind structure: The text to search for in the given range.
@ -2688,10 +2660,8 @@ long Editor::FindText(
wParam & SCFIND_REGEXP,
&lengthFound);
if (pos != -1) {
if (iMessage != EM_FINDTEXT) {
ft->chrgText.cpMin = pos;
ft->chrgText.cpMax = pos + lengthFound;
}
ft->chrgText.cpMin = pos;
ft->chrgText.cpMax = pos + lengthFound;
}
return pos;
}
@ -2800,33 +2770,23 @@ char *Editor::CopyRange(int start, int end) {
return text;
}
int Editor::SelectionRangeLength() {
void Editor::CopySelectionRange(SelectionText *ss) {
char *text = 0;
int size = 0;
if (selType == selRectangle) {
int lineStart = pdoc->LineFromPosition(SelectionStart());
int lineEnd = pdoc->LineFromPosition(SelectionEnd());
int totalSize = 0;
for (int line = lineStart; line <= lineEnd; line++) {
totalSize += SelectionEnd(line) - SelectionStart(line) + 1;
int line;
for (line = lineStart; line <= lineEnd; line++) {
size += SelectionEnd(line) - SelectionStart(line) + 1;
if (pdoc->eolMode == SC_EOL_CRLF)
totalSize++;
size++;
}
return totalSize;
} else {
return SelectionEnd() - SelectionStart();
}
}
char *Editor::CopySelectionRange() {
if (selType == selRectangle) {
char *text = 0;
int lineStart = pdoc->LineFromPosition(SelectionStart());
int lineEnd = pdoc->LineFromPosition(SelectionEnd());
int totalSize = SelectionRangeLength();
if (totalSize > 0) {
text = new char[totalSize + 1];
if (size > 0) {
text = new char[size + 1];
if (text) {
int j = 0;
for (int line = lineStart; line <= lineEnd; line++) {
for (line = lineStart; line <= lineEnd; line++) {
for (int i = SelectionStart(line);i < SelectionEnd(line);i++) {
text[j++] = pdoc->CharAt(i);
}
@ -2835,24 +2795,14 @@ char *Editor::CopySelectionRange() {
if (pdoc->eolMode != SC_EOL_CR)
text[j++] = '\n';
}
text[totalSize] = '\0';
text[size] = '\0';
}
}
return text;
} else {
return CopyRange(SelectionStart(), SelectionEnd());
}
}
void Editor::CopySelectionIntoDrag() {
delete []dragChars;
dragChars = 0;
lenDrag = SelectionRangeLength();
dragChars = CopySelectionRange();
dragIsRectangle = selType == selRectangle;
if (!dragChars) {
lenDrag = 0;
size = SelectionEnd() - SelectionStart();
text = CopyRange(SelectionStart(), SelectionEnd());
}
ss->Set(text, size, selType == selRectangle);
}
void Editor::SetDragPosition(int newPos) {
@ -2882,8 +2832,6 @@ void Editor::StartDrag() {
//DisplayCursor(Window::cursorArrow);
}
void Editor::DropAt(int position, const char *value, bool moving, bool rectangular) {
//Platform::DebugPrintf("DropAt %d\n", inDragDrop);
if (inDragDrop)
@ -3115,7 +3063,7 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b
if (inDragDrop) {
SetMouseCapture(false);
SetDragPosition(newPos);
CopySelectionIntoDrag();
CopySelectionRange(&drag);
StartDrag();
} else {
xStartSelect = pt.x - vs.fixedColumnWidth + xOffset;
@ -3220,25 +3168,23 @@ void Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) {
int selStart = SelectionStart();
int selEnd = SelectionEnd();
if (selStart < selEnd) {
if (dragChars && lenDrag) {
if (drag.len) {
if (ctrl) {
pdoc->InsertString(newPos, dragChars, lenDrag);
SetSelection(newPos, newPos + lenDrag);
pdoc->InsertString(newPos, drag.s, drag.len);
SetSelection(newPos, newPos + drag.len);
} else if (newPos < selStart) {
pdoc->DeleteChars(selStart, lenDrag);
pdoc->InsertString(newPos, dragChars, lenDrag);
SetSelection(newPos, newPos + lenDrag);
pdoc->DeleteChars(selStart, drag.len);
pdoc->InsertString(newPos, drag.s, drag.len);
SetSelection(newPos, newPos + drag.len);
} else if (newPos > selEnd) {
pdoc->DeleteChars(selStart, lenDrag);
newPos -= lenDrag;
pdoc->InsertString(newPos, dragChars, lenDrag);
SetSelection(newPos, newPos + lenDrag);
pdoc->DeleteChars(selStart, drag.len);
newPos -= drag.len;
pdoc->InsertString(newPos, drag.s, drag.len);
SetSelection(newPos, newPos + drag.len);
} else {
SetEmptySelection(newPos);
}
delete []dragChars;
dragChars = 0;
lenDrag = 0;
drag.Set(0, 0);
}
selectionType = selChar;
}
@ -3545,14 +3491,11 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
//Platform::DebugPrintf("S start wnd proc %d %d %d\n",iMessage, wParam, lParam);
// Optional macro recording hook
#ifdef MACRO_SUPPORT
if (recordingMacro)
NotifyMacroRecord(iMessage, wParam, lParam);
#endif
switch (iMessage) {
case WM_GETTEXT:
case SCI_GETTEXT:
{
if (lParam == 0)
@ -3565,7 +3508,6 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
return iChar;
}
case WM_SETTEXT:
case SCI_SETTEXT:
{
if (lParam == 0)
@ -3576,130 +3518,45 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
return TRUE;
}
case WM_GETTEXTLENGTH:
case SCI_GETTEXTLENGTH:
return pdoc->Length();
case WM_CUT:
case SCI_CUT:
Cut();
SetLastXChosen();
break;
case WM_COPY:
case SCI_COPY:
Copy();
break;
case WM_PASTE:
case SCI_PASTE:
Paste();
SetLastXChosen();
EnsureCaretVisible();
break;
case WM_CLEAR:
case SCI_CLEAR:
Clear();
SetLastXChosen();
break;
case WM_UNDO:
case SCI_UNDO:
Undo();
SetLastXChosen();
break;
// Edit control messages
// Not supported (no-ops):
// EM_GETWORDBREAKPROC
// EM_GETWORDBREAKPROCEX
// EM_SETWORDBREAKPROC
// EM_SETWORDBREAKPROCEX
// EM_GETWORDWRAPMODE
// EM_SETWORDWRAPMODE
// EM_LIMITTEXT
// EM_EXLIMITTEXT
// EM_SETRECT
// EM_SETRECTNP
// EM_FMTLINES
// EM_GETHANDLE
// EM_SETHANDLE
// EM_GETPASSWORDCHAR
// EM_SETPASSWORDCHAR
// EM_SETTABSTOPS
// EM_FINDWORDBREAK
// EM_GETCHARFORMAT
// EM_SETCHARFORMAT
// EM_GETOLEINTERFACE
// EM_SETOLEINTERFACE
// EM_SETOLECALLBACK
// EM_GETPARAFORMAT
// EM_SETPARAFORMAT
// EM_PASTESPECIAL
// EM_REQUESTRESIZE
// EM_GETBKGNDCOLOR
// EM_SETBKGNDCOLOR
// EM_STREAMIN
// EM_STREAMOUT
// EM_GETIMECOLOR
// EM_SETIMECOLOR
// EM_GETIMEOPTIONS
// EM_SETIMEOPTIONS
// EM_GETOPTIONS
// EM_SETOPTIONS
// EM_GETPUNCTUATION
// EM_SETPUNCTUATION
// EM_GETTHUMB
// EM_SETTARGETDEVICE
// Not supported but should be:
// EM_GETEVENTMASK
// EM_SETEVENTMASK
// For printing:
// EM_DISPLAYBAND
case EM_CANUNDO:
case SCI_CANUNDO:
return pdoc->CanUndo() ? TRUE : FALSE;
case EM_UNDO:
Undo();
SetLastXChosen();
break;
case EM_EMPTYUNDOBUFFER:
case SCI_EMPTYUNDOBUFFER:
pdoc->DeleteUndoHistory();
return 0;
case EM_GETFIRSTVISIBLELINE:
case SCI_GETFIRSTVISIBLELINE:
return topLine;
case EM_GETLINE: {
if (lParam == 0) {
return 0;
}
char *ptr = reinterpret_cast<char *>(lParam);
short *pBufSize = reinterpret_cast<short *>(lParam);
short bufSize = *pBufSize;
ptr[0] = '\0'; // If no characters copied, have to put a NUL into buffer
if (static_cast<int>(wParam) > pdoc->LinesTotal()) {
return 0;
}
int lineStart = pdoc->LineStart(wParam);
int lineEnd = pdoc->LineStart(wParam + 1);
// The first word of the buffer is the size, in TCHARs, of the buffer
int iPlace = 0;
for (int iChar = lineStart; iChar < lineEnd && iPlace < bufSize; iChar++) {
ptr[iPlace++] = pdoc->CharAt(iChar);
}
return iPlace;
}
case SCI_GETLINE: { // Simpler than EM_GETLINE, but with risk of overwriting the end of the buffer
case SCI_GETLINE: { // Risk of overwriting the end of the buffer
if (lParam == 0) {
return 0;
}
@ -3713,42 +3570,15 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
return iPlace;
}
case EM_GETLINECOUNT:
case SCI_GETLINECOUNT:
if (pdoc->LinesTotal() == 0)
return 1;
else
return pdoc->LinesTotal();
case EM_GETMODIFY:
case SCI_GETMODIFY:
return !pdoc->IsSavePoint();
case EM_GETRECT:
if (lParam == 0)
return 0;
*(reinterpret_cast<PRectangle *>(lParam)) = GetClientRectangle();
break;
case EM_GETSEL:
if (wParam)
*reinterpret_cast<int *>(wParam) = SelectionStart();
if (lParam)
*reinterpret_cast<int *>(lParam) = SelectionEnd();
return Platform::LongFromTwoShorts(
static_cast<short>(SelectionStart()),
static_cast<short>(SelectionEnd()));
case EM_EXGETSEL: {
if (lParam == 0)
return 0;
CharacterRange *pCR = reinterpret_cast<CharacterRange *>(lParam);
pCR->cpMin = SelectionStart();
pCR->cpMax = SelectionEnd();
}
break;
case EM_SETSEL:
case SCI_SETSEL: {
int nStart = static_cast<int>(wParam);
int nEnd = static_cast<int>(lParam);
@ -3762,55 +3592,28 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
}
break;
case EM_EXSETSEL: {
if (lParam == 0)
return 0;
CharacterRange *pCR = reinterpret_cast<CharacterRange *>(lParam);
selType = selStream;
if (pCR->cpMax == -1) {
SetSelection(pCR->cpMin, pdoc->Length());
} else {
SetSelection(pCR->cpMin, pCR->cpMax);
}
EnsureCaretVisible();
return pdoc->LineFromPosition(SelectionStart());
}
case EM_GETSELTEXT:
case SCI_GETSELTEXT: {
if (lParam == 0)
return 0;
SelectionText selectedText;
CopySelectionRange(&selectedText);
char *ptr = reinterpret_cast<char *>(lParam);
int selSize = SelectionRangeLength();
char *text = CopySelectionRange();
int iChar = 0;
if (text) {
for (; iChar < selSize; iChar++)
ptr[iChar] = text[iChar];
if (selectedText.len) {
for (; iChar < selectedText.len; iChar++)
ptr[iChar] = selectedText.s[iChar];
ptr[iChar] = '\0';
delete []text;
} else {
ptr[0] = '\0';
}
return iChar;
}
case EM_LINEFROMCHAR:
if (static_cast<int>(wParam) < 0)
wParam = SelectionStart();
return pdoc->LineFromPosition(wParam);
case EM_EXLINEFROMCHAR:
if (static_cast<int>(lParam) < 0)
lParam = SelectionStart(); // Not specified, but probably OK
return pdoc->LineFromPosition(lParam);
case SCI_LINEFROMPOSITION:
if (static_cast<int>(wParam) < 0)
return 0;
return pdoc->LineFromPosition(wParam);
case EM_LINEINDEX:
case SCI_POSITIONFROMLINE:
if (static_cast<int>(wParam) < 0)
wParam = pdoc->LineFromPosition(SelectionStart());
@ -3822,28 +3625,13 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
// return -1;
return pdoc->LineStart(wParam);
case EM_LINELENGTH: {
if (static_cast<int>(wParam) < 0) // Who use this anyway?
return 0; // Should be... Too complex to describe here, see MS specs!
if (static_cast<int>(wParam) > pdoc->Length()) // Useful test, anyway...
return 0;
int line = pdoc->LineFromPosition(wParam);
int charsOnLine = 0;
for (int pos = pdoc->LineStart(line); pos < pdoc->LineStart(line + 1); pos++) {
if ((pdoc->CharAt(pos) != '\r') && (pdoc->CharAt(pos) != '\n'))
charsOnLine++;
}
return charsOnLine;
}
// Replacement of the old Scintilla interpretation of EM_LINELENGTH
// Replacement of the old Scintilla interpretation of EM_LINELENGTH
case SCI_LINELENGTH:
if ((static_cast<int>(wParam) < 0) ||
(static_cast<int>(wParam) > pdoc->LineFromPosition(pdoc->Length())))
return 0;
return pdoc->LineStart(wParam + 1) - pdoc->LineStart(wParam);
case EM_REPLACESEL:
case SCI_REPLACESEL: {
if (lParam == 0)
return 0;
@ -3890,18 +3678,15 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
case SCI_GETSEARCHFLAGS:
return searchFlags;
case EM_LINESCROLL:
case SCI_LINESCROLL:
ScrollTo(topLine + lParam);
HorizontalScrollTo(xOffset + wParam * vs.spaceWidth);
return TRUE;
case EM_SCROLLCARET:
case SCI_SCROLLCARET:
EnsureCaretVisible();
break;
case EM_SETREADONLY:
case SCI_SETREADONLY:
pdoc->SetReadOnly(wParam);
return TRUE;
@ -3909,33 +3694,9 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
case SCI_GETREADONLY:
return pdoc->IsReadOnly();
case EM_CANPASTE:
case SCI_CANPASTE:
return CanPaste();
case EM_CHARFROMPOS: {
if (lParam == 0)
return 0;
Point *ppt = reinterpret_cast<Point *>(lParam);
int pos = PositionFromLocation(*ppt);
int line = pdoc->LineFromPosition(pos);
return Platform::LongFromTwoShorts(
static_cast<short>(pos), static_cast < short > (line));
}
case EM_POSFROMCHAR: {
// The MS specs for this have changed 3 times: using the RichEdit 3 version
if (wParam == 0)
return 0;
Point *ppt = reinterpret_cast<Point *>(wParam);
if (lParam < 0) {
*ppt = Point(0, 0);
} else {
*ppt = LocationFromPosition(lParam);
}
return 0;
}
case SCI_POINTXFROMPOSITION:
if (lParam < 0) {
return 0;
@ -3952,14 +3713,9 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
return pt.y;
}
case EM_FINDTEXT:
return FindText(iMessage, wParam, lParam);
case EM_FINDTEXTEX:
case SCI_FINDTEXT:
return FindText(iMessage, wParam, lParam);
return FindText(wParam, lParam);
case EM_GETTEXTRANGE:
case SCI_GETTEXTRANGE: {
if (lParam == 0)
return 0;
@ -3974,53 +3730,20 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
return len; // Not including NUL
}
case EM_SELECTIONTYPE:
#ifdef SEL_EMPTY
if (currentPos == anchor)
return SEL_EMPTY;
else
return SEL_TEXT;
#else
return 0;
#endif
case EM_HIDESELECTION:
case SCI_HIDESELECTION:
hideSelection = wParam;
Redraw();
break;
case EM_FORMATRANGE:
case SCI_FORMATRANGE:
return FormatRange(wParam, reinterpret_cast<RangeToFormat *>(lParam));
case EM_GETMARGINS:
return Platform::LongFromTwoShorts(static_cast<short>(vs.leftMarginWidth),
static_cast<short>(vs.rightMarginWidth));
case SCI_GETMARGINLEFT:
return vs.leftMarginWidth;
case SCI_GETMARGINRIGHT:
return vs.rightMarginWidth;
case EM_SETMARGINS:
#ifdef EC_LEFTMARGIN
if (wParam & EC_LEFTMARGIN) {
vs.leftMarginWidth = Platform::LowShortFromLong(lParam);
}
if (wParam & EC_RIGHTMARGIN) {
vs.rightMarginWidth = Platform::HighShortFromLong(lParam);
}
if (wParam == EC_USEFONTINFO) {
vs.leftMarginWidth = vs.aveCharWidth / 2;
vs.rightMarginWidth = vs.aveCharWidth / 2;
}
InvalidateStyleRedraw();
#endif
break;
case SCI_SETMARGINLEFT:
vs.leftMarginWidth = lParam;
InvalidateStyleRedraw();
@ -4667,10 +4390,6 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
case SCI_LINESONSCREEN:
return LinesOnScreen();
case SCI_USEPOPUP:
displayPopupMenu = wParam;
break;
case SCI_SETSELFORE:
vs.selforeset = wParam;
vs.selforeground.desired = Colour(lParam);
@ -4711,7 +4430,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
case SCI_CLEARCMDKEY:
kmap.AssignCmdKey(Platform::LowShortFromLong(wParam),
Platform::HighShortFromLong(wParam), WM_NULL);
Platform::HighShortFromLong(wParam), SCI_NULL);
break;
case SCI_CLEARALLCMDKEYS:
@ -4915,15 +4634,13 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
case SCI_GETCURSOR:
return cursorMode;
#ifdef MACRO_SUPPORT
case SCI_STARTRECORD:
recordingMacro = 1;
recordingMacro = true;
return 0;
case SCI_STOPRECORD:
recordingMacro = 0;
recordingMacro = false;
return 0;
#endif
case SCI_MOVECARETINSIDEVIEW:
MoveCaretInsideView();

View File

@ -50,6 +50,26 @@ public:
int positions[maxLineLength+1];
};
class SelectionText {
public:
char *s;
int len;
bool rectangular;
SelectionText() : s(0), len(0), rectangular(false) {}
~SelectionText() {
Set(0, 0);
}
void Set(char *s_, int len_, bool rectangular_=false) {
delete []s;
s = s_;
if (s)
len = len_;
else
len = 0;
rectangular = rectangular_;
}
};
/**
*/
class Editor : public DocWatcher {
@ -68,6 +88,7 @@ protected: // ScintillaBase subclass needs access to much of Editor
bool stylesValid;
ViewStyle vs;
Palette palette;
int printMagnification;
int printColourMode;
int cursorMode;
@ -91,9 +112,6 @@ protected: // ScintillaBase subclass needs access to much of Editor
Surface pixmapSelPattern;
Surface pixmapIndentGuide;
Surface pixmapIndentGuideHighlight;
// Intellimouse support - currently only implemented for Windows
unsigned int ucWheelScrollLines;
int cWheelDelta; ///< Wheel delta from roll
KeyMap kmap;
@ -109,7 +127,6 @@ protected: // ScintillaBase subclass needs access to much of Editor
bool dwelling;
enum { selChar, selWord, selLine } selectionType;
Point ptMouseLast;
bool firstExpose;
bool inDragDrop;
bool dropWentOutside;
int posDrag;
@ -138,9 +155,7 @@ protected: // ScintillaBase subclass needs access to much of Editor
int modEventMask;
char *dragChars;
int lenDrag;
bool dragIsRectangle;
SelectionText drag;
enum { selStream, selRectangle, selRectangleFixed } selType;
int xStartSelect;
int xEndSelect;
@ -154,11 +169,7 @@ protected: // ScintillaBase subclass needs access to much of Editor
int searchAnchor;
int displayPopupMenu;
#ifdef MACRO_SUPPORT
int recordingMacro;
#endif
bool recordingMacro;
int foldFlags;
ContractionState cs;
@ -270,11 +281,7 @@ protected: // ScintillaBase subclass needs access to much of Editor
void NotifyModified(Document *document, DocModification mh, void *userData);
void NotifyDeleted(Document *document, void *userData);
void NotifyStyleNeeded(Document *doc, void *userData, int endPos);
#ifdef MACRO_SUPPORT
void NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long lParam);
#endif
void PageMove(int direction, bool extend=false);
void ChangeCaseOfSelection(bool makeUpperCase);
@ -289,16 +296,14 @@ protected: // ScintillaBase subclass needs access to much of Editor
void Indent(bool forwards);
long FindText(unsigned int iMessage, unsigned long wParam, long lParam);
long FindText(unsigned long wParam, long lParam);
void SearchAnchor();
long SearchText(unsigned int iMessage, unsigned long wParam, long lParam);
long SearchInTarget(const char *text, int length);
void GoToLine(int lineNo);
char *CopyRange(int start, int end);
int SelectionRangeLength();
char *CopySelectionRange();
void CopySelectionIntoDrag();
void CopySelectionRange(SelectionText *ss);
void SetDragPosition(int newPos);
void DisplayCursor(Window::Cursor c);
virtual void StartDrag();

View File

@ -108,22 +108,26 @@ LexerModule lmNull(SCLEX_NULL, ColouriseNullDoc, "null");
int wxForceScintillaLexers(void) {
extern LexerModule lmAda;
extern LexerModule lmAVE;
extern LexerModule lmConf;
extern LexerModule lmDiff;
extern LexerModule lmLatex;
extern LexerModule lmPascal;
extern LexerModule lmCPP;
extern LexerModule lmHTML;
extern LexerModule lmXML;
extern LexerModule lmProps;
extern LexerModule lmErrorList;
extern LexerModule lmMake;
extern LexerModule lmBatch;
extern LexerModule lmConf;
extern LexerModule lmCPP;
extern LexerModule lmDiff;
extern LexerModule lmEiffel;
extern LexerModule lmEiffelkw;
extern LexerModule lmErrorList;
extern LexerModule lmHTML;
extern LexerModule lmLatex;
extern LexerModule lmLISP;
extern LexerModule lmLua;
extern LexerModule lmMake;
extern LexerModule lmPascal;
extern LexerModule lmPerl;
extern LexerModule lmProps;
extern LexerModule lmPython;
extern LexerModule lmRuby;
extern LexerModule lmSQL;
extern LexerModule lmVB;
extern LexerModule lmRuby;
extern LexerModule lmXML;
if (
&lmAda
@ -143,7 +147,12 @@ int wxForceScintillaLexers(void) {
&& &lmPython
&& &lmSQL
&& &lmVB
&& &lmRuby
&& &lmRuby
&& &lmEiffel
&& &lmEiffelkw
&& &lmLISP
&& &lmLua
&& &lmNull
)
{
return 1;

View File

@ -15,317 +15,255 @@
#include "PropSet.h"
#include "Accessor.h"
#include "StyleContext.h"
#include "KeyWords.h"
#include "Scintilla.h"
#include "SciLexer.h"
static bool IsOKBeforeRE(int ch) {
static bool IsOKBeforeRE(const int ch) {
return (ch == '(') || (ch == '=') || (ch == ',');
}
static void getRange(unsigned int start,
unsigned int end,
Accessor &styler,
char *s,
unsigned int len) {
unsigned int i = 0;
while ((i < end - start + 1) && (i < len-1)) {
s[i] = styler[start + i];
i++;
}
s[i] = '\0';
}
inline bool IsASpace(int ch) {
return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d));
}
inline bool IsAWordChar(int ch) {
inline bool IsAWordChar(const int ch) {
return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
}
inline bool IsAWordStart(int ch) {
inline bool IsAWordStart(const int ch) {
return (ch < 0x80) && (isalnum(ch) || ch == '_');
}
inline bool IsADigit(int ch) {
return (ch >= '0') && (ch <= '9');
inline bool IsADoxygenChar(const int ch) {
return (islower(ch) || ch == '$' || ch == '@' ||
ch == '\\' || ch == '&' || ch == '<' ||
ch == '>' || ch == '#' || ch == '{' ||
ch == '}' || ch == '[' || ch == ']');
}
// All languages handled so far can treat all characters >= 0x80 as one class
// which just continues the current token or starts an identifier if in default.
// DBCS treated specially as the second character can be < 0x80 and hence
// syntactically significant. UTF-8 avoids this as all trail bytes are >= 0x80
class ColouriseContext {
Accessor &styler;
int lengthDoc;
int currentPos;
ColouriseContext& operator=(const ColouriseContext&) {
return *this;
}
public:
bool atEOL;
int state;
int chPrev;
int ch;
int chNext;
inline bool IsStateComment(const int state) {
return ((state == SCE_C_COMMENT) ||
(state == SCE_C_COMMENTLINE) ||
(state == SCE_C_COMMENTDOC) ||
(state == SCE_C_COMMENTDOCKEYWORD) ||
(state == SCE_C_COMMENTDOCKEYWORDERROR));
}
ColouriseContext(unsigned int startPos, int length,
int initStyle, Accessor &styler_) :
styler(styler_),
lengthDoc(startPos + length),
currentPos(startPos),
atEOL(false),
state(initStyle),
chPrev(0),
ch(0),
chNext(0) {
styler.StartAt(startPos);
styler.StartSegment(startPos);
int pos = currentPos;
ch = static_cast<unsigned char>(styler.SafeGetCharAt(pos));
if (styler.IsLeadByte(static_cast<char>(ch))) {
pos++;
ch = ch << 8;
ch |= static_cast<unsigned char>(styler.SafeGetCharAt(pos));
}
chNext = static_cast<unsigned char>(styler.SafeGetCharAt(pos+1));
if (styler.IsLeadByte(static_cast<char>(chNext))) {
chNext = chNext << 8;
chNext |= static_cast<unsigned char>(styler.SafeGetCharAt(pos+2));
}
atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
}
void Complete() {
styler.ColourTo(currentPos - 1, state);
}
bool More() {
return currentPos <= lengthDoc;
}
void Forward() {
// A lot of this is repeated from the constructor - TODO: merge code
chPrev = ch;
currentPos++;
if (ch >= 0x100)
currentPos++;
ch = chNext;
chNext = static_cast<unsigned char>(styler.SafeGetCharAt(currentPos+1));
if (styler.IsLeadByte(static_cast<char>(chNext))) {
chNext = chNext << 8;
chNext |= static_cast<unsigned char>(styler.SafeGetCharAt(currentPos + 2));
}
// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)
// Avoid triggering two times on Dos/Win
// End of line
atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
}
void ChangeState(int state_) {
state = state_;
}
void SetState(int state_) {
styler.ColourTo(currentPos - 1, state);
state = state_;
}
void ForwardSetState(int state_) {
Forward();
styler.ColourTo(currentPos - 1, state);
state = state_;
}
void GetCurrent(char *s, int len) {
getRange(styler.GetStartSegment(), currentPos - 1, styler, s, len);
}
int LengthCurrent() {
return currentPos - styler.GetStartSegment();
}
bool Match(char ch0) {
return ch == ch0;
}
bool Match(char ch0, char ch1) {
return (ch == ch0) && (chNext == ch1);
}
bool Match(const char *s) {
if (ch != *s)
return false;
s++;
if (chNext != *s)
return false;
s++;
for (int n=2; *s; n++) {
if (*s != styler.SafeGetCharAt(currentPos+n))
return false;
s++;
}
return true;
}
};
inline bool IsStateString(const int state) {
return ((state == SCE_C_STRING) || (state == SCE_C_VERBATIM));
}
static void ColouriseCppDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
Accessor &styler) {
WordList &keywords = *keywordlists[0];
WordList &keywords2 = *keywordlists[1];
WordList &keywords3 = *keywordlists[2];
bool stylingWithinPreprocessor = styler.GetPropertyInt("styling.within.preprocessor");
if (initStyle == SCE_C_STRINGEOL) // Does not leak onto next line
// Do not leak onto next line
if (initStyle == SCE_C_STRINGEOL)
initStyle = SCE_C_DEFAULT;
int chPrevNonWhite = ' ';
int visibleChars = 0;
int noDocChars = 0;
bool lastWordWasUUID = false;
ColouriseContext cc(startPos, length, initStyle, styler);
StyleContext sc(startPos, length, initStyle, styler);
for (; cc.More(); cc.Forward()) {
for (; sc.More(); sc.Forward()) {
// Handle line continuation generically.
if (sc.ch == '\\') {
if (sc.Match("\\\n")) {
sc.Forward();
sc.Forward();
continue;
}
if (sc.Match("\\\r\n")) {
sc.Forward();
sc.Forward();
sc.Forward();
continue;
}
}
if (cc.state == SCE_C_STRINGEOL) {
if (cc.atEOL) {
cc.SetState(SCE_C_DEFAULT);
// Determine if the current state should terminate.
if (sc.state == SCE_C_OPERATOR) {
sc.SetState(SCE_C_DEFAULT);
} else if (sc.state == SCE_C_NUMBER) {
if (!IsAWordChar(sc.ch)) {
sc.SetState(SCE_C_DEFAULT);
}
} else if (cc.state == SCE_C_OPERATOR) {
cc.SetState(SCE_C_DEFAULT);
} else if (cc.state == SCE_C_NUMBER) {
if (!IsAWordChar(cc.ch)) {
cc.SetState(SCE_C_DEFAULT);
}
} else if (cc.state == SCE_C_IDENTIFIER) {
if (!IsAWordChar(cc.ch) || (cc.ch == '.')) {
} else if (sc.state == SCE_C_IDENTIFIER) {
if (!IsAWordChar(sc.ch) || (sc.ch == '.')) {
char s[100];
cc.GetCurrent(s, sizeof(s));
sc.GetCurrent(s, sizeof(s));
if (keywords.InList(s)) {
lastWordWasUUID = strcmp(s, "uuid") == 0;
cc.ChangeState(SCE_C_WORD);
sc.ChangeState(SCE_C_WORD);
} else if (keywords2.InList(s)) {
cc.ChangeState(SCE_C_WORD2);
sc.ChangeState(SCE_C_WORD2);
}
cc.SetState(SCE_C_DEFAULT);
sc.SetState(SCE_C_DEFAULT);
}
} if (cc.state == SCE_C_PREPROCESSOR) {
} else if (sc.state == SCE_C_PREPROCESSOR) {
if (stylingWithinPreprocessor) {
if (IsASpace(cc.ch)) {
cc.SetState(SCE_C_DEFAULT);
if (IsASpace(sc.ch)) {
sc.SetState(SCE_C_DEFAULT);
}
} else {
if (cc.atEOL && (cc.chPrev != '\\')) {
cc.SetState(SCE_C_DEFAULT);
if (sc.atLineEnd) {
sc.SetState(SCE_C_DEFAULT);
}
}
} else if (cc.state == SCE_C_COMMENT) {
if (cc.Match('*', '/')) {
cc.Forward();
cc.ForwardSetState(SCE_C_DEFAULT);
} else if (sc.state == SCE_C_COMMENT) {
if (sc.Match('*', '/')) {
sc.Forward();
sc.ForwardSetState(SCE_C_DEFAULT);
}
} else if (cc.state == SCE_C_COMMENTDOC) {
if (cc.Match('*', '/')) {
cc.Forward();
cc.ForwardSetState(SCE_C_DEFAULT);
} else if (sc.state == SCE_C_COMMENTDOC) {
if (sc.Match('*', '/')) {
sc.Forward();
sc.ForwardSetState(SCE_C_DEFAULT);
} else if ((sc.ch == '@' || sc.ch == '\\') && (noDocChars == 0)) {
sc.SetState(SCE_C_COMMENTDOCKEYWORD);
} else if (sc.atLineEnd) {
noDocChars = 0;
} else if (!isspace(sc.ch) && (sc.ch != '*')) {
noDocChars++;
}
} else if (cc.state == SCE_C_COMMENTLINE || cc.state == SCE_C_COMMENTLINEDOC) {
if (cc.ch == '\r' || cc.ch == '\n') {
cc.SetState(SCE_C_DEFAULT);
} else if (sc.state == SCE_C_COMMENTLINE || sc.state == SCE_C_COMMENTLINEDOC) {
if (sc.atLineEnd) {
sc.SetState(SCE_C_DEFAULT);
visibleChars = 0;
}
} else if (cc.state == SCE_C_STRING) {
if (cc.ch == '\\') {
if (cc.chNext == '\"' || cc.chNext == '\'' || cc.chNext == '\\') {
cc.Forward();
} else if (sc.state == SCE_C_COMMENTDOCKEYWORD) {
if (sc.Match('*', '/')) {
sc.ChangeState(SCE_C_COMMENTDOCKEYWORDERROR);
sc.Forward();
sc.ForwardSetState(SCE_C_DEFAULT);
} else if (!IsADoxygenChar(sc.ch)) {
char s[100];
sc.GetCurrent(s, sizeof(s));
if (!isspace(sc.ch) || !keywords3.InList(s+1)) {
sc.ChangeState(SCE_C_COMMENTDOCKEYWORDERROR);
}
} else if (cc.ch == '\"') {
cc.ForwardSetState(SCE_C_DEFAULT);
} else if ((cc.atEOL) && (cc.chPrev != '\\')) {
cc.ChangeState(SCE_C_STRINGEOL);
sc.SetState(SCE_C_COMMENTDOC);
}
} else if (cc.state == SCE_C_CHARACTER) {
if ((cc.ch == '\r' || cc.ch == '\n') && (cc.chPrev != '\\')) {
cc.ChangeState(SCE_C_STRINGEOL);
} else if (cc.ch == '\\') {
if (cc.chNext == '\"' || cc.chNext == '\'' || cc.chNext == '\\') {
cc.Forward();
} else if (sc.state == SCE_C_STRING) {
if (sc.ch == '\\') {
if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {
sc.Forward();
}
} else if (cc.ch == '\'') {
cc.ForwardSetState(SCE_C_DEFAULT);
} else if (sc.ch == '\"') {
sc.ForwardSetState(SCE_C_DEFAULT);
} else if (sc.atLineEnd) {
sc.ChangeState(SCE_C_STRINGEOL);
sc.ForwardSetState(SCE_C_DEFAULT);
visibleChars = 0;
}
} else if (cc.state == SCE_C_REGEX) {
if (cc.ch == '\r' || cc.ch == '\n' || cc.ch == '/') {
cc.ForwardSetState(SCE_C_DEFAULT);
} else if (cc.ch == '\\') {
} else if (sc.state == SCE_C_CHARACTER) {
if (sc.atLineEnd) {
sc.ChangeState(SCE_C_STRINGEOL);
sc.ForwardSetState(SCE_C_DEFAULT);
visibleChars = 0;
} else if (sc.ch == '\\') {
if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {
sc.Forward();
}
} else if (sc.ch == '\'') {
sc.ForwardSetState(SCE_C_DEFAULT);
}
} else if (sc.state == SCE_C_REGEX) {
if (sc.ch == '\r' || sc.ch == '\n' || sc.ch == '/') {
sc.ForwardSetState(SCE_C_DEFAULT);
} else if (sc.ch == '\\') {
// Gobble up the quoted character
if (cc.chNext == '\\' || cc.chNext == '/') {
cc.Forward();
if (sc.chNext == '\\' || sc.chNext == '/') {
sc.Forward();
}
}
} else if (cc.state == SCE_C_VERBATIM) {
if (cc.ch == '\"') {
if (cc.chNext == '\"') {
cc.Forward();
} else if (sc.state == SCE_C_VERBATIM) {
if (sc.ch == '\"') {
if (sc.chNext == '\"') {
sc.Forward();
} else {
cc.ForwardSetState(SCE_C_DEFAULT);
sc.ForwardSetState(SCE_C_DEFAULT);
}
}
} else if (cc.state == SCE_C_UUID) {
if (cc.ch == '\r' || cc.ch == '\n' || cc.ch == ')') {
cc.SetState(SCE_C_DEFAULT);
} else if (sc.state == SCE_C_UUID) {
if (sc.ch == '\r' || sc.ch == '\n' || sc.ch == ')') {
sc.SetState(SCE_C_DEFAULT);
}
}
if (cc.state == SCE_C_DEFAULT) {
if (cc.Match('@', '\"')) {
cc.SetState(SCE_C_VERBATIM);
cc.Forward();
} else if (IsADigit(cc.ch) || (cc.ch == '.' && IsADigit(cc.chNext))) {
// Determine if a new state should be entered.
if (sc.state == SCE_C_DEFAULT) {
if (sc.Match('@', '\"')) {
sc.SetState(SCE_C_VERBATIM);
sc.Forward();
} else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
if (lastWordWasUUID) {
cc.SetState(SCE_C_UUID);
sc.SetState(SCE_C_UUID);
lastWordWasUUID = false;
} else {
cc.SetState(SCE_C_NUMBER);
sc.SetState(SCE_C_NUMBER);
}
} else if (IsAWordStart(cc.ch) || (cc.ch == '@')) {
} else if (IsAWordStart(sc.ch) || (sc.ch == '@')) {
if (lastWordWasUUID) {
cc.SetState(SCE_C_UUID);
sc.SetState(SCE_C_UUID);
lastWordWasUUID = false;
} else {
cc.SetState(SCE_C_IDENTIFIER);
sc.SetState(SCE_C_IDENTIFIER);
}
} else if (cc.Match('/', '*')) {
if (cc.Match("/**") || cc.Match("/*!")) // Support of Qt/Doxygen doc. style
cc.SetState(SCE_C_COMMENTDOC);
} else if (sc.Match('/', '*')) {
if (sc.Match("/**") || sc.Match("/*!")) { // Support of Qt/Doxygen doc. style
noDocChars = 0;
sc.SetState(SCE_C_COMMENTDOC);
} else {
sc.SetState(SCE_C_COMMENT);
}
sc.Forward(); // Eat the * so it isn't used for the end of the comment
} else if (sc.Match('/', '/')) {
if (sc.Match("///") || sc.Match("//!")) // Support of Qt/Doxygen doc. style
sc.SetState(SCE_C_COMMENTLINEDOC);
else
cc.SetState(SCE_C_COMMENT);
cc.Forward(); // Eat the * so it isn't used for the end of the comment
} else if (cc.Match('/', '/')) {
if (cc.Match("///") || cc.Match("//!")) // Support of Qt/Doxygen doc. style
cc.SetState(SCE_C_COMMENTLINEDOC);
else
cc.SetState(SCE_C_COMMENTLINE);
} else if (cc.ch == '/' && IsOKBeforeRE(chPrevNonWhite)) {
cc.SetState(SCE_C_REGEX);
} else if (cc.ch == '\"') {
cc.SetState(SCE_C_STRING);
} else if (cc.ch == '\'') {
cc.SetState(SCE_C_CHARACTER);
} else if (cc.ch == '#' && visibleChars == 0) {
sc.SetState(SCE_C_COMMENTLINE);
} else if (sc.ch == '/' && IsOKBeforeRE(chPrevNonWhite)) {
sc.SetState(SCE_C_REGEX);
} else if (sc.ch == '\"') {
sc.SetState(SCE_C_STRING);
} else if (sc.ch == '\'') {
sc.SetState(SCE_C_CHARACTER);
} else if (sc.ch == '#' && visibleChars == 0) {
// Preprocessor commands are alone on their line
cc.SetState(SCE_C_PREPROCESSOR);
sc.SetState(SCE_C_PREPROCESSOR);
// Skip whitespace between # and preprocessor word
do {
cc.Forward();
} while (IsASpace(cc.ch) && cc.More());
} else if (isoperator(static_cast<char>(cc.ch))) {
cc.SetState(SCE_C_OPERATOR);
sc.Forward();
} while ((sc.ch == ' ') && (sc.ch == '\t') && sc.More());
if (sc.atLineEnd) {
sc.SetState(SCE_C_DEFAULT);
}
} else if (isoperator(static_cast<char>(sc.ch))) {
sc.SetState(SCE_C_OPERATOR);
}
}
if (cc.atEOL) {
if (sc.atLineEnd) {
// Reset states to begining of colourise so no surprises
// if different sets of lines lexed.
chPrevNonWhite = ' ';
visibleChars = 0;
lastWordWasUUID = false;
}
if (!IsASpace(cc.ch)) {
chPrevNonWhite = cc.ch;
if (!IsASpace(sc.ch)) {
chPrevNonWhite = sc.ch;
visibleChars++;
}
}
cc.Complete();
sc.Complete();
}
static void FoldCppDoc(unsigned int startPos, int length, int initStyle, WordList *[],

View File

@ -0,0 +1,204 @@
// Scintilla source code edit control
/** @file LexCrontab.cxx
** Lexer to use with extended crontab files used by a powerful
** Windows scheduler/event monitor/automation manager nnCron.
** (http://nemtsev.virtualave.net/)
**/
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <stdarg.h>
#include "Platform.h"
#include "PropSet.h"
#include "Accessor.h"
#include "KeyWords.h"
#include "Scintilla.h"
#include "SciLexer.h"
static void ColouriseNncrontabDoc(unsigned int startPos, int length, int, WordList
*keywordLists[], Accessor &styler)
{
int state = SCE_NNCRONTAB_DEFAULT;
char chNext = styler[startPos];
int lengthDoc = startPos + length;
// create a buffer large enough to take the largest chunk...
char *buffer = new char[length];
int bufferCount = 0;
// used when highliting environment variables inside quoted string:
bool insideString = false;
// this assumes that we have 3 keyword list in conf.properties
WordList &section = *keywordLists[0];
WordList &keyword = *keywordLists[1];
WordList &modifier = *keywordLists[2];
// go through all provided text segment
// using the hand-written state machine shown below
styler.StartAt(startPos);
styler.StartSegment(startPos);
for (int i = startPos; i < lengthDoc; i++) {
char ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
if (styler.IsLeadByte(ch)) {
chNext = styler.SafeGetCharAt(i + 2);
i++;
continue;
}
switch(state) {
case SCE_NNCRONTAB_DEFAULT:
if( ch == '\n' || ch == '\r' || ch == '\t' || ch == ' ') {
// whitespace is simply ignored here...
styler.ColourTo(i,SCE_NNCRONTAB_DEFAULT);
break;
} else if( ch == '#' && styler.SafeGetCharAt(i+1) == '(') {
// signals the start of a task...
state = SCE_NNCRONTAB_TASK;
styler.ColourTo(i,SCE_NNCRONTAB_TASK);
}
else if( ch == '\\' && styler.SafeGetCharAt(i+1) == ' ') {
// signals the start of an extended comment...
state = SCE_NNCRONTAB_COMMENT;
styler.ColourTo(i,SCE_NNCRONTAB_COMMENT);
} else if( ch == '#' ) {
// signals the start of a plain comment...
state = SCE_NNCRONTAB_COMMENT;
styler.ColourTo(i,SCE_NNCRONTAB_COMMENT);
} else if( ch == ')' && styler.SafeGetCharAt(i+1) == '#') {
// signals the end of a task...
state = SCE_NNCRONTAB_TASK;
styler.ColourTo(i,SCE_NNCRONTAB_TASK);
} else if( ch == '"') {
state = SCE_NNCRONTAB_STRING;
styler.ColourTo(i,SCE_NNCRONTAB_STRING);
} else if( ch == '%') {
// signals environment variables
state = SCE_NNCRONTAB_ENVIRONMENT;
styler.ColourTo(i,SCE_NNCRONTAB_ENVIRONMENT);
} else if( ch == '*' ) {
// signals an asterisk
// no state jump necessary for this simple case...
styler.ColourTo(i,SCE_NNCRONTAB_ASTERISK);
} else if( isalpha(ch) || ch == '<' ) {
// signals the start of an identifier
bufferCount = 0;
buffer[bufferCount++] = ch;
state = SCE_NNCRONTAB_IDENTIFIER;
} else if( isdigit(ch) ) {
// signals the start of a number
bufferCount = 0;
buffer[bufferCount++] = ch;
state = SCE_NNCRONTAB_NUMBER;
} else {
// style it the default style..
styler.ColourTo(i,SCE_NNCRONTAB_DEFAULT);
}
break;
case SCE_NNCRONTAB_COMMENT:
// if we find a newline here,
// we simply go to default state
// else continue to work on it...
if( ch == '\n' || ch == '\r' ) {
state = SCE_NNCRONTAB_DEFAULT;
} else {
styler.ColourTo(i,SCE_NNCRONTAB_COMMENT);
}
break;
case SCE_NNCRONTAB_TASK:
// if we find a newline here,
// we simply go to default state
// else continue to work on it...
if( ch == '\n' || ch == '\r' ) {
state = SCE_NNCRONTAB_DEFAULT;
} else {
styler.ColourTo(i,SCE_NNCRONTAB_TASK);
}
break;
case SCE_NNCRONTAB_STRING:
if( ch == '%' ) {
state = SCE_NNCRONTAB_ENVIRONMENT;
insideString = true;
styler.ColourTo(i-1,SCE_NNCRONTAB_STRING);
break;
}
// if we find the end of a string char, we simply go to default state
// else we're still dealing with an string...
if( (ch == '"' && styler.SafeGetCharAt(i-1)!='\\') ||
(ch == '\n') || (ch == '\r') ) {
state = SCE_NNCRONTAB_DEFAULT;
}
styler.ColourTo(i,SCE_NNCRONTAB_STRING);
break;
case SCE_NNCRONTAB_ENVIRONMENT:
// if we find the end of a string char, we simply go to default state
// else we're still dealing with an string...
if( ch == '%' && insideString ) {
state = SCE_NNCRONTAB_STRING;
insideString = false;
break;
}
if( (ch == '%' && styler.SafeGetCharAt(i-1)!='\\')
|| (ch == '\n') || (ch == '\r') ) {
state = SCE_NNCRONTAB_DEFAULT;
styler.ColourTo(i,SCE_NNCRONTAB_ENVIRONMENT);
break;
}
styler.ColourTo(i+1,SCE_NNCRONTAB_ENVIRONMENT);
break;
case SCE_NNCRONTAB_IDENTIFIER:
// stay in CONF_IDENTIFIER state until we find a non-alphanumeric
if( isalnum(ch) || (ch == '_') || (ch == '-') || (ch == '/') ||
(ch == '$') || (ch == '.') || (ch == '<') || (ch == '>') ) {
buffer[bufferCount++] = ch;
} else {
state = SCE_NNCRONTAB_DEFAULT;
buffer[bufferCount] = '\0';
// check if the buffer contains a keyword,
// and highlight it if it is a keyword...
if(section.InList(buffer)) {
styler.ColourTo(i,SCE_NNCRONTAB_SECTION );
} else if(keyword.InList(buffer)) {
styler.ColourTo(i-1,SCE_NNCRONTAB_KEYWORD );
} // else if(strchr(buffer,'/') || strchr(buffer,'.')) {
// styler.ColourTo(i-1,SCE_NNCRONTAB_EXTENSION);
// }
else if(modifier.InList(buffer)) {
styler.ColourTo(i-1,SCE_NNCRONTAB_MODIFIER );
} else {
styler.ColourTo(i-1,SCE_NNCRONTAB_DEFAULT);
}
// push back the faulty character
chNext = styler[i--];
}
break;
case SCE_NNCRONTAB_NUMBER:
// stay in CONF_NUMBER state until we find a non-numeric
if( isdigit(ch) /* || ch == '.' */ ) {
buffer[bufferCount++] = ch;
} else {
state = SCE_NNCRONTAB_DEFAULT;
buffer[bufferCount] = '\0';
// Colourize here... (normal number)
styler.ColourTo(i-1,SCE_NNCRONTAB_NUMBER);
// push back a character
chNext = styler[i--];
}
break;
}
}
}
LexerModule lmNncrontab(SCLEX_NNCRONTAB, ColouriseNncrontabDoc, "nncrontab");

View File

@ -16,6 +16,7 @@
#include "PropSet.h"
#include "Accessor.h"
#include "StyleContext.h"
#include "KeyWords.h"
#include "Scintilla.h"
#include "SciLexer.h"
@ -31,23 +32,6 @@ inline bool isEiffelOperator(unsigned int ch) {
ch == '!' || ch == '@' || ch == '?';
}
static void getRangeLowered(unsigned int start,
unsigned int end,
Accessor &styler,
char *s,
unsigned int len) {
unsigned int i = 0;
while ((i < end - start + 1) && (i < len-1)) {
s[i] = static_cast<char>(tolower(styler[start + i]));
i++;
}
s[i] = '\0';
}
inline bool IsASpace(unsigned int ch) {
return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d));
}
inline bool IsAWordChar(unsigned int ch) {
return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
}
@ -56,81 +40,6 @@ inline bool IsAWordStart(unsigned int ch) {
return (ch < 0x80) && (isalnum(ch) || ch == '_');
}
inline bool IsADigit(unsigned int ch) {
return (ch >= '0') && (ch <= '9');
}
// All languages handled so far can treat all characters >= 0x80 as one class
// which just continues the current token or starts an identifier if in default.
// DBCS treated specially as the second character can be < 0x80 and hence
// syntactically significant. UTF-8 avoids this as all trail bytes are >= 0x80
class xColouriseContext {
Accessor &styler;
int lengthDoc;
int currentPos;
xColouriseContext& operator=(const xColouriseContext&) {
return *this;
}
public:
int state;
unsigned int chPrev;
unsigned int ch;
unsigned int chNext;
xColouriseContext(unsigned int startPos, int length,
int initStyle, Accessor &styler_) :
styler(styler_),
lengthDoc(startPos + length),
currentPos(startPos),
state(initStyle),
chPrev(0),
ch(0),
chNext(0) {
styler.StartAt(startPos);
styler.StartSegment(startPos);
int pos = currentPos;
ch = static_cast<unsigned char>(styler.SafeGetCharAt(pos));
if (styler.IsLeadByte(static_cast<char>(ch))) {
pos++;
ch = ch << 8;
ch |= static_cast<unsigned char>(styler.SafeGetCharAt(pos));
}
chNext = static_cast<unsigned char>(styler.SafeGetCharAt(pos+1));
if (styler.IsLeadByte(static_cast<char>(chNext))) {
chNext = chNext << 8;
chNext |= static_cast<unsigned char>(styler.SafeGetCharAt(pos+2));
}
}
void Complete() {
styler.ColourTo(currentPos - 1, state);
}
bool More() {
return currentPos <= lengthDoc;
}
void Forward() {
chPrev = ch;
currentPos++;
if (ch >= 0x100)
currentPos++;
ch = chNext;
chNext = static_cast<unsigned char>(styler.SafeGetCharAt(currentPos+1));
if (styler.IsLeadByte(static_cast<char>(chNext))) {
chNext = chNext << 8;
chNext |= static_cast<unsigned char>(styler.SafeGetCharAt(currentPos + 2));
}
}
void ChangeState(int state_) {
state = state_;
}
void SetState(int state_) {
styler.ColourTo(currentPos - 1, state);
state = state_;
}
void GetCurrentLowered(char *s, int len) {
getRangeLowered(styler.GetStartSegment(), currentPos - 1, styler, s, len);
}
};
static void ColouriseEiffelDoc(unsigned int startPos,
int length,
int initStyle,
@ -139,68 +48,68 @@ static void ColouriseEiffelDoc(unsigned int startPos,
WordList &keywords = *keywordlists[0];
xColouriseContext lc(startPos, length, initStyle, styler);
StyleContext sc(startPos, length, initStyle, styler);
for (; lc.More(); lc.Forward()) {
for (; sc.More(); sc.Forward()) {
if (lc.state == SCE_EIFFEL_STRINGEOL) {
if (lc.ch != '\r' && lc.ch != '\n') {
lc.SetState(SCE_EIFFEL_DEFAULT);
if (sc.state == SCE_EIFFEL_STRINGEOL) {
if (sc.ch != '\r' && sc.ch != '\n') {
sc.SetState(SCE_EIFFEL_DEFAULT);
}
} else if (lc.state == SCE_EIFFEL_OPERATOR) {
lc.SetState(SCE_EIFFEL_DEFAULT);
} else if (lc.state == SCE_EIFFEL_WORD) {
if (!IsAWordChar(lc.ch)) {
} else if (sc.state == SCE_EIFFEL_OPERATOR) {
sc.SetState(SCE_EIFFEL_DEFAULT);
} else if (sc.state == SCE_EIFFEL_WORD) {
if (!IsAWordChar(sc.ch)) {
char s[100];
lc.GetCurrentLowered(s, sizeof(s));
sc.GetCurrentLowered(s, sizeof(s));
if (!keywords.InList(s)) {
lc.ChangeState(SCE_EIFFEL_IDENTIFIER);
sc.ChangeState(SCE_EIFFEL_IDENTIFIER);
}
lc.SetState(SCE_EIFFEL_DEFAULT);
sc.SetState(SCE_EIFFEL_DEFAULT);
}
} else if (lc.state == SCE_EIFFEL_NUMBER) {
if (!IsAWordChar(lc.ch)) {
lc.SetState(SCE_EIFFEL_DEFAULT);
} else if (sc.state == SCE_EIFFEL_NUMBER) {
if (!IsAWordChar(sc.ch)) {
sc.SetState(SCE_EIFFEL_DEFAULT);
}
} else if (lc.state == SCE_EIFFEL_COMMENTLINE) {
if (lc.ch == '\r' || lc.ch == '\n') {
lc.SetState(SCE_EIFFEL_DEFAULT);
} else if (sc.state == SCE_EIFFEL_COMMENTLINE) {
if (sc.ch == '\r' || sc.ch == '\n') {
sc.SetState(SCE_EIFFEL_DEFAULT);
}
} else if (lc.state == SCE_EIFFEL_STRING) {
if (lc.ch == '%') {
lc.Forward();
} else if (lc.ch == '\"') {
lc.Forward();
lc.SetState(SCE_EIFFEL_DEFAULT);
} else if (sc.state == SCE_EIFFEL_STRING) {
if (sc.ch == '%') {
sc.Forward();
} else if (sc.ch == '\"') {
sc.Forward();
sc.SetState(SCE_EIFFEL_DEFAULT);
}
} else if (lc.state == SCE_EIFFEL_CHARACTER) {
if (lc.ch == '\r' || lc.ch == '\n') {
lc.SetState(SCE_EIFFEL_STRINGEOL);
} else if (lc.ch == '%') {
lc.Forward();
} else if (lc.ch == '\'') {
lc.Forward();
lc.SetState(SCE_EIFFEL_DEFAULT);
} else if (sc.state == SCE_EIFFEL_CHARACTER) {
if (sc.ch == '\r' || sc.ch == '\n') {
sc.SetState(SCE_EIFFEL_STRINGEOL);
} else if (sc.ch == '%') {
sc.Forward();
} else if (sc.ch == '\'') {
sc.Forward();
sc.SetState(SCE_EIFFEL_DEFAULT);
}
}
if (lc.state == SCE_EIFFEL_DEFAULT) {
if (lc.ch == '-' && lc.chNext == '-') {
lc.SetState(SCE_EIFFEL_COMMENTLINE);
} else if (lc.ch == '\"') {
lc.SetState(SCE_EIFFEL_STRING);
} else if (lc.ch == '\'') {
lc.SetState(SCE_EIFFEL_CHARACTER);
} else if (IsADigit(lc.ch) || (lc.ch == '.')) {
lc.SetState(SCE_EIFFEL_NUMBER);
} else if (IsAWordStart(lc.ch)) {
lc.SetState(SCE_EIFFEL_WORD);
} else if (isEiffelOperator(lc.ch)) {
lc.SetState(SCE_EIFFEL_OPERATOR);
if (sc.state == SCE_EIFFEL_DEFAULT) {
if (sc.ch == '-' && sc.chNext == '-') {
sc.SetState(SCE_EIFFEL_COMMENTLINE);
} else if (sc.ch == '\"') {
sc.SetState(SCE_EIFFEL_STRING);
} else if (sc.ch == '\'') {
sc.SetState(SCE_EIFFEL_CHARACTER);
} else if (IsADigit(sc.ch) || (sc.ch == '.')) {
sc.SetState(SCE_EIFFEL_NUMBER);
} else if (IsAWordStart(sc.ch)) {
sc.SetState(SCE_EIFFEL_WORD);
} else if (isEiffelOperator(sc.ch)) {
sc.SetState(SCE_EIFFEL_OPERATOR);
}
}
}
lc.Complete();
sc.Complete();
}
static bool IsEiffelComment(Accessor &styler, int pos, int len) {

View File

@ -1,7 +1,7 @@
// Scintilla source code edit control
/** @file LexHTML.cxx
** Lexer for HTML.
**/
**/
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
@ -23,16 +23,16 @@
#define SCE_HA_VBS (SCE_HBA_START - SCE_HB_START)
#define SCE_HA_PYTHON (SCE_HPA_START - SCE_HP_START)
enum { eScriptNone = 0, eScriptJS, eScriptVBS, eScriptPython, eScriptPHP, eScriptXML };
enum { eScriptNone = 0, eScriptJS, eScriptVBS, eScriptPython, eScriptPHP, eScriptXML, eScriptSGML, eScriptSGMLblock };
enum { eHtml = 0, eNonHtmlScript, eNonHtmlPreProc, eNonHtmlScriptPreProc };
static int segIsScriptingIndicator(Accessor &styler, unsigned int start, unsigned int end, int prevValue) {
char s[30 + 1];
s[0] = '\0';
for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
unsigned int i = 0;
for (; i < end - start + 1 && i < 30; i++) {
s[i] = static_cast<char>(tolower(styler[start + i]));
s[i + 1] = '\0';
}
s[i] = '\0';
//Platform::DebugPrintf("Scripting indicator [%s]\n", s);
if (strstr(s, "src")) // External script
return eScriptNone;
@ -55,11 +55,11 @@ static int segIsScriptingIndicator(Accessor &styler, unsigned int start, unsigne
static int PrintScriptingIndicatorOffset(Accessor &styler, unsigned int start, unsigned int end) {
int iResult = 0;
char s[30 + 1];
s[0] = '\0';
for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
unsigned int i = 0;
for (; i < end - start + 1 && i < 30; i++) {
s[i] = static_cast<char>(tolower(styler[start + i]));
s[i + 1] = '\0';
}
s[i] = '\0';
if (0 == strncmp(s, "php", 3)) {
iResult = 3;
}
@ -68,22 +68,21 @@ static int PrintScriptingIndicatorOffset(Accessor &styler, unsigned int start, u
}
static int ScriptOfState(int state) {
int scriptLanguage;
if ((state >= SCE_HP_START) && (state <= SCE_HP_IDENTIFIER)) {
scriptLanguage = eScriptPython;
return eScriptPython;
} else if ((state >= SCE_HB_START) && (state <= SCE_HB_STRINGEOL)) {
scriptLanguage = eScriptVBS;
return eScriptVBS;
} else if ((state >= SCE_HJ_START) && (state <= SCE_HJ_REGEX)) {
scriptLanguage = eScriptJS;
return eScriptJS;
} else if ((state >= SCE_HPHP_DEFAULT) && (state <= SCE_HPHP_COMMENTLINE)) {
scriptLanguage = eScriptPHP;
return eScriptPHP;
} else if ((state >= SCE_H_SGML_DEFAULT) && (state <= SCE_H_SGML_BLOCK_DEFAULT)) {
return eScriptSGML;
} else if (state == SCE_H_SGML_BLOCK_DEFAULT) {
return eScriptSGMLblock;
} else {
// scriptLanguage = defaultScript;
scriptLanguage = eScriptNone;
return eScriptNone;
}
return scriptLanguage;
}
static int statePrintForState(int state, int inScriptType) {
@ -174,11 +173,11 @@ static void classifyAttribHTML(unsigned int start, unsigned int end, WordList &k
chAttr = SCE_H_NUMBER;
} else {
char s[30 + 1];
s[0] = '\0';
for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
unsigned int i = 0;
for (; i < end - start + 1 && i < 30; i++) {
s[i] = static_cast<char>(tolower(styler[start + i]));
s[i + 1] = '\0';
}
s[i] = '\0';
if (keywords.InList(s))
chAttr = SCE_H_ATTRIBUTE;
}
@ -195,18 +194,14 @@ static int classifyTagHTML(unsigned int start, unsigned int end,
unsigned int i = 0;
for (unsigned int cPos = start; cPos <= end && i < 30; cPos++) {
char ch = styler[cPos];
if (ch != '<')
if ((ch != '<') && (ch != '/'))
s[i++] = static_cast<char>(tolower(ch));
}
s[i] = '\0';
bool isScript = false;
char chAttr = SCE_H_TAGUNKNOWN;
if (s[0] == '!' && s[1] == '-' && s[2] == '-') { //Comment
chAttr = SCE_H_COMMENT;
} else if (strcmp(s, "![cdata[") == 0) { // In lower case because already converted
chAttr = SCE_H_CDATA;
} else if (s[0] == '!') {
chAttr = SCE_H_SGML;
if (s[0] == '!') {
chAttr = SCE_H_SGML_DEFAULT;
} else if (s[0] == '/') { // Closing tag
if (keywords.InList(s + 1))
chAttr = SCE_H_TAG;
@ -231,10 +226,11 @@ static void classifyWordHTJS(unsigned int start, unsigned int end,
chAttr = SCE_HJ_NUMBER;
else {
char s[30 + 1];
for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
unsigned int i = 0;
for (; i < end - start + 1 && i < 30; i++) {
s[i] = styler[start + i];
s[i + 1] = '\0';
}
s[i] = '\0';
if (keywords.InList(s))
chAttr = SCE_HJ_KEYWORD;
}
@ -248,10 +244,11 @@ static int classifyWordHTVB(unsigned int start, unsigned int end, WordList &keyw
chAttr = SCE_HB_NUMBER;
else {
char s[30 + 1];
for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
unsigned int i = 0;
for (; i < end - start + 1 && i < 30; i++) {
s[i] = static_cast<char>(tolower(styler[start + i]));
s[i + 1] = '\0';
}
s[i] = '\0';
if (keywords.InList(s)) {
chAttr = SCE_HB_WORD;
if (strcmp(s, "rem") == 0)
@ -268,10 +265,11 @@ static int classifyWordHTVB(unsigned int start, unsigned int end, WordList &keyw
static void classifyWordHTPy(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord, int inScriptType) {
bool wordIsNumber = isdigit(styler[start]);
char s[30 + 1];
for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
unsigned int i = 0;
for (; i < end - start + 1 && i < 30; i++) {
s[i] = styler[start + i];
s[i + 1] = '\0';
}
s[i] = '\0';
char chAttr = SCE_HP_IDENTIFIER;
if (0 == strcmp(prevWord, "class"))
chAttr = SCE_HP_CLASSNAME;
@ -294,16 +292,37 @@ static void classifyWordHTPHP(unsigned int start, unsigned int end, WordList &ke
chAttr = SCE_HPHP_NUMBER;
else {
char s[30 + 1];
for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
unsigned int i = 0;
for (; i < end - start + 1 && i < 30; i++) {
s[i] = styler[start + i];
s[i + 1] = '\0';
}
s[i] = '\0';
if (keywords.InList(s))
chAttr = SCE_HPHP_WORD;
}
styler.ColourTo(end, chAttr);
}
static bool isWordHSGML(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) {
char s[30 + 1];
unsigned int i = 0;
for (; i < end - start + 1 && i < 30; i++) {
s[i] = styler[start + i];
}
s[i] = '\0';
return keywords.InList(s);
}
static bool isWordCdata(unsigned int start, unsigned int end, Accessor &styler) {
char s[30 + 1];
unsigned int i = 0;
for (; i < end - start + 1 && i < 30; i++) {
s[i] = styler[start + i];
}
s[i] = '\0';
return (0 == strcmp(s, "[CDATA["));
}
// Return the first state to reach when entering a scripting language
static int StateForScript(int scriptLanguage) {
int Result;
@ -320,6 +339,9 @@ static int StateForScript(int scriptLanguage) {
case eScriptXML:
Result = SCE_H_TAGUNKNOWN;
break;
case eScriptSGML:
Result = SCE_H_SGML_DEFAULT;
break;
default :
Result = SCE_HJ_START;
break;
@ -331,6 +353,10 @@ inline bool ishtmlwordchar(char ch) {
return isalnum(ch) || ch == '.' || ch == '-' || ch == '_' || ch == ':' || ch == '!' || ch == '#';
}
inline bool issgmlwordchar(char ch) {
return isalnum(ch) || ch == '.' || ch == '_' || ch == ':' || ch == '!' || ch == '#' || ch == '[';
}
static bool InTagState(int state) {
return state == SCE_H_TAG || state == SCE_H_TAGUNKNOWN ||
state == SCE_H_SCRIPT ||
@ -339,6 +365,10 @@ static bool InTagState(int state) {
state == SCE_H_DOUBLESTRING || state == SCE_H_SINGLESTRING;
}
static bool IsCommentState(const int state) {
return state == SCE_H_COMMENT || state == SCE_H_SGML_COMMENT;
}
static bool isLineEnd(char ch) {
return ch == '\r' || ch == '\n';
}
@ -348,23 +378,23 @@ static bool isOKBeforeRE(char ch) {
}
static bool isPHPStringState(int state) {
return
(state == SCE_HPHP_HSTRING) ||
(state == SCE_HPHP_SIMPLESTRING) ||
(state == SCE_HPHP_HSTRING_VARIABLE);
return
(state == SCE_HPHP_HSTRING) ||
(state == SCE_HPHP_SIMPLESTRING) ||
(state == SCE_HPHP_HSTRING_VARIABLE);
}
static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[],
Accessor &styler) {
WordList &keywords = *keywordlists[0];
WordList &keywords2 = *keywordlists[1];
WordList &keywords3 = *keywordlists[2];
WordList &keywords4 = *keywordlists[3];
WordList &keywords5 = *keywordlists[4];
WordList &keywords6 = *keywordlists[5]; // SGML (DTD) keywords
// Lexer for HTML requires more lexical states (7 bits worth) than most lexers
styler.StartAt(startPos, 127);
styler.StartAt(startPos, STYLE_MAX);
char prevWord[200];
prevWord[0] = '\0';
int StateToPrint = initStyle;
@ -374,49 +404,51 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
if (InTagState(state)) {
while ((startPos > 0) && (InTagState(styler.StyleAt(startPos - 1)))) {
startPos--;
length++;
length++;
}
state = SCE_H_DEFAULT;
}
styler.StartAt(startPos, 127);
styler.StartAt(startPos, STYLE_MAX);
int lineState = eScriptVBS;
int lineCurrent = styler.GetLine(startPos);
if (lineCurrent > 0)
int lineState;
if (lineCurrent > 0) {
lineState = styler.GetLineState(lineCurrent);
int inScriptType = (lineState >> 0) & 0x03; // 2 bits of scripting type
bool tagOpened = (lineState >> 2) & 0x01; // 1 bit to know if we are in an opened tag
bool tagClosing = (lineState >> 3) & 0x01; // 1 bit to know if we are in a closing tag
int defaultScript = (lineState >> 4) & 0x0F; // 4 bits of script name
int beforePreProc = (lineState >> 8) & 0xFF; // 8 bits of state
} else {
// Default client and ASP scripting language is JavaScript
lineState = eScriptJS << 8;
lineState |= styler.GetPropertyInt("asp.default.language", eScriptJS) << 4;
}
int inScriptType = (lineState >> 0) & 0x03; // 2 bits of scripting type
bool tagOpened = (lineState >> 2) & 0x01; // 1 bit to know if we are in an opened tag
bool tagClosing = (lineState >> 3) & 0x01; // 1 bit to know if we are in a closing tag
int aspScript = (lineState >> 4) & 0x0F; // 4 bits of script name
int clientScript = (lineState >> 8) & 0x0F; // 4 bits of script name
int beforePreProc = (lineState >> 12) & 0xFF; // 8 bits of state
int scriptLanguage = ScriptOfState(state);
bool fold = styler.GetPropertyInt("fold");
bool foldHTML = styler.GetPropertyInt("fold.html",0);
bool foldCompact = styler.GetPropertyInt("fold.compact",1);
fold = foldHTML && fold;
const bool foldHTML = styler.GetPropertyInt("fold.html", 0);
const bool fold = foldHTML && styler.GetPropertyInt("fold");
const bool foldCompact = styler.GetPropertyInt("fold.compact", 1);
int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
int levelCurrent = levelPrev;
int visibleChars;
visibleChars = 0;
int visibleChars = 0;
char chPrev = ' ';
char ch = ' ';
char chPrevNonWhite = ' ';
styler.StartSegment(startPos);
int lengthDoc = startPos + length;
const int lengthDoc = startPos + length;
for (int i = startPos; i < lengthDoc; i++) {
char chPrev2 = chPrev;
const char chPrev2 = chPrev;
chPrev = ch;
if (ch != ' ' && ch != '\t')
chPrevNonWhite = ch;
ch = styler[i];
char chNext = styler.SafeGetCharAt(i + 1);
char chNext2 = styler.SafeGetCharAt(i + 2);
const char chNext2 = styler.SafeGetCharAt(i + 2);
// Handle DBCS codepages
if (styler.IsLeadByte(ch)) {
@ -451,18 +483,21 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
} else if ((ch == '\n') && !((chNext == '\r') && (chNext2 == '\n')) && (chNext != '\n')) {
// check if the number of tabs is lower than the level
int Findlevel = (levelCurrent & ~SC_FOLDLEVELBASE) * 8;
for (int j = 0;Findlevel > 0;j++) {
for (int j = 0; Findlevel > 0; j++) {
char chTmp = styler.SafeGetCharAt(i + j + 1);
if (chTmp == '\t') {
Findlevel -= 8;
} else if (chTmp == ' ') {
} else if (chTmp == ' ') {
Findlevel--;
} else break;
} else {
break;
}
}
if (Findlevel > 0) {
levelCurrent -= Findlevel / 8;
if (Findlevel % 8) levelCurrent--;
if (Findlevel % 8)
levelCurrent--;
}
}
}
@ -487,11 +522,12 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
}
lineCurrent++;
styler.SetLineState(lineCurrent,
((inScriptType & 0x03) << 0) |
((tagOpened & 0x01) << 2) |
((tagClosing & 0x01) << 3) |
((defaultScript & 0x0F) << 4) |
((beforePreProc & 0xFF) << 8));
((inScriptType & 0x03) << 0) |
((tagOpened & 0x01) << 2) |
((tagClosing & 0x01) << 3) |
((aspScript & 0x0F) << 4) |
((clientScript & 0x0F) << 8) |
((beforePreProc & 0xFF) << 12));
}
// generic end of script processing
@ -503,9 +539,9 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
case SCE_H_SINGLESTRING:
case SCE_HJ_COMMENT:
case SCE_HJ_COMMENTDOC:
// SCE_HJ_COMMENTLINE removed as this is a common thing done to hide
// the end of script marker from some JS interpreters.
//case SCE_HJ_COMMENTLINE:
// SCE_HJ_COMMENTLINE removed as this is a common thing done to hide
// the end of script marker from some JS interpreters.
//case SCE_HJ_COMMENTLINE:
case SCE_HJ_DOUBLESTRING:
case SCE_HJ_SINGLESTRING:
case SCE_HB_STRING:
@ -514,29 +550,31 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
case SCE_HP_TRIPLEDOUBLE:
break;
default :
// maybe we should check here if it's a tag and if it's SCRIPT
// closing tag of the script (it's a closing HTML tag anyway)
styler.ColourTo(i - 1, StateToPrint);
state = SCE_H_TAGUNKNOWN;
inScriptType = eHtml;
scriptLanguage = eScriptNone;
clientScript = eScriptJS;
i += 2;
// unfold closing script
levelCurrent--;
visibleChars += 2;
tagClosing = true;
continue;
}
}
/////////////////////////////////////
// handle the start of PHP pre-processor = Non-HTML
else if ((state != SCE_H_ASPAT) &&
!isPHPStringState(state) &&
(state != SCE_HPHP_COMMENT) &&
(ch == '<') &&
(chNext == '?')) {
else if ((state != SCE_H_ASPAT) &&
!isPHPStringState(state) &&
(state != SCE_HPHP_COMMENT) &&
(ch == '<') &&
(chNext == '?')) {
styler.ColourTo(i - 1, StateToPrint);
beforePreProc = state;
scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment() + 2, i + 10, eScriptPHP);
i++;
visibleChars++;
i += PrintScriptingIndicatorOffset(styler, styler.GetStartSegment() + 2, i + 10);
if (scriptLanguage == eScriptXML)
styler.ColourTo(i, SCE_H_XMLSTART);
@ -567,6 +605,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
if (chNext2 == '@') {
i += 2; // place as if it was the second next char treated
visibleChars += 2;
state = SCE_H_ASPAT;
} else if ((chNext2 == '-') && (styler.SafeGetCharAt(i + 3) == '-')) {
styler.ColourTo(i + 3, SCE_H_ASP);
@ -576,11 +615,13 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
} else {
if (chNext2 == '=') {
i += 2; // place as if it was the second next char treated
visibleChars += 2;
} else {
i++; // place as if it was the next char treated
visibleChars++;
}
state = StateForScript(defaultScript);
state = StateForScript(aspScript);
}
scriptLanguage = eScriptVBS;
styler.ColourTo(i, SCE_H_ASP);
@ -591,17 +632,42 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
continue;
}
/////////////////////////////////////
// handle the start of SGML language (DTD)
else if (((scriptLanguage == eScriptNone) || (scriptLanguage == eScriptXML)) &&
(chPrev == '<') &&
(ch == '!') &&
(StateToPrint != SCE_H_CDATA) && (!IsCommentState(StateToPrint))) {
beforePreProc = state;
styler.ColourTo(i - 2, StateToPrint);
if ((chNext == '-') && (chNext2 == '-')) {
state = SCE_H_COMMENT; // wait for a pending command
}
else if (isWordCdata(i + 1, i + 7, styler)) {
state = SCE_H_CDATA;
} else {
styler.ColourTo(i, SCE_H_SGML_DEFAULT); // <! is default
scriptLanguage = eScriptSGML;
state = SCE_H_SGML_COMMAND; // wait for a pending command
}
// fold whole tag (-- when closing the tag)
levelCurrent++;
continue;
}
// handle the end of a pre-processor = Non-HTML
else if (
((inScriptType == eNonHtmlPreProc)
|| (inScriptType == eNonHtmlScriptPreProc)) && (
((scriptLanguage == eScriptPHP) && (ch == '?') && !isPHPStringState(state) && (state != SCE_HPHP_COMMENT)) ||
((scriptLanguage != eScriptNone) && !isStringState(state) &&
(ch == '%'))
) && (chNext == '>')) {
else if ((
((inScriptType == eNonHtmlPreProc)
|| (inScriptType == eNonHtmlScriptPreProc)) && (
((scriptLanguage == eScriptPHP) && (ch == '?') && !isPHPStringState(state) && (state != SCE_HPHP_COMMENT)) ||
((scriptLanguage != eScriptNone) && !isStringState(state) &&
(ch == '%'))
) && (chNext == '>')) ||
((scriptLanguage == eScriptSGML) && (ch == '>') && (state != SCE_H_SGML_COMMENT))) {
if (state == SCE_H_ASPAT) {
defaultScript = segIsScriptingIndicator(styler,
styler.GetStartSegment(), i - 1, defaultScript);
aspScript = segIsScriptingIndicator(styler,
styler.GetStartSegment(), i - 1, aspScript);
}
// Bounce out of any ASP mode
switch (state) {
@ -624,11 +690,16 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
styler.ColourTo(i - 1, StateToPrint);
break;
}
i++;
if (scriptLanguage != eScriptSGML) {
i++;
visibleChars++;
}
if (ch == '%')
styler.ColourTo(i, SCE_H_ASP);
else if (scriptLanguage == eScriptXML)
styler.ColourTo(i, SCE_H_XMLEND);
else if (scriptLanguage == eScriptSGML)
styler.ColourTo(i, SCE_H_SGML_DEFAULT);
else
styler.ColourTo(i, SCE_H_QUESTION);
state = beforePreProc;
@ -648,47 +719,156 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
if (ch == '<') {
// in HTML, fold on tag open and unfold on tag close
tagOpened = true;
if (chNext == '/') {
tagClosing = true;
} else {
tagClosing = false;
}
tagClosing = (chNext == '/');
styler.ColourTo(i - 1, StateToPrint);
if (chNext == '!' && chNext2 == '-' && styler.SafeGetCharAt(i + 3) == '-') {
// should be better
i += 3;
levelCurrent++;
state = SCE_H_COMMENT;
} else
if (chNext != '!')
state = SCE_H_TAGUNKNOWN;
} else if (ch == '&') {
styler.ColourTo(i - 1, SCE_H_DEFAULT);
state = SCE_H_ENTITY;
}
break;
case SCE_H_COMMENT:
if ((ch == '>') && (chPrev == '-') && (chPrev2 == '-')) {
// unfold HTML comment
levelCurrent--;
case SCE_H_SGML_DEFAULT:
if (scriptLanguage == eScriptSGMLblock)
StateToPrint = SCE_H_SGML_BLOCK_DEFAULT;
if (ch == '\"') {
styler.ColourTo(i - 1, StateToPrint);
state = SCE_H_SGML_DOUBLESTRING;
} else if (ch == '\'') {
styler.ColourTo(i - 1, StateToPrint);
state = SCE_H_SGML_SIMPLESTRING;
} else if ((ch == '-') && (chPrev == '-')) {
styler.ColourTo(i - 2, StateToPrint);
state = SCE_H_SGML_COMMENT;
} else if (isalpha(ch) && (chPrev == '%')) {
styler.ColourTo(i - 2, StateToPrint);
state = SCE_H_SGML_ENTITY;
} else if (ch == '#') {
styler.ColourTo(i - 1, StateToPrint);
state = SCE_H_SGML_SPECIAL;
} else if (ch == '[') {
styler.ColourTo(i - 1, StateToPrint);
scriptLanguage = eScriptSGMLblock;
} else if (ch == ']') {
if (scriptLanguage == eScriptSGMLblock) {
styler.ColourTo(i, StateToPrint);
scriptLanguage = eScriptSGML;
} else {
styler.ColourTo(i - 1, StateToPrint);
styler.ColourTo(i, SCE_H_SGML_ERROR);
}
} else if (scriptLanguage == eScriptSGMLblock) {
if ((ch == '!') && (chPrev == '<')) {
styler.ColourTo(i - 2, StateToPrint);
styler.ColourTo(i, SCE_H_SGML_DEFAULT);
state = SCE_H_SGML_COMMAND;
} else if (ch == '>') {
styler.ColourTo(i - 1, StateToPrint);
styler.ColourTo(i, SCE_H_SGML_DEFAULT);
}
}
break;
case SCE_H_SGML_COMMAND:
if ((ch == '-') && (chPrev == '-')) {
styler.ColourTo(i - 2, StateToPrint);
state = SCE_H_SGML_COMMENT;
} else if (!issgmlwordchar(ch)) {
if (isWordHSGML(styler.GetStartSegment(), i - 1, keywords6, styler)) {
styler.ColourTo(i - 1, StateToPrint);
state = SCE_H_SGML_1ST_PARAM;
} else {
state = SCE_H_SGML_ERROR;
}
}
break;
case SCE_H_SGML_1ST_PARAM:
// wait for the beginning of the word
if ((ch == '-') && (chPrev == '-')) {
if (scriptLanguage == eScriptSGMLblock) {
styler.ColourTo(i - 2, SCE_H_SGML_BLOCK_DEFAULT);
} else {
styler.ColourTo(i - 2, SCE_H_SGML_DEFAULT);
}
state = SCE_H_SGML_1ST_PARAM_COMMENT;
} else if (issgmlwordchar(ch)) {
if (scriptLanguage == eScriptSGMLblock) {
styler.ColourTo(i - 1, SCE_H_SGML_BLOCK_DEFAULT);
} else {
styler.ColourTo(i - 1, SCE_H_SGML_DEFAULT);
}
// find the length of the word
int size = 1;
while (ishtmlwordchar(styler.SafeGetCharAt(i + size)))
size++;
styler.ColourTo(i + size - 1, StateToPrint);
i += size - 1;
visibleChars += size - 1;
ch = styler.SafeGetCharAt(i);
state = SCE_H_SGML_DEFAULT;
continue;
}
break;
case SCE_H_SGML_ERROR:
if ((ch == '-') && (chPrev == '-')) {
styler.ColourTo(i - 2, StateToPrint);
state = SCE_H_SGML_COMMENT;
}
case SCE_H_SGML_DOUBLESTRING:
if (ch == '\"') {
styler.ColourTo(i, StateToPrint);
state = SCE_H_DEFAULT;
tagOpened = false;
state = SCE_H_SGML_DEFAULT;
}
break;
case SCE_H_SGML_SIMPLESTRING:
if (ch == '\'') {
styler.ColourTo(i, StateToPrint);
state = SCE_H_SGML_DEFAULT;
}
break;
case SCE_H_SGML_COMMENT:
if ((ch == '-') && (chPrev == '-')) {
styler.ColourTo(i, StateToPrint);
state = SCE_H_SGML_DEFAULT;
}
break;
case SCE_H_CDATA:
if ((ch == '>') && (chPrev == ']') && (chPrev2 == ']')) {
if ((chPrev2 == ']') && (chPrev == ']') && (ch == '>')) {
styler.ColourTo(i, StateToPrint);
state = SCE_H_DEFAULT;
tagOpened = false;
levelCurrent--;
}
break;
case SCE_H_SGML:
if (ch == '>') {
levelCurrent--;
case SCE_H_COMMENT:
if ((chPrev2 == '-') && (chPrev == '-') && (ch == '>')) {
styler.ColourTo(i, StateToPrint);
state = SCE_H_DEFAULT;
tagOpened = false;
levelCurrent--;
}
break;
case SCE_H_SGML_1ST_PARAM_COMMENT:
if ((ch == '-') && (chPrev == '-')) {
styler.ColourTo(i, SCE_H_SGML_COMMENT);
state = SCE_H_SGML_1ST_PARAM;
}
break;
case SCE_H_SGML_SPECIAL:
if (!isupper(ch)) {
styler.ColourTo(i - 1, StateToPrint);
if (isalnum(ch)) {
state = SCE_H_SGML_ERROR;
} else {
state = SCE_H_SGML_DEFAULT;
}
}
break;
case SCE_H_SGML_ENTITY:
if (ch == ';') {
styler.ColourTo(i, StateToPrint);
state = SCE_H_SGML_DEFAULT;
} else if (!isalnum(ch) && ch != '-' && ch != '.') {
styler.ColourTo(i, SCE_H_SGML_ERROR);
state = SCE_H_SGML_DEFAULT;
}
break;
case SCE_H_ENTITY:
@ -705,9 +885,14 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
if (!ishtmlwordchar(ch) && !((ch == '/') && (chPrev == '<')) && ch != '[') {
int eClass = classifyTagHTML(styler.GetStartSegment(), i - 1, keywords, styler);
if (eClass == SCE_H_SCRIPT) {
inScriptType = eNonHtmlScript;
scriptLanguage = defaultScript;
eClass = SCE_H_TAG;
if (!tagClosing) {
inScriptType = eNonHtmlScript;
scriptLanguage = clientScript;
eClass = SCE_H_TAG;
} else {
scriptLanguage = eScriptNone;
eClass = SCE_H_TAG;
}
}
if (ch == '>') {
styler.ColourTo(i, eClass);
@ -717,28 +902,27 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
state = SCE_H_DEFAULT;
}
tagOpened = false;
if (tagClosing)
if (tagClosing) {
levelCurrent--;
else
levelCurrent++;
tagClosing = false;
} else if (ch == '/' && chNext == '>') {
if (eClass == SCE_H_TAGUNKNOWN) {
styler.ColourTo(i + 1, SCE_H_TAGUNKNOWN);
} else {
styler.ColourTo(i - 1, StateToPrint);
styler.ColourTo(i + 1, SCE_H_TAGEND);
levelCurrent++;
}
i++;
ch = chNext;
state = SCE_H_DEFAULT;
tagClosing = false;
} else if (ch == '/' && chNext == '>') {
if (eClass == SCE_H_TAGUNKNOWN) {
styler.ColourTo(i + 1, SCE_H_TAGUNKNOWN);
} else {
styler.ColourTo(i - 1, StateToPrint);
styler.ColourTo(i + 1, SCE_H_TAGEND);
}
i++;
ch = chNext;
state = SCE_H_DEFAULT;
tagOpened = false;
} else {
if (eClass != SCE_H_TAGUNKNOWN) {
if (eClass == SCE_H_CDATA) {
state = SCE_H_CDATA;
} else if (eClass == SCE_H_SGML) {
state = SCE_H_SGML;
if (eClass == SCE_H_SGML_DEFAULT) {
state = SCE_H_SGML_DEFAULT;
} else {
state = SCE_H_OTHER;
}
@ -750,7 +934,8 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
if (!ishtmlwordchar(ch) && ch != '/' && ch != '-') {
if (inScriptType == eNonHtmlScript) {
int scriptLanguagePrev = scriptLanguage;
scriptLanguage = segIsScriptingIndicator(styler, styler.GetStartSegment(), i - 1, scriptLanguage);
clientScript = segIsScriptingIndicator(styler, styler.GetStartSegment(), i - 1, scriptLanguage);
scriptLanguage = clientScript;
if ((scriptLanguagePrev != scriptLanguage) && (scriptLanguage == eScriptNone))
inScriptType = eHtml;
}
@ -1217,18 +1402,18 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
case SCE_HPHP_NUMBER:
if (!isdigit(ch)) {
styler.ColourTo(i - 1, SCE_HPHP_NUMBER);
if (isoperator(ch))
state =SCE_HPHP_OPERATOR;
else
if (isoperator(ch))
state = SCE_HPHP_OPERATOR;
else
state = SCE_HPHP_DEFAULT;
}
break;
case SCE_HPHP_VARIABLE:
if (!iswordstart(ch)) {
styler.ColourTo(i - 1, SCE_HPHP_VARIABLE);
if (isoperator(ch))
state =SCE_HPHP_OPERATOR;
else
if (isoperator(ch))
state = SCE_HPHP_OPERATOR;
else
state = SCE_HPHP_DEFAULT;
}
break;
@ -1249,7 +1434,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
// skip the next char
i++;
} else if (ch == '$') {
styler.ColourTo(i-1, StateToPrint);
styler.ColourTo(i - 1, StateToPrint);
state = SCE_HPHP_HSTRING_VARIABLE;
} else if (ch == '\"') {
styler.ColourTo(i, StateToPrint);
@ -1267,13 +1452,13 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
break;
case SCE_HPHP_HSTRING_VARIABLE:
if (!iswordstart(ch)) {
styler.ColourTo(i-1, StateToPrint);
styler.ColourTo(i - 1, StateToPrint);
i--; // strange but it works
state = SCE_HPHP_HSTRING;
}
break;
case SCE_HPHP_OPERATOR:
case SCE_HPHP_DEFAULT:
case SCE_HPHP_DEFAULT:
styler.ColourTo(i - 1, StateToPrint);
if (isdigit(ch)) {
state = SCE_HPHP_NUMBER;
@ -1304,6 +1489,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
// Some of the above terminated their lexeme but since the same character starts
// the same class again, only reenter if non empty segment.
bool nonEmptySegment = i >= static_cast<int>(styler.GetStartSegment());
if (state == SCE_HB_DEFAULT) { // One of the above succeeded
if ((ch == '\"') && (nonEmptySegment)) {
@ -1335,7 +1521,7 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
state = SCE_HJ_COMMENTLINE;
} else if ((ch == '\"') && (nonEmptySegment)) {
state = SCE_HJ_DOUBLESTRING;
} else if ((ch == '\'') && (nonEmptySegment)) {
} else if ((ch == '\'') && (nonEmptySegment)) {
state = SCE_HJ_SINGLESTRING;
} else if (iswordstart(ch)) {
state = SCE_HJ_WORD;
@ -1357,4 +1543,3 @@ static void ColouriseHyperTextDoc(unsigned int startPos, int length, int initSty
LexerModule lmHTML(SCLEX_HTML, ColouriseHyperTextDoc, "hypertext");
LexerModule lmXML(SCLEX_XML, ColouriseHyperTextDoc, "xml");

View File

@ -15,70 +15,18 @@
#include "PropSet.h"
#include "Accessor.h"
#include "StyleContext.h"
#include "KeyWords.h"
#include "Scintilla.h"
#include "SciLexer.h"
/* Returns true if the "as" word that begins at start follows an import statement */
static bool IsImportAs(unsigned int start, Accessor &styler) {
unsigned int i;
unsigned int j;
char s[10];
/* Find any import before start but after any statement terminator or quote */
i = start;
while (i > 0) {
char ch = styler[i - 1];
if (ch == '\n' || ch == '\r' || ch == ';' || ch == '\'' || ch == '"' || ch == '`')
break;
if (ch == 't' && i > 5) {
for (j = 0; j < 6; j++)
s[j] = styler[(i - 6) + j];
s[j] = '\0';
if (strcmp(s, "import") == 0)
return true;
}
i--;
}
return false;
}
static void ClassifyWordPy(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler, char *prevWord) {
char s[100];
bool wordIsNumber = isdigit(styler[start]);
for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) {
s[i] = styler[start + i];
s[i + 1] = '\0';
}
char chAttr = SCE_P_IDENTIFIER;
if (0 == strcmp(prevWord, "class"))
chAttr = SCE_P_CLASSNAME;
else if (0 == strcmp(prevWord, "def"))
chAttr = SCE_P_DEFNAME;
else if (wordIsNumber)
chAttr = SCE_P_NUMBER;
else if (keywords.InList(s))
chAttr = SCE_P_WORD;
else if (strcmp(s, "as") == 0 && IsImportAs(start, styler))
chAttr = SCE_P_WORD;
// make sure that dot-qualifiers inside the word are lexed correct
else for (unsigned int i = 0; i < end - start + 1; i++) {
if (styler[start + i] == '.') {
styler.ColourTo(start + i - 1, chAttr);
styler.ColourTo(start + i, SCE_P_OPERATOR);
}
}
styler.ColourTo(end, chAttr);
strcpy(prevWord, s);
}
enum kwType { kwOther, kwClass, kwDef, kwImport };
static bool IsPyComment(Accessor &styler, int pos, int len) {
return len>0 && styler[pos]=='#';
}
static bool IsPyStringStart(char ch, char chNext, char chNext2) {
static bool IsPyStringStart(int ch, int chNext, int chNext2) {
if (ch == '\'' || ch == '"')
return true;
if (ch == 'u' || ch == 'U') {
@ -93,10 +41,6 @@ static bool IsPyStringStart(char ch, char chNext, char chNext2) {
return false;
}
static bool IsPyWordStart(char ch, char chNext, char chNext2) {
return (iswordchar(ch) && !IsPyStringStart(ch, chNext, chNext2));
}
/* Return the state to use for the string starting at i; *nextIndex will be set to the first index following the quote(s) */
static int GetPyStringState(Accessor &styler, int i, int *nextIndex) {
char ch = styler.SafeGetCharAt(i);
@ -139,10 +83,18 @@ static int GetPyStringState(Accessor &styler, int i, int *nextIndex) {
}
}
inline bool IsAWordChar(int ch) {
return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
}
inline bool IsAWordStart(int ch) {
return (ch < 0x80) && (isalnum(ch) || ch == '_');
}
static void ColourisePyDoc(unsigned int startPos, int length, int initStyle,
WordList *keywordlists[], Accessor &styler) {
int lengthDoc = startPos + length;
int endPos = startPos + length;
// Backtrack to previous line in case need to fix its tab whinging
int lineCurrent = styler.GetLine(startPos);
@ -156,32 +108,27 @@ static void ColourisePyDoc(unsigned int startPos, int length, int initStyle,
}
}
// Python uses a different mask because bad indentation is marked by oring with 32
styler.StartAt(startPos, 127);
WordList &keywords = *keywordlists[0];
int whingeLevel = styler.GetPropertyInt("tab.timmy.whinge.level");
char prevWord[200];
prevWord[0] = '\0';
if (length == 0)
return ;
const int whingeLevel = styler.GetPropertyInt("tab.timmy.whinge.level");
int state = initStyle & 31;
initStyle = initStyle & 31;
if (initStyle == SCE_P_STRINGEOL) {
initStyle = SCE_P_DEFAULT;
}
int nextIndex = 0;
char chPrev = ' ';
char chPrev2 = ' ';
char chNext = styler[startPos];
styler.StartSegment(startPos);
bool atStartLine = true;
kwType kwLast = kwOther;
int spaceFlags = 0;
styler.IndentAmount(lineCurrent, &spaceFlags, IsPyComment);
for (int i = startPos; i < lengthDoc; i++) {
// Python uses a different mask because bad indentation is marked by oring with 32
StyleContext sc(startPos, endPos-startPos, initStyle, styler, 0x7f);
for (; sc.More(); sc.Forward()) {
if (atStartLine) {
char chBad = static_cast<char>(64);
char chGood = static_cast<char>(0);
if (sc.atLineStart) {
const char chBad = static_cast<char>(64);
const char chGood = static_cast<char>(0);
char chFlags = chGood;
if (whingeLevel == 1) {
chFlags = (spaceFlags & wsInconsistent) ? chBad : chGood;
@ -192,132 +139,117 @@ static void ColourisePyDoc(unsigned int startPos, int length, int initStyle,
} else if (whingeLevel == 4) {
chFlags = (spaceFlags & wsTab) ? chBad : chGood;
}
styler.SetFlags(chFlags, static_cast<char>(state));
atStartLine = false;
styler.SetFlags(chFlags, static_cast<char>(sc.state));
}
char ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
char chNext2 = styler.SafeGetCharAt(i + 2);
if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc)) {
if ((state == SCE_P_DEFAULT) || (state == SCE_P_TRIPLE) || (state == SCE_P_TRIPLEDOUBLE)) {
if (sc.atLineEnd) {
if ((sc.state == SCE_P_DEFAULT) ||
(sc.state == SCE_P_TRIPLE) ||
(sc.state == SCE_P_TRIPLEDOUBLE)) {
// Perform colourisation of white space and triple quoted strings at end of each line to allow
// tab marking to work inside white space and triple quoted strings
styler.ColourTo(i, state);
sc.ForwardSetState(sc.state);
}
lineCurrent++;
styler.IndentAmount(lineCurrent, &spaceFlags, IsPyComment);
atStartLine = true;
if ((sc.state == SCE_P_STRING) || (sc.state == SCE_P_CHARACTER)) {
sc.ChangeState(SCE_P_STRINGEOL);
sc.ForwardSetState(SCE_P_DEFAULT);
}
}
if (styler.IsLeadByte(ch)) {
chNext = styler.SafeGetCharAt(i + 2);
chPrev = ' ';
chPrev2 = ' ';
i += 1;
continue;
// Check for a state end
if (sc.state == SCE_P_OPERATOR) {
kwLast = kwOther;
sc.SetState(SCE_C_DEFAULT);
} else if (sc.state == SCE_P_NUMBER) {
if (!IsAWordChar(sc.ch)) {
sc.SetState(SCE_P_DEFAULT);
}
} else if (sc.state == SCE_P_WORD) {
if ((sc.ch == '.') || (!IsAWordChar(sc.ch))) {
char s[100];
sc.GetCurrent(s, sizeof(s));
int style = SCE_P_IDENTIFIER;
if ((kwLast == kwImport) && (strcmp(s, "as") == 0)) {
style = SCE_P_WORD;
} else if (keywords.InList(s)) {
style = SCE_P_WORD;
} else if (kwLast == kwClass) {
style = SCE_P_CLASSNAME;
} else if (kwLast == kwDef) {
style = SCE_P_DEFNAME;
}
sc.ChangeState(style);
sc.SetState(SCE_P_DEFAULT);
if (style == SCE_P_WORD) {
if (0 == strcmp(s, "class"))
kwLast = kwClass;
else if (0 == strcmp(s, "def"))
kwLast = kwDef;
else if (0 == strcmp(s, "import"))
kwLast = kwImport;
else
kwLast = kwOther;
} else if (style == SCE_P_CLASSNAME) {
kwLast = kwOther;
} else if (style == SCE_P_DEFNAME) {
kwLast = kwOther;
}
}
} else if ((sc.state == SCE_P_COMMENTLINE) || (sc.state == SCE_P_COMMENTBLOCK)) {
if (sc.ch == '\r' || sc.ch == '\n') {
sc.SetState(SCE_P_DEFAULT);
}
} else if ((sc.state == SCE_P_STRING) || (sc.state == SCE_P_CHARACTER)) {
if (sc.ch == '\\') {
if ((sc.chNext == '\r') && (sc.GetRelative(2) == '\n')) {
sc.Forward();
}
sc.Forward();
} else if ((sc.state == SCE_P_STRING) && (sc.ch == '\"')) {
sc.ForwardSetState(SCE_P_DEFAULT);
} else if ((sc.state == SCE_P_CHARACTER) && (sc.ch == '\'')) {
sc.ForwardSetState(SCE_P_DEFAULT);
}
} else if (sc.state == SCE_P_TRIPLE) {
if (sc.ch == '\\') {
sc.Forward();
} else if (sc.Match("\'\'\'")) {
sc.Forward();
sc.Forward();
sc.ForwardSetState(SCE_P_DEFAULT);
}
} else if (sc.state == SCE_P_TRIPLEDOUBLE) {
if (sc.ch == '\\') {
sc.Forward();
} else if (sc.Match("\"\"\"")) {
sc.Forward();
sc.Forward();
sc.ForwardSetState(SCE_P_DEFAULT);
}
}
if (state == SCE_P_STRINGEOL) {
if (ch != '\r' && ch != '\n') {
styler.ColourTo(i - 1, state);
state = SCE_P_DEFAULT;
// Check for a new state starting character
if (sc.state == SCE_P_DEFAULT) {
if (isascii(sc.ch) && isoperator(static_cast<char>(sc.ch)) || sc.ch == '`') {
sc.SetState(SCE_P_OPERATOR);
} else if (sc.ch == '#') {
sc.SetState(sc.chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE);
} else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
sc.SetState(SCE_P_NUMBER);
} else if (IsPyStringStart(sc.ch, sc.chNext, sc.GetRelative(2))) {
int nextIndex = 0;
sc.SetState(GetPyStringState(styler, sc.currentPos, &nextIndex));
while (nextIndex > (sc.currentPos+1)) {
sc.Forward();
}
} else if (IsAWordStart(sc.ch)) {
sc.SetState(SCE_P_WORD);
}
}
if (state == SCE_P_DEFAULT) {
if (IsPyWordStart(ch, chNext, chNext2)) {
styler.ColourTo(i - 1, state);
state = SCE_P_WORD;
} else if (ch == '#') {
styler.ColourTo(i - 1, state);
state = chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE;
} else if (IsPyStringStart(ch, chNext, chNext2)) {
styler.ColourTo(i - 1, state);
state = GetPyStringState(styler, i, &nextIndex);
if (nextIndex != i + 1) {
i = nextIndex - 1;
ch = ' ';
chPrev = ' ';
chNext = styler.SafeGetCharAt(i + 1);
}
} else if (isoperator(ch)) {
styler.ColourTo(i - 1, state);
styler.ColourTo(i, SCE_P_OPERATOR);
}
} else if (state == SCE_P_WORD) {
if (!iswordchar(ch)) {
ClassifyWordPy(styler.GetStartSegment(), i - 1, keywords, styler, prevWord);
state = SCE_P_DEFAULT;
if (ch == '#') {
state = chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE;
} else if (IsPyStringStart(ch, chNext, chNext2)) {
styler.ColourTo(i - 1, state);
state = GetPyStringState(styler, i, &nextIndex);
if (nextIndex != i + 1) {
i = nextIndex - 1;
ch = ' ';
chPrev = ' ';
chNext = styler.SafeGetCharAt(i + 1);
}
} else if (isoperator(ch)) {
styler.ColourTo(i, SCE_P_OPERATOR);
}
}
} else {
if (state == SCE_P_COMMENTLINE || state == SCE_P_COMMENTBLOCK) {
if (ch == '\r' || ch == '\n') {
styler.ColourTo(i - 1, state);
state = SCE_P_DEFAULT;
}
} else if (state == SCE_P_STRING) {
if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) {
styler.ColourTo(i - 1, state);
state = SCE_P_STRINGEOL;
} else if (ch == '\\') {
if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
i++;
ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
}
} else if (ch == '\"') {
styler.ColourTo(i, state);
state = SCE_P_DEFAULT;
}
} else if (state == SCE_P_CHARACTER) {
if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) {
styler.ColourTo(i - 1, state);
state = SCE_P_STRINGEOL;
} else if (ch == '\\') {
if (chNext == '\"' || chNext == '\'' || chNext == '\\') {
i++;
ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
}
} else if (ch == '\'') {
styler.ColourTo(i, state);
state = SCE_P_DEFAULT;
}
} else if (state == SCE_P_TRIPLE) {
if (ch == '\'' && chPrev == '\'' && chPrev2 == '\'') {
styler.ColourTo(i, state);
state = SCE_P_DEFAULT;
}
} else if (state == SCE_P_TRIPLEDOUBLE) {
if (ch == '\"' && chPrev == '\"' && chPrev2 == '\"') {
styler.ColourTo(i, state);
state = SCE_P_DEFAULT;
}
}
}
chPrev2 = chPrev;
chPrev = ch;
}
if (state == SCE_P_WORD) {
ClassifyWordPy(styler.GetStartSegment(), lengthDoc, keywords, styler, prevWord);
} else {
styler.ColourTo(lengthDoc, state);
}
sc.Complete();
}
static bool IsCommentLine(int line, Accessor &styler) {
@ -338,14 +270,15 @@ static bool IsQuoteLine(int line, Accessor &styler) {
return ((style == SCE_P_TRIPLE) || (style== SCE_P_TRIPLEDOUBLE));
}
static void FoldPyDoc(unsigned int startPos, int length, int /*initStyle - unused*/,
WordList *[], Accessor &styler) {
int maxPos = startPos + length;
int maxLines = styler.GetLine(maxPos-1);
bool foldComment = styler.GetPropertyInt("fold.comment.python");
bool foldQuotes = styler.GetPropertyInt("fold.quotes.python");
const int maxPos = startPos + length;
const int maxLines = styler.GetLine(maxPos-1); // Requested last line
const int docLines = styler.GetLine(styler.Length() - 1); // Available last line
const bool foldComment = styler.GetPropertyInt("fold.comment.python");
const bool foldQuotes = styler.GetPropertyInt("fold.quotes.python");
// Backtrack to previous non-blank line so we can determine indent level
// for any white space lines (needed esp. within triple quoted strings)
// and so we can fix any preceding fold level (which is why we go back
@ -363,8 +296,8 @@ static void FoldPyDoc(unsigned int startPos, int length, int /*initStyle - unuse
}
int indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK;
// Set up initial loop state
startPos = styler.LineStart(lineCurrent);
// Set up initial state
int prev_state = SCE_P_DEFAULT & 31;
if (lineCurrent >= 1)
prev_state = styler.StyleAt(startPos-1) & 31;
@ -374,21 +307,27 @@ static void FoldPyDoc(unsigned int startPos, int length, int /*initStyle - unuse
prevComment = foldComment && IsCommentLine(lineCurrent - 1, styler);
// Process all characters to end of requested range or end of any triple quote
// or comment that hangs over the end of the range
while ((lineCurrent <= maxLines) || prevQuote || prevComment) {
// or comment that hangs over the end of the range. Cap processing in all cases
// to end of document (in case of unclosed quote or comment at end).
while ((lineCurrent <= docLines) && ((lineCurrent <= maxLines) || prevQuote || prevComment)) {
// Gather info
int lev = indentCurrent;
int lineNext = lineCurrent + 1;
int style = styler.StyleAt(styler.LineStart(lineNext)) & 31;
int indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);
int quote = foldQuotes && ((style == SCE_P_TRIPLE) || (style== SCE_P_TRIPLEDOUBLE));
int quote_start = (quote && !prevQuote);
int quote_continue = (quote && prevQuote);
int comment = foldComment && IsCommentLine(lineCurrent, styler);
int comment_start = (comment && !prevComment &&
int indentNext = indentCurrent;
int quote = false;
if (lineNext <= docLines) {
// Information about next line is only available if not at end of document
indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);
int style = styler.StyleAt(styler.LineStart(lineNext)) & 31;
quote = foldQuotes && ((style == SCE_P_TRIPLE) || (style== SCE_P_TRIPLEDOUBLE));
}
const int quote_start = (quote && !prevQuote);
const int quote_continue = (quote && prevQuote);
const int comment = foldComment && IsCommentLine(lineCurrent, styler);
const int comment_start = (comment && !prevComment && (lineNext <= docLines) &&
IsCommentLine(lineNext, styler) && (lev > SC_FOLDLEVELBASE));
int comment_continue = (comment && prevComment);
const int comment_continue = (comment && prevComment);
if ((!quote || !prevQuote) && !comment)
indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK;
if (quote)
@ -411,22 +350,35 @@ static void FoldPyDoc(unsigned int startPos, int length, int /*initStyle - unuse
}
// Skip past any blank lines for next indent level info; we skip also comments
// starting in column 0 which effectively folds them into surrounding code
// rather than screwing up folding. Then set indent level on the lines
// we skipped to be same as maximum of current and next indent. This approach
// does a reasonable job of collapsing white space into surrounding code
// without getting confused by white space at the start of an indented level.
// starting in column 0 which effectively folds them into surrounding code rather
// than screwing up folding.
const int saveIndentNext = indentNext;
while (!quote &&
((indentNext & SC_FOLDLEVELWHITEFLAG) || styler[styler.LineStart(lineNext)] == '#') &&
(lineNext < maxLines)) {
int level = Platform::Maximum(indentCurrent, indentNext);
if (indentNext & SC_FOLDLEVELWHITEFLAG)
level = SC_FOLDLEVELWHITEFLAG | indentCurrentLevel;
styler.SetLevel(lineNext, level);
(lineNext < docLines) &&
((indentNext & SC_FOLDLEVELWHITEFLAG) ||
(lineNext <= docLines && styler[styler.LineStart(lineNext)] == '#'))) {
lineNext++;
indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);
}
// Next compute max indent level of current line and next non-blank line.
// This is the level to which we set all the intervening blank or comment lines.
const int skip_level = Platform::Maximum(indentCurrentLevel,
indentNext & SC_FOLDLEVELNUMBERMASK);
// Now set all the indent levels on the lines we skipped
int skipLine = lineCurrent + 1;
int skipIndentNext = saveIndentNext;
while (skipLine < lineNext) {
int skipLineLevel = skip_level;
if (skipIndentNext & SC_FOLDLEVELWHITEFLAG)
skipLineLevel = SC_FOLDLEVELWHITEFLAG | skipLineLevel;
styler.SetLevel(skipLine, skipLineLevel);
skipLine++;
skipIndentNext = styler.IndentAmount(skipLine, &spaceFlags, NULL);
}
// Set fold header on non-quote/non-comment line
if (!quote && !comment && !(indentCurrent & SC_FOLDLEVELWHITEFLAG) ) {
if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK))
@ -443,8 +395,9 @@ static void FoldPyDoc(unsigned int startPos, int length, int /*initStyle - unuse
lineCurrent = lineNext;
}
// Make sure last line indent level is set too
styler.SetLevel(lineCurrent, indentCurrent);
// NOTE: Cannot set level of last line here because indentCurrent doesn't have
// header flag set; the loop above is crafted to take care of this case!
//styler.SetLevel(lineCurrent, indentCurrent);
}
LexerModule lmPython(SCLEX_PYTHON, ColourisePyDoc, "python", FoldPyDoc);

View File

@ -40,7 +40,7 @@ static void DrawMinus(Surface *surface, int centreX, int centreY, int armSize, C
surface->FillRectangle(rcH, fore);
}
void LineMarker::Draw(Surface *surface, PRectangle &rcWhole) {
void LineMarker::Draw(Surface *surface, PRectangle &rcWhole, Font &fontForCharacter) {
// Restrict most shapes a bit
PRectangle rc = rcWhole;
rc.top++;
@ -230,6 +230,15 @@ void LineMarker::Draw(Surface *surface, PRectangle &rcWhole) {
surface->MoveTo(centreX, rcWhole.top);
surface->LineTo(centreX, centreY - blobSize);
} else if (markType >= SC_MARK_CHARACTER) {
char character[1];
character[0] = static_cast<char>(markType - SC_MARK_CHARACTER);
int width = surface->WidthText(fontForCharacter, character, 1);
rc.left += (rc.Width() - width) / 2;
rc.right = rc.left + width;
surface->DrawTextClipped(rc, fontForCharacter, rc.bottom - 2,
character, 1, fore.allocated, back.allocated);
} else { // SC_MARK_SHORTARROW
Point pts[] = {
Point(centreX, centreY + dimOn2),

View File

@ -20,7 +20,7 @@ public:
fore = Colour(0,0,0);
back = Colour(0xff,0xff,0xff);
}
void Draw(Surface *surface, PRectangle &rc);
void Draw(Surface *surface, PRectangle &rc, Font &fontForCharacter);
};
#endif

View File

@ -30,9 +30,8 @@
* Modification history:
*
* $Log$
* Revision 1.1 2001/09/01 03:05:24 RD
* Upgraded to version 1.39 of Scintilla, and upated wxStyledTextCtrl
* accordingly.
* Revision 1.2 2001/10/18 01:24:58 RD
* Updated to version 1.40 of Scintilla
*
* Revision 1.6 2001/04/29 13:32:10 nyamatongwe
* Addition of new target methods - versions of ReplaceTarget that take counted

View File

@ -35,6 +35,7 @@
#include "ScintillaBase.h"
ScintillaBase::ScintillaBase() {
displayPopupMenu = true;
listType = 0;
#ifdef SCI_LEXER
lexLanguage = SCLEX_CONTAINER;
@ -514,6 +515,10 @@ sptr_t ScintillaBase::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lPara
InvalidateStyleRedraw();
break;
case SCI_USEPOPUP:
displayPopupMenu = wParam;
break;
#ifdef SCI_LEXER
case SCI_SETLEXER:
SetLexer(wParam);

View File

@ -30,6 +30,7 @@ protected:
idcmdSelectAll=16
};
bool displayPopupMenu;
Menu popup;
AutoComplete ac;
@ -42,7 +43,7 @@ protected:
int lexLanguage;
LexerModule *lexCurrent;
PropSet props;
enum {numWordLists=5};
enum {numWordLists=6};
WordList *keyWordLists[numWordLists+1];
void SetLexer(uptr_t wParam);
void SetLexerLanguage(const char *languageName);

View File

@ -0,0 +1,51 @@
// Scintilla source code edit control
/** @file StyleContext.cxx
** Lexer infrastructure.
**/
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
// This file is in the public domain.
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include "Platform.h"
#include "PropSet.h"
#include "Accessor.h"
#include "StyleContext.h"
static void getRange(unsigned int start,
unsigned int end,
Accessor &styler,
char *s,
unsigned int len) {
unsigned int i = 0;
while ((i < end - start + 1) && (i < len-1)) {
s[i] = styler[start + i];
i++;
}
s[i] = '\0';
}
void StyleContext::GetCurrent(char *s, int len) {
getRange(styler.GetStartSegment(), currentPos - 1, styler, s, len);
}
static void getRangeLowered(unsigned int start,
unsigned int end,
Accessor &styler,
char *s,
unsigned int len) {
unsigned int i = 0;
while ((i < end - start + 1) && (i < len-1)) {
s[i] = static_cast<char>(tolower(styler[start + i]));
i++;
}
s[i] = '\0';
}
void StyleContext::GetCurrentLowered(char *s, int len) {
getRangeLowered(styler.GetStartSegment(), currentPos - 1, styler, s, len);
}

View File

@ -0,0 +1,127 @@
// Scintilla source code edit control
/** @file StyleContext.cxx
** Lexer infrastructure.
**/
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
// This file is in the public domain.
// All languages handled so far can treat all characters >= 0x80 as one class
// which just continues the current token or starts an identifier if in default.
// DBCS treated specially as the second character can be < 0x80 and hence
// syntactically significant. UTF-8 avoids this as all trail bytes are >= 0x80
class StyleContext {
Accessor &styler;
int endPos;
StyleContext& operator=(const StyleContext&) {
return *this;
}
public:
int currentPos;
bool atLineStart;
bool atLineEnd;
int state;
int chPrev;
int ch;
int chNext;
StyleContext(unsigned int startPos, int length,
int initStyle, Accessor &styler_, char chMask=31) :
styler(styler_),
endPos(startPos + length),
currentPos(startPos),
atLineStart(true),
atLineEnd(false),
state(initStyle),
chPrev(0),
ch(0),
chNext(0) {
styler.StartAt(startPos, chMask);
styler.StartSegment(startPos);
int pos = currentPos;
ch = static_cast<unsigned char>(styler.SafeGetCharAt(pos));
if (styler.IsLeadByte(static_cast<char>(ch))) {
pos++;
ch = ch << 8;
ch |= static_cast<unsigned char>(styler.SafeGetCharAt(pos));
}
chNext = static_cast<unsigned char>(styler.SafeGetCharAt(pos+1));
if (styler.IsLeadByte(static_cast<char>(chNext))) {
chNext = chNext << 8;
chNext |= static_cast<unsigned char>(styler.SafeGetCharAt(pos+2));
}
atLineEnd = (ch == '\r' && chNext != '\n') || (ch == '\n') || (currentPos >= endPos);
}
void Complete() {
styler.ColourTo(currentPos - 1, state);
}
bool More() {
return currentPos <= endPos;
}
void Forward() {
atLineStart = atLineEnd;
// A lot of this is repeated from the constructor - TODO: merge code
chPrev = ch;
currentPos++;
if (ch >= 0x100)
currentPos++;
ch = chNext;
chNext = static_cast<unsigned char>(styler.SafeGetCharAt(currentPos+1));
if (styler.IsLeadByte(static_cast<char>(chNext))) {
chNext = chNext << 8;
chNext |= static_cast<unsigned char>(styler.SafeGetCharAt(currentPos + 2));
}
// Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix)
// Avoid triggering two times on Dos/Win
// End of line
atLineEnd = (ch == '\r' && chNext != '\n') || (ch == '\n') || (currentPos >= endPos);
}
void ChangeState(int state_) {
state = state_;
}
void SetState(int state_) {
styler.ColourTo(currentPos - 1, state);
state = state_;
}
void ForwardSetState(int state_) {
Forward();
styler.ColourTo(currentPos - 1, state);
state = state_;
}
int LengthCurrent() {
return currentPos - styler.GetStartSegment();
}
int GetRelative(int n) {
return styler.SafeGetCharAt(currentPos+n);
}
bool Match(char ch0) {
return ch == ch0;
}
bool Match(char ch0, char ch1) {
return (ch == ch0) && (chNext == ch1);
}
bool Match(const char *s) {
if (ch != *s)
return false;
s++;
if (chNext != *s)
return false;
s++;
for (int n=2; *s; n++) {
if (*s != styler.SafeGetCharAt(currentPos+n))
return false;
s++;
}
return true;
}
// Non-inline
void GetCurrent(char *s, int len);
void GetCurrentLowered(char *s, int len);
};
inline bool IsASpace(unsigned int ch) {
return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d));
}
inline bool IsADigit(unsigned int ch) {
return (ch >= '0') && (ch <= '9');
}

View File

@ -32,6 +32,7 @@ int wxForceScintillaLexers(void)
extern LexerModule lmAVE;
extern LexerModule lmConf;
extern LexerModule lmCPP;
extern LexerModule lmNncrontab;
extern LexerModule lmEiffel;
extern LexerModule lmHTML;
extern LexerModule lmLISP;
@ -48,6 +49,7 @@ int wxForceScintillaLexers(void)
&& &lmAVE
&& &lmConf
&& &lmCPP
&& &lmNncrontab
&& &lmEiffel
&& &lmHTML
&& &lmLISP
@ -1202,6 +1204,7 @@ int wxStyledTextCtrl::GetTargetEnd() {
}
// Replace the target text with the argument text.
// Text is counted so it can contain nulls.
// Returns the length of the replacement text.
int wxStyledTextCtrl::ReplaceTarget(const wxString& text) {
@ -1210,6 +1213,7 @@ int wxStyledTextCtrl::GetTargetEnd() {
}
// Replace the target text with the argument text after \d processing.
// Text is counted so it can contain nulls.
// Looks for \d where d is between 1 and 9 and replaces these with the strings
// matched in the last search operation which were surrounded by \( and \).
// Returns the length of the replacement text including any change
@ -1221,7 +1225,7 @@ int wxStyledTextCtrl::GetTargetEnd() {
}
// Search for a counted string in the target and set the target to the found
// range.
// range. Text is counted so it can contain nulls.
// Returns length of range or -1 for failure in which case target is not moved.
int wxStyledTextCtrl::SearchInTarget(const wxString& text) {

View File

@ -32,6 +32,7 @@ int wxForceScintillaLexers(void)
extern LexerModule lmAVE;
extern LexerModule lmConf;
extern LexerModule lmCPP;
extern LexerModule lmNncrontab;
extern LexerModule lmEiffel;
extern LexerModule lmHTML;
extern LexerModule lmLISP;
@ -48,6 +49,7 @@ int wxForceScintillaLexers(void)
&& &lmAVE
&& &lmConf
&& &lmCPP
&& &lmNncrontab
&& &lmEiffel
&& &lmHTML
&& &lmLISP