1 // Scintilla source code edit control 
   2 /** @file ViewStyle.cxx 
   3  ** Store information on how the document is to be viewed. 
   5 // Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org> 
   6 // The License.txt file describes the conditions under which this software may be distributed. 
  12 #include "Scintilla.h" 
  13 #include "Indicator.h" 
  15 #include "LineMarker.h" 
  17 #include "ViewStyle.h" 
  19 MarginStyle::MarginStyle() : 
  20         symbol(false), width(16), mask(0xffffffff), sensitive(false) { 
  23 // A list of the fontnames - avoids wasting space in each style 
  24 FontNames::FontNames() { 
  28 FontNames::~FontNames() { 
  32 void FontNames::Clear() { 
  33         for (int i
=0;i
<max
;i
++) { 
  39 const char *FontNames::Save(const char *name
) { 
  42         for (int i
=0;i
<max
;i
++) { 
  43                 if (strcmp(names
[i
], name
) == 0) { 
  47         names
[max
] = new char[strlen(name
) + 1]; 
  48         strcpy(names
[max
], name
); 
  53 ViewStyle::ViewStyle() { 
  57 ViewStyle::ViewStyle(const ViewStyle 
&source
) { 
  59         for (unsigned int sty
=0;sty
<(sizeof(styles
)/sizeof(styles
[0]));sty
++) { 
  60                 styles
[sty
] = source
.styles
[sty
]; 
  61                 // Can't just copy fontname as its lifetime is relative to its owning ViewStyle 
  62                 styles
[sty
].fontName 
= fontNames
.Save(source
.styles
[sty
].fontName
); 
  64         for (int mrk
=0;mrk
<=MARKER_MAX
;mrk
++) { 
  65                 markers
[mrk
] = source
.markers
[mrk
]; 
  67         for (int ind
=0;ind
<=INDIC_MAX
;ind
++) { 
  68                 indicators
[ind
] = source
.indicators
[ind
]; 
  71         selforeset 
= source
.selforeset
; 
  72         selforeground
.desired 
= source
.selforeground
.desired
; 
  73         selbackset 
= source
.selbackset
; 
  74         selbackground
.desired 
= source
.selbackground
.desired
; 
  75         selbackground2
.desired 
= source
.selbackground2
.desired
; 
  77         foldmarginColourSet 
= source
.foldmarginColourSet
; 
  78         foldmarginColour
.desired 
= source
.foldmarginColour
.desired
; 
  79         foldmarginHighlightColourSet 
= source
.foldmarginHighlightColourSet
; 
  80         foldmarginHighlightColour
.desired 
= source
.foldmarginHighlightColour
.desired
; 
  82         hotspotForegroundSet 
= source
.hotspotForegroundSet
; 
  83         hotspotForeground
.desired 
= source
.hotspotForeground
.desired
; 
  84         hotspotBackgroundSet 
= source
.hotspotBackgroundSet
; 
  85         hotspotBackground
.desired 
= source
.hotspotBackground
.desired
; 
  86         hotspotUnderline 
= source
.hotspotUnderline
; 
  87         hotspotSingleLine 
= source
.hotspotSingleLine
; 
  89         whitespaceForegroundSet 
= source
.whitespaceForegroundSet
; 
  90         whitespaceForeground
.desired 
= source
.whitespaceForeground
.desired
; 
  91         whitespaceBackgroundSet 
= source
.whitespaceBackgroundSet
; 
  92         whitespaceBackground
.desired 
= source
.whitespaceBackground
.desired
; 
  93         selbar
.desired 
= source
.selbar
.desired
; 
  94         selbarlight
.desired 
= source
.selbarlight
.desired
; 
  95         caretcolour
.desired 
= source
.caretcolour
.desired
; 
  96         showCaretLineBackground 
= source
.showCaretLineBackground
; 
  97         caretLineBackground
.desired 
= source
.caretLineBackground
.desired
; 
  98         edgecolour
.desired 
= source
.edgecolour
.desired
; 
  99         edgeState 
= source
.edgeState
; 
 100         caretWidth 
= source
.caretWidth
; 
 101         someStylesProtected 
= false; 
 102         leftMarginWidth 
= source
.leftMarginWidth
; 
 103         rightMarginWidth 
= source
.rightMarginWidth
; 
 104         for (int i
=0;i 
< margins
; i
++) { 
 105                 ms
[i
] = source
.ms
[i
]; 
 107         symbolMargin 
= source
.symbolMargin
; 
 108         maskInLine 
= source
.maskInLine
; 
 109         fixedColumnWidth 
= source
.fixedColumnWidth
; 
 110         zoomLevel 
= source
.zoomLevel
; 
 111         viewWhitespace 
= source
.viewWhitespace
; 
 112         viewIndentationGuides 
= source
.viewIndentationGuides
; 
 113         viewEOL 
= source
.viewEOL
; 
 114         showMarkedLines 
= source
.showMarkedLines
; 
 115         extraFontFlag 
= source
.extraFontFlag
; 
 118 ViewStyle::~ViewStyle() { 
 121 void ViewStyle::Init() { 
 125         indicators
[0].style 
= INDIC_SQUIGGLE
; 
 126         indicators
[0].fore 
= ColourDesired(0, 0x7f, 0); 
 127         indicators
[1].style 
= INDIC_TT
; 
 128         indicators
[1].fore 
= ColourDesired(0, 0, 0xff); 
 129         indicators
[2].style 
= INDIC_PLAIN
; 
 130         indicators
[2].fore 
= ColourDesired(0xff, 0, 0); 
 139         selforeground
.desired 
= ColourDesired(0xff, 0, 0); 
 141         selbackground
.desired 
= ColourDesired(0xc0, 0xc0, 0xc0); 
 142         selbackground2
.desired 
= ColourDesired(0xb0, 0xb0, 0xb0); 
 144         foldmarginColourSet 
= false; 
 145         foldmarginColour
.desired 
= ColourDesired(0xff, 0, 0); 
 146         foldmarginHighlightColourSet 
= false; 
 147         foldmarginHighlightColour
.desired 
= ColourDesired(0xc0, 0xc0, 0xc0); 
 149         whitespaceForegroundSet 
= false; 
 150         whitespaceForeground
.desired 
= ColourDesired(0, 0, 0); 
 151         whitespaceBackgroundSet 
= false; 
 152         whitespaceBackground
.desired 
= ColourDesired(0xff, 0xff, 0xff); 
 153         selbar
.desired 
= Platform::Chrome(); 
 154         selbarlight
.desired 
= Platform::ChromeHighlight(); 
 155         styles
[STYLE_LINENUMBER
].fore
.desired 
= ColourDesired(0, 0, 0); 
 156         styles
[STYLE_LINENUMBER
].back
.desired 
= Platform::Chrome(); 
 157         caretcolour
.desired 
= ColourDesired(0, 0, 0); 
 158         showCaretLineBackground 
= false; 
 159         caretLineBackground
.desired 
= ColourDesired(0xff, 0xff, 0); 
 160         edgecolour
.desired 
= ColourDesired(0xc0, 0xc0, 0xc0); 
 161         edgeState 
= EDGE_NONE
; 
 163         someStylesProtected 
= false; 
 165         hotspotForegroundSet 
= false; 
 166         hotspotForeground
.desired 
= ColourDesired(0, 0, 0xff); 
 167         hotspotBackgroundSet 
= false; 
 168         hotspotBackground
.desired 
= ColourDesired(0xff, 0xff, 0xff); 
 169         hotspotUnderline 
= true; 
 170         hotspotSingleLine 
= true; 
 173         rightMarginWidth 
= 1; 
 174         ms
[0].symbol 
= false; 
 179         ms
[1].mask 
= ~SC_MASK_FOLDERS
; 
 183         fixedColumnWidth 
= leftMarginWidth
; 
 184         symbolMargin 
= false; 
 185         maskInLine 
= 0xffffffff; 
 186         for (int margin
=0; margin 
< margins
; margin
++) { 
 187                 fixedColumnWidth 
+= ms
[margin
].width
; 
 188                 symbolMargin 
= symbolMargin 
|| ms
[margin
].symbol
; 
 189                 if (ms
[margin
].width 
> 0) 
 190                         maskInLine 
&= ~ms
[margin
].mask
; 
 193         viewWhitespace 
= wsInvisible
; 
 194         viewIndentationGuides 
= false; 
 196         showMarkedLines 
= true; 
 197         extraFontFlag 
= false; 
 200 void ViewStyle::RefreshColourPalette(Palette 
&pal
, bool want
) { 
 202         for (i
=0;i
<(sizeof(styles
)/sizeof(styles
[0]));i
++) { 
 203                 pal
.WantFind(styles
[i
].fore
, want
); 
 204                 pal
.WantFind(styles
[i
].back
, want
); 
 206         for (i
=0;i
<(sizeof(indicators
)/sizeof(indicators
[0]));i
++) { 
 207                 pal
.WantFind(indicators
[i
].fore
, want
); 
 209         for (i
=0;i
<(sizeof(markers
)/sizeof(markers
[0]));i
++) { 
 210                 markers
[i
].RefreshColourPalette(pal
, want
); 
 212         pal
.WantFind(selforeground
, want
); 
 213         pal
.WantFind(selbackground
, want
); 
 214         pal
.WantFind(selbackground2
, want
); 
 216         pal
.WantFind(foldmarginColour
, want
); 
 217         pal
.WantFind(foldmarginHighlightColour
, want
); 
 219         pal
.WantFind(whitespaceForeground
, want
); 
 220         pal
.WantFind(whitespaceBackground
, want
); 
 221         pal
.WantFind(selbar
, want
); 
 222         pal
.WantFind(selbarlight
, want
); 
 223         pal
.WantFind(caretcolour
, want
); 
 224         pal
.WantFind(caretLineBackground
, want
); 
 225         pal
.WantFind(edgecolour
, want
); 
 226         pal
.WantFind(hotspotForeground
, want
); 
 227         pal
.WantFind(hotspotBackground
, want
); 
 230 void ViewStyle::Refresh(Surface 
&surface
) { 
 231         selbar
.desired 
= Platform::Chrome(); 
 232         selbarlight
.desired 
= Platform::ChromeHighlight(); 
 233         styles
[STYLE_DEFAULT
].Realise(surface
, zoomLevel
, NULL
, extraFontFlag
); 
 234         maxAscent 
= styles
[STYLE_DEFAULT
].ascent
; 
 235         maxDescent 
= styles
[STYLE_DEFAULT
].descent
; 
 236         someStylesProtected 
= false; 
 237         for (unsigned int i
=0;i
<(sizeof(styles
)/sizeof(styles
[0]));i
++) { 
 238                 if (i 
!= STYLE_DEFAULT
) { 
 239                         styles
[i
].Realise(surface
, zoomLevel
, &styles
[STYLE_DEFAULT
], extraFontFlag
); 
 240                         if (maxAscent 
< styles
[i
].ascent
) 
 241                                 maxAscent 
= styles
[i
].ascent
; 
 242                         if (maxDescent 
< styles
[i
].descent
) 
 243                                 maxDescent 
= styles
[i
].descent
; 
 245                 if (styles
[i
].IsProtected()) { 
 246                         someStylesProtected 
= true; 
 250         lineHeight 
= maxAscent 
+ maxDescent
; 
 251         aveCharWidth 
= styles
[STYLE_DEFAULT
].aveCharWidth
; 
 252         spaceWidth 
= styles
[STYLE_DEFAULT
].spaceWidth
; 
 254         fixedColumnWidth 
= leftMarginWidth
; 
 255         symbolMargin 
= false; 
 256         maskInLine 
= 0xffffffff; 
 257         for (int margin
=0; margin 
< margins
; margin
++) { 
 258                 fixedColumnWidth 
+= ms
[margin
].width
; 
 259                 symbolMargin 
= symbolMargin 
|| ms
[margin
].symbol
; 
 260                 if (ms
[margin
].width 
> 0) 
 261                         maskInLine 
&= ~ms
[margin
].mask
; 
 265 void ViewStyle::ResetDefaultStyle() { 
 266         styles
[STYLE_DEFAULT
].Clear(ColourDesired(0,0,0), 
 267                 ColourDesired(0xff,0xff,0xff), 
 268                 Platform::DefaultFontSize(), fontNames
.Save(Platform::DefaultFont()), 
 270                 false, false, false, false, Style::caseMixed
, true, true, false); 
 273 void ViewStyle::ClearStyles() { 
 274         // Reset all styles to be like the default style 
 275         for (unsigned int i
=0;i
<(sizeof(styles
)/sizeof(styles
[0]));i
++) { 
 276                 if (i 
!= STYLE_DEFAULT
) { 
 277                         styles
[i
].ClearTo(styles
[STYLE_DEFAULT
]); 
 280         styles
[STYLE_LINENUMBER
].back
.desired 
= Platform::Chrome(); 
 283 void ViewStyle::SetStyleFontName(int styleIndex
, const char *name
) { 
 284         styles
[styleIndex
].fontName 
= fontNames
.Save(name
); 
 287 bool ViewStyle::ProtectionActive() const { 
 288     return someStylesProtected
;