aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authornyamatongwe <unknown>2007-06-24 12:02:23 +0000
committernyamatongwe <unknown>2007-06-24 12:02:23 +0000
commit903e4bd44bab47455f533915caaa95bd2fd2e99e (patch)
treefd041ad1e922734432d617c50c2c80575a71ec84 /src
parentb443cc0a72149358aab36d9a8b26e5021d72fbfc (diff)
downloadscintilla-mirror-903e4bd44bab47455f533915caaa95bd2fd2e99e.tar.gz
Make the styles array variable length so it can be increased to 256 entries
without always taking 24K.
Diffstat (limited to 'src')
-rw-r--r--src/Document.cxx6
-rw-r--r--src/Editor.cxx210
-rw-r--r--src/Editor.h2
-rw-r--r--src/ViewStyle.cxx79
-rw-r--r--src/ViewStyle.h7
5 files changed, 153 insertions, 151 deletions
diff --git a/src/Document.cxx b/src/Document.cxx
index cfcda92be..51800b905 100644
--- a/src/Document.cxx
+++ b/src/Document.cxx
@@ -1271,11 +1271,7 @@ void Document::SetCharClasses(const unsigned char *chars, CharClassify::cc newCh
void Document::SetStylingBits(int bits) {
stylingBits = bits;
- stylingBitsMask = 0;
- for (int bit = 0; bit < stylingBits; bit++) {
- stylingBitsMask <<= 1;
- stylingBitsMask |= 1;
- }
+ stylingBitsMask = (1 << stylingBits) - 1;
}
void Document::StartStyling(int position, char mask) {
diff --git a/src/Editor.cxx b/src/Editor.cxx
index 9c4c77d3c..c4e86fb09 100644
--- a/src/Editor.cxx
+++ b/src/Editor.cxx
@@ -5662,6 +5662,89 @@ static char *CharPtrFromSPtr(sptr_t lParam) {
return reinterpret_cast<char *>(lParam);
}
+void Editor::StyleSetMessage(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
+ vs.EnsureStyle(wParam);
+ switch (iMessage) {
+ case SCI_STYLESETFORE:
+ vs.styles[wParam].fore.desired = ColourDesired(lParam);
+ break;
+ case SCI_STYLESETBACK:
+ vs.styles[wParam].back.desired = ColourDesired(lParam);
+ break;
+ case SCI_STYLESETBOLD:
+ vs.styles[wParam].bold = lParam != 0;
+ break;
+ case SCI_STYLESETITALIC:
+ vs.styles[wParam].italic = lParam != 0;
+ break;
+ case SCI_STYLESETEOLFILLED:
+ vs.styles[wParam].eolFilled = lParam != 0;
+ break;
+ case SCI_STYLESETSIZE:
+ vs.styles[wParam].size = lParam;
+ break;
+ case SCI_STYLESETFONT:
+ if (lParam != 0) {
+ vs.SetStyleFontName(wParam, CharPtrFromSPtr(lParam));
+ }
+ break;
+ case SCI_STYLESETUNDERLINE:
+ vs.styles[wParam].underline = lParam != 0;
+ break;
+ case SCI_STYLESETCASE:
+ vs.styles[wParam].caseForce = static_cast<Style::ecaseForced>(lParam);
+ break;
+ case SCI_STYLESETCHARACTERSET:
+ vs.styles[wParam].characterSet = lParam;
+ break;
+ case SCI_STYLESETVISIBLE:
+ vs.styles[wParam].visible = lParam != 0;
+ break;
+ case SCI_STYLESETCHANGEABLE:
+ vs.styles[wParam].changeable = lParam != 0;
+ break;
+ case SCI_STYLESETHOTSPOT:
+ vs.styles[wParam].hotspot = lParam != 0;
+ break;
+ }
+ InvalidateStyleRedraw();
+}
+
+sptr_t Editor::StyleGetMessage(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
+ vs.EnsureStyle(wParam);
+ switch (iMessage) {
+ case SCI_STYLEGETFORE:
+ return vs.styles[wParam].fore.desired.AsLong();
+ case SCI_STYLEGETBACK:
+ return vs.styles[wParam].back.desired.AsLong();
+ case SCI_STYLEGETBOLD:
+ return vs.styles[wParam].bold ? 1 : 0;
+ case SCI_STYLEGETITALIC:
+ return vs.styles[wParam].italic ? 1 : 0;
+ case SCI_STYLEGETEOLFILLED:
+ return vs.styles[wParam].eolFilled ? 1 : 0;
+ case SCI_STYLEGETSIZE:
+ return vs.styles[wParam].size;
+ case SCI_STYLEGETFONT:
+ if (lParam != 0)
+ strcpy(CharPtrFromSPtr(lParam), vs.styles[wParam].fontName);
+ return strlen(vs.styles[wParam].fontName);
+ case SCI_STYLEGETUNDERLINE:
+ return vs.styles[wParam].underline ? 1 : 0;
+ case SCI_STYLEGETCASE:
+ return static_cast<int>(vs.styles[wParam].caseForce);
+ case SCI_STYLEGETCHARACTERSET:
+ return vs.styles[wParam].characterSet;
+ case SCI_STYLEGETVISIBLE:
+ return vs.styles[wParam].visible ? 1 : 0;
+ case SCI_STYLEGETCHANGEABLE:
+ return vs.styles[wParam].changeable ? 1 : 0;
+ case SCI_STYLEGETHOTSPOT:
+ return vs.styles[wParam].hotspot ? 1 : 0;
+ }
+ return 0;
+}
+
sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
//Platform::DebugPrintf("S start wnd proc %d %d %d\n",iMessage, wParam, lParam);
@@ -6406,7 +6489,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
break;
case SCI_TEXTWIDTH:
- PLATFORM_ASSERT(wParam <= STYLE_MAX);
+ PLATFORM_ASSERT(wParam <= vs.stylesSize);
PLATFORM_ASSERT(lParam);
return TextWidth(wParam, CharPtrFromSPtr(lParam));
@@ -6635,157 +6718,42 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
break;
case SCI_STYLESETFORE:
- if (wParam <= STYLE_MAX) {
- vs.styles[wParam].fore.desired = ColourDesired(lParam);
- InvalidateStyleRedraw();
- }
- break;
case SCI_STYLESETBACK:
- if (wParam <= STYLE_MAX) {
- vs.styles[wParam].back.desired = ColourDesired(lParam);
- InvalidateStyleRedraw();
- }
- break;
case SCI_STYLESETBOLD:
- if (wParam <= STYLE_MAX) {
- vs.styles[wParam].bold = lParam != 0;
- InvalidateStyleRedraw();
- }
- break;
case SCI_STYLESETITALIC:
- if (wParam <= STYLE_MAX) {
- vs.styles[wParam].italic = lParam != 0;
- InvalidateStyleRedraw();
- }
- break;
case SCI_STYLESETEOLFILLED:
- if (wParam <= STYLE_MAX) {
- vs.styles[wParam].eolFilled = lParam != 0;
- InvalidateStyleRedraw();
- }
- break;
case SCI_STYLESETSIZE:
- if (wParam <= STYLE_MAX) {
- vs.styles[wParam].size = lParam;
- InvalidateStyleRedraw();
- }
- break;
case SCI_STYLESETFONT:
- if (lParam == 0)
- return 0;
- if (wParam <= STYLE_MAX) {
- vs.SetStyleFontName(wParam, CharPtrFromSPtr(lParam));
- InvalidateStyleRedraw();
- }
- break;
case SCI_STYLESETUNDERLINE:
- if (wParam <= STYLE_MAX) {
- vs.styles[wParam].underline = lParam != 0;
- InvalidateStyleRedraw();
- }
- break;
case SCI_STYLESETCASE:
- if (wParam <= STYLE_MAX) {
- vs.styles[wParam].caseForce = static_cast<Style::ecaseForced>(lParam);
- InvalidateStyleRedraw();
- }
- break;
case SCI_STYLESETCHARACTERSET:
- if (wParam <= STYLE_MAX) {
- vs.styles[wParam].characterSet = lParam;
- InvalidateStyleRedraw();
- }
- break;
case SCI_STYLESETVISIBLE:
- if (wParam <= STYLE_MAX) {
- vs.styles[wParam].visible = lParam != 0;
- InvalidateStyleRedraw();
- }
- break;
case SCI_STYLESETCHANGEABLE:
- if (wParam <= STYLE_MAX) {
- vs.styles[wParam].changeable = lParam != 0;
- InvalidateStyleRedraw();
- }
- break;
case SCI_STYLESETHOTSPOT:
- if (wParam <= STYLE_MAX) {
- vs.styles[wParam].hotspot = lParam != 0;
- InvalidateStyleRedraw();
- }
+ StyleSetMessage(iMessage, wParam, lParam);
break;
+
case SCI_STYLEGETFORE:
- if (wParam <= STYLE_MAX)
- return vs.styles[wParam].fore.desired.AsLong();
- else
- return 0;
case SCI_STYLEGETBACK:
- if (wParam <= STYLE_MAX)
- return vs.styles[wParam].back.desired.AsLong();
- else
- return 0;
case SCI_STYLEGETBOLD:
- if (wParam <= STYLE_MAX)
- return vs.styles[wParam].bold ? 1 : 0;
- else
- return 0;
case SCI_STYLEGETITALIC:
- if (wParam <= STYLE_MAX)
- return vs.styles[wParam].italic ? 1 : 0;
- else
- return 0;
case SCI_STYLEGETEOLFILLED:
- if (wParam <= STYLE_MAX)
- return vs.styles[wParam].eolFilled ? 1 : 0;
- else
- return 0;
case SCI_STYLEGETSIZE:
- if (wParam <= STYLE_MAX)
- return vs.styles[wParam].size;
- else
- return 0;
case SCI_STYLEGETFONT:
- if (lParam == 0)
- return strlen(vs.styles[wParam].fontName);
-
- if (wParam <= STYLE_MAX)
- strcpy(CharPtrFromSPtr(lParam), vs.styles[wParam].fontName);
- break;
case SCI_STYLEGETUNDERLINE:
- if (wParam <= STYLE_MAX)
- return vs.styles[wParam].underline ? 1 : 0;
- else
- return 0;
case SCI_STYLEGETCASE:
- if (wParam <= STYLE_MAX)
- return static_cast<int>(vs.styles[wParam].caseForce);
- else
- return 0;
case SCI_STYLEGETCHARACTERSET:
- if (wParam <= STYLE_MAX)
- return vs.styles[wParam].characterSet;
- else
- return 0;
case SCI_STYLEGETVISIBLE:
- if (wParam <= STYLE_MAX)
- return vs.styles[wParam].visible ? 1 : 0;
- else
- return 0;
case SCI_STYLEGETCHANGEABLE:
- if (wParam <= STYLE_MAX)
- return vs.styles[wParam].changeable ? 1 : 0;
- else
- return 0;
case SCI_STYLEGETHOTSPOT:
- if (wParam <= STYLE_MAX)
- return vs.styles[wParam].hotspot ? 1 : 0;
- else
- return 0;
+ return StyleGetMessage(iMessage, wParam, lParam);
+
case SCI_STYLERESETDEFAULT:
vs.ResetDefaultStyle();
InvalidateStyleRedraw();
break;
case SCI_SETSTYLEBITS:
+ vs.EnsureStyle((1 << wParam) - 1);
pdoc->SetStylingBits(wParam);
break;
diff --git a/src/Editor.h b/src/Editor.h
index 213b0e361..501abb632 100644
--- a/src/Editor.h
+++ b/src/Editor.h
@@ -454,6 +454,8 @@ protected: // ScintillaBase subclass needs access to much of Editor
void AddStyledText(char *buffer, int appendLength);
virtual sptr_t DefWndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) = 0;
+ void StyleSetMessage(unsigned int iMessage, uptr_t wParam, sptr_t lParam);
+ sptr_t StyleGetMessage(unsigned int iMessage, uptr_t wParam, sptr_t lParam);
public:
// Public so the COM thunks can access it.
diff --git a/src/ViewStyle.cxx b/src/ViewStyle.cxx
index 8f51fd5b9..f73c15ed1 100644
--- a/src/ViewStyle.cxx
+++ b/src/ViewStyle.cxx
@@ -29,15 +29,15 @@ MarginStyle::MarginStyle() :
// A list of the fontnames - avoids wasting space in each style
FontNames::FontNames() {
- size = 8;
- names = new char *[size];
+ size = 8;
+ names = new char *[size];
max = 0;
}
FontNames::~FontNames() {
Clear();
- delete []names;
- names = 0;
+ delete []names;
+ names = 0;
}
void FontNames::Clear() {
@@ -55,17 +55,17 @@ const char *FontNames::Save(const char *name) {
return names[i];
}
}
- if (max >= size) {
- // Grow array
- int sizeNew = size * 2;
- char **namesNew = new char *[sizeNew];
- for (int j=0;j<max;j++) {
- namesNew[j] = names[j];
- }
- delete []names;
- names = namesNew;
- size = sizeNew;
- }
+ if (max >= size) {
+ // Grow array
+ int sizeNew = size * 2;
+ char **namesNew = new char *[sizeNew];
+ for (int j=0;j<max;j++) {
+ namesNew[j] = names[j];
+ }
+ delete []names;
+ names = namesNew;
+ size = sizeNew;
+ }
names[max] = new char[strlen(name) + 1];
strcpy(names[max], name);
max++;
@@ -77,8 +77,8 @@ ViewStyle::ViewStyle() {
}
ViewStyle::ViewStyle(const ViewStyle &source) {
- Init();
- for (unsigned int sty=0;sty<(sizeof(styles)/sizeof(styles[0]));sty++) {
+ Init(source.stylesSize);
+ for (unsigned int sty=0;sty<source.stylesSize;sty++) {
styles[sty] = source.styles[sty];
// Can't just copy fontname as its lifetime is relative to its owning ViewStyle
styles[sty].fontName = fontNames.Save(source.styles[sty].fontName);
@@ -142,9 +142,14 @@ ViewStyle::ViewStyle(const ViewStyle &source) {
}
ViewStyle::~ViewStyle() {
+ delete []styles;
+ styles = NULL;
}
-void ViewStyle::Init() {
+void ViewStyle::Init(size_t stylesSize_) {
+ stylesSize = 0;
+ styles = NULL;
+ AllocStyles(stylesSize_);
fontNames.Clear();
ResetDefaultStyle();
@@ -232,7 +237,7 @@ void ViewStyle::Init() {
void ViewStyle::RefreshColourPalette(Palette &pal, bool want) {
unsigned int i;
- for (i=0;i<(sizeof(styles)/sizeof(styles[0]));i++) {
+ for (i=0;i<stylesSize;i++) {
pal.WantFind(styles[i].fore, want);
pal.WantFind(styles[i].back, want);
}
@@ -267,7 +272,7 @@ void ViewStyle::Refresh(Surface &surface) {
maxAscent = styles[STYLE_DEFAULT].ascent;
maxDescent = styles[STYLE_DEFAULT].descent;
someStylesProtected = false;
- for (unsigned int i=0;i<(sizeof(styles)/sizeof(styles[0]));i++) {
+ for (unsigned int i=0; i<stylesSize; i++) {
if (i != STYLE_DEFAULT) {
styles[i].Realise(surface, zoomLevel, &styles[STYLE_DEFAULT], extraFontFlag);
if (maxAscent < styles[i].ascent)
@@ -295,17 +300,45 @@ void ViewStyle::Refresh(Surface &surface) {
}
}
+void ViewStyle::AllocStyles(size_t sizeNew) {
+ Style *stylesNew = new Style[sizeNew];
+ size_t i=0;
+ for (; i<stylesSize; i++) {
+ stylesNew[i] = styles[i];
+ stylesNew[i].fontName = styles[i].fontName;
+ }
+ if (stylesSize > STYLE_DEFAULT) {
+ for (; i<sizeNew; i++) {
+ if (i != STYLE_DEFAULT) {
+ stylesNew[i].ClearTo(styles[STYLE_DEFAULT]);
+ }
+ }
+ }
+ delete []styles;
+ styles = stylesNew;
+ stylesSize = sizeNew;
+}
+
+void ViewStyle::EnsureStyle(size_t index) {
+ if (index >= stylesSize) {
+ size_t sizeNew = stylesSize * 2;
+ while (sizeNew < index)
+ sizeNew *= 2;
+ AllocStyles(sizeNew);
+ }
+}
+
void ViewStyle::ResetDefaultStyle() {
styles[STYLE_DEFAULT].Clear(ColourDesired(0,0,0),
ColourDesired(0xff,0xff,0xff),
- Platform::DefaultFontSize(), fontNames.Save(Platform::DefaultFont()),
+ Platform::DefaultFontSize(), fontNames.Save(Platform::DefaultFont()),
SC_CHARSET_DEFAULT,
false, false, false, false, Style::caseMixed, true, true, false);
}
void ViewStyle::ClearStyles() {
// Reset all styles to be like the default style
- for (unsigned int i=0;i<(sizeof(styles)/sizeof(styles[0]));i++) {
+ for (unsigned int i=0; i<stylesSize; i++) {
if (i != STYLE_DEFAULT) {
styles[i].ClearTo(styles[STYLE_DEFAULT]);
}
@@ -322,5 +355,5 @@ void ViewStyle::SetStyleFontName(int styleIndex, const char *name) {
}
bool ViewStyle::ProtectionActive() const {
- return someStylesProtected;
+ return someStylesProtected;
}
diff --git a/src/ViewStyle.h b/src/ViewStyle.h
index 39adf81e8..a41e5f452 100644
--- a/src/ViewStyle.h
+++ b/src/ViewStyle.h
@@ -45,7 +45,8 @@ enum WhiteSpaceVisibility {wsInvisible=0, wsVisibleAlways=1, wsVisibleAfterInden
class ViewStyle {
public:
FontNames fontNames;
- Style styles[STYLE_MAX + 1];
+ size_t stylesSize;
+ Style *styles;
LineMarker markers[MARKER_MAX + 1];
Indicator indicators[INDIC_MAX + 1];
int lineHeight;
@@ -103,9 +104,11 @@ public:
ViewStyle();
ViewStyle(const ViewStyle &source);
~ViewStyle();
- void Init();
+ void Init(size_t stylesSize_=64);
void RefreshColourPalette(Palette &pal, bool want);
void Refresh(Surface &surface);
+ void AllocStyles(size_t sizeNew);
+ void EnsureStyle(size_t index);
void ResetDefaultStyle();
void ClearStyles();
void SetStyleFontName(int styleIndex, const char *name);