Index: Source/core/editing/ModifySelectionListLevel.cpp |
diff --git a/Source/core/editing/ModifySelectionListLevel.cpp b/Source/core/editing/ModifySelectionListLevel.cpp |
deleted file mode 100644 |
index e438eb25b4f047c383498c5343dd09778c19da93..0000000000000000000000000000000000000000 |
--- a/Source/core/editing/ModifySelectionListLevel.cpp |
+++ /dev/null |
@@ -1,293 +0,0 @@ |
-/* |
- * Copyright (C) 2006, 2008 Apple Inc. All rights reserved. |
- * |
- * Redistribution and use in source and binary forms, with or without |
- * modification, are permitted provided that the following conditions |
- * are met: |
- * 1. Redistributions of source code must retain the above copyright |
- * notice, this list of conditions and the following disclaimer. |
- * 2. Redistributions in binary form must reproduce the above copyright |
- * notice, this list of conditions and the following disclaimer in the |
- * documentation and/or other materials provided with the distribution. |
- * |
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY |
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR |
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
- */ |
- |
-#include "config.h" |
-#include "core/editing/ModifySelectionListLevel.h" |
- |
-#include "core/dom/Document.h" |
-#include "core/editing/FrameSelection.h" |
-#include "core/editing/htmlediting.h" |
-#include "core/html/HTMLElement.h" |
-#include "core/frame/Frame.h" |
-#include "core/rendering/RenderObject.h" |
- |
-namespace WebCore { |
- |
-ModifySelectionListLevelCommand::ModifySelectionListLevelCommand(Document& document) |
- : CompositeEditCommand(document) |
-{ |
-} |
- |
-bool ModifySelectionListLevelCommand::preservesTypingStyle() const |
-{ |
- return true; |
-} |
- |
-// This needs to be static so it can be called by canIncreaseSelectionListLevel and canDecreaseSelectionListLevel |
-static bool getStartEndListChildren(const VisibleSelection& selection, Node*& start, Node*& end) |
-{ |
- if (selection.isNone()) |
- return false; |
- |
- // start must be in a list child |
- Node* startListChild = enclosingListChild(selection.start().anchorNode()); |
- if (!startListChild) |
- return false; |
- |
- // end must be in a list child |
- Node* endListChild = selection.isRange() ? enclosingListChild(selection.end().anchorNode()) : startListChild; |
- if (!endListChild) |
- return false; |
- |
- // For a range selection we want the following behavior: |
- // - the start and end must be within the same overall list |
- // - the start must be at or above the level of the rest of the range |
- // - if the end is anywhere in a sublist lower than start, the whole sublist gets moved |
- // In terms of this function, this means: |
- // - endListChild must start out being be a sibling of startListChild, or be in a |
- // sublist of startListChild or a sibling |
- // - if endListChild is in a sublist of startListChild or a sibling, it must be adjusted |
- // to be the ancestor that is startListChild or its sibling |
- while (startListChild->parentNode() != endListChild->parentNode()) { |
- endListChild = endListChild->parentNode(); |
- if (!endListChild) |
- return false; |
- } |
- |
- // if the selection ends on a list item with a sublist, include the entire sublist |
- if (endListChild->renderer()->isListItem()) { |
- RenderObject* r = endListChild->renderer()->nextSibling(); |
- if (r && isListElement(r->node())) |
- endListChild = r->node(); |
- } |
- |
- start = startListChild; |
- end = endListChild; |
- return true; |
-} |
- |
-void ModifySelectionListLevelCommand::insertSiblingNodeRangeBefore(Node* startNode, Node* endNode, Node* refNode) |
-{ |
- Node* node = startNode; |
- while (1) { |
- Node* next = node->nextSibling(); |
- removeNode(node); |
- insertNodeBefore(node, refNode); |
- |
- if (node == endNode) |
- break; |
- |
- node = next; |
- } |
-} |
- |
-void ModifySelectionListLevelCommand::insertSiblingNodeRangeAfter(Node* startNode, Node* endNode, Node* refNode) |
-{ |
- Node* node = startNode; |
- while (1) { |
- Node* next = node->nextSibling(); |
- removeNode(node); |
- insertNodeAfter(node, refNode); |
- |
- if (node == endNode) |
- break; |
- |
- refNode = node; |
- node = next; |
- } |
-} |
- |
-void ModifySelectionListLevelCommand::appendSiblingNodeRange(Node* startNode, Node* endNode, Element* newParent) |
-{ |
- Node* node = startNode; |
- while (1) { |
- Node* next = node->nextSibling(); |
- removeNode(node); |
- appendNode(node, newParent); |
- |
- if (node == endNode) |
- break; |
- |
- node = next; |
- } |
-} |
- |
-IncreaseSelectionListLevelCommand::IncreaseSelectionListLevelCommand(Document& document, Type listType) |
- : ModifySelectionListLevelCommand(document) |
- , m_listType(listType) |
-{ |
-} |
- |
-// This needs to be static so it can be called by canIncreaseSelectionListLevel |
-static bool canIncreaseListLevel(const VisibleSelection& selection, Node*& start, Node*& end) |
-{ |
- if (!getStartEndListChildren(selection, start, end)) |
- return false; |
- |
- // start must not be the first child (because you need a prior one |
- // to increase relative to) |
- if (!start->renderer()->previousSibling()) |
- return false; |
- |
- return true; |
-} |
- |
-// For the moment, this is SPI and the only client (Mail.app) is satisfied. |
-// Here are two things to re-evaluate when making into API. |
-// 1. Currently, InheritedListType uses clones whereas OrderedList and |
-// UnorderedList create a new list node of the specified type. That is |
-// inconsistent wrt style. If that is not OK, here are some alternatives: |
-// - new nodes always inherit style (probably the best choice) |
-// - new nodes have always have no style |
-// - new nodes of the same type inherit style |
-// 2. Currently, the node we return may be either a pre-existing one or |
-// a new one. Is it confusing to return the pre-existing one without |
-// somehow indicating that it is not new? If so, here are some alternatives: |
-// - only return the list node if we created it |
-// - indicate whether the list node is new or pre-existing |
-// - (silly) client specifies whether to return pre-existing list nodes |
-void IncreaseSelectionListLevelCommand::doApply() |
-{ |
- Node* startListChild; |
- Node* endListChild; |
- if (!canIncreaseListLevel(endingSelection(), startListChild, endListChild)) |
- return; |
- |
- Node* previousItem = startListChild->renderer()->previousSibling()->node(); |
- if (isListElement(previousItem)) { |
- // move nodes up into preceding list |
- appendSiblingNodeRange(startListChild, endListChild, toElement(previousItem)); |
- m_listElement = previousItem; |
- } else { |
- // create a sublist for the preceding element and move nodes there |
- RefPtr<Element> newParent; |
- switch (m_listType) { |
- case InheritedListType: |
- newParent = startListChild->parentElement(); |
- if (newParent) |
- newParent = newParent->cloneElementWithoutChildren(); |
- break; |
- case OrderedList: |
- newParent = createOrderedListElement(document()); |
- break; |
- case UnorderedList: |
- newParent = createUnorderedListElement(document()); |
- break; |
- } |
- insertNodeBefore(newParent, startListChild); |
- appendSiblingNodeRange(startListChild, endListChild, newParent.get()); |
- m_listElement = newParent.release(); |
- } |
-} |
- |
-bool IncreaseSelectionListLevelCommand::canIncreaseSelectionListLevel(Document& document) |
-{ |
- Node* startListChild; |
- Node* endListChild; |
- return canIncreaseListLevel(document.frame()->selection().selection(), startListChild, endListChild); |
-} |
- |
-PassRefPtr<Node> IncreaseSelectionListLevelCommand::increaseSelectionListLevel(Document& document, Type type) |
-{ |
- ASSERT(document.frame()); |
- RefPtr<IncreaseSelectionListLevelCommand> command = create(document, type); |
- command->apply(); |
- return command->m_listElement.release(); |
-} |
- |
-PassRefPtr<Node> IncreaseSelectionListLevelCommand::increaseSelectionListLevel(Document& document) |
-{ |
- return increaseSelectionListLevel(document, InheritedListType); |
-} |
- |
-PassRefPtr<Node> IncreaseSelectionListLevelCommand::increaseSelectionListLevelOrdered(Document& document) |
-{ |
- return increaseSelectionListLevel(document, OrderedList); |
-} |
- |
-PassRefPtr<Node> IncreaseSelectionListLevelCommand::increaseSelectionListLevelUnordered(Document& document) |
-{ |
- return increaseSelectionListLevel(document, UnorderedList); |
-} |
- |
-DecreaseSelectionListLevelCommand::DecreaseSelectionListLevelCommand(Document& document) |
- : ModifySelectionListLevelCommand(document) |
-{ |
-} |
- |
-// This needs to be static so it can be called by canDecreaseSelectionListLevel |
-static bool canDecreaseListLevel(const VisibleSelection& selection, Node*& start, Node*& end) |
-{ |
- if (!getStartEndListChildren(selection, start, end)) |
- return false; |
- |
- // there must be a destination list to move the items to |
- if (!isListElement(start->parentNode()->parentNode())) |
- return false; |
- |
- return true; |
-} |
- |
-void DecreaseSelectionListLevelCommand::doApply() |
-{ |
- Node* startListChild; |
- Node* endListChild; |
- if (!canDecreaseListLevel(endingSelection(), startListChild, endListChild)) |
- return; |
- |
- Node* previousItem = startListChild->renderer()->previousSibling() ? startListChild->renderer()->previousSibling()->node() : 0; |
- Node* nextItem = endListChild->renderer()->nextSibling() ? endListChild->renderer()->nextSibling()->node() : 0; |
- Element* listNode = startListChild->parentElement(); |
- |
- if (!previousItem) { |
- // at start of sublist, move the child(ren) to before the sublist |
- insertSiblingNodeRangeBefore(startListChild, endListChild, listNode); |
- // if that was the whole sublist we moved, remove the sublist node |
- if (!nextItem) |
- removeNode(listNode); |
- } else if (!nextItem) { |
- // at end of list, move the child(ren) to after the sublist |
- insertSiblingNodeRangeAfter(startListChild, endListChild, listNode); |
- } else if (listNode) { |
- // in the middle of list, split the list and move the children to the divide |
- splitElement(listNode, startListChild); |
- insertSiblingNodeRangeBefore(startListChild, endListChild, listNode); |
- } |
-} |
- |
-bool DecreaseSelectionListLevelCommand::canDecreaseSelectionListLevel(Document& document) |
-{ |
- Node* startListChild; |
- Node* endListChild; |
- return canDecreaseListLevel(document.frame()->selection().selection(), startListChild, endListChild); |
-} |
- |
-void DecreaseSelectionListLevelCommand::decreaseSelectionListLevel(Document& document) |
-{ |
- ASSERT(document.frame()); |
- create(document)->apply(); |
-} |
- |
-} |