1 // Scintilla source code edit control
3 ** Defines the appearance of the main text area of the editor window.
5 // Copyright 1998-2014 by Neil Hodgson <neilh@scintilla.org>
6 // The License.txt file describes the conditions under which this software may be distributed.
15 struct PrintParameters
{
23 * The view may be drawn in separate phases.
27 drawIndicatorsBack
= 0x2,
29 drawIndentationGuides
= 0x8,
30 drawIndicatorsFore
= 0x10,
31 drawSelectionTranslucent
= 0x20,
32 drawLineTranslucent
= 0x40,
38 bool ValidStyledText(const ViewStyle
&vs
, size_t styleOffset
, const StyledText
&st
);
39 int WidestLineWidth(Surface
*surface
, const ViewStyle
&vs
, int styleOffset
, const StyledText
&st
);
40 void DrawTextNoClipPhase(Surface
*surface
, PRectangle rc
, const Style
&style
, XYPOSITION ybase
,
41 const char *s
, int len
, DrawPhase phase
);
42 void DrawStyledText(Surface
*surface
, const ViewStyle
&vs
, int styleOffset
, PRectangle rcText
,
43 const StyledText
&st
, size_t start
, size_t length
, DrawPhase phase
);
45 typedef void (*DrawTabArrowFn
)(Surface
*surface
, PRectangle rcTab
, int ymid
);
48 * EditView draws the main text area.
52 PrintParameters printParameters
;
54 int tabWidthMinimumPixels
;
57 bool drawOverstrikeCaret
;
59 /** In bufferedDraw mode, graphics operations are drawn to a pixmap and then copied to
60 * the screen. This avoids flashing but is about 30% slower. */
62 /** In phasesTwo mode, drawing is performed in two phases, first the background
63 * and then the foreground. This avoids chopping off characters that overlap the next run.
64 * In multiPhaseDraw mode, drawing is performed in multiple phases with each phase drawing
65 * one feature over the whole drawing area, instead of within one line. This allows text to
66 * overlap from one line to the next. */
67 enum PhasesDraw
{ phasesOne
, phasesTwo
, phasesMultiple
};
68 PhasesDraw phasesDraw
;
72 bool additionalCaretsBlink
;
73 bool additionalCaretsVisible
;
75 bool imeCaretBlockOverride
;
78 Surface
*pixmapIndentGuide
;
79 Surface
*pixmapIndentGuideHighlight
;
82 PositionCache posCache
;
84 int tabArrowHeight
; // draw arrow heads this many pixels above/below line midpoint
85 /** Some platforms, notably PLAT_CURSES, do not support Scintilla's native
86 * DrawTabArrow function for drawing tab characters. Allow those platforms to
87 * override it instead of creating a new method in the Surface class that
88 * existing platforms must implement as empty. */
89 DrawTabArrowFn customDrawTabArrow
;
90 DrawWrapMarkerFn customDrawWrapMarker
;
95 bool SetTwoPhaseDraw(bool twoPhaseDraw
);
96 bool SetPhasesDraw(int phases
);
97 bool LinesOverlap() const;
99 void ClearAllTabstops();
100 XYPOSITION
NextTabstopPos(int line
, XYPOSITION x
, XYPOSITION tabWidth
) const;
101 bool ClearTabstops(int line
);
102 bool AddTabstop(int line
, int x
);
103 int GetNextTabstop(int line
, int x
) const;
104 void LinesAddedOrRemoved(int lineOfPos
, int linesAdded
);
106 void DropGraphics(bool freeObjects
);
107 void AllocateGraphics(const ViewStyle
&vsDraw
);
108 void RefreshPixMaps(Surface
*surfaceWindow
, WindowID wid
, const ViewStyle
&vsDraw
);
110 LineLayout
*RetrieveLineLayout(int lineNumber
, const EditModel
&model
);
111 void LayoutLine(const EditModel
&model
, int line
, Surface
*surface
, const ViewStyle
&vstyle
,
112 LineLayout
*ll
, int width
= LineLayout::wrapWidthInfinite
);
114 Point
LocationFromPosition(Surface
*surface
, const EditModel
&model
, SelectionPosition pos
, int topLine
, const ViewStyle
&vs
);
115 SelectionPosition
SPositionFromLocation(Surface
*surface
, const EditModel
&model
, Point pt
, bool canReturnInvalid
,
116 bool charPosition
, bool virtualSpace
, const ViewStyle
&vs
);
117 SelectionPosition
SPositionFromLineX(Surface
*surface
, const EditModel
&model
, int lineDoc
, int x
, const ViewStyle
&vs
);
118 int DisplayFromPosition(Surface
*surface
, const EditModel
&model
, int pos
, const ViewStyle
&vs
);
119 int StartEndDisplayLine(Surface
*surface
, const EditModel
&model
, int pos
, bool start
, const ViewStyle
&vs
);
121 void DrawIndentGuide(Surface
*surface
, int lineVisible
, int lineHeight
, int start
, PRectangle rcSegment
, bool highlight
);
122 void DrawEOL(Surface
*surface
, const EditModel
&model
, const ViewStyle
&vsDraw
, const LineLayout
*ll
, PRectangle rcLine
,
123 int line
, int lineEnd
, int xStart
, int subLine
, XYACCUMULATOR subLineStart
,
124 ColourOptional background
);
125 void DrawAnnotation(Surface
*surface
, const EditModel
&model
, const ViewStyle
&vsDraw
, const LineLayout
*ll
,
126 int line
, int xStart
, PRectangle rcLine
, int subLine
, DrawPhase phase
);
127 void DrawCarets(Surface
*surface
, const EditModel
&model
, const ViewStyle
&vsDraw
, const LineLayout
*ll
, int line
,
128 int xStart
, PRectangle rcLine
, int subLine
) const;
129 void DrawBackground(Surface
*surface
, const EditModel
&model
, const ViewStyle
&vsDraw
, const LineLayout
*ll
, PRectangle rcLine
,
130 Range lineRange
, int posLineStart
, int xStart
,
131 int subLine
, ColourOptional background
) const;
132 void DrawForeground(Surface
*surface
, const EditModel
&model
, const ViewStyle
&vsDraw
, const LineLayout
*ll
, int lineVisible
,
133 PRectangle rcLine
, Range lineRange
, int posLineStart
, int xStart
,
134 int subLine
, ColourOptional background
);
135 void DrawIndentGuidesOverEmpty(Surface
*surface
, const EditModel
&model
, const ViewStyle
&vsDraw
, const LineLayout
*ll
,
136 int line
, int lineVisible
, PRectangle rcLine
, int xStart
, int subLine
);
137 void DrawLine(Surface
*surface
, const EditModel
&model
, const ViewStyle
&vsDraw
, const LineLayout
*ll
, int line
,
138 int lineVisible
, int xStart
, PRectangle rcLine
, int subLine
, DrawPhase phase
);
139 void PaintText(Surface
*surfaceWindow
, const EditModel
&model
, PRectangle rcArea
, PRectangle rcClient
,
140 const ViewStyle
&vsDraw
);
141 long FormatRange(bool draw
, Sci_RangeToFormat
*pfr
, Surface
*surface
, Surface
*surfaceMeasure
,
142 const EditModel
&model
, const ViewStyle
&vs
);
146 * Convenience class to ensure LineLayout objects are always disposed.
148 class AutoLineLayout
{
149 LineLayoutCache
&llc
;
151 AutoLineLayout
&operator=(const AutoLineLayout
&);
153 AutoLineLayout(LineLayoutCache
&llc_
, LineLayout
*ll_
) : llc(llc_
), ll(ll_
) {}
158 LineLayout
*operator->() const {
161 operator LineLayout
*() const {
164 void Set(LineLayout
*ll_
) {