OLD | NEW |
---|---|
(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/DocumentMarkerList.h" | |
6 | |
7 namespace blink { | |
8 | |
9 DocumentMarkerList::DocumentMarkerList() {} | |
10 | |
11 bool DocumentMarkerList::isEditingMarkerList() const { | |
12 return false; | |
13 } | |
14 | |
15 bool DocumentMarkerList::isSpellCheckMarkerList() const { | |
16 return false; | |
17 } | |
18 | |
19 DocumentMarker* DocumentMarkerList::at(size_t index) { | |
20 return m_markers[index].get(); | |
21 } | |
22 | |
23 void DocumentMarkerList::add(DocumentMarker* marker) { | |
24 m_markers.push_back(marker); | |
25 } | |
26 | |
27 void DocumentMarkerList::clear() { | |
28 m_markers.clear(); | |
29 } | |
30 | |
31 void DocumentMarkerList::appendMarkersToInputList( | |
32 DocumentMarkerVector* list) const { | |
33 for (Member<DocumentMarker> marker : m_markers) { | |
34 list->push_back(marker); | |
35 } | |
36 } | |
37 | |
38 DocumentMarkerList::DidCopyMarkerOrNot DocumentMarkerList::copyMarkers( | |
Xiaocheng
2017/03/31 18:59:18
Please add |const| to this function to indicate th
rlanday
2017/04/03 20:34:43
Let's fix it here. I will add const and remove the
rlanday
2017/04/03 21:30:14
We actually already have const here so I'll just r
| |
39 unsigned startOffset, | |
40 int length, | |
41 DocumentMarkerList* dstList, | |
42 int delta) const { | |
43 DidCopyMarkerOrNot didCopyMarker = DidCopyMarkerOrNot::DidNotCopyMarker; | |
44 unsigned endOffset = startOffset + length - 1; | |
45 | |
46 for (Member<DocumentMarker> marker : m_markers) { | |
47 // pin the marker to the specified range and apply the shift delta | |
48 if (marker->endOffset() >= startOffset && | |
49 marker->startOffset() <= endOffset) { | |
50 didCopyMarker = DidCopyMarkerOrNot::DidCopyMarker; | |
51 | |
52 DocumentMarker* copiedMarker = marker->clone(); | |
53 if (copiedMarker->startOffset() < startOffset) | |
54 copiedMarker->setStartOffset(startOffset); | |
55 if (copiedMarker->endOffset() > endOffset) | |
56 copiedMarker->setEndOffset(endOffset); | |
57 copiedMarker->shiftOffsets(delta); | |
58 | |
59 dstList->add(copiedMarker); | |
60 } | |
61 } | |
62 | |
63 return didCopyMarker; | |
64 } | |
65 | |
66 DocumentMarkerList::DidRemoveMarkerOrNot DocumentMarkerList::removeMarkers( | |
67 unsigned startOffset, | |
68 int length, | |
69 bool shouldRemovePartiallyOverlappingMarkers) { | |
70 unsigned endOffset = startOffset + length; | |
71 HeapVector<Member<DocumentMarker>> newMarkerList; | |
72 DidRemoveMarkerOrNot didRemoveMarker = | |
73 DidRemoveMarkerOrNot::DidNotRemoveMarker; | |
74 | |
75 for (Member<DocumentMarker> marker : m_markers) { | |
76 if (marker->endOffset() <= startOffset) { | |
77 newMarkerList.push_back(marker); | |
78 continue; | |
79 } | |
80 | |
81 if (marker->startOffset() >= endOffset) { | |
82 newMarkerList.push_back(marker); | |
83 continue; | |
84 } | |
85 | |
86 didRemoveMarker = DidRemoveMarkerOrNot::DidRemoveMarker; | |
87 | |
88 if (shouldRemovePartiallyOverlappingMarkers) { | |
89 // Stop here. Don't add resulting slices back. | |
90 continue; | |
91 } | |
92 | |
93 // add either of the resulting slices that are left after removing target | |
94 if (startOffset > marker->startOffset()) { | |
95 DocumentMarker* newLeft = marker->clone(); | |
96 newLeft->setEndOffset(startOffset); | |
97 newMarkerList.push_back(newLeft); | |
98 } | |
99 | |
100 if (marker->endOffset() > endOffset) { | |
101 DocumentMarker* newRight = marker->clone(); | |
102 newRight->setStartOffset(endOffset); | |
103 newMarkerList.push_back(newRight); | |
104 } | |
105 } | |
106 | |
107 swap(m_markers, newMarkerList); | |
108 return didRemoveMarker; | |
109 } | |
110 | |
111 DocumentMarkerList::DidShiftMarkerOrNot DocumentMarkerList::shiftMarkers( | |
112 unsigned offset, | |
113 unsigned oldLength, | |
114 unsigned newLength) { | |
115 HeapVector<Member<DocumentMarker>> newMarkerList; | |
116 DocumentMarkerList::DidShiftMarkerOrNot didShift = | |
117 DidShiftMarkerOrNot::DidNotShiftMarker; | |
118 for (Member<DocumentMarker> marker : m_markers) { | |
119 Optional<DocumentMarker::MarkerOffsets> result = | |
120 marker->computeOffsetsAfterShift(offset, oldLength, newLength); | |
121 | |
122 if (result == WTF::nullopt) { | |
123 didShift = DidShiftMarkerOrNot::DidShiftMarker; | |
124 continue; | |
125 } | |
126 | |
127 if (result.value().startOffset != marker->startOffset() || | |
128 result.value().endOffset != marker->endOffset()) { | |
129 marker->setStartOffset(result.value().startOffset); | |
130 marker->setEndOffset(result.value().endOffset); | |
131 | |
132 didShift = DidShiftMarkerOrNot::DidShiftMarker; | |
133 } | |
134 newMarkerList.push_back(marker); | |
135 } | |
136 | |
137 swap(m_markers, newMarkerList); | |
138 return didShift; | |
139 } | |
140 | |
141 HeapVector<Member<DocumentMarker>>::iterator | |
142 DocumentMarkerList::getPosOfFirstMarkerNotEndingBefore(size_t startOffset) { | |
143 DCHECK(markerListIsSorted()); | |
144 return std::upper_bound( | |
145 m_markers.begin(), m_markers.end(), startOffset, | |
146 [](size_t startOffset, const Member<DocumentMarker>& rhv) -> bool { | |
147 return startOffset < rhv->endOffset(); | |
148 }); | |
149 } | |
150 | |
151 DEFINE_TRACE(DocumentMarkerList) { | |
152 visitor->trace(m_markers); | |
153 } | |
154 | |
155 } // namespace blink | |
OLD | NEW |