| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
| 4 * (C) 2001 Dirk Mueller (mueller@kde.org) | 4 * (C) 2001 Dirk Mueller (mueller@kde.org) |
| 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) | 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) |
| 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights
reserved. | 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights
reserved. |
| 7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) | 7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) |
| 8 * Copyright (C) Research In Motion Limited 2010. All rights reserved. | 8 * Copyright (C) Research In Motion Limited 2010. All rights reserved. |
| 9 * | 9 * |
| 10 * This library is free software; you can redistribute it and/or | 10 * This library is free software; you can redistribute it and/or |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 if (toInsert.type() != DocumentMarker::TextMatch) { | 206 if (toInsert.type() != DocumentMarker::TextMatch) { |
| 207 mergeOverlapping(list.get(), toInsert); | 207 mergeOverlapping(list.get(), toInsert); |
| 208 } else { | 208 } else { |
| 209 MarkerList::iterator pos = std::lower_bound(list->begin(), list->end
(), toInsert, startsFurther); | 209 MarkerList::iterator pos = std::lower_bound(list->begin(), list->end
(), toInsert, startsFurther); |
| 210 list->insert(pos - list->begin(), RenderedDocumentMarker(toInsert)); | 210 list->insert(pos - list->begin(), RenderedDocumentMarker(toInsert)); |
| 211 } | 211 } |
| 212 } | 212 } |
| 213 | 213 |
| 214 // repaint the affected node | 214 // repaint the affected node |
| 215 if (node->renderer()) | 215 if (node->renderer()) |
| 216 node->renderer()->repaint(); | 216 node->renderer()->invalidatePaint(); |
| 217 } | 217 } |
| 218 | 218 |
| 219 void DocumentMarkerController::mergeOverlapping(MarkerList* list, DocumentMarker
& toInsert) | 219 void DocumentMarkerController::mergeOverlapping(MarkerList* list, DocumentMarker
& toInsert) |
| 220 { | 220 { |
| 221 MarkerList::iterator firstOverlapping = std::lower_bound(list->begin(), list
->end(), toInsert, doesNotOverlap); | 221 MarkerList::iterator firstOverlapping = std::lower_bound(list->begin(), list
->end(), toInsert, doesNotOverlap); |
| 222 size_t index = firstOverlapping - list->begin(); | 222 size_t index = firstOverlapping - list->begin(); |
| 223 list->insert(index, RenderedDocumentMarker(toInsert)); | 223 list->insert(index, RenderedDocumentMarker(toInsert)); |
| 224 MarkerList::iterator inserted = list->begin() + index; | 224 MarkerList::iterator inserted = list->begin() + index; |
| 225 firstOverlapping = inserted + 1; | 225 firstOverlapping = inserted + 1; |
| 226 for (MarkerList::iterator i = firstOverlapping; i != list->end() && i->start
Offset() <= inserted->endOffset(); ) { | 226 for (MarkerList::iterator i = firstOverlapping; i != list->end() && i->start
Offset() <= inserted->endOffset(); ) { |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 267 if (marker.endOffset() > endOffset) | 267 if (marker.endOffset() > endOffset) |
| 268 marker.setEndOffset(endOffset); | 268 marker.setEndOffset(endOffset); |
| 269 marker.shiftOffsets(delta); | 269 marker.shiftOffsets(delta); |
| 270 | 270 |
| 271 addMarker(dstNode, marker); | 271 addMarker(dstNode, marker); |
| 272 } | 272 } |
| 273 } | 273 } |
| 274 | 274 |
| 275 // repaint the affected node | 275 // repaint the affected node |
| 276 if (docDirty && dstNode->renderer()) | 276 if (docDirty && dstNode->renderer()) |
| 277 dstNode->renderer()->repaint(); | 277 dstNode->renderer()->invalidatePaint(); |
| 278 } | 278 } |
| 279 | 279 |
| 280 void DocumentMarkerController::removeMarkers(Node* node, unsigned startOffset, i
nt length, DocumentMarker::MarkerTypes markerTypes, RemovePartiallyOverlappingMa
rkerOrNot shouldRemovePartiallyOverlappingMarker) | 280 void DocumentMarkerController::removeMarkers(Node* node, unsigned startOffset, i
nt length, DocumentMarker::MarkerTypes markerTypes, RemovePartiallyOverlappingMa
rkerOrNot shouldRemovePartiallyOverlappingMarker) |
| 281 { | 281 { |
| 282 if (length <= 0) | 282 if (length <= 0) |
| 283 return; | 283 return; |
| 284 | 284 |
| 285 if (!possiblyHasMarkers(markerTypes)) | 285 if (!possiblyHasMarkers(markerTypes)) |
| 286 return; | 286 return; |
| 287 ASSERT(!(m_markers.isEmpty())); | 287 ASSERT(!(m_markers.isEmpty())); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 348 } | 348 } |
| 349 | 349 |
| 350 if (emptyListsCount == DocumentMarker::MarkerTypeIndexesCount) { | 350 if (emptyListsCount == DocumentMarker::MarkerTypeIndexesCount) { |
| 351 m_markers.remove(node); | 351 m_markers.remove(node); |
| 352 if (m_markers.isEmpty()) | 352 if (m_markers.isEmpty()) |
| 353 m_possiblyExistingMarkerTypes = 0; | 353 m_possiblyExistingMarkerTypes = 0; |
| 354 } | 354 } |
| 355 | 355 |
| 356 // repaint the affected node | 356 // repaint the affected node |
| 357 if (docDirty && node->renderer()) | 357 if (docDirty && node->renderer()) |
| 358 node->renderer()->repaint(); | 358 node->renderer()->invalidatePaint(); |
| 359 } | 359 } |
| 360 | 360 |
| 361 DocumentMarker* DocumentMarkerController::markerContainingPoint(const LayoutPoin
t& point, DocumentMarker::MarkerType markerType) | 361 DocumentMarker* DocumentMarkerController::markerContainingPoint(const LayoutPoin
t& point, DocumentMarker::MarkerType markerType) |
| 362 { | 362 { |
| 363 if (!possiblyHasMarkers(markerType)) | 363 if (!possiblyHasMarkers(markerType)) |
| 364 return 0; | 364 return 0; |
| 365 ASSERT(!(m_markers.isEmpty())); | 365 ASSERT(!(m_markers.isEmpty())); |
| 366 | 366 |
| 367 // outer loop: process each node that contains any markers | 367 // outer loop: process each node that contains any markers |
| 368 MarkerMap::iterator end = m_markers.end(); | 368 MarkerMap::iterator end = m_markers.end(); |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 539 ++emptyListsCount; | 539 ++emptyListsCount; |
| 540 needsRepainting = true; | 540 needsRepainting = true; |
| 541 } | 541 } |
| 542 } | 542 } |
| 543 | 543 |
| 544 nodeCanBeRemoved = emptyListsCount == DocumentMarker::MarkerTypeIndexesC
ount; | 544 nodeCanBeRemoved = emptyListsCount == DocumentMarker::MarkerTypeIndexesC
ount; |
| 545 } | 545 } |
| 546 | 546 |
| 547 if (needsRepainting) { | 547 if (needsRepainting) { |
| 548 if (RenderObject* renderer = iterator->key->renderer()) | 548 if (RenderObject* renderer = iterator->key->renderer()) |
| 549 renderer->repaint(); | 549 renderer->invalidatePaint(); |
| 550 } | 550 } |
| 551 | 551 |
| 552 if (nodeCanBeRemoved) { | 552 if (nodeCanBeRemoved) { |
| 553 m_markers.remove(iterator); | 553 m_markers.remove(iterator); |
| 554 if (m_markers.isEmpty()) | 554 if (m_markers.isEmpty()) |
| 555 m_possiblyExistingMarkerTypes = 0; | 555 m_possiblyExistingMarkerTypes = 0; |
| 556 } | 556 } |
| 557 } | 557 } |
| 558 | 558 |
| 559 void DocumentMarkerController::repaintMarkers(DocumentMarker::MarkerTypes marker
Types) | 559 void DocumentMarkerController::repaintMarkers(DocumentMarker::MarkerTypes marker
Types) |
| 560 { | 560 { |
| 561 if (!possiblyHasMarkers(markerTypes)) | 561 if (!possiblyHasMarkers(markerTypes)) |
| 562 return; | 562 return; |
| 563 ASSERT(!m_markers.isEmpty()); | 563 ASSERT(!m_markers.isEmpty()); |
| 564 | 564 |
| 565 // outer loop: process each markered node in the document | 565 // outer loop: process each markered node in the document |
| 566 MarkerMap::iterator end = m_markers.end(); | 566 MarkerMap::iterator end = m_markers.end(); |
| 567 for (MarkerMap::iterator i = m_markers.begin(); i != end; ++i) { | 567 for (MarkerMap::iterator i = m_markers.begin(); i != end; ++i) { |
| 568 const Node* node = i->key; | 568 const Node* node = i->key; |
| 569 | 569 |
| 570 // inner loop: process each marker in the current node | 570 // inner loop: process each marker in the current node |
| 571 MarkerLists* markers = i->value.get(); | 571 MarkerLists* markers = i->value.get(); |
| 572 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::Marke
rTypeIndexesCount; ++markerListIndex) { | 572 for (size_t markerListIndex = 0; markerListIndex < DocumentMarker::Marke
rTypeIndexesCount; ++markerListIndex) { |
| 573 OwnPtrWillBeMember<MarkerList>& list = (*markers)[markerListIndex]; | 573 OwnPtrWillBeMember<MarkerList>& list = (*markers)[markerListIndex]; |
| 574 if (!list || list->isEmpty() || !markerTypes.contains(list->begin()-
>type())) | 574 if (!list || list->isEmpty() || !markerTypes.contains(list->begin()-
>type())) |
| 575 continue; | 575 continue; |
| 576 | 576 |
| 577 // cause the node to be redrawn | 577 // cause the node to be redrawn |
| 578 if (RenderObject* renderer = node->renderer()) { | 578 if (RenderObject* renderer = node->renderer()) { |
| 579 renderer->repaint(); | 579 renderer->invalidatePaint(); |
| 580 break; | 580 break; |
| 581 } | 581 } |
| 582 } | 582 } |
| 583 } | 583 } |
| 584 } | 584 } |
| 585 | 585 |
| 586 void DocumentMarkerController::invalidateRenderedRectsForMarkersInRect(const Lay
outRect& r) | 586 void DocumentMarkerController::invalidateRenderedRectsForMarkersInRect(const Lay
outRect& r) |
| 587 { | 587 { |
| 588 // outer loop: process each markered node in the document | 588 // outer loop: process each markered node in the document |
| 589 MarkerMap::iterator end = m_markers.end(); | 589 MarkerMap::iterator end = m_markers.end(); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 620 marker->shiftOffsets(delta); | 620 marker->shiftOffsets(delta); |
| 621 docDirty = true; | 621 docDirty = true; |
| 622 | 622 |
| 623 // Marker moved, so previously-computed rendered rectangle is now in
valid | 623 // Marker moved, so previously-computed rendered rectangle is now in
valid |
| 624 marker->invalidate(); | 624 marker->invalidate(); |
| 625 } | 625 } |
| 626 } | 626 } |
| 627 | 627 |
| 628 // repaint the affected node | 628 // repaint the affected node |
| 629 if (docDirty && node->renderer()) | 629 if (docDirty && node->renderer()) |
| 630 node->renderer()->repaint(); | 630 node->renderer()->invalidatePaint(); |
| 631 } | 631 } |
| 632 | 632 |
| 633 void DocumentMarkerController::setMarkersActive(Range* range, bool active) | 633 void DocumentMarkerController::setMarkersActive(Range* range, bool active) |
| 634 { | 634 { |
| 635 if (!possiblyHasMarkers(DocumentMarker::AllMarkers())) | 635 if (!possiblyHasMarkers(DocumentMarker::AllMarkers())) |
| 636 return; | 636 return; |
| 637 ASSERT(!m_markers.isEmpty()); | 637 ASSERT(!m_markers.isEmpty()); |
| 638 | 638 |
| 639 Node* startContainer = range->startContainer(); | 639 Node* startContainer = range->startContainer(); |
| 640 Node* endContainer = range->endContainer(); | 640 Node* endContainer = range->endContainer(); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 664 // Markers are returned in order, so stop if we are now past the specifi
ed range. | 664 // Markers are returned in order, so stop if we are now past the specifi
ed range. |
| 665 if (marker->startOffset() >= endOffset) | 665 if (marker->startOffset() >= endOffset) |
| 666 break; | 666 break; |
| 667 | 667 |
| 668 marker->setActiveMatch(active); | 668 marker->setActiveMatch(active); |
| 669 docDirty = true; | 669 docDirty = true; |
| 670 } | 670 } |
| 671 | 671 |
| 672 // repaint the affected node | 672 // repaint the affected node |
| 673 if (docDirty && node->renderer()) | 673 if (docDirty && node->renderer()) |
| 674 node->renderer()->repaint(); | 674 node->renderer()->invalidatePaint(); |
| 675 } | 675 } |
| 676 | 676 |
| 677 bool DocumentMarkerController::hasMarkers(Range* range, DocumentMarker::MarkerTy
pes markerTypes) | 677 bool DocumentMarkerController::hasMarkers(Range* range, DocumentMarker::MarkerTy
pes markerTypes) |
| 678 { | 678 { |
| 679 if (!possiblyHasMarkers(markerTypes)) | 679 if (!possiblyHasMarkers(markerTypes)) |
| 680 return false; | 680 return false; |
| 681 ASSERT(!m_markers.isEmpty()); | 681 ASSERT(!m_markers.isEmpty()); |
| 682 | 682 |
| 683 Node* startContainer = range->startContainer(); | 683 Node* startContainer = range->startContainer(); |
| 684 ASSERT(startContainer); | 684 ASSERT(startContainer); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 727 | 727 |
| 728 } // namespace WebCore | 728 } // namespace WebCore |
| 729 | 729 |
| 730 #ifndef NDEBUG | 730 #ifndef NDEBUG |
| 731 void showDocumentMarkers(const WebCore::DocumentMarkerController* controller) | 731 void showDocumentMarkers(const WebCore::DocumentMarkerController* controller) |
| 732 { | 732 { |
| 733 if (controller) | 733 if (controller) |
| 734 controller->showMarkers(); | 734 controller->showMarkers(); |
| 735 } | 735 } |
| 736 #endif | 736 #endif |
| OLD | NEW |