1 // Scintilla source code edit control
2 /** @file PerLine.h
3  ** Manages data associated with each line of the document
4  **/
5 // Copyright 1998-2009 by Neil Hodgson <neilh@scintilla.org>
6 // The License.txt file describes the conditions under which this software may be distributed.
7 
8 #ifndef PERLINE_H
9 #define PERLINE_H
10 
11 namespace Scintilla {
12 
13 /**
14  * This holds the marker identifier and the marker type to display.
15  * MarkerHandleNumbers are members of lists.
16  */
17 struct MarkerHandleNumber {
18 	int handle;
19 	int number;
MarkerHandleNumberMarkerHandleNumber20 	MarkerHandleNumber(int handle_, int number_) : handle(handle_), number(number_) {}
21 };
22 
23 /**
24  * A marker handle set contains any number of MarkerHandleNumbers.
25  */
26 class MarkerHandleSet {
27 	std::forward_list<MarkerHandleNumber> mhList;
28 
29 public:
30 	MarkerHandleSet();
31 	// Deleted so MarkerHandleSet objects can not be copied.
32 	MarkerHandleSet(const MarkerHandleSet &) = delete;
33 	MarkerHandleSet(MarkerHandleSet &&) = delete;
34 	void operator=(const MarkerHandleSet &) = delete;
35 	void operator=(MarkerHandleSet &&) = delete;
36 	~MarkerHandleSet();
37 	bool Empty() const noexcept;
38 	int MarkValue() const noexcept;	///< Bit set of marker numbers.
39 	bool Contains(int handle) const noexcept;
40 	bool InsertHandle(int handle, int markerNum);
41 	void RemoveHandle(int handle);
42 	bool RemoveNumber(int markerNum, bool all);
43 	void CombineWith(MarkerHandleSet *other);
44 };
45 
46 class LineMarkers : public PerLine {
47 	SplitVector<std::unique_ptr<MarkerHandleSet>> markers;
48 	/// Handles are allocated sequentially and should never have to be reused as 32 bit ints are very big.
49 	int handleCurrent;
50 public:
LineMarkers()51 	LineMarkers() : handleCurrent(0) {
52 	}
53 	// Deleted so LineMarkers objects can not be copied.
54 	LineMarkers(const LineMarkers &) = delete;
55 	LineMarkers(LineMarkers &&) = delete;
56 	void operator=(const LineMarkers &) = delete;
57 	void operator=(LineMarkers &&) = delete;
58 	~LineMarkers() override;
59 	void Init() override;
60 	void InsertLine(Sci::Line line) override;
61 	void RemoveLine(Sci::Line line) override;
62 
63 	int MarkValue(Sci::Line line) noexcept;
64 	Sci::Line MarkerNext(Sci::Line lineStart, int mask) const;
65 	int AddMark(Sci::Line line, int markerNum, Sci::Line lines);
66 	void MergeMarkers(Sci::Line line);
67 	bool DeleteMark(Sci::Line line, int markerNum, bool all);
68 	void DeleteMarkFromHandle(int markerHandle);
69 	Sci::Line LineFromHandle(int markerHandle);
70 };
71 
72 class LineLevels : public PerLine {
73 	SplitVector<int> levels;
74 public:
LineLevels()75 	LineLevels() {
76 	}
77 	// Deleted so LineLevels objects can not be copied.
78 	LineLevels(const LineLevels &) = delete;
79 	LineLevels(LineLevels &&) = delete;
80 	void operator=(const LineLevels &) = delete;
81 	void operator=(LineLevels &&) = delete;
82 	~LineLevels() override;
83 	void Init() override;
84 	void InsertLine(Sci::Line line) override;
85 	void RemoveLine(Sci::Line line) override;
86 
87 	void ExpandLevels(Sci::Line sizeNew=-1);
88 	void ClearLevels();
89 	int SetLevel(Sci::Line line, int level, Sci::Line lines);
90 	int GetLevel(Sci::Line line) const;
91 };
92 
93 class LineState : public PerLine {
94 	SplitVector<int> lineStates;
95 public:
LineState()96 	LineState() {
97 	}
98 	// Deleted so LineState objects can not be copied.
99 	LineState(const LineState &) = delete;
100 	LineState(LineState &&) = delete;
101 	void operator=(const LineState &) = delete;
102 	void operator=(LineState &&) = delete;
103 	~LineState() override;
104 	void Init() override;
105 	void InsertLine(Sci::Line line) override;
106 	void RemoveLine(Sci::Line line) override;
107 
108 	int SetLineState(Sci::Line line, int state);
109 	int GetLineState(Sci::Line line);
110 	Sci::Line GetMaxLineState() const;
111 };
112 
113 class LineAnnotation : public PerLine {
114 	SplitVector<std::unique_ptr<char []>> annotations;
115 public:
LineAnnotation()116 	LineAnnotation() {
117 	}
118 	// Deleted so LineAnnotation objects can not be copied.
119 	LineAnnotation(const LineAnnotation &) = delete;
120 	LineAnnotation(LineAnnotation &&) = delete;
121 	void operator=(const LineAnnotation &) = delete;
122 	void operator=(LineAnnotation &&) = delete;
123 	~LineAnnotation() override;
124 	void Init() override;
125 	void InsertLine(Sci::Line line) override;
126 	void RemoveLine(Sci::Line line) override;
127 
128 	bool MultipleStyles(Sci::Line line) const;
129 	int Style(Sci::Line line) const;
130 	const char *Text(Sci::Line line) const;
131 	const unsigned char *Styles(Sci::Line line) const;
132 	void SetText(Sci::Line line, const char *text);
133 	void ClearAll();
134 	void SetStyle(Sci::Line line, int style);
135 	void SetStyles(Sci::Line line, const unsigned char *styles);
136 	int Length(Sci::Line line) const;
137 	int Lines(Sci::Line line) const;
138 };
139 
140 typedef std::vector<int> TabstopList;
141 
142 class LineTabstops : public PerLine {
143 	SplitVector<std::unique_ptr<TabstopList>> tabstops;
144 public:
LineTabstops()145 	LineTabstops() {
146 	}
147 	// Deleted so LineTabstops objects can not be copied.
148 	LineTabstops(const LineTabstops &) = delete;
149 	LineTabstops(LineTabstops &&) = delete;
150 	void operator=(const LineTabstops &) = delete;
151 	void operator=(LineTabstops &&) = delete;
152 	~LineTabstops() override;
153 	void Init() override;
154 	void InsertLine(Sci::Line line) override;
155 	void RemoveLine(Sci::Line line) override;
156 
157 	bool ClearTabstops(Sci::Line line);
158 	bool AddTabstop(Sci::Line line, int x);
159 	int GetNextTabstop(Sci::Line line, int x) const;
160 };
161 
162 }
163 
164 #endif
165