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

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

Issue 2650113004: [WIP] Add support for Android SuggestionSpans when editing text (Closed)
Patch Set: Created 3 years, 10 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 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 return match ? &trueInstance : &falseInstance; 83 return match ? &trueInstance : &falseInstance;
84 } 84 }
85 85
86 inline DocumentMarkerTextMatch* toDocumentMarkerTextMatch( 86 inline DocumentMarkerTextMatch* toDocumentMarkerTextMatch(
87 DocumentMarkerDetails* details) { 87 DocumentMarkerDetails* details) {
88 if (details && details->isTextMatch()) 88 if (details && details->isTextMatch())
89 return static_cast<DocumentMarkerTextMatch*>(details); 89 return static_cast<DocumentMarkerTextMatch*>(details);
90 return 0; 90 return 0;
91 } 91 }
92 92
93 class TextCompositionMarkerDetails final : public DocumentMarkerDetails { 93 class TextCompositionMarkerDetails : public DocumentMarkerDetails {
94 public: 94 public:
95 static TextCompositionMarkerDetails* create(Color underlineColor, 95 static TextCompositionMarkerDetails* create(Color underlineColor,
96 bool thick, 96 bool thick,
97 Color backgroundColor); 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, 98 TextCompositionMarkerDetails(Color underlineColor,
106 bool thick, 99 bool thick,
107 Color backgroundColor) 100 Color backgroundColor)
108 : m_underlineColor(underlineColor), 101 : m_underlineColor(underlineColor),
109 m_backgroundColor(backgroundColor), 102 m_backgroundColor(backgroundColor),
110 m_thick(thick) {} 103 m_thick(thick) {}
111 104
105 bool isComposition() const override { return true; }
106 Color underlineColor() const { return m_underlineColor; }
107 bool thick() const { return m_thick; }
108 Color backgroundColor() const { return m_backgroundColor; }
109
110 private:
112 Color m_underlineColor; 111 Color m_underlineColor;
113 Color m_backgroundColor; 112 Color m_backgroundColor;
114 bool m_thick; 113 bool m_thick;
115 }; 114 };
116 115
117 TextCompositionMarkerDetails* TextCompositionMarkerDetails::create( 116 TextCompositionMarkerDetails* TextCompositionMarkerDetails::create(
118 Color underlineColor, 117 Color underlineColor,
119 bool thick, 118 bool thick,
120 Color backgroundColor) { 119 Color backgroundColor) {
121 return new TextCompositionMarkerDetails(underlineColor, thick, 120 return new TextCompositionMarkerDetails(underlineColor, thick,
122 backgroundColor); 121 backgroundColor);
123 } 122 }
124 123
125 inline TextCompositionMarkerDetails* toTextCompositionMarkerDetails( 124 inline TextCompositionMarkerDetails* toTextCompositionMarkerDetails(
126 DocumentMarkerDetails* details) { 125 DocumentMarkerDetails* details) {
127 if (details && details->isComposition()) 126 if (details && details->isComposition())
128 return static_cast<TextCompositionMarkerDetails*>(details); 127 return static_cast<TextCompositionMarkerDetails*>(details);
129 return nullptr; 128 return nullptr;
130 } 129 }
131 130
131 class TextSuggestionMarkerDetails final : public TextCompositionMarkerDetails {
132 public:
133 static TextSuggestionMarkerDetails* create(
134 Color underlineColor,
135 bool thick,
136 Color backgroundColor,
137 const std::vector<std::string>& suggestions,
138 int id);
139
140 bool isSuggestion() const override { return true; }
141 std::vector<std::string>& suggestions() { return m_suggestions; }
142 int id() { return m_id; }
143
144 private:
145 TextSuggestionMarkerDetails(Color underlineColor,
146 bool thick,
147 Color backgroundColor,
148 const std::vector<std::string>& suggestions,
149 int id)
150 : TextCompositionMarkerDetails(underlineColor, thick, backgroundColor),
151 m_suggestions(suggestions),
152 m_id(id) {}
153
154 std::vector<std::string> m_suggestions;
155 int m_id;
156 };
157
158 TextSuggestionMarkerDetails* TextSuggestionMarkerDetails::create(
159 Color underlineColor,
160 bool thick,
161 Color backgroundColor,
162 const std::vector<std::string>& suggestions,
163 int id) {
164 return new TextSuggestionMarkerDetails(underlineColor, thick, backgroundColor,
165 suggestions, id);
166 }
167
168 inline TextSuggestionMarkerDetails* toTextSuggestionMarkerDetails(
169 DocumentMarkerDetails* details) {
170 if (details && details->isSuggestion())
171 return static_cast<TextSuggestionMarkerDetails*>(details);
172 return nullptr;
173 }
174
132 DocumentMarker::DocumentMarker(MarkerType type, 175 DocumentMarker::DocumentMarker(MarkerType type,
133 unsigned startOffset, 176 unsigned startOffset,
134 unsigned endOffset, 177 unsigned endOffset,
135 const String& description, 178 const String& description,
136 uint32_t hash) 179 uint32_t hash)
137 : m_type(type), 180 : m_type(type),
138 m_startOffset(startOffset), 181 m_startOffset(startOffset),
139 m_endOffset(endOffset), 182 m_endOffset(endOffset),
140 m_details(description.isEmpty() 183 m_details(description.isEmpty()
141 ? nullptr 184 ? nullptr
142 : DocumentMarkerDescription::create(description)), 185 : DocumentMarkerDescription::create(description)),
143 m_hash(hash) {} 186 m_hash(hash) {}
144 187
145 DocumentMarker::DocumentMarker(unsigned startOffset, 188 DocumentMarker::DocumentMarker(unsigned startOffset,
146 unsigned endOffset, 189 unsigned endOffset,
147 bool activeMatch) 190 bool activeMatch)
148 : m_type(DocumentMarker::TextMatch), 191 : m_type(DocumentMarker::TextMatch),
149 m_startOffset(startOffset), 192 m_startOffset(startOffset),
150 m_endOffset(endOffset), 193 m_endOffset(endOffset),
151 m_details(DocumentMarkerTextMatch::create(activeMatch)), 194 m_details(DocumentMarkerTextMatch::create(activeMatch)),
152 m_hash(0) {} 195 m_hash(0) {}
153 196
154 DocumentMarker::DocumentMarker(unsigned startOffset, 197 DocumentMarker::DocumentMarker(MarkerType type,
198 unsigned startOffset,
155 unsigned endOffset, 199 unsigned endOffset,
156 Color underlineColor, 200 Color underlineColor,
157 bool thick, 201 bool thick,
158 Color backgroundColor) 202 Color backgroundColor)
159 : m_type(DocumentMarker::Composition), 203 : m_type(type),
160 m_startOffset(startOffset), 204 m_startOffset(startOffset),
161 m_endOffset(endOffset), 205 m_endOffset(endOffset),
162 m_details(TextCompositionMarkerDetails::create(underlineColor, 206 m_details(TextCompositionMarkerDetails::create(underlineColor,
163 thick, 207 thick,
164 backgroundColor)), 208 backgroundColor)),
165 m_hash(0) {} 209 m_hash(0) {}
166 210
211 DocumentMarker::DocumentMarker(unsigned startOffset,
212 unsigned endOffset,
213 Color underlineColor,
214 bool thick,
215 Color backgroundColor,
216 const std::vector<std::string>& suggestions,
217 int suggestionMarkerID)
218 : m_startOffset(startOffset), m_endOffset(endOffset), m_hash(0) {
219 if (suggestions.empty()) {
220 m_type = DocumentMarker::Composition;
221 m_details = TextCompositionMarkerDetails::create(underlineColor, thick,
222 backgroundColor);
223 } else {
224 m_type = DocumentMarker::Suggestion;
225 m_details = TextSuggestionMarkerDetails::create(
226 underlineColor, thick, backgroundColor, suggestions,
227 suggestionMarkerID);
228 }
229 }
230
167 DocumentMarker::DocumentMarker(const DocumentMarker& marker) 231 DocumentMarker::DocumentMarker(const DocumentMarker& marker)
168 : m_type(marker.type()), 232 : m_type(marker.type()),
169 m_startOffset(marker.startOffset()), 233 m_startOffset(marker.startOffset()),
170 m_endOffset(marker.endOffset()), 234 m_endOffset(marker.endOffset()),
171 m_details(marker.details()), 235 m_details(marker.details()),
172 m_hash(marker.hash()) {} 236 m_hash(marker.hash()) {}
173 237
174 void DocumentMarker::shiftOffsets(int delta) { 238 void DocumentMarker::shiftOffsets(int delta) {
175 m_startOffset += delta; 239 m_startOffset += delta;
176 m_endOffset += delta; 240 m_endOffset += delta;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 return false; 272 return false;
209 } 273 }
210 274
211 Color DocumentMarker::backgroundColor() const { 275 Color DocumentMarker::backgroundColor() const {
212 if (TextCompositionMarkerDetails* details = 276 if (TextCompositionMarkerDetails* details =
213 toTextCompositionMarkerDetails(m_details.get())) 277 toTextCompositionMarkerDetails(m_details.get()))
214 return details->backgroundColor(); 278 return details->backgroundColor();
215 return Color::transparent; 279 return Color::transparent;
216 } 280 }
217 281
282 const std::vector<std::string> DocumentMarker::suggestions() const {
283 if (TextSuggestionMarkerDetails* details =
284 toTextSuggestionMarkerDetails(m_details.get()))
285 return details->suggestions();
286 return std::vector<std::string>();
287 }
288
289 int DocumentMarker::suggestionMarkerID() const {
290 if (TextSuggestionMarkerDetails* details =
291 toTextSuggestionMarkerDetails(m_details.get()))
292 return details->id();
293 return -1;
294 }
295
296 void DocumentMarker::replaceSuggestion(int index,
297 const std::string& newSuggestion) {
298 if (TextSuggestionMarkerDetails* details =
299 toTextSuggestionMarkerDetails(m_details.get()))
300 details->suggestions()[index] = newSuggestion;
301 }
302
218 DEFINE_TRACE(DocumentMarker) { 303 DEFINE_TRACE(DocumentMarker) {
219 visitor->trace(m_details); 304 visitor->trace(m_details);
220 } 305 }
221 306
222 } // namespace blink 307 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698