From 903e4bd44bab47455f533915caaa95bd2fd2e99e Mon Sep 17 00:00:00 2001 From: nyamatongwe Date: Sun, 24 Jun 2007 12:02:23 +0000 Subject: Make the styles array variable length so it can be increased to 256 entries without always taking 24K. --- src/Document.cxx | 6 +- src/Editor.cxx | 210 +++++++++++++++++++++++------------------------------- src/Editor.h | 2 + src/ViewStyle.cxx | 79 ++++++++++++++------ src/ViewStyle.h | 7 +- 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(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(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(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(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(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= size) { + // Grow array + int sizeNew = size * 2; + char **namesNew = new char *[sizeNew]; + for (int j=0;j STYLE_DEFAULT) { + for (; i= 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