aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorNeil <nyamatongwe@gmail.com>2013-09-03 18:25:32 +1000
committerNeil <nyamatongwe@gmail.com>2013-09-03 18:25:32 +1000
commit77e3727bdd5c981c338fd1c0bc073393aa2f5068 (patch)
tree14ab874e81b5216e3f4154d94a9b14da76f48bd2
parente27fc2d13734da7861ca1c640143b172927f25a6 (diff)
downloadscintilla-mirror-77e3727bdd5c981c338fd1c0bc073393aa2f5068.tar.gz
Added GetStyleFromSubStyle.
Tests for this and other sub styles methods.
-rw-r--r--include/ILexer.h1
-rw-r--r--include/Scintilla.h1
-rw-r--r--include/Scintilla.iface3
-rw-r--r--lexers/LexCPP.cxx3
-rw-r--r--lexlib/SubStyles.h17
-rw-r--r--src/ScintillaBase.cxx11
-rw-r--r--test/simpleTests.py32
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):