Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(67)

Side by Side Diff: third_party/WebKit/Source/core/editing/markers/DocumentMarker.cpp

Issue 2780313002: [WIP] Refactor DocumentMarker (Closed)
Patch Set: Rebase Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 16 matching lines...) Expand all
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */ 29 */
30 30
31 #include "core/editing/markers/DocumentMarker.h" 31 #include "core/editing/markers/DocumentMarker.h"
32 32
33 #include "wtf/StdLibExtras.h" 33 #include "wtf/StdLibExtras.h"
34 34
35 namespace blink { 35 namespace blink {
36 36
37 DocumentMarkerDetails::~DocumentMarkerDetails() {} 37 DocumentMarker::DocumentMarker(const DocumentMarker& marker)
38 : m_startOffset(marker.startOffset()), m_endOffset(marker.endOffset()) {}
38 39
39 class DocumentMarkerDescription final : public DocumentMarkerDetails { 40 DocumentMarker::~DocumentMarker() {}
40 public:
41 static DocumentMarkerDescription* create(const String&);
42 41
43 const String& description() const { return m_description; } 42 DocumentMarker::DocumentMarker(unsigned startOffset, unsigned endOffset)
44 bool isDescription() const override { return true; } 43 : m_startOffset(startOffset), m_endOffset(endOffset) {}
45
46 private:
47 explicit DocumentMarkerDescription(const String& description)
48 : m_description(description) {}
49
50 String m_description;
51 };
52
53 DocumentMarkerDescription* DocumentMarkerDescription::create(
54 const String& description) {
55 return new DocumentMarkerDescription(description);
56 }
57
58 inline DocumentMarkerDescription* toDocumentMarkerDescription(
59 DocumentMarkerDetails* details) {
60 if (details && details->isDescription())
61 return static_cast<DocumentMarkerDescription*>(details);
62 return 0;
63 }
64
65 class DocumentMarkerTextMatch final : public DocumentMarkerDetails {
66 public:
67 static DocumentMarkerTextMatch* create(bool);
68
69 bool activeMatch() const { return m_match; }
70 bool isTextMatch() const override { return true; }
71
72 private:
73 explicit DocumentMarkerTextMatch(bool match) : m_match(match) {}
74
75 bool m_match;
76 };
77
78 DocumentMarkerTextMatch* DocumentMarkerTextMatch::create(bool match) {
79 DEFINE_STATIC_LOCAL(DocumentMarkerTextMatch, trueInstance,
80 (new DocumentMarkerTextMatch(true)));
81 DEFINE_STATIC_LOCAL(DocumentMarkerTextMatch, falseInstance,
82 (new DocumentMarkerTextMatch(false)));
83 return match ? &trueInstance : &falseInstance;
84 }
85
86 inline DocumentMarkerTextMatch* toDocumentMarkerTextMatch(
87 DocumentMarkerDetails* details) {
88 if (details && details->isTextMatch())
89 return static_cast<DocumentMarkerTextMatch*>(details);
90 return 0;
91 }
92
93 class TextCompositionMarkerDetails final : public DocumentMarkerDetails {
94 public:
95 static TextCompositionMarkerDetails* create(Color underlineColor,
96 bool thick,
97 Color backgroundColor);
98
99 bool isComposition() const override { return true; }
100 Color underlineColor() const { return m_underlineColor; }
101 bool thick() const { return m_thick; }
102 Color backgroundColor() const { return m_backgroundColor; }
103
104 private:
105 TextCompositionMarkerDetails(Color underlineColor,
106 bool thick,
107 Color backgroundColor)
108 : m_underlineColor(underlineColor),
109 m_backgroundColor(backgroundColor),
110 m_thick(thick) {}
111
112 Color m_underlineColor;
113 Color m_backgroundColor;
114 bool m_thick;
115 };
116
117 TextCompositionMarkerDetails* TextCompositionMarkerDetails::create(
118 Color underlineColor,
119 bool thick,
120 Color backgroundColor) {
121 return new TextCompositionMarkerDetails(underlineColor, thick,
122 backgroundColor);
123 }
124
125 inline TextCompositionMarkerDetails* toTextCompositionMarkerDetails(
126 DocumentMarkerDetails* details) {
127 if (details && details->isComposition())
128 return static_cast<TextCompositionMarkerDetails*>(details);
129 return nullptr;
130 }
131
132 DocumentMarker* DocumentMarker::clone() const {
133 return new DocumentMarker(*this);
134 }
135
136 DocumentMarker::DocumentMarker(MarkerType type,
137 unsigned startOffset,
138 unsigned endOffset,
139 const String& description)
140 : m_type(type),
141 m_startOffset(startOffset),
142 m_endOffset(endOffset),
143 m_details(description.isEmpty()
144 ? nullptr
145 : DocumentMarkerDescription::create(description)) {
146 DCHECK(type != DocumentMarker::TextMatch);
147 }
148
149 DocumentMarker::DocumentMarker(unsigned startOffset,
150 unsigned endOffset,
151 bool activeMatch)
152 : m_type(DocumentMarker::TextMatch),
153 m_startOffset(startOffset),
154 m_endOffset(endOffset),
155 m_details(DocumentMarkerTextMatch::create(activeMatch)) {}
156
157 DocumentMarker::DocumentMarker(unsigned startOffset,
158 unsigned endOffset,
159 Color underlineColor,
160 bool thick,
161 Color backgroundColor)
162 : m_type(DocumentMarker::Composition),
163 m_startOffset(startOffset),
164 m_endOffset(endOffset),
165 m_details(TextCompositionMarkerDetails::create(underlineColor,
166 thick,
167 backgroundColor)) {}
168
169 DocumentMarker::DocumentMarker(const DocumentMarker& marker)
170 : m_type(marker.type()),
171 m_startOffset(marker.startOffset()),
172 m_endOffset(marker.endOffset()),
173 m_details(marker.details()) {}
174 44
175 DocumentMarker::ShiftMarkerResult DocumentMarker::getShiftedMarkerPosition( 45 DocumentMarker::ShiftMarkerResult DocumentMarker::getShiftedMarkerPosition(
176 unsigned offset, 46 unsigned offset,
177 unsigned oldLength, 47 unsigned oldLength,
178 unsigned newLength) const { 48 unsigned newLength) const {
179 ShiftMarkerResult result; 49 ShiftMarkerResult result;
180 result.newStartOffset = startOffset(); 50 result.newStartOffset = startOffset();
181 result.newEndOffset = endOffset(); 51 result.newEndOffset = endOffset();
182 result.shouldRemoveMarker = false; 52 result.shouldRemoveMarker = false;
183 53
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 result.shouldRemoveMarker = true; 87 result.shouldRemoveMarker = true;
218 88
219 return result; 89 return result;
220 } 90 }
221 91
222 void DocumentMarker::shiftOffsets(int delta) { 92 void DocumentMarker::shiftOffsets(int delta) {
223 m_startOffset += delta; 93 m_startOffset += delta;
224 m_endOffset += delta; 94 m_endOffset += delta;
225 } 95 }
226 96
227 void DocumentMarker::setActiveMatch(bool active) { 97 bool DocumentMarker::operator==(const DocumentMarker& other) const {
228 m_details = DocumentMarkerTextMatch::create(active); 98 return type() == other.type() && m_startOffset == other.m_startOffset &&
99 m_endOffset == other.m_endOffset;
229 } 100 }
230 101
231 const String& DocumentMarker::description() const { 102 const String& DocumentMarker::description() const {
232 if (DocumentMarkerDescription* details =
233 toDocumentMarkerDescription(m_details.get()))
234 return details->description();
235 return emptyString; 103 return emptyString;
236 } 104 }
237 105
238 bool DocumentMarker::activeMatch() const { 106 bool DocumentMarker::activeMatch() const {
239 if (DocumentMarkerTextMatch* details =
240 toDocumentMarkerTextMatch(m_details.get()))
241 return details->activeMatch();
242 return false; 107 return false;
243 } 108 }
244 109
245 Color DocumentMarker::underlineColor() const { 110 Color DocumentMarker::underlineColor() const {
246 if (TextCompositionMarkerDetails* details =
247 toTextCompositionMarkerDetails(m_details.get()))
248 return details->underlineColor();
249 return Color::transparent; 111 return Color::transparent;
250 } 112 }
251 113
252 bool DocumentMarker::thick() const { 114 bool DocumentMarker::thick() const {
253 if (TextCompositionMarkerDetails* details =
254 toTextCompositionMarkerDetails(m_details.get()))
255 return details->thick();
256 return false; 115 return false;
257 } 116 }
258 117
259 Color DocumentMarker::backgroundColor() const { 118 Color DocumentMarker::backgroundColor() const {
260 if (TextCompositionMarkerDetails* details =
261 toTextCompositionMarkerDetails(m_details.get()))
262 return details->backgroundColor();
263 return Color::transparent; 119 return Color::transparent;
264 } 120 }
265 121
266 DEFINE_TRACE(DocumentMarker) {
267 visitor->trace(m_details);
268 }
269
270 } // namespace blink 122 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698