OSDN Git Service

Commit DialogBox compile Okay
[tortoisegit/TortoiseGitJp.git] / ext / scintilla / src / ViewStyle.cxx
diff --git a/ext/scintilla/src/ViewStyle.cxx b/ext/scintilla/src/ViewStyle.cxx
new file mode 100644 (file)
index 0000000..d0bac30
--- /dev/null
@@ -0,0 +1,359 @@
+// 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