diff options
Diffstat (limited to 'src/ScintillaBase.cxx')
| -rw-r--r-- | src/ScintillaBase.cxx | 283 | 
1 files changed, 195 insertions, 88 deletions
diff --git a/src/ScintillaBase.cxx b/src/ScintillaBase.cxx index cecfc0952..2f84db7cd 100644 --- a/src/ScintillaBase.cxx +++ b/src/ScintillaBase.cxx @@ -9,20 +9,21 @@  #include <string.h>  #include <stdio.h>  #include <ctype.h> +#include <assert.h>  #include <string>  #include <vector>  #include "Platform.h" +#include "ILexer.h"  #include "Scintilla.h" -#include "PropSet.h" +  #include "PropSetSimple.h"  #ifdef SCI_LEXER  #include "SciLexer.h" -#include "Accessor.h" -#include "DocumentAccessor.h" -#include "KeyWords.h" +#include "LexerModule.h" +#include "Catalogue.h"  #endif  #include "SplitVector.h"  #include "Partitioning.h" @@ -53,21 +54,9 @@ ScintillaBase::ScintillaBase() {  	displayPopupMenu = true;  	listType = 0;  	maxListWidth = 0; -#ifdef SCI_LEXER -	lexLanguage = SCLEX_CONTAINER; -	performingStyle = false; -	lexCurrent = 0; -	for (int wl = 0; wl < numWordLists; wl++) -		keyWordLists[wl] = new WordList; -	keyWordLists[numWordLists] = 0; -#endif  }  ScintillaBase::~ScintillaBase() { -#ifdef SCI_LEXER -	for (int wl = 0; wl < numWordLists; wl++) -		delete keyWordLists[wl]; -#endif  }  void ScintillaBase::Finalise() { @@ -477,76 +466,189 @@ void ScintillaBase::ButtonDown(Point pt, unsigned int curTime, bool shift, bool  }  #ifdef SCI_LEXER -void ScintillaBase::SetLexer(uptr_t wParam) { -	lexLanguage = wParam; -	lexCurrent = LexerModule::Find(lexLanguage); -	if (!lexCurrent) -		lexCurrent = LexerModule::Find(SCLEX_NULL); -	int bits = lexCurrent ? lexCurrent->GetStyleBitsNeeded() : 5; -	vs.EnsureStyle((1 << bits) - 1); + +#ifdef SCI_NAMESPACE +namespace Scintilla { +#endif + +class LexState : public LexInterface { +	const LexerModule *lexCurrent; +	void SetLexerModule(const LexerModule *lex); +	PropSetSimple props; +public: +	int lexLanguage; + +	LexState(Document *pdoc_); +	virtual ~LexState(); +	void SetLexer(uptr_t wParam); +	void SetLexerLanguage(const char *languageName); +	const char *DescribeWordListSets(); +	void SetWordList(int n, const char *wl); +	int GetStyleBitsNeeded() const; +	const char *GetName() const; +	void *PrivateCall(int operation, void *pointer); +	const char *PropertyNames(); +	int PropertyType(const char *name); +	const char *DescribeProperty(const char *name); +	void PropSet(const char *key, const char *val); +	const char *PropGet(const char *key) const; +	int PropGetInt(const char *key, int defaultValue=0) const; +	int PropGetExpanded(const char *key, char *result) const; +}; + +#ifdef SCI_NAMESPACE  } +#endif -void ScintillaBase::SetLexerLanguage(const char *languageName) { +LexState::LexState(Document *pdoc_) : LexInterface(pdoc_) { +	lexCurrent = 0; +	performingStyle = false;  	lexLanguage = SCLEX_CONTAINER; -	lexCurrent = LexerModule::Find(languageName); -	if (!lexCurrent) -		lexCurrent = LexerModule::Find(SCLEX_NULL); -	if (lexCurrent) -		lexLanguage = lexCurrent->GetLanguage(); -	int bits = lexCurrent ? lexCurrent->GetStyleBitsNeeded() : 5; -	vs.EnsureStyle((1 << bits) - 1);  } -void ScintillaBase::Colourise(int start, int end) { -	if (!performingStyle) { -		// Protect against reentrance, which may occur, for example, when -		// fold points are discovered while performing styling and the folding -		// code looks for child lines which may trigger styling. -		performingStyle = true; +LexState::~LexState() { +	if (instance) { +		instance->Release(); +		instance = 0; +	} +} + +LexState *ScintillaBase::DocumentLexState() { +	if (!pdoc->pli) { +		pdoc->pli = new LexState(pdoc); +	} +	return static_cast<LexState *>(pdoc->pli); +} -		int lengthDoc = pdoc->Length(); -		if (end == -1) -			end = lengthDoc; -		int len = end - start; +void LexState::SetLexerModule(const LexerModule *lex) { +	if (lex != lexCurrent) { +		if (instance) { +			instance->Release(); +			instance = 0; +		} +		lexCurrent = lex; +		instance = lexCurrent->Create(); +		pdoc->LexerChanged(); +	} +} -		PLATFORM_ASSERT(len >= 0); -		PLATFORM_ASSERT(start + len <= lengthDoc); +void LexState::SetLexer(uptr_t wParam) { +	lexLanguage = wParam; +	const LexerModule *lex = Catalogue::Find(lexLanguage); +	if (!lex) +		lex = Catalogue::Find(SCLEX_NULL); +	SetLexerModule(lex); +} -		//WindowAccessor styler(wMain.GetID(), props); -		DocumentAccessor styler(pdoc, props, wMain.GetID()); +void LexState::SetLexerLanguage(const char *languageName) { +	const LexerModule *lex = Catalogue::Find(languageName); +	if (!lex) +		lex = Catalogue::Find(SCLEX_NULL); +	if (lex) +		lexLanguage = lex->GetLanguage(); +	SetLexerModule(lex); +} -		int styleStart = 0; -		if (start > 0) -			styleStart = styler.StyleAt(start - 1) & pdoc->stylingBitsMask; -		styler.SetCodePage(pdoc->dbcsCodePage); +const char *LexState::DescribeWordListSets() { +	if (instance) { +		return instance->DescribeWordListSets(); +	} else { +		return 0; +	} +} -		if (lexCurrent && (len > 0)) {	// Should always succeed as null lexer should always be available -			lexCurrent->Lex(start, len, styleStart, keyWordLists, styler); -			styler.Flush(); -			if (styler.GetPropertyInt("fold")) { -				lexCurrent->Fold(start, len, styleStart, keyWordLists, styler); -				styler.Flush(); -			} +void LexState::SetWordList(int n, const char *wl) { +	if (instance) { +		int firstModification = instance->WordListSet(n, wl); +		if (firstModification >= 0) { +			pdoc->ModifiedAt(firstModification);  		} +	} +} -		performingStyle = false; +int LexState::GetStyleBitsNeeded() const { +	return lexCurrent ? lexCurrent->GetStyleBitsNeeded() : 5; +} + +const char *LexState::GetName() const { +	return lexCurrent ? lexCurrent->languageName : ""; +} + +void *LexState::PrivateCall(int operation, void *pointer) { +	if (pdoc && instance) { +		return instance->PrivateCall(operation, pointer); +	} else { +		return 0; +	} +} + +const char *LexState::PropertyNames() { +	if (instance) { +		return instance->PropertyNames(); +	} else { +		return 0; +	} +} + +int LexState::PropertyType(const char *name) { +	if (instance) { +		return instance->PropertyType(name); +	} else { +		return SC_TYPE_BOOLEAN;  	}  } + +const char *LexState::DescribeProperty(const char *name) { +	if (instance) { +		return instance->DescribeProperty(name); +	} else { +		return 0; +	} +} + +void LexState::PropSet(const char *key, const char *val) { +	props.Set(key, val); +	if (instance) { +		int firstModification = instance->PropertySet(key, val); +		if (firstModification >= 0) { +			pdoc->ModifiedAt(firstModification); +		} +	} +} + +const char *LexState::PropGet(const char *key) const { +	return props.Get(key); +} + +int LexState::PropGetInt(const char *key, int defaultValue) const { +	return props.GetInt(key, defaultValue); +} + +int LexState::PropGetExpanded(const char *key, char *result) const { +	return props.GetExpanded(key, result); +} +  #endif  void ScintillaBase::NotifyStyleToNeeded(int endStyleNeeded) {  #ifdef SCI_LEXER -	if (lexLanguage != SCLEX_CONTAINER) { -		int endStyled = WndProc(SCI_GETENDSTYLED, 0, 0); -		int lineEndStyled = WndProc(SCI_LINEFROMPOSITION, endStyled, 0); -		endStyled = WndProc(SCI_POSITIONFROMLINE, lineEndStyled, 0); -		Colourise(endStyled, endStyleNeeded); +	if (DocumentLexState()->lexLanguage != SCLEX_CONTAINER) { +		int lineEndStyled = pdoc->LineFromPosition(pdoc->GetEndStyled()); +		int endStyled = pdoc->LineStart(lineEndStyled); +		DocumentLexState()->Colourise(endStyled, endStyleNeeded);  		return;  	}  #endif  	Editor::NotifyStyleToNeeded(endStyleNeeded);  } +void ScintillaBase::NotifyLexerChanged(Document *, void *) { +#ifdef SCI_LEXER +	int bits = DocumentLexState()->GetStyleBitsNeeded(); +	vs.EnsureStyle((1 << bits) - 1); +#endif +} +  sptr_t ScintillaBase::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {  	switch (iMessage) {  	case SCI_AUTOCSHOW: @@ -709,61 +811,66 @@ sptr_t ScintillaBase::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lPara  #ifdef SCI_LEXER  	case SCI_SETLEXER: -		SetLexer(wParam); -		lexLanguage = wParam; +		DocumentLexState()->SetLexer(wParam);  		break;  	case SCI_GETLEXER: -		return lexLanguage; +		return DocumentLexState()->lexLanguage;  	case SCI_COLOURISE: -		if (lexLanguage == SCLEX_CONTAINER) { +		if (DocumentLexState()->lexLanguage == SCLEX_CONTAINER) {  			pdoc->ModifiedAt(wParam);  			NotifyStyleToNeeded((lParam == -1) ? pdoc->Length() : lParam);  		} else { -			Colourise(wParam, lParam); +			DocumentLexState()->Colourise(wParam, lParam);  		}  		Redraw();  		break;  	case SCI_SETPROPERTY: -		props.Set(reinterpret_cast<const char *>(wParam), +		DocumentLexState()->PropSet(reinterpret_cast<const char *>(wParam),  		          reinterpret_cast<const char *>(lParam));  		break;  	case SCI_GETPROPERTY: -			return StringResult(lParam, props.Get(reinterpret_cast<const char *>(wParam))); - -	case SCI_GETPROPERTYEXPANDED: { -			char *val = props.Expanded(reinterpret_cast<const char *>(wParam)); -			const int n = strlen(val); -			if (lParam != 0) { -				char *ptr = reinterpret_cast<char *>(lParam); -				strcpy(ptr, val); -			} -			delete []val; -			return n;	// Not including NUL -		} +		return StringResult(lParam, DocumentLexState()->PropGet(reinterpret_cast<const char *>(wParam))); + +	case SCI_GETPROPERTYEXPANDED: +		return DocumentLexState()->PropGetExpanded(reinterpret_cast<const char *>(wParam), +			reinterpret_cast<char *>(lParam));  	case SCI_GETPROPERTYINT: -		return props.GetInt(reinterpret_cast<const char *>(wParam), lParam); +		return DocumentLexState()->PropGetInt(reinterpret_cast<const char *>(wParam), lParam);  	case SCI_SETKEYWORDS: -		if (wParam < numWordLists) { -			keyWordLists[wParam]->Clear(); -			keyWordLists[wParam]->Set(reinterpret_cast<const char *>(lParam)); -		} +		DocumentLexState()->SetWordList(wParam, reinterpret_cast<const char *>(lParam));  		break;  	case SCI_SETLEXERLANGUAGE: -		SetLexerLanguage(reinterpret_cast<const char *>(lParam)); +		DocumentLexState()->SetLexerLanguage(reinterpret_cast<const char *>(lParam));  		break;  	case SCI_GETLEXERLANGUAGE: -		return StringResult(lParam, lexCurrent ? lexCurrent->languageName : ""); +		return StringResult(lParam, DocumentLexState()->GetName()); + +	case SCI_PRIVATELEXERCALL: +		return reinterpret_cast<sptr_t>( +			DocumentLexState()->PrivateCall(wParam, reinterpret_cast<void *>(lParam)));  	case SCI_GETSTYLEBITSNEEDED: -		return lexCurrent ? lexCurrent->GetStyleBitsNeeded() : 5; +		return DocumentLexState()->GetStyleBitsNeeded(); + +	case SCI_PROPERTYNAMES: +		return StringResult(lParam, DocumentLexState()->PropertyNames()); + +	case SCI_PROPERTYTYPE: +		return DocumentLexState()->PropertyType(reinterpret_cast<const char *>(wParam)); + +	case SCI_DESCRIBEPROPERTY: +		return StringResult(lParam, DocumentLexState()->DescribeProperty(reinterpret_cast<const char *>(wParam))); + +	case SCI_DESCRIBEKEYWORDSETS: +		return StringResult(lParam, DocumentLexState()->DescribeWordListSets());  #endif  | 
