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

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

Issue 2723663002: Refactor DocumentMarkerController (Closed)
Patch Set: Rebase on https://codereview.chromium.org/2755013004 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 EditingMarkerList::EditingMarkerList(
13 DocumentMarkerController* documentMarkerController)
14 : DocumentMarkerList(documentMarkerController), m_markersAreSorted(false) {}
15
16 size_t EditingMarkerList::size() const {
17 return m_markers.size();
18 }
19
20 bool EditingMarkerList::empty() const {
21 return m_markers.isEmpty();
22 }
23
24 DocumentMarker* EditingMarkerList::at(size_t index) {
25 return m_markers[index].get();
26 }
27
28 void EditingMarkerList::clear() {
29 m_markers.clear();
30 m_markersAreSorted = true;
31 }
32
33 DocumentMarkerList::iterator EditingMarkerList::begin() {
34 return m_markers.begin();
35 }
36
37 DocumentMarkerList::iterator EditingMarkerList::end() {
38 return m_markers.end();
39 }
40
41 DocumentMarkerList::const_iterator EditingMarkerList::begin() const {
42 return m_markers.begin();
43 }
44
45 DocumentMarkerList::const_iterator EditingMarkerList::end() const {
46 return m_markers.end();
47 }
48
49 void EditingMarkerList::appendMarkersToInputList(
50 DocumentMarkerVector* list) const {
51 for (Member<DocumentMarker> marker : m_markers) {
52 list->push_back(marker);
53 }
54 }
55
56 bool EditingMarkerList::copyMarkers(unsigned startOffset,
57 int length,
58 Node* dstNode,
59 int delta) const {
60 bool docDirty = false;
61 unsigned endOffset = startOffset + length - 1;
62 for (Member<DocumentMarker> marker : m_markers) {
63 // pin the marker to the specified range and apply the shift delta
64 if (marker->endOffset() >= startOffset &&
65 marker->startOffset() <= endOffset) {
66 docDirty = true;
67 if (marker->startOffset() < startOffset)
68 marker->setStartOffset(startOffset);
69 if (marker->endOffset() > endOffset)
70 marker->setEndOffset(endOffset);
71 marker->shiftOffsets(delta);
72
73 m_documentMarkerController->addMarker(dstNode, marker);
74 }
75 }
76
77 return docDirty;
78 }
79
80 void EditingMarkerList::removeMarkers(
81 unsigned startOffset,
82 int length,
83 bool shouldRemovePartiallyOverlappingMarkers,
84 bool* didRemoveMarker) {
85 unsigned endOffset = startOffset + length;
86 size_t markerIndex = 0;
87 if (m_markersAreSorted) {
88 markerIndex =
89 std::upper_bound(m_markers.begin(), m_markers.end(), startOffset,
90 DocumentMarkerList::endsBefore) -
91 m_markers.begin();
92 }
93
94 for (; markerIndex < m_markers.size(); ++markerIndex) {
95 DocumentMarker& marker = *m_markers.at(markerIndex);
96
97 if (!m_markersAreSorted) {
98 if (marker.endOffset() <= startOffset)
99 continue;
100 }
101
102 if (marker.startOffset() >= endOffset) {
103 if (m_markersAreSorted)
104 break;
105 continue;
106 }
107
108 // pitch the old marker
109 m_markers.remove(markerIndex);
110 *didRemoveMarker = true;
111
112 if (shouldRemovePartiallyOverlappingMarkers) {
113 // Stop here. Don't add resulting slices back.
114 continue;
115 }
116
117 // add either of the resulting slices that are left after removing target
118 if (startOffset > marker.startOffset()) {
119 DocumentMarker* newLeft = new DocumentMarker(marker);
120 newLeft->setEndOffset(startOffset);
121 m_markers.insert(markerIndex, *newLeft);
122 // Move to the marker after the inserted one.
123 ++markerIndex;
124 }
125 if (marker.endOffset() > endOffset) {
126 DocumentMarker* newRight = new DocumentMarker(marker);
127 newRight->setStartOffset(endOffset);
128 m_markers.insert(markerIndex, *newRight);
129 // Move to the marker after the inserted one.
130 ++markerIndex;
131 }
132 }
133 }
134
135 bool EditingMarkerList::shiftMarkers(unsigned offset,
136 unsigned oldLength,
137 unsigned newLength) {
138 bool didShift = false;
139 for (auto it = m_markers.begin(); it != m_markers.end(); ++it) {
140 DocumentMarker& marker = **it;
141
142 ShiftMarkerResult result =
143 getShiftedMarkerPosition(marker, offset, oldLength, newLength);
144 if (result.shouldRemoveMarker) {
145 m_markers.remove(it - m_markers.begin());
146 --it;
147
148 didShift = true;
149 } else if (result.newStartOffset != marker.startOffset() ||
150 result.newEndOffset != marker.endOffset()) {
151 marker.setStartOffset(result.newStartOffset);
152 marker.setEndOffset(result.newEndOffset);
153
154 didShift = true;
155 }
156 }
157
158 return didShift;
159 }
160
161 void EditingMarkerList::insert(DocumentMarker* marker) {
162 DCHECK(marker->type() == allowedMarkerType());
163 if (m_markersAreSorted && !m_markers.isEmpty() &&
164 m_markers.back()->endOffset() > marker->startOffset())
165 m_markersAreSorted = false;
166 m_markers.push_back(marker);
167 }
168
169 void EditingMarkerList::sortMarkerList() {
170 std::sort(m_markers.begin(), m_markers.end(),
171 DocumentMarkerList::compareByStart);
172 }
173
174 DEFINE_TRACE(EditingMarkerList) {
175 visitor->trace(m_markers);
176 DocumentMarkerList::trace(visitor);
177 }
178
179 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698