diff options
author | Neil <nyamatongwe@gmail.com> | 2013-09-03 18:25:32 +1000 |
---|---|---|
committer | Neil <nyamatongwe@gmail.com> | 2013-09-03 18:25:32 +1000 |
commit | 77e3727bdd5c981c338fd1c0bc073393aa2f5068 (patch) | |
tree | 14ab874e81b5216e3f4154d94a9b14da76f48bd2 | |
parent | e27fc2d13734da7861ca1c640143b172927f25a6 (diff) | |
download | scintilla-mirror-77e3727bdd5c981c338fd1c0bc073393aa2f5068.tar.gz |
Added GetStyleFromSubStyle.
Tests for this and other sub styles methods.
-rw-r--r-- | include/ILexer.h | 1 | ||||
-rw-r--r-- | include/Scintilla.h | 1 | ||||
-rw-r--r-- | include/Scintilla.iface | 3 | ||||
-rw-r--r-- | lexers/LexCPP.cxx | 3 | ||||
-rw-r--r-- | lexlib/SubStyles.h | 17 | ||||
-rw-r--r-- | src/ScintillaBase.cxx | 11 | ||||
-rw-r--r-- | test/simpleTests.py | 32 |
7 files changed, 66 insertions, 2 deletions
diff --git a/include/ILexer.h b/include/ILexer.h index e93de819a..16ae4a28f 100644 --- a/include/ILexer.h +++ b/include/ILexer.h @@ -75,6 +75,7 @@ public: virtual int SCI_METHOD AllocateSubStyles(int styleBase, int numberStyles) = 0; virtual int SCI_METHOD SubStylesStart(int styleBase) = 0; virtual int SCI_METHOD SubStylesLength(int styleBase) = 0; + virtual int SCI_METHOD StyleFromSubStyle(int subStyle) = 0; virtual void SCI_METHOD FreeSubStyles() = 0; virtual void SCI_METHOD SetIdentifiers(int style, const char *identifiers) = 0; virtual int SCI_METHOD DistanceToSecondaryStyles() = 0; diff --git a/include/Scintilla.h b/include/Scintilla.h index 405cc81f7..8391bae3e 100644 --- a/include/Scintilla.h +++ b/include/Scintilla.h @@ -997,6 +997,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, #define SCI_ALLOCATESUBSTYLES 4020 #define SCI_GETSUBSTYLESSTART 4021 #define SCI_GETSUBSTYLESLENGTH 4022 +#define SCI_GETSTYLEFROMSUBSTYLE 4027 #define SCI_FREESUBSTYLES 4023 #define SCI_SETIDENTIFIERS 4024 #define SCI_DISTANCETOSECONDARYSTYLES 4025 diff --git a/include/Scintilla.iface b/include/Scintilla.iface index a2170501f..b5ba48f65 100644 --- a/include/Scintilla.iface +++ b/include/Scintilla.iface @@ -4403,6 +4403,9 @@ get int GetSubStylesStart=4021(int styleBase,) # The number of sub styles associated with a base style get int GetSubStylesLength=4022(int styleBase,) +# For a sub style, return the base style, else return the argument. +get int GetStyleFromSubStyle=4027(int subStyle,) + # Free allocated sub styles fun void FreeSubStyles=4023(,) diff --git a/lexers/LexCPP.cxx b/lexers/LexCPP.cxx index b3c934618..5340271d5 100644 --- a/lexers/LexCPP.cxx +++ b/lexers/LexCPP.cxx @@ -387,6 +387,9 @@ public: int SCI_METHOD SubStylesLength(int styleBase) { return subStyles.Length(styleBase); } + int SCI_METHOD StyleFromSubStyle(int subStyle) { + return subStyles.BaseStyle(subStyle); + } void SCI_METHOD FreeSubStyles() { subStyles.Free(); } diff --git a/lexlib/SubStyles.h b/lexlib/SubStyles.h index e6c34e0df..ee0edce96 100644 --- a/lexlib/SubStyles.h +++ b/lexlib/SubStyles.h @@ -13,13 +13,14 @@ namespace Scintilla { #endif class WordClassifier { + int baseStyle; int firstStyle; int lenStyles; std::map<std::string, int> wordToStyle; public: - WordClassifier() : firstStyle(0), lenStyles(0) { + WordClassifier(int baseStyle_) : baseStyle(baseStyle_), firstStyle(0), lenStyles(0) { } void Allocate(int firstStyle_, int lenStyles_) { @@ -28,6 +29,10 @@ public: wordToStyle.clear(); } + int Base() const { + return baseStyle; + } + int Start() const { return firstStyle; } @@ -105,8 +110,8 @@ public: secondaryDistance(secondaryDistance_), allocated(0) { while (baseStyles[classifications]) { + classifiers.push_back(WordClassifier(baseStyles[classifications])); classifications++; - classifiers.push_back(WordClassifier()); } } @@ -134,6 +139,14 @@ public: return (block >= 0) ? classifiers[block].Length() : 0; } + int BaseStyle(int subStyle) const { + int block = BlockFromStyle(subStyle); + if (block >= 0) + return classifiers[block].Base(); + else + return subStyle; + } + int DistanceToSecondaryStyles() const { return secondaryDistance; } diff --git a/src/ScintillaBase.cxx b/src/ScintillaBase.cxx index 814eac726..e65b3ecf7 100644 --- a/src/ScintillaBase.cxx +++ b/src/ScintillaBase.cxx @@ -503,6 +503,7 @@ public: int AllocateSubStyles(int styleBase, int numberStyles); int SubStylesStart(int styleBase); int SubStylesLength(int styleBase); + int StyleFromSubStyle(int subStyle); void FreeSubStyles(); void SetIdentifiers(int style, const char *identifiers); int DistanceToSecondaryStyles(); @@ -678,6 +679,13 @@ int LexState::SubStylesLength(int styleBase) { return 0; } +int LexState::StyleFromSubStyle(int subStyle) { + if (instance && (interfaceVersion >= lvSubStyles)) { + return static_cast<ILexerWithSubStyles *>(instance)->StyleFromSubStyle(subStyle); + } + return 0; +} + void LexState::FreeSubStyles() { if (instance && (interfaceVersion >= lvSubStyles)) { static_cast<ILexerWithSubStyles *>(instance)->FreeSubStyles(); @@ -983,6 +991,9 @@ sptr_t ScintillaBase::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lPara case SCI_GETSUBSTYLESLENGTH: return DocumentLexState()->SubStylesLength(wParam); + case SCI_GETSTYLEFROMSUBSTYLE: + return DocumentLexState()->StyleFromSubStyle(wParam); + case SCI_FREESUBSTYLES: DocumentLexState()->FreeSubStyles(); break; diff --git a/test/simpleTests.py b/test/simpleTests.py index 30e74209d..f98d0c230 100644 --- a/test/simpleTests.py +++ b/test/simpleTests.py @@ -1627,6 +1627,38 @@ class TestLexer(unittest.TestCase): wordSet = self.ed.DescribeKeyWordSets() self.assertNotEquals(wordSet, b"") +class TestSubStyles(unittest.TestCase): + def setUp(self): + self.xite = Xite.xiteFrame + self.ed = self.xite.ed + self.ed.ClearAll() + self.ed.EmptyUndoBuffer() + + def testInfo(self): + self.ed.Lexer = self.ed.SCLEX_CPP + bases = self.ed.GetSubStyleBases() + self.assertEquals(bases, b"\x0b\x11") # IDENTIFIER 11, COMMENTDOCKEYWORD 17 + self.assertEquals(self.ed.DistanceToSecondaryStyles(), 0x40) + + def testAllocate(self): + self.ed.Lexer = self.ed.SCLEX_CPP + self.assertEquals(self.ed.GetStyleFromSubStyle(0x80), 0x80) + self.assertEquals(self.ed.GetSubStylesStart(self.ed.SCE_C_IDENTIFIER), 0) + self.assertEquals(self.ed.GetSubStylesLength(self.ed.SCE_C_IDENTIFIER), 0) + numSubStyles = 5 + subs = self.ed.AllocateSubStyles(self.ed.SCE_C_IDENTIFIER, numSubStyles) + self.assertEquals(subs, 0x80) + self.assertEquals(self.ed.GetSubStylesStart(self.ed.SCE_C_IDENTIFIER), 0x80) + self.assertEquals(self.ed.GetSubStylesLength(self.ed.SCE_C_IDENTIFIER), numSubStyles) + self.assertEquals(self.ed.GetStyleFromSubStyle(subs), self.ed.SCE_C_IDENTIFIER) + self.assertEquals(self.ed.GetStyleFromSubStyle(subs+numSubStyles-1), self.ed.SCE_C_IDENTIFIER) + self.assertEquals(self.ed.GetStyleFromSubStyle(self.ed.SCE_C_IDENTIFIER), self.ed.SCE_C_IDENTIFIER) + # Now free and check same as start + self.ed.FreeSubStyles() + self.assertEquals(self.ed.GetStyleFromSubStyle(subs), subs) + self.assertEquals(self.ed.GetSubStylesStart(self.ed.SCE_C_IDENTIFIER), 0) + self.assertEquals(self.ed.GetSubStylesLength(self.ed.SCE_C_IDENTIFIER), 0) + class TestAutoComplete(unittest.TestCase): def setUp(self): |