Update Scintilla to version 3.7.1
[geany-mirror.git] / scintilla / src / EditView.h
blob83dd8bb1f220c2620fb9240f1f77221561855f4d
1 // Scintilla source code edit control
2 /** @file EditView.h
3 ** Defines the appearance of the main text area of the editor window.
4 **/
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.
8 #ifndef EDITVIEW_H
9 #define EDITVIEW_H
11 #ifdef SCI_NAMESPACE
12 namespace Scintilla {
13 #endif
15 struct PrintParameters {
16 int magnification;
17 int colourMode;
18 WrapMode wrapState;
19 PrintParameters();
22 /**
23 * The view may be drawn in separate phases.
25 enum DrawPhase {
26 drawBack = 0x1,
27 drawIndicatorsBack = 0x2,
28 drawText = 0x4,
29 drawIndentationGuides = 0x8,
30 drawIndicatorsFore = 0x10,
31 drawSelectionTranslucent = 0x20,
32 drawLineTranslucent = 0x40,
33 drawFoldLines = 0x80,
34 drawCarets = 0x100,
35 drawAll = 0x1FF
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);
47 /**
48 * EditView draws the main text area.
50 class EditView {
51 public:
52 PrintParameters printParameters;
53 PerLine *ldTabstops;
54 int tabWidthMinimumPixels;
56 bool hideSelection;
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. */
61 bool bufferedDraw;
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;
70 int lineWidthMaxSeen;
72 bool additionalCaretsBlink;
73 bool additionalCaretsVisible;
75 bool imeCaretBlockOverride;
77 Surface *pixmapLine;
78 Surface *pixmapIndentGuide;
79 Surface *pixmapIndentGuideHighlight;
81 LineLayoutCache llc;
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;
92 EditView();
93 virtual ~EditView();
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,
115 const ViewStyle &vs, PointEnd pe);
116 Range RangeDisplayLine(Surface *surface, const EditModel &model, int lineVisible, const ViewStyle &vs);
117 SelectionPosition SPositionFromLocation(Surface *surface, const EditModel &model, Point pt, bool canReturnInvalid,
118 bool charPosition, bool virtualSpace, const ViewStyle &vs);
119 SelectionPosition SPositionFromLineX(Surface *surface, const EditModel &model, int lineDoc, int x, const ViewStyle &vs);
120 int DisplayFromPosition(Surface *surface, const EditModel &model, int pos, const ViewStyle &vs);
121 int StartEndDisplayLine(Surface *surface, const EditModel &model, int pos, bool start, const ViewStyle &vs);
123 void DrawIndentGuide(Surface *surface, int lineVisible, int lineHeight, int start, PRectangle rcSegment, bool highlight);
124 void DrawEOL(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, PRectangle rcLine,
125 int line, int lineEnd, int xStart, int subLine, XYACCUMULATOR subLineStart,
126 ColourOptional background);
127 void DrawFoldDisplayText(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll,
128 int line, int xStart, PRectangle rcLine, int subLine, XYACCUMULATOR subLineStart, DrawPhase phase);
129 void DrawAnnotation(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll,
130 int line, int xStart, PRectangle rcLine, int subLine, DrawPhase phase);
131 void DrawCarets(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, int line,
132 int xStart, PRectangle rcLine, int subLine) const;
133 void DrawBackground(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, PRectangle rcLine,
134 Range lineRange, int posLineStart, int xStart,
135 int subLine, ColourOptional background) const;
136 void DrawForeground(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, int lineVisible,
137 PRectangle rcLine, Range lineRange, int posLineStart, int xStart,
138 int subLine, ColourOptional background);
139 void DrawIndentGuidesOverEmpty(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll,
140 int line, int lineVisible, PRectangle rcLine, int xStart, int subLine);
141 void DrawLine(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, int line,
142 int lineVisible, int xStart, PRectangle rcLine, int subLine, DrawPhase phase);
143 void PaintText(Surface *surfaceWindow, const EditModel &model, PRectangle rcArea, PRectangle rcClient,
144 const ViewStyle &vsDraw);
145 void FillLineRemainder(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll,
146 int line, PRectangle rcArea, int subLine);
147 long FormatRange(bool draw, Sci_RangeToFormat *pfr, Surface *surface, Surface *surfaceMeasure,
148 const EditModel &model, const ViewStyle &vs);
152 * Convenience class to ensure LineLayout objects are always disposed.
154 class AutoLineLayout {
155 LineLayoutCache &llc;
156 LineLayout *ll;
157 AutoLineLayout &operator=(const AutoLineLayout &);
158 public:
159 AutoLineLayout(LineLayoutCache &llc_, LineLayout *ll_) : llc(llc_), ll(ll_) {}
160 ~AutoLineLayout() {
161 llc.Dispose(ll);
162 ll = 0;
164 LineLayout *operator->() const {
165 return ll;
167 operator LineLayout *() const {
168 return ll;
170 void Set(LineLayout *ll_) {
171 llc.Dispose(ll);
172 ll = ll_;
176 #ifdef SCI_NAMESPACE
178 #endif
180 #endif