diff options
-rw-r--r-- | src/Document.cxx | 6 | ||||
-rw-r--r-- | src/Editor.cxx | 210 | ||||
-rw-r--r-- | src/Editor.h | 2 | ||||
-rw-r--r-- | src/ViewStyle.cxx | 79 | ||||
-rw-r--r-- | 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<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); |