diff options
| author | nyamatongwe <unknown> | 2013-01-19 11:10:41 +1100 | 
|---|---|---|
| committer | nyamatongwe <unknown> | 2013-01-19 11:10:41 +1100 | 
| commit | 7d3a087d2e149d95e1e267fd6191dd0312fe3c0a (patch) | |
| tree | 43ca4e0efe203238a7f1eec810789d91a7fdf6f7 /src | |
| parent | 0bb8702e061f17864f74785e330a40b6feef85ba (diff) | |
| download | scintilla-mirror-7d3a087d2e149d95e1e267fd6191dd0312fe3c0a.tar.gz | |
Implement APIs for Unicode line ends and substyles and expose to
message interface.
Expose IDocumentWithLineEnd interface on Document.
Diffstat (limited to 'src')
| -rw-r--r-- | src/Document.cxx | 20 | ||||
| -rw-r--r-- | src/Document.h | 8 | ||||
| -rw-r--r-- | src/ScintillaBase.cxx | 95 | 
3 files changed, 118 insertions, 5 deletions
| diff --git a/src/Document.cxx b/src/Document.cxx index 1938149e7..500259d8d 100644 --- a/src/Document.cxx +++ b/src/Document.cxx @@ -67,6 +67,17 @@ void LexInterface::Colourise(int start, int end) {  	}  } +int LexInterface::LineEndTypesSupported() { +	if (instance) { +		int interfaceVersion = instance->Version(); +		if (interfaceVersion >= lvSubStyles) { +			ILexerWithSubStyles *ssinstance = static_cast<ILexerWithSubStyles *>(instance); +			return ssinstance->LineEndTypesSupported(); +		} +	} +	return 0; +} +  Document::Document() {  	refCount = 0;  	pcf = NULL; @@ -135,6 +146,13 @@ void Document::Init() {  	}  } +int Document::LineEndTypesSupported() const { +	if ((SC_CP_UTF8 == dbcsCodePage) && pli) +		return pli->LineEndTypesSupported(); +	else +		return 0; +} +  bool Document::SetDBCSCodePage(int dbcsCodePage_) {  	if (dbcsCodePage != dbcsCodePage_) {  		dbcsCodePage = dbcsCodePage_; @@ -245,7 +263,7 @@ int SCI_METHOD Document::LineStart(int line) const {  	return cb.LineStart(line);  } -int Document::LineEnd(int line) const { +int SCI_METHOD Document::LineEnd(int line) const {  	if (line == LinesTotal() - 1) {  		return LineStart(line + 1);  	} else { diff --git a/src/Document.h b/src/Document.h index 36d670937..2830d626e 100644 --- a/src/Document.h +++ b/src/Document.h @@ -186,6 +186,7 @@ public:  	virtual ~LexInterface() {  	}  	void Colourise(int start, int end); +	int LineEndTypesSupported();  	bool UseContainerLexing() const {  		return instance == 0;  	} @@ -193,7 +194,7 @@ public:  /**   */ -class Document : PerLine, public IDocument, public ILoader { +class Document : PerLine, public IDocumentWithLineEnd, public ILoader {  public:  	/** Used to pair watcher pointer with user data. */ @@ -256,12 +257,13 @@ public:  	int SCI_METHOD Release();  	virtual void Init(); +	int LineEndTypesSupported() const;  	bool SetDBCSCodePage(int dbcsCodePage_);  	virtual void InsertLine(int line);  	virtual void RemoveLine(int line);  	int SCI_METHOD Version() const { -		return dvOriginal; +		return dvLineEnd;  	}  	void SCI_METHOD SetErrorStatus(int status); @@ -338,7 +340,7 @@ public:  	void DeleteAllMarks(int markerNum);  	int LineFromHandle(int markerHandle);  	int SCI_METHOD LineStart(int line) const; -	int LineEnd(int line) const; +	int SCI_METHOD LineEnd(int line) const;  	int LineEndPosition(int position) const;  	bool IsLineEndPosition(int position) const;  	int VCHomePosition(int position) const; diff --git a/src/ScintillaBase.cxx b/src/ScintillaBase.cxx index 5fc908e91..4a0146f7b 100644 --- a/src/ScintillaBase.cxx +++ b/src/ScintillaBase.cxx @@ -473,6 +473,7 @@ class LexState : public LexInterface {  	const LexerModule *lexCurrent;  	void SetLexerModule(const LexerModule *lex);  	PropSetSimple props; +	int interfaceVersion;  public:  	int lexLanguage; @@ -492,6 +493,15 @@ public:  	const char *PropGet(const char *key) const;  	int PropGetInt(const char *key, int defaultValue=0) const;  	int PropGetExpanded(const char *key, char *result) const; + +	int LineEndTypesSupported(); +	int AllocateSubStyles(int styleBase, int numberStyles); +	int SubStylesStart(int styleBase); +	int SubStylesLength(int styleBase); +	void FreeSubStyles(); +	void SetIdentifiers(int style, const char *identifiers); +	int DistanceToSecondaryStyles(); +	const char *GetSubStyleBases();  };  #ifdef SCI_NAMESPACE @@ -501,6 +511,7 @@ public:  LexState::LexState(Document *pdoc_) : LexInterface(pdoc_) {  	lexCurrent = 0;  	performingStyle = false; +	interfaceVersion = lvOriginal;  	lexLanguage = SCLEX_CONTAINER;  } @@ -524,9 +535,12 @@ void LexState::SetLexerModule(const LexerModule *lex) {  			instance->Release();  			instance = 0;  		} +		interfaceVersion = lvOriginal;  		lexCurrent = lex; -		if (lexCurrent) +		if (lexCurrent) {  			instance = lexCurrent->Create(); +			interfaceVersion = instance->Version(); +		}  		pdoc->LexerChanged();  	}  } @@ -631,6 +645,60 @@ int LexState::PropGetExpanded(const char *key, char *result) const {  	return props.GetExpanded(key, result);  } +int LexState::LineEndTypesSupported() { +	if (instance && (interfaceVersion >= lvSubStyles)) { +		return static_cast<ILexerWithSubStyles *>(instance)->LineEndTypesSupported(); +	} +	return 0; +} + +int LexState::AllocateSubStyles(int styleBase, int numberStyles) { +	if (instance && (interfaceVersion >= lvSubStyles)) { +		return static_cast<ILexerWithSubStyles *>(instance)->AllocateSubStyles(styleBase, numberStyles); +	} +	return -1; +} + +int LexState::SubStylesStart(int styleBase) { +	if (instance && (interfaceVersion >= lvSubStyles)) { +		return static_cast<ILexerWithSubStyles *>(instance)->SubStylesStart(styleBase); +	} +	return -1; +} + +int LexState::SubStylesLength(int styleBase) { +	if (instance && (interfaceVersion >= lvSubStyles)) { +		return static_cast<ILexerWithSubStyles *>(instance)->SubStylesLength(styleBase); +	} +	return 0; +} + +void LexState::FreeSubStyles() { +	if (instance && (interfaceVersion >= lvSubStyles)) { +		static_cast<ILexerWithSubStyles *>(instance)->FreeSubStyles(); +	} +} + +void LexState::SetIdentifiers(int style, const char *identifiers) { +	if (instance && (interfaceVersion >= lvSubStyles)) { +		static_cast<ILexerWithSubStyles *>(instance)->SetIdentifiers(style, identifiers); +	} +} + +int LexState::DistanceToSecondaryStyles() { +	if (instance && (interfaceVersion >= lvSubStyles)) { +		return static_cast<ILexerWithSubStyles *>(instance)->DistanceToSecondaryStyles(); +	} +	return 0; +} + +const char *LexState::GetSubStyleBases() { +	if (instance && (interfaceVersion >= lvSubStyles)) { +		return static_cast<ILexerWithSubStyles *>(instance)->GetSubStyleBases(); +	} +	return ""; +} +  #endif  void ScintillaBase::NotifyStyleToNeeded(int endStyleNeeded) { @@ -891,6 +959,31 @@ sptr_t ScintillaBase::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lPara  	case SCI_DESCRIBEKEYWORDSETS:  		return StringResult(lParam, DocumentLexState()->DescribeWordListSets()); +	case SCI_GETLINEENDTYPESSUPPORTED: +		return DocumentLexState()->LineEndTypesSupported(); + +	case SCI_ALLOCATESUBSTYLES: +		return DocumentLexState()->AllocateSubStyles(wParam, lParam); + +	case SCI_GETSUBSTYLESSTART: +		return DocumentLexState()->SubStylesStart(wParam); + +	case SCI_GETSUBSTYLESLENGTH: +		return DocumentLexState()->SubStylesLength(wParam); + +	case SCI_FREESUBSTYLES: +		DocumentLexState()->FreeSubStyles(); +		break; + +	case SCI_SETIDENTIFIERS: +		DocumentLexState()->SetIdentifiers(wParam, reinterpret_cast<const char *>(lParam)); +		break; + +	case SCI_DISTANCETOSECONDARYSTYLES: +		return DocumentLexState()->DistanceToSecondaryStyles(); + +	case SCI_GETSUBSTYLEBASES: +		return StringResult(lParam, DocumentLexState()->GetSubStyleBases());  #endif  	default: | 
