bool DocumentMarkerController::hasMarkers(Range* range, DocumentMarker::MarkerTypes markerTypes) { if (!possiblyHasMarkers(markerTypes)) return false; ASSERT(!m_markers.isEmpty()); Node* startContainer = range->startContainer(); ASSERT(startContainer); Node* endContainer = range->endContainer(); ASSERT(endContainer); Node* pastLastNode = range->pastLastNode(); for (Node* node = range->firstNode(); node != pastLastNode; node = NodeTraversal::next(*node)) { DocumentMarkerVector markers = markersFor(node); DocumentMarkerVector::const_iterator end = markers.end(); for (DocumentMarkerVector::const_iterator it = markers.begin(); it != end; ++it) { DocumentMarker* marker = *it; if (!markerTypes.contains(marker->type())) continue; if (node == startContainer && marker->endOffset() <= static_cast<unsigned>(range->startOffset())) continue; if (node == endContainer && marker->startOffset() >= static_cast<unsigned>(range->endOffset())) continue; return true; } } return false; }
void SpellChecker::replaceMisspelledRange(const String& text) { RefPtr<Range> caretRange = m_frame.selection().toNormalizedRange(); if (!caretRange) return; DocumentMarkerVector markers = m_frame.document()->markers().markersInRange(caretRange.get(), DocumentMarker::MisspellingMarkers()); if (markers.size() < 1 || markers[0]->startOffset() >= markers[0]->endOffset()) return; RefPtr<Range> markerRange = Range::create(caretRange->ownerDocument(), caretRange->startContainer(), markers[0]->startOffset(), caretRange->endContainer(), markers[0]->endOffset()); if (!markerRange) return; m_frame.selection().setSelection(VisibleSelection(markerRange.get()), CharacterGranularity); m_frame.editor().replaceSelectionWithText(text, false, false); }
DocumentMarkerVector DocumentMarkerController::markers() { DocumentMarkerVector result; for (MarkerMap::iterator i = m_markers.begin(); i != m_markers.end(); ++i) { MarkerLists* markers = i->value.get(); for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::MarkerTypeIndexesCount; ++markerListIndex) { OwnPtr<MarkerList>& list = (*markers)[markerListIndex]; for (size_t j = 0; list.get() && j < list->size(); ++j) result.append(list->at(j).get()); } } std::sort(result.begin(), result.end(), compareByStart); return result; }
bool SpellChecker::selectionStartHasMarkerFor(DocumentMarker::MarkerType markerType, int from, int length) const { Node* node = findFirstMarkable(m_frame.selection().start().deprecatedNode()); if (!node) return false; unsigned startOffset = static_cast<unsigned>(from); unsigned endOffset = static_cast<unsigned>(from + length); DocumentMarkerVector markers = m_frame.document()->markers().markersFor(node); for (size_t i = 0; i < markers.size(); ++i) { DocumentMarker* marker = markers[i]; if (marker->startOffset() <= startOffset && endOffset <= marker->endOffset() && marker->type() == markerType) return true; } return false; }
void DocumentMarkerController::addTextMatchMarker(const Range* range, bool activeMatch) { // Use a TextIterator to visit the potentially multiple nodes the range covers. for (TextIterator markedText(range); !markedText.atEnd(); markedText.advance()) { RefPtr<Range> textPiece = markedText.range(); unsigned startOffset = textPiece->startOffset(); unsigned endOffset = textPiece->endOffset(); addMarker(textPiece->startContainer(), DocumentMarker(startOffset, endOffset, activeMatch)); if (endOffset > startOffset) { // Rendered rects for markers in WebKit are not populated until each time // the markers are painted. However, we need it to happen sooner, because // the whole purpose of tickmarks on the scrollbar is to show where // matches off-screen are (that haven't been painted yet). Node* node = textPiece->startContainer(); DocumentMarkerVector markers = markersFor(node); toRenderedDocumentMarker(markers[markers.size() - 1])->setRenderedRect(range->boundingBox()); } } }
DocumentMarkerVector DocumentMarkerController::markersFor(Node* node, DocumentMarker::MarkerTypes markerTypes) { DocumentMarkerVector result; MarkerLists* markers = m_markers.get(node); if (!markers) return result; for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::MarkerTypeIndexesCount; ++markerListIndex) { OwnPtr<MarkerList>& list = (*markers)[markerListIndex]; if (!list || list->isEmpty() || !markerTypes.contains((*list->begin())->type())) continue; for (size_t i = 0; i < list->size(); ++i) result.append(list->at(i).get()); } std::sort(result.begin(), result.end(), compareByStart); return result; }