OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2005 Apple Computer, Inc. All rights reserved. | 2 * Copyright (C) 2005 Apple Computer, Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 DeleteSelectionCommand::DeleteSelectionCommand(Document& document, bool smartDel
ete, bool mergeBlocksAfterDelete, bool expandForSpecialElements, bool sanitizeMa
rkup) | 69 DeleteSelectionCommand::DeleteSelectionCommand(Document& document, bool smartDel
ete, bool mergeBlocksAfterDelete, bool expandForSpecialElements, bool sanitizeMa
rkup) |
70 : CompositeEditCommand(document) | 70 : CompositeEditCommand(document) |
71 , m_hasSelectionToDelete(false) | 71 , m_hasSelectionToDelete(false) |
72 , m_smartDelete(smartDelete) | 72 , m_smartDelete(smartDelete) |
73 , m_mergeBlocksAfterDelete(mergeBlocksAfterDelete) | 73 , m_mergeBlocksAfterDelete(mergeBlocksAfterDelete) |
74 , m_needPlaceholder(false) | 74 , m_needPlaceholder(false) |
75 , m_expandForSpecialElements(expandForSpecialElements) | 75 , m_expandForSpecialElements(expandForSpecialElements) |
76 , m_pruneStartBlockIfNecessary(false) | 76 , m_pruneStartBlockIfNecessary(false) |
77 , m_startsAtEmptyLine(false) | 77 , m_startsAtEmptyLine(false) |
78 , m_sanitizeMarkup(sanitizeMarkup) | 78 , m_sanitizeMarkup(sanitizeMarkup) |
79 , m_startBlock(0) | 79 , m_startBlock(nullptr) |
80 , m_endBlock(0) | 80 , m_endBlock(nullptr) |
81 , m_typingStyle(0) | 81 , m_typingStyle(nullptr) |
82 , m_deleteIntoBlockquoteStyle(0) | 82 , m_deleteIntoBlockquoteStyle(nullptr) |
83 { | 83 { |
84 } | 84 } |
85 | 85 |
86 DeleteSelectionCommand::DeleteSelectionCommand(const VisibleSelection& selection
, bool smartDelete, bool mergeBlocksAfterDelete, bool expandForSpecialElements,
bool sanitizeMarkup) | 86 DeleteSelectionCommand::DeleteSelectionCommand(const VisibleSelection& selection
, bool smartDelete, bool mergeBlocksAfterDelete, bool expandForSpecialElements,
bool sanitizeMarkup) |
87 : CompositeEditCommand(*selection.start().document()) | 87 : CompositeEditCommand(*selection.start().document()) |
88 , m_hasSelectionToDelete(true) | 88 , m_hasSelectionToDelete(true) |
89 , m_smartDelete(smartDelete) | 89 , m_smartDelete(smartDelete) |
90 , m_mergeBlocksAfterDelete(mergeBlocksAfterDelete) | 90 , m_mergeBlocksAfterDelete(mergeBlocksAfterDelete) |
91 , m_needPlaceholder(false) | 91 , m_needPlaceholder(false) |
92 , m_expandForSpecialElements(expandForSpecialElements) | 92 , m_expandForSpecialElements(expandForSpecialElements) |
93 , m_pruneStartBlockIfNecessary(false) | 93 , m_pruneStartBlockIfNecessary(false) |
94 , m_startsAtEmptyLine(false) | 94 , m_startsAtEmptyLine(false) |
95 , m_sanitizeMarkup(sanitizeMarkup) | 95 , m_sanitizeMarkup(sanitizeMarkup) |
96 , m_selectionToDelete(selection) | 96 , m_selectionToDelete(selection) |
97 , m_startBlock(0) | 97 , m_startBlock(nullptr) |
98 , m_endBlock(0) | 98 , m_endBlock(nullptr) |
99 , m_typingStyle(0) | 99 , m_typingStyle(nullptr) |
100 , m_deleteIntoBlockquoteStyle(0) | 100 , m_deleteIntoBlockquoteStyle(nullptr) |
101 { | 101 { |
102 } | 102 } |
103 | 103 |
104 void DeleteSelectionCommand::initializeStartEnd(Position& start, Position& end) | 104 void DeleteSelectionCommand::initializeStartEnd(Position& start, Position& end) |
105 { | 105 { |
106 Node* startSpecialContainer = 0; | 106 Node* startSpecialContainer = 0; |
107 Node* endSpecialContainer = 0; | 107 Node* endSpecialContainer = 0; |
108 | 108 |
109 start = m_selectionToDelete.start(); | 109 start = m_selectionToDelete.start(); |
110 end = m_selectionToDelete.end(); | 110 end = m_selectionToDelete.end(); |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
290 | 290 |
291 // Figure out the typing style in effect before the delete is done. | 291 // Figure out the typing style in effect before the delete is done. |
292 m_typingStyle = EditingStyle::create(m_selectionToDelete.start(), EditingSty
le::EditingPropertiesInEffect); | 292 m_typingStyle = EditingStyle::create(m_selectionToDelete.start(), EditingSty
le::EditingPropertiesInEffect); |
293 m_typingStyle->removeStyleAddedByNode(enclosingAnchorElement(m_selectionToDe
lete.start())); | 293 m_typingStyle->removeStyleAddedByNode(enclosingAnchorElement(m_selectionToDe
lete.start())); |
294 | 294 |
295 // If we're deleting into a Mail blockquote, save the style at end() instead
of start() | 295 // If we're deleting into a Mail blockquote, save the style at end() instead
of start() |
296 // We'll use this later in computeTypingStyleAfterDelete if we end up outsid
e of a Mail blockquote | 296 // We'll use this later in computeTypingStyleAfterDelete if we end up outsid
e of a Mail blockquote |
297 if (enclosingNodeOfType(m_selectionToDelete.start(), isMailBlockquote)) | 297 if (enclosingNodeOfType(m_selectionToDelete.start(), isMailBlockquote)) |
298 m_deleteIntoBlockquoteStyle = EditingStyle::create(m_selectionToDelete.e
nd()); | 298 m_deleteIntoBlockquoteStyle = EditingStyle::create(m_selectionToDelete.e
nd()); |
299 else | 299 else |
300 m_deleteIntoBlockquoteStyle = 0; | 300 m_deleteIntoBlockquoteStyle = nullptr; |
301 } | 301 } |
302 | 302 |
303 bool DeleteSelectionCommand::handleSpecialCaseBRDelete() | 303 bool DeleteSelectionCommand::handleSpecialCaseBRDelete() |
304 { | 304 { |
305 Node* nodeAfterUpstreamStart = m_upstreamStart.computeNodeAfterPosition(); | 305 Node* nodeAfterUpstreamStart = m_upstreamStart.computeNodeAfterPosition(); |
306 Node* nodeAfterDownstreamStart = m_downstreamStart.computeNodeAfterPosition(
); | 306 Node* nodeAfterDownstreamStart = m_downstreamStart.computeNodeAfterPosition(
); |
307 // Upstream end will appear before BR due to canonicalization | 307 // Upstream end will appear before BR due to canonicalization |
308 Node* nodeAfterUpstreamEnd = m_upstreamEnd.computeNodeAfterPosition(); | 308 Node* nodeAfterUpstreamEnd = m_upstreamEnd.computeNodeAfterPosition(); |
309 | 309 |
310 if (!nodeAfterUpstreamStart || !nodeAfterDownstreamStart) | 310 if (!nodeAfterUpstreamStart || !nodeAfterDownstreamStart) |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
505 } | 505 } |
506 } else if (startNode == m_upstreamEnd.deprecatedNode() && startNode->isT
extNode()) { | 506 } else if (startNode == m_upstreamEnd.deprecatedNode() && startNode->isT
extNode()) { |
507 Text* text = toText(m_upstreamEnd.deprecatedNode()); | 507 Text* text = toText(m_upstreamEnd.deprecatedNode()); |
508 deleteTextFromNode(text, 0, m_upstreamEnd.deprecatedEditingOffset())
; | 508 deleteTextFromNode(text, 0, m_upstreamEnd.deprecatedEditingOffset())
; |
509 } | 509 } |
510 | 510 |
511 // handle deleting all nodes that are completely selected | 511 // handle deleting all nodes that are completely selected |
512 while (node && node != m_downstreamEnd.deprecatedNode()) { | 512 while (node && node != m_downstreamEnd.deprecatedNode()) { |
513 if (comparePositions(firstPositionInOrBeforeNode(node.get()), m_down
streamEnd) >= 0) { | 513 if (comparePositions(firstPositionInOrBeforeNode(node.get()), m_down
streamEnd) >= 0) { |
514 // NodeTraversal::nextSkippingChildren just blew past the end po
sition, so stop deleting | 514 // NodeTraversal::nextSkippingChildren just blew past the end po
sition, so stop deleting |
515 node = 0; | 515 node = nullptr; |
516 } else if (!m_downstreamEnd.deprecatedNode()->isDescendantOf(node.ge
t())) { | 516 } else if (!m_downstreamEnd.deprecatedNode()->isDescendantOf(node.ge
t())) { |
517 RefPtr<Node> nextNode = NodeTraversal::nextSkippingChildren(*nod
e); | 517 RefPtr<Node> nextNode = NodeTraversal::nextSkippingChildren(*nod
e); |
518 // if we just removed a node from the end container, update end
position so the | 518 // if we just removed a node from the end container, update end
position so the |
519 // check above will work | 519 // check above will work |
520 updatePositionForNodeRemoval(m_downstreamEnd, node.get()); | 520 updatePositionForNodeRemoval(m_downstreamEnd, node.get()); |
521 removeNode(node.get()); | 521 removeNode(node.get()); |
522 node = nextNode.get(); | 522 node = nextNode.get(); |
523 } else { | 523 } else { |
524 Node& n = node->lastDescendant(); | 524 Node& n = node->lastDescendant(); |
525 if (m_downstreamEnd.deprecatedNode() == n && m_downstreamEnd.dep
recatedEditingOffset() >= caretMaxOffset(&n)) { | 525 if (m_downstreamEnd.deprecatedNode() == n && m_downstreamEnd.dep
recatedEditingOffset() >= caretMaxOffset(&n)) { |
526 removeNode(node.get()); | 526 removeNode(node.get()); |
527 node = 0; | 527 node = nullptr; |
528 } else { | 528 } else { |
529 node = NodeTraversal::next(*node); | 529 node = NodeTraversal::next(*node); |
530 } | 530 } |
531 } | 531 } |
532 } | 532 } |
533 | 533 |
534 if (m_downstreamEnd.deprecatedNode() != startNode && !m_upstreamStart.de
precatedNode()->isDescendantOf(m_downstreamEnd.deprecatedNode()) && m_downstream
End.inDocument() && m_downstreamEnd.deprecatedEditingOffset() >= caretMinOffset(
m_downstreamEnd.deprecatedNode())) { | 534 if (m_downstreamEnd.deprecatedNode() != startNode && !m_upstreamStart.de
precatedNode()->isDescendantOf(m_downstreamEnd.deprecatedNode()) && m_downstream
End.inDocument() && m_downstreamEnd.deprecatedEditingOffset() >= caretMinOffset(
m_downstreamEnd.deprecatedNode())) { |
535 if (m_downstreamEnd.atLastEditingPositionForNode() && !canHaveChildr
enForEditing(m_downstreamEnd.deprecatedNode())) { | 535 if (m_downstreamEnd.atLastEditingPositionForNode() && !canHaveChildr
enForEditing(m_downstreamEnd.deprecatedNode())) { |
536 // The node itself is fully selected, not just its contents. De
lete it. | 536 // The node itself is fully selected, not just its contents. De
lete it. |
537 removeNode(m_downstreamEnd.deprecatedNode()); | 537 removeNode(m_downstreamEnd.deprecatedNode()); |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
721 | 721 |
722 // Compute the difference between the style before the delete and the style
now | 722 // Compute the difference between the style before the delete and the style
now |
723 // after the delete has been done. Set this style on the frame, so other edi
ting | 723 // after the delete has been done. Set this style on the frame, so other edi
ting |
724 // commands being composed with this one will work, and also cache it on the
command, | 724 // commands being composed with this one will work, and also cache it on the
command, |
725 // so the Frame::appliedEditing can set it after the whole composite command | 725 // so the Frame::appliedEditing can set it after the whole composite command |
726 // has completed. | 726 // has completed. |
727 | 727 |
728 // If we deleted into a blockquote, but are now no longer in a blockquote, u
se the alternate typing style | 728 // If we deleted into a blockquote, but are now no longer in a blockquote, u
se the alternate typing style |
729 if (m_deleteIntoBlockquoteStyle && !enclosingNodeOfType(m_endingPosition, is
MailBlockquote, CanCrossEditingBoundary)) | 729 if (m_deleteIntoBlockquoteStyle && !enclosingNodeOfType(m_endingPosition, is
MailBlockquote, CanCrossEditingBoundary)) |
730 m_typingStyle = m_deleteIntoBlockquoteStyle; | 730 m_typingStyle = m_deleteIntoBlockquoteStyle; |
731 m_deleteIntoBlockquoteStyle = 0; | 731 m_deleteIntoBlockquoteStyle = nullptr; |
732 | 732 |
733 m_typingStyle->prepareToApplyAt(m_endingPosition); | 733 m_typingStyle->prepareToApplyAt(m_endingPosition); |
734 if (m_typingStyle->isEmpty()) | 734 if (m_typingStyle->isEmpty()) |
735 m_typingStyle = 0; | 735 m_typingStyle = nullptr; |
736 // This is where we've deleted all traces of a style but not a whole paragra
ph (that's handled above). | 736 // This is where we've deleted all traces of a style but not a whole paragra
ph (that's handled above). |
737 // In this case if we start typing, the new characters should have the same
style as the just deleted ones, | 737 // In this case if we start typing, the new characters should have the same
style as the just deleted ones, |
738 // but, if we change the selection, come back and start typing that style sh
ould be lost. Also see | 738 // but, if we change the selection, come back and start typing that style sh
ould be lost. Also see |
739 // preserveTypingStyle() below. | 739 // preserveTypingStyle() below. |
740 document().frame()->selection().setTypingStyle(m_typingStyle); | 740 document().frame()->selection().setTypingStyle(m_typingStyle); |
741 } | 741 } |
742 | 742 |
743 void DeleteSelectionCommand::clearTransientState() | 743 void DeleteSelectionCommand::clearTransientState() |
744 { | 744 { |
745 m_selectionToDelete = VisibleSelection(); | 745 m_selectionToDelete = VisibleSelection(); |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
862 | 862 |
863 // Normally deletion doesn't preserve the typing style that was present before i
t. For example, | 863 // Normally deletion doesn't preserve the typing style that was present before i
t. For example, |
864 // type a character, Bold, then delete the character and start typing. The Bold
typing style shouldn't | 864 // type a character, Bold, then delete the character and start typing. The Bold
typing style shouldn't |
865 // stick around. Deletion should preserve a typing style that *it* sets, howeve
r. | 865 // stick around. Deletion should preserve a typing style that *it* sets, howeve
r. |
866 bool DeleteSelectionCommand::preservesTypingStyle() const | 866 bool DeleteSelectionCommand::preservesTypingStyle() const |
867 { | 867 { |
868 return m_typingStyle; | 868 return m_typingStyle; |
869 } | 869 } |
870 | 870 |
871 } // namespace WebCore | 871 } // namespace WebCore |
OLD | NEW |