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
);
46 * EditView draws the main text area.
50 PrintParameters printParameters
;
54 bool drawOverstrikeCaret
;
56 /** In bufferedDraw mode, graphics operations are drawn to a pixmap and then copied to
57 * the screen. This avoids flashing but is about 30% slower. */
59 /** In phasesTwo mode, drawing is performed in two phases, first the background
60 * and then the foreground. This avoids chopping off characters that overlap the next run.
61 * In multiPhaseDraw mode, drawing is performed in multiple phases with each phase drawing
62 * one feature over the whole drawing area, instead of within one line. This allows text to
63 * overlap from one line to the next. */
64 enum PhasesDraw
{ phasesOne
, phasesTwo
, phasesMultiple
};
65 PhasesDraw phasesDraw
;
69 bool additionalCaretsBlink
;
70 bool additionalCaretsVisible
;
72 bool imeCaretBlockOverride
;
75 Surface
*pixmapIndentGuide
;
76 Surface
*pixmapIndentGuideHighlight
;
79 PositionCache posCache
;
84 bool SetTwoPhaseDraw(bool twoPhaseDraw
);
85 bool SetPhasesDraw(int phases
);
86 bool LinesOverlap() const;
88 void ClearAllTabstops();
89 XYPOSITION
NextTabstopPos(int line
, XYPOSITION x
, XYPOSITION tabWidth
) const;
90 bool ClearTabstops(int line
);
91 bool AddTabstop(int line
, int x
);
92 int GetNextTabstop(int line
, int x
) const;
93 void LinesAddedOrRemoved(int lineOfPos
, int linesAdded
);
95 void DropGraphics(bool freeObjects
);
96 void AllocateGraphics(const ViewStyle
&vsDraw
);
97 void RefreshPixMaps(Surface
*surfaceWindow
, WindowID wid
, const ViewStyle
&vsDraw
);
99 LineLayout
*RetrieveLineLayout(int lineNumber
, const EditModel
&model
);
100 void LayoutLine(const EditModel
&model
, int line
, Surface
*surface
, const ViewStyle
&vstyle
,
101 LineLayout
*ll
, int width
= LineLayout::wrapWidthInfinite
);
103 Point
LocationFromPosition(Surface
*surface
, const EditModel
&model
, SelectionPosition pos
, int topLine
, const ViewStyle
&vs
);
104 SelectionPosition
SPositionFromLocation(Surface
*surface
, const EditModel
&model
, Point pt
, bool canReturnInvalid
,
105 bool charPosition
, bool virtualSpace
, const ViewStyle
&vs
);
106 SelectionPosition
SPositionFromLineX(Surface
*surface
, const EditModel
&model
, int lineDoc
, int x
, const ViewStyle
&vs
);
107 int DisplayFromPosition(Surface
*surface
, const EditModel
&model
, int pos
, const ViewStyle
&vs
);
108 int StartEndDisplayLine(Surface
*surface
, const EditModel
&model
, int pos
, bool start
, const ViewStyle
&vs
);
110 void DrawIndentGuide(Surface
*surface
, int lineVisible
, int lineHeight
, int start
, PRectangle rcSegment
, bool highlight
);
111 void DrawEOL(Surface
*surface
, const EditModel
&model
, const ViewStyle
&vsDraw
, const LineLayout
*ll
, PRectangle rcLine
,
112 int line
, int lineEnd
, int xStart
, int subLine
, XYACCUMULATOR subLineStart
,
113 ColourOptional background
);
114 void DrawAnnotation(Surface
*surface
, const EditModel
&model
, const ViewStyle
&vsDraw
, const LineLayout
*ll
,
115 int line
, int xStart
, PRectangle rcLine
, int subLine
, DrawPhase phase
);
116 void DrawCarets(Surface
*surface
, const EditModel
&model
, const ViewStyle
&vsDraw
, const LineLayout
*ll
, int line
,
117 int xStart
, PRectangle rcLine
, int subLine
) const;
118 void DrawBackground(Surface
*surface
, const EditModel
&model
, const ViewStyle
&vsDraw
, const LineLayout
*ll
, PRectangle rcLine
,
119 Range lineRange
, int posLineStart
, int xStart
,
120 int subLine
, ColourOptional background
) const;
121 void DrawForeground(Surface
*surface
, const EditModel
&model
, const ViewStyle
&vsDraw
, const LineLayout
*ll
, int lineVisible
,
122 PRectangle rcLine
, Range lineRange
, int posLineStart
, int xStart
,
123 int subLine
, ColourOptional background
);
124 void DrawIndentGuidesOverEmpty(Surface
*surface
, const EditModel
&model
, const ViewStyle
&vsDraw
, const LineLayout
*ll
,
125 int line
, int lineVisible
, PRectangle rcLine
, int xStart
, int subLine
);
126 void DrawLine(Surface
*surface
, const EditModel
&model
, const ViewStyle
&vsDraw
, const LineLayout
*ll
, int line
,
127 int lineVisible
, int xStart
, PRectangle rcLine
, int subLine
, DrawPhase phase
);
128 void PaintText(Surface
*surfaceWindow
, const EditModel
&model
, PRectangle rcArea
, PRectangle rcClient
,
129 const ViewStyle
&vsDraw
);
130 long FormatRange(bool draw
, Sci_RangeToFormat
*pfr
, Surface
*surface
, Surface
*surfaceMeasure
,
131 const EditModel
&model
, const ViewStyle
&vs
);
135 * Convenience class to ensure LineLayout objects are always disposed.
137 class AutoLineLayout
{
138 LineLayoutCache
&llc
;
140 AutoLineLayout
&operator=(const AutoLineLayout
&);
142 AutoLineLayout(LineLayoutCache
&llc_
, LineLayout
*ll_
) : llc(llc_
), ll(ll_
) {}
147 LineLayout
*operator->() const {
150 operator LineLayout
*() const {
153 void Set(LineLayout
*ll_
) {