aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authornyamatongwe <devnull@localhost>2013-01-19 11:10:41 +1100
committernyamatongwe <devnull@localhost>2013-01-19 11:10:41 +1100
commit5a13b76c4ba92e4e47cac86d8d7d2617c60aa856 (patch)
tree04e29696c41c6d512d32190e31606f8cd6480036 /src
parent6bddf57deb97b522c7b8e0293fcd15c95a2d9823 (diff)
downloadscintilla-mirror-5a13b76c4ba92e4e47cac86d8d7d2617c60aa856.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.cxx20
-rw-r--r--src/Document.h8
-rw-r--r--src/ScintillaBase.cxx95
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: