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: |