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

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

Issue 2916493002: Make SelectionState enum class (Closed)
Patch Set: Created 3 years, 6 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) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights
4 * reserved. 4 * reserved.
5 * 5 *
6 * This library is free software; you can redistribute it and/or 6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public 7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either 8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version. 9 * version 2 of the License, or (at your option) any later version.
10 * 10 *
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
174 174
175 SelectedMap selected_map; 175 SelectedMap selected_map;
176 176
177 LayoutObject* const stop = 177 LayoutObject* const stop =
178 LayoutObjectAfterPosition(range.EndLayoutObject(), range.EndOffset()); 178 LayoutObjectAfterPosition(range.EndLayoutObject(), range.EndOffset());
179 for (LayoutObject* runner = range.StartLayoutObject(); 179 for (LayoutObject* runner = range.StartLayoutObject();
180 runner && (runner != stop); runner = runner->NextInPreOrder()) { 180 runner && (runner != stop); runner = runner->NextInPreOrder()) {
181 if (!runner->CanBeSelectionLeaf() && runner != range.StartLayoutObject() && 181 if (!runner->CanBeSelectionLeaf() && runner != range.StartLayoutObject() &&
182 runner != range.EndLayoutObject()) 182 runner != range.EndLayoutObject())
183 continue; 183 continue;
184 if (runner->GetSelectionState() == SelectionNone) 184 if (runner->GetSelectionState() == SelectionState::kNone)
185 continue; 185 continue;
186 186
187 // Blocks are responsible for painting line gaps and margin gaps. They 187 // Blocks are responsible for painting line gaps and margin gaps. They
188 // must be examined as well. 188 // must be examined as well.
189 selected_map.object_map.Set(runner, runner->GetSelectionState()); 189 selected_map.object_map.Set(runner, runner->GetSelectionState());
190 if (option == CollectSelectedMapOption::kCollectBlock) { 190 if (option == CollectSelectedMapOption::kCollectBlock) {
191 LayoutBlock* containing_block = runner->ContainingBlock(); 191 LayoutBlock* containing_block = runner->ContainingBlock();
192 while (containing_block && !containing_block->IsLayoutView()) { 192 while (containing_block && !containing_block->IsLayoutView()) {
193 SelectedBlockMap::AddResult result = selected_map.block_map.insert( 193 SelectedBlockMap::AddResult result = selected_map.block_map.insert(
194 containing_block, containing_block->GetSelectionState()); 194 containing_block, containing_block->GetSelectionState());
195 if (!result.is_new_entry) 195 if (!result.is_new_entry)
196 break; 196 break;
197 containing_block = containing_block->ContainingBlock(); 197 containing_block = containing_block->ContainingBlock();
198 } 198 }
199 } 199 }
200 } 200 }
201 return selected_map; 201 return selected_map;
202 } 202 }
203 203
204 // Update the selection status of all LayoutObjects between |start| and |end|. 204 // Update the selection status of all LayoutObjects between |start| and |end|.
205 static void SetSelectionState(const SelectionPaintRange& range) { 205 static void SetSelectionState(const SelectionPaintRange& range) {
206 if (range.IsNull()) 206 if (range.IsNull())
207 return; 207 return;
208 208
209 if (range.StartLayoutObject() == range.EndLayoutObject()) { 209 if (range.StartLayoutObject() == range.EndLayoutObject()) {
210 range.StartLayoutObject()->SetSelectionStateIfNeeded(SelectionBoth); 210 range.StartLayoutObject()->SetSelectionStateIfNeeded(
211 SelectionState::kStartAndEnd);
211 } else { 212 } else {
212 range.StartLayoutObject()->SetSelectionStateIfNeeded(SelectionStart); 213 range.StartLayoutObject()->SetSelectionStateIfNeeded(
213 range.EndLayoutObject()->SetSelectionStateIfNeeded(SelectionEnd); 214 SelectionState::kStart);
215 range.EndLayoutObject()->SetSelectionStateIfNeeded(SelectionState::kEnd);
214 } 216 }
215 217
216 LayoutObject* const stop = 218 LayoutObject* const stop =
217 LayoutObjectAfterPosition(range.EndLayoutObject(), range.EndOffset()); 219 LayoutObjectAfterPosition(range.EndLayoutObject(), range.EndOffset());
218 for (LayoutObject* runner = range.StartLayoutObject(); 220 for (LayoutObject* runner = range.StartLayoutObject();
219 runner && runner != stop; runner = runner->NextInPreOrder()) { 221 runner && runner != stop; runner = runner->NextInPreOrder()) {
220 if (runner != range.StartLayoutObject() && 222 if (runner != range.StartLayoutObject() &&
221 runner != range.EndLayoutObject() && runner->CanBeSelectionLeaf()) 223 runner != range.EndLayoutObject() && runner->CanBeSelectionLeaf())
222 runner->SetSelectionStateIfNeeded(SelectionInside); 224 runner->SetSelectionStateIfNeeded(SelectionState::kInside);
223 } 225 }
224 } 226 }
225 227
226 // Set SetSelectionState and ShouldInvalidateSelection flag of LayoutObjects 228 // Set SetSelectionState and ShouldInvalidateSelection flag of LayoutObjects
227 // comparing them in |new_range| and |old_range|. 229 // comparing them in |new_range| and |old_range|.
228 static void UpdateLayoutObjectState(const SelectionPaintRange& new_range, 230 static void UpdateLayoutObjectState(const SelectionPaintRange& new_range,
229 const SelectionPaintRange& old_range) { 231 const SelectionPaintRange& old_range) {
230 SelectedMap old_selected_map = 232 SelectedMap old_selected_map =
231 CollectSelectedMap(old_range, CollectSelectedMapOption::kCollectBlock); 233 CollectSelectedMap(old_range, CollectSelectedMapOption::kCollectBlock);
232 234
233 // Now clear the selection. 235 // Now clear the selection.
234 for (auto layout_object : old_selected_map.object_map.Keys()) 236 for (auto layout_object : old_selected_map.object_map.Keys())
235 layout_object->SetSelectionStateIfNeeded(SelectionNone); 237 layout_object->SetSelectionStateIfNeeded(SelectionState::kNone);
236 238
237 SetSelectionState(new_range); 239 SetSelectionState(new_range);
238 240
239 // Now that the selection state has been updated for the new objects, walk 241 // Now that the selection state has been updated for the new objects, walk
240 // them again and put them in the new objects list. 242 // them again and put them in the new objects list.
241 // TODO(editing-dev): |new_selected_map| doesn't really need to store the 243 // TODO(editing-dev): |new_selected_map| doesn't really need to store the
242 // SelectionState, it's just more convenient to have it use the same data 244 // SelectionState, it's just more convenient to have it use the same data
243 // structure as |old_selected_map|. 245 // structure as |old_selected_map|.
244 SelectedMap new_selected_map = 246 SelectedMap new_selected_map =
245 CollectSelectedMap(new_range, CollectSelectedMapOption::kCollectBlock); 247 CollectSelectedMap(new_range, CollectSelectedMapOption::kCollectBlock);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 298
297 // Just return if the selection is already empty. 299 // Just return if the selection is already empty.
298 if (paint_range_.IsNull()) 300 if (paint_range_.IsNull())
299 return; 301 return;
300 302
301 const SelectedMap& old_selected_map = CollectSelectedMap( 303 const SelectedMap& old_selected_map = CollectSelectedMap(
302 paint_range_, CollectSelectedMapOption::kNotCollectBlock); 304 paint_range_, CollectSelectedMapOption::kNotCollectBlock);
303 // Clear SelectionState and invalidation. 305 // Clear SelectionState and invalidation.
304 for (auto layout_object : old_selected_map.object_map.Keys()) { 306 for (auto layout_object : old_selected_map.object_map.Keys()) {
305 const SelectionState old_state = layout_object->GetSelectionState(); 307 const SelectionState old_state = layout_object->GetSelectionState();
306 layout_object->SetSelectionStateIfNeeded(SelectionNone); 308 layout_object->SetSelectionStateIfNeeded(SelectionState::kNone);
307 if (layout_object->GetSelectionState() == old_state) 309 if (layout_object->GetSelectionState() == old_state)
308 continue; 310 continue;
309 layout_object->SetShouldInvalidateSelection(); 311 layout_object->SetShouldInvalidateSelection();
310 } 312 }
311 313
312 // Reset selection. 314 // Reset selection.
313 paint_range_ = SelectionPaintRange(); 315 paint_range_ = SelectionPaintRange();
314 } 316 }
315 317
316 void LayoutSelection::Commit() { 318 void LayoutSelection::Commit() {
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 Commit(); 402 Commit();
401 if (paint_range_.IsNull()) 403 if (paint_range_.IsNull())
402 return IntRect(); 404 return IntRect();
403 405
404 LayoutObject* os = paint_range_.StartLayoutObject(); 406 LayoutObject* os = paint_range_.StartLayoutObject();
405 LayoutObject* stop = LayoutObjectAfterPosition(paint_range_.EndLayoutObject(), 407 LayoutObject* stop = LayoutObjectAfterPosition(paint_range_.EndLayoutObject(),
406 paint_range_.EndOffset()); 408 paint_range_.EndOffset());
407 while (os && os != stop) { 409 while (os && os != stop) {
408 if ((os->CanBeSelectionLeaf() || os == paint_range_.StartLayoutObject() || 410 if ((os->CanBeSelectionLeaf() || os == paint_range_.StartLayoutObject() ||
409 os == paint_range_.EndLayoutObject()) && 411 os == paint_range_.EndLayoutObject()) &&
410 os->GetSelectionState() != SelectionNone) { 412 os->GetSelectionState() != SelectionState::kNone) {
411 // Blocks are responsible for painting line gaps and margin gaps. They 413 // Blocks are responsible for painting line gaps and margin gaps. They
412 // must be examined as well. 414 // must be examined as well.
413 sel_rect.Unite(SelectionRectForLayoutObject(os)); 415 sel_rect.Unite(SelectionRectForLayoutObject(os));
414 const LayoutBlock* cb = os->ContainingBlock(); 416 const LayoutBlock* cb = os->ContainingBlock();
415 while (cb && !cb->IsLayoutView()) { 417 while (cb && !cb->IsLayoutView()) {
416 sel_rect.Unite(SelectionRectForLayoutObject(cb)); 418 sel_rect.Unite(SelectionRectForLayoutObject(cb));
417 VisitedContainingBlockSet::AddResult add_result = 419 VisitedContainingBlockSet::AddResult add_result =
418 visited_containing_blocks.insert(cb); 420 visited_containing_blocks.insert(cb);
419 if (!add_result.is_new_entry) 421 if (!add_result.is_new_entry)
420 break; 422 break;
(...skipping 11 matching lines...) Expand all
432 if (paint_range_.IsNull()) 434 if (paint_range_.IsNull())
433 return; 435 return;
434 436
435 LayoutObject* end = LayoutObjectAfterPosition(paint_range_.EndLayoutObject(), 437 LayoutObject* end = LayoutObjectAfterPosition(paint_range_.EndLayoutObject(),
436 paint_range_.EndOffset()); 438 paint_range_.EndOffset());
437 for (LayoutObject* o = paint_range_.StartLayoutObject(); o && o != end; 439 for (LayoutObject* o = paint_range_.StartLayoutObject(); o && o != end;
438 o = o->NextInPreOrder()) { 440 o = o->NextInPreOrder()) {
439 if (!o->CanBeSelectionLeaf() && o != paint_range_.StartLayoutObject() && 441 if (!o->CanBeSelectionLeaf() && o != paint_range_.StartLayoutObject() &&
440 o != paint_range_.EndLayoutObject()) 442 o != paint_range_.EndLayoutObject())
441 continue; 443 continue;
442 if (o->GetSelectionState() == SelectionNone) 444 if (o->GetSelectionState() == SelectionState::kNone)
443 continue; 445 continue;
444 446
445 o->SetShouldInvalidateSelection(); 447 o->SetShouldInvalidateSelection();
446 } 448 }
447 } 449 }
448 450
449 DEFINE_TRACE(LayoutSelection) { 451 DEFINE_TRACE(LayoutSelection) {
450 visitor->Trace(frame_selection_); 452 visitor->Trace(frame_selection_);
451 } 453 }
452 454
453 } // namespace blink 455 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698