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

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

Issue 2723663002: Refactor DocumentMarkerController (Closed)
Patch Set: Make requested changes, rebase (HashMap::remove() => HashMap::erase()) Created 3 years, 9 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
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "core/editing/markers/EditingMarkerList.h"
6
7 #include <algorithm>
8 #include "core/editing/markers/DocumentMarkerController.h"
9
10 namespace blink {
11
12 namespace {
13
14 bool compareByStart(const Member<DocumentMarker>& lhv,
15 const Member<DocumentMarker>& rhv) {
16 return lhv->startOffset() < rhv->startOffset();
17 }
18
19 } // namespace
20
21 EditingMarkerList::EditingMarkerList(
22 DocumentMarkerController* documentMarkerController)
23 : DocumentMarkerList(documentMarkerController), m_markersAreSorted(false) {}
24
25 void EditingMarkerList::clear() {
26 m_markers.clear();
27 m_markersAreSorted = true;
28 }
29
30 bool EditingMarkerList::copyMarkers(unsigned startOffset,
31 int length,
32 Node* dstNode,
33 int delta) const {
34 bool docDirty = false;
35 unsigned endOffset = startOffset + length - 1;
36 for (Member<DocumentMarker> marker : m_markers) {
37 // pin the marker to the specified range and apply the shift delta
38 if (marker->endOffset() >= startOffset &&
39 marker->startOffset() <= endOffset) {
40 docDirty = true;
41 if (marker->startOffset() < startOffset)
42 marker->setStartOffset(startOffset);
43 if (marker->endOffset() > endOffset)
44 marker->setEndOffset(endOffset);
45 marker->shiftOffsets(delta);
46
47 m_documentMarkerController->addMarker(dstNode, marker);
48 }
49 }
50
51 return docDirty;
52 }
53
54 void EditingMarkerList::removeMarkers(
55 unsigned startOffset,
56 int length,
57 bool shouldRemovePartiallyOverlappingMarkers,
58 bool* didRemoveMarker) {
59 unsigned endOffset = startOffset + length;
60 size_t markerIndex = 0;
61 if (m_markersAreSorted) {
62 markerIndex =
63 getPosOfFirstMarkerNotEndingBefore(markerIndex) - m_markers.begin();
64 }
65
66 for (; markerIndex < m_markers.size(); ++markerIndex) {
67 DocumentMarker& marker = *m_markers.at(markerIndex);
68
69 if (!m_markersAreSorted) {
70 if (marker.endOffset() <= startOffset)
71 continue;
72 }
73
74 if (marker.startOffset() >= endOffset) {
75 if (m_markersAreSorted)
76 break;
77 continue;
78 }
79
80 // pitch the old marker
81 m_markers.remove(markerIndex);
82 *didRemoveMarker = true;
83
84 if (shouldRemovePartiallyOverlappingMarkers) {
85 // Stop here. Don't add resulting slices back.
86 continue;
87 }
88
89 // add either of the resulting slices that are left after removing target
90 if (startOffset > marker.startOffset()) {
91 DocumentMarker* newLeft = new DocumentMarker(marker);
92 newLeft->setEndOffset(startOffset);
93 m_markers.insert(markerIndex, *newLeft);
94 // Move to the marker after the inserted one.
95 ++markerIndex;
96 }
97 if (marker.endOffset() > endOffset) {
98 DocumentMarker* newRight = new DocumentMarker(marker);
99 newRight->setStartOffset(endOffset);
100 m_markers.insert(markerIndex, *newRight);
101 // Move to the marker after the inserted one.
102 ++markerIndex;
103 }
104 }
105 }
106
107 bool EditingMarkerList::shiftMarkers(unsigned offset,
108 unsigned oldLength,
109 unsigned newLength) {
110 bool didShift = false;
111 for (auto it = m_markers.begin(); it != m_markers.end(); ++it) {
112 DocumentMarker& marker = **it;
113
114 DocumentMarker::ShiftMarkerResult result =
115 marker.getShiftedMarkerPosition(offset, oldLength, newLength);
116 if (result.shouldRemoveMarker) {
117 m_markers.remove(it - m_markers.begin());
118 --it;
119
120 didShift = true;
121 } else if (result.newStartOffset != marker.startOffset() ||
122 result.newEndOffset != marker.endOffset()) {
123 marker.setStartOffset(result.newStartOffset);
124 marker.setEndOffset(result.newEndOffset);
125
126 didShift = true;
127 }
128 }
129
130 return didShift;
131 }
132
133 void EditingMarkerList::insert(DocumentMarker* marker) {
134 DCHECK(marker->type() == allowedMarkerType());
135 if (m_markersAreSorted && !m_markers.isEmpty() &&
136 m_markers.back()->endOffset() > marker->startOffset())
137 m_markersAreSorted = false;
138 m_markers.push_back(marker);
139 }
140
141 void EditingMarkerList::sortMarkerList() {
142 std::sort(m_markers.begin(), m_markers.end(), compareByStart);
143 }
144
145 DEFINE_TRACE(EditingMarkerList) {
146 visitor->trace(m_markers);
147 DocumentMarkerList::trace(visitor);
148 }
149
150 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698