--- /dev/null
+// Scintilla source code edit control\r
+/** @file ViewStyle.cxx\r
+ ** Store information on how the document is to be viewed.\r
+ **/\r
+// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>\r
+// The License.txt file describes the conditions under which this software may be distributed.\r
+\r
+#include <string.h>\r
+\r
+#include "Platform.h"\r
+\r
+#include "Scintilla.h"\r
+#include "SplitVector.h"\r
+#include "Partitioning.h"\r
+#include "RunStyles.h"\r
+#include "Indicator.h"\r
+#include "XPM.h"\r
+#include "LineMarker.h"\r
+#include "Style.h"\r
+#include "ViewStyle.h"\r
+\r
+#ifdef SCI_NAMESPACE\r
+using namespace Scintilla;\r
+#endif\r
+\r
+MarginStyle::MarginStyle() :\r
+ style(SC_MARGIN_SYMBOL), width(0), mask(0), sensitive(false) {\r
+}\r
+\r
+// A list of the fontnames - avoids wasting space in each style\r
+FontNames::FontNames() {\r
+ size = 8;\r
+ names = new char *[size];\r
+ max = 0;\r
+}\r
+\r
+FontNames::~FontNames() {\r
+ Clear();\r
+ delete []names;\r
+ names = 0;\r
+}\r
+\r
+void FontNames::Clear() {\r
+ for (int i=0;i<max;i++) {\r
+ delete []names[i];\r
+ }\r
+ max = 0;\r
+}\r
+\r
+const char *FontNames::Save(const char *name) {\r
+ if (!name)\r
+ return 0;\r
+ for (int i=0;i<max;i++) {\r
+ if (strcmp(names[i], name) == 0) {\r
+ return names[i];\r
+ }\r
+ }\r
+ if (max >= size) {\r
+ // Grow array\r
+ int sizeNew = size * 2;\r
+ char **namesNew = new char *[sizeNew];\r
+ for (int j=0;j<max;j++) {\r
+ namesNew[j] = names[j];\r
+ }\r
+ delete []names;\r
+ names = namesNew;\r
+ size = sizeNew;\r
+ }\r
+ names[max] = new char[strlen(name) + 1];\r
+ strcpy(names[max], name);\r
+ max++;\r
+ return names[max-1];\r
+}\r
+\r
+ViewStyle::ViewStyle() {\r
+ Init();\r
+}\r
+\r
+ViewStyle::ViewStyle(const ViewStyle &source) {\r
+ Init(source.stylesSize);\r
+ for (unsigned int sty=0;sty<source.stylesSize;sty++) {\r
+ styles[sty] = source.styles[sty];\r
+ // Can't just copy fontname as its lifetime is relative to its owning ViewStyle\r
+ styles[sty].fontName = fontNames.Save(source.styles[sty].fontName);\r
+ }\r
+ for (int mrk=0;mrk<=MARKER_MAX;mrk++) {\r
+ markers[mrk] = source.markers[mrk];\r
+ }\r
+ for (int ind=0;ind<=INDIC_MAX;ind++) {\r
+ indicators[ind] = source.indicators[ind];\r
+ }\r
+\r
+ selforeset = source.selforeset;\r
+ selforeground.desired = source.selforeground.desired;\r
+ selbackset = source.selbackset;\r
+ selbackground.desired = source.selbackground.desired;\r
+ selbackground2.desired = source.selbackground2.desired;\r
+ selAlpha = source.selAlpha;\r
+ selEOLFilled = source.selEOLFilled;\r
+\r
+ foldmarginColourSet = source.foldmarginColourSet;\r
+ foldmarginColour.desired = source.foldmarginColour.desired;\r
+ foldmarginHighlightColourSet = source.foldmarginHighlightColourSet;\r
+ foldmarginHighlightColour.desired = source.foldmarginHighlightColour.desired;\r
+\r
+ hotspotForegroundSet = source.hotspotForegroundSet;\r
+ hotspotForeground.desired = source.hotspotForeground.desired;\r
+ hotspotBackgroundSet = source.hotspotBackgroundSet;\r
+ hotspotBackground.desired = source.hotspotBackground.desired;\r
+ hotspotUnderline = source.hotspotUnderline;\r
+ hotspotSingleLine = source.hotspotSingleLine;\r
+\r
+ whitespaceForegroundSet = source.whitespaceForegroundSet;\r
+ whitespaceForeground.desired = source.whitespaceForeground.desired;\r
+ whitespaceBackgroundSet = source.whitespaceBackgroundSet;\r
+ whitespaceBackground.desired = source.whitespaceBackground.desired;\r
+ selbar.desired = source.selbar.desired;\r
+ selbarlight.desired = source.selbarlight.desired;\r
+ caretcolour.desired = source.caretcolour.desired;\r
+ showCaretLineBackground = source.showCaretLineBackground;\r
+ caretLineBackground.desired = source.caretLineBackground.desired;\r
+ caretLineAlpha = source.caretLineAlpha;\r
+ edgecolour.desired = source.edgecolour.desired;\r
+ edgeState = source.edgeState;\r
+ caretStyle = source.caretStyle;\r
+ caretWidth = source.caretWidth;\r
+ someStylesProtected = false;\r
+ leftMarginWidth = source.leftMarginWidth;\r
+ rightMarginWidth = source.rightMarginWidth;\r
+ for (int i=0;i < margins; i++) {\r
+ ms[i] = source.ms[i];\r
+ }\r
+ symbolMargin = source.symbolMargin;\r
+ maskInLine = source.maskInLine;\r
+ fixedColumnWidth = source.fixedColumnWidth;\r
+ zoomLevel = source.zoomLevel;\r
+ viewWhitespace = source.viewWhitespace;\r
+ viewIndentationGuides = source.viewIndentationGuides;\r
+ viewEOL = source.viewEOL;\r
+ showMarkedLines = source.showMarkedLines;\r
+ extraFontFlag = source.extraFontFlag;\r
+}\r
+\r
+ViewStyle::~ViewStyle() {\r
+ delete []styles;\r
+ styles = NULL;\r
+}\r
+\r
+void ViewStyle::Init(size_t stylesSize_) {\r
+ stylesSize = 0;\r
+ styles = NULL;\r
+ AllocStyles(stylesSize_);\r
+ fontNames.Clear();\r
+ ResetDefaultStyle();\r
+\r
+ indicators[0].style = INDIC_SQUIGGLE;\r
+ indicators[0].under = false;\r
+ indicators[0].fore = ColourDesired(0, 0x7f, 0);\r
+ indicators[1].style = INDIC_TT;\r
+ indicators[1].under = false;\r
+ indicators[1].fore = ColourDesired(0, 0, 0xff);\r
+ indicators[2].style = INDIC_PLAIN;\r
+ indicators[2].under = false;\r
+ indicators[2].fore = ColourDesired(0xff, 0, 0);\r
+\r
+ lineHeight = 1;\r
+ maxAscent = 1;\r
+ maxDescent = 1;\r
+ aveCharWidth = 8;\r
+ spaceWidth = 8;\r
+\r
+ selforeset = false;\r
+ selforeground.desired = ColourDesired(0xff, 0, 0);\r
+ selbackset = true;\r
+ selbackground.desired = ColourDesired(0xc0, 0xc0, 0xc0);\r
+ selbackground2.desired = ColourDesired(0xb0, 0xb0, 0xb0);\r
+ selAlpha = SC_ALPHA_NOALPHA;\r
+ selEOLFilled = false;\r
+\r
+ foldmarginColourSet = false;\r
+ foldmarginColour.desired = ColourDesired(0xff, 0, 0);\r
+ foldmarginHighlightColourSet = false;\r
+ foldmarginHighlightColour.desired = ColourDesired(0xc0, 0xc0, 0xc0);\r
+\r
+ whitespaceForegroundSet = false;\r
+ whitespaceForeground.desired = ColourDesired(0, 0, 0);\r
+ whitespaceBackgroundSet = false;\r
+ whitespaceBackground.desired = ColourDesired(0xff, 0xff, 0xff);\r
+ selbar.desired = Platform::Chrome();\r
+ selbarlight.desired = Platform::ChromeHighlight();\r
+ styles[STYLE_LINENUMBER].fore.desired = ColourDesired(0, 0, 0);\r
+ styles[STYLE_LINENUMBER].back.desired = Platform::Chrome();\r
+ caretcolour.desired = ColourDesired(0, 0, 0);\r
+ showCaretLineBackground = false;\r
+ caretLineBackground.desired = ColourDesired(0xff, 0xff, 0);\r
+ caretLineAlpha = SC_ALPHA_NOALPHA;\r
+ edgecolour.desired = ColourDesired(0xc0, 0xc0, 0xc0);\r
+ edgeState = EDGE_NONE;\r
+ caretStyle = CARETSTYLE_LINE;\r
+ caretWidth = 1;\r
+ someStylesProtected = false;\r
+\r
+ hotspotForegroundSet = false;\r
+ hotspotForeground.desired = ColourDesired(0, 0, 0xff);\r
+ hotspotBackgroundSet = false;\r
+ hotspotBackground.desired = ColourDesired(0xff, 0xff, 0xff);\r
+ hotspotUnderline = true;\r
+ hotspotSingleLine = true;\r
+\r
+ leftMarginWidth = 1;\r
+ rightMarginWidth = 1;\r
+ ms[0].style = SC_MARGIN_NUMBER;\r
+ ms[0].width = 0;\r
+ ms[0].mask = 0;\r
+ ms[1].style = SC_MARGIN_SYMBOL;\r
+ ms[1].width = 16;\r
+ ms[1].mask = ~SC_MASK_FOLDERS;\r
+ ms[2].style = SC_MARGIN_SYMBOL;\r
+ ms[2].width = 0;\r
+ ms[2].mask = 0;\r
+ fixedColumnWidth = leftMarginWidth;\r
+ symbolMargin = false;\r
+ maskInLine = 0xffffffff;\r
+ for (int margin=0; margin < margins; margin++) {\r
+ fixedColumnWidth += ms[margin].width;\r
+ symbolMargin = symbolMargin || (ms[margin].style != SC_MARGIN_NUMBER);\r
+ if (ms[margin].width > 0)\r
+ maskInLine &= ~ms[margin].mask;\r
+ }\r
+ zoomLevel = 0;\r
+ viewWhitespace = wsInvisible;\r
+ viewIndentationGuides = ivNone;\r
+ viewEOL = false;\r
+ showMarkedLines = true;\r
+ extraFontFlag = false;\r
+}\r
+\r
+void ViewStyle::RefreshColourPalette(Palette &pal, bool want) {\r
+ unsigned int i;\r
+ for (i=0;i<stylesSize;i++) {\r
+ pal.WantFind(styles[i].fore, want);\r
+ pal.WantFind(styles[i].back, want);\r
+ }\r
+ for (i=0;i<(sizeof(indicators)/sizeof(indicators[0]));i++) {\r
+ pal.WantFind(indicators[i].fore, want);\r
+ }\r
+ for (i=0;i<(sizeof(markers)/sizeof(markers[0]));i++) {\r
+ markers[i].RefreshColourPalette(pal, want);\r
+ }\r
+ pal.WantFind(selforeground, want);\r
+ pal.WantFind(selbackground, want);\r
+ pal.WantFind(selbackground2, want);\r
+\r
+ pal.WantFind(foldmarginColour, want);\r
+ pal.WantFind(foldmarginHighlightColour, want);\r
+\r
+ pal.WantFind(whitespaceForeground, want);\r
+ pal.WantFind(whitespaceBackground, want);\r
+ pal.WantFind(selbar, want);\r
+ pal.WantFind(selbarlight, want);\r
+ pal.WantFind(caretcolour, want);\r
+ pal.WantFind(caretLineBackground, want);\r
+ pal.WantFind(edgecolour, want);\r
+ pal.WantFind(hotspotForeground, want);\r
+ pal.WantFind(hotspotBackground, want);\r
+}\r
+\r
+void ViewStyle::Refresh(Surface &surface) {\r
+ selbar.desired = Platform::Chrome();\r
+ selbarlight.desired = Platform::ChromeHighlight();\r
+ styles[STYLE_DEFAULT].Realise(surface, zoomLevel, NULL, extraFontFlag);\r
+ maxAscent = styles[STYLE_DEFAULT].ascent;\r
+ maxDescent = styles[STYLE_DEFAULT].descent;\r
+ someStylesProtected = false;\r
+ for (unsigned int i=0; i<stylesSize; i++) {\r
+ if (i != STYLE_DEFAULT) {\r
+ styles[i].Realise(surface, zoomLevel, &styles[STYLE_DEFAULT], extraFontFlag);\r
+ if (maxAscent < styles[i].ascent)\r
+ maxAscent = styles[i].ascent;\r
+ if (maxDescent < styles[i].descent)\r
+ maxDescent = styles[i].descent;\r
+ }\r
+ if (styles[i].IsProtected()) {\r
+ someStylesProtected = true;\r
+ }\r
+ }\r
+\r
+ lineHeight = maxAscent + maxDescent;\r
+ aveCharWidth = styles[STYLE_DEFAULT].aveCharWidth;\r
+ spaceWidth = styles[STYLE_DEFAULT].spaceWidth;\r
+\r
+ fixedColumnWidth = leftMarginWidth;\r
+ symbolMargin = false;\r
+ maskInLine = 0xffffffff;\r
+ for (int margin=0; margin < margins; margin++) {\r
+ fixedColumnWidth += ms[margin].width;\r
+ symbolMargin = symbolMargin || (ms[margin].style != SC_MARGIN_NUMBER);\r
+ if (ms[margin].width > 0)\r
+ maskInLine &= ~ms[margin].mask;\r
+ }\r
+}\r
+\r
+void ViewStyle::AllocStyles(size_t sizeNew) {\r
+ Style *stylesNew = new Style[sizeNew];\r
+ size_t i=0;\r
+ for (; i<stylesSize; i++) {\r
+ stylesNew[i] = styles[i];\r
+ stylesNew[i].fontName = styles[i].fontName;\r
+ }\r
+ if (stylesSize > STYLE_DEFAULT) {\r
+ for (; i<sizeNew; i++) {\r
+ if (i != STYLE_DEFAULT) {\r
+ stylesNew[i].ClearTo(styles[STYLE_DEFAULT]);\r
+ }\r
+ }\r
+ }\r
+ delete []styles;\r
+ styles = stylesNew;\r
+ stylesSize = sizeNew;\r
+}\r
+\r
+void ViewStyle::EnsureStyle(size_t index) {\r
+ if (index >= stylesSize) {\r
+ size_t sizeNew = stylesSize * 2;\r
+ while (sizeNew < index)\r
+ sizeNew *= 2;\r
+ AllocStyles(sizeNew);\r
+ }\r
+}\r
+\r
+void ViewStyle::ResetDefaultStyle() {\r
+ styles[STYLE_DEFAULT].Clear(ColourDesired(0,0,0),\r
+ ColourDesired(0xff,0xff,0xff),\r
+ Platform::DefaultFontSize(), fontNames.Save(Platform::DefaultFont()),\r
+ SC_CHARSET_DEFAULT,\r
+ false, false, false, false, Style::caseMixed, true, true, false);\r
+}\r
+\r
+void ViewStyle::ClearStyles() {\r
+ // Reset all styles to be like the default style\r
+ for (unsigned int i=0; i<stylesSize; i++) {\r
+ if (i != STYLE_DEFAULT) {\r
+ styles[i].ClearTo(styles[STYLE_DEFAULT]);\r
+ }\r
+ }\r
+ styles[STYLE_LINENUMBER].back.desired = Platform::Chrome();\r
+\r
+ // Set call tip fore/back to match the values previously set for call tips\r
+ styles[STYLE_CALLTIP].back.desired = ColourDesired(0xff, 0xff, 0xff);\r
+ styles[STYLE_CALLTIP].fore.desired = ColourDesired(0x80, 0x80, 0x80);\r
+}\r
+\r
+void ViewStyle::SetStyleFontName(int styleIndex, const char *name) {\r
+ styles[styleIndex].fontName = fontNames.Save(name);\r
+}\r
+\r
+bool ViewStyle::ProtectionActive() const {\r
+ return someStylesProtected;\r
+}\r