1/*
2 * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#pragma once
27
28#include "CompositeEditCommand.h"
29
30namespace WebCore {
31
32// ModifySelectionListLevelCommand provides functions useful for both increasing and decreasing the list level.
33// It is the base class of IncreaseSelectionListLevelCommand and DecreaseSelectionListLevelCommand.
34// It is not used on its own.
35class ModifySelectionListLevelCommand : public CompositeEditCommand {
36protected:
37 explicit ModifySelectionListLevelCommand(Document&);
38
39 void appendSiblingNodeRange(Node* startNode, Node* endNode, Element* newParent);
40 void insertSiblingNodeRangeBefore(Node* startNode, Node* endNode, Node* refNode);
41 void insertSiblingNodeRangeAfter(Node* startNode, Node* endNode, Node* refNode);
42
43private:
44 bool preservesTypingStyle() const override;
45};
46
47// IncreaseSelectionListLevelCommand moves the selected list items one level deeper.
48class IncreaseSelectionListLevelCommand : public ModifySelectionListLevelCommand {
49public:
50 enum class Type : uint8_t { InheritedListType, OrderedList, UnorderedList };
51 static Ref<IncreaseSelectionListLevelCommand> create(Document& document, Type type)
52 {
53 return adoptRef(*new IncreaseSelectionListLevelCommand(document, type));
54 }
55
56 static bool canIncreaseSelectionListLevel(Document*);
57 static RefPtr<Node> increaseSelectionListLevel(Document*);
58 static RefPtr<Node> increaseSelectionListLevelOrdered(Document*);
59 static RefPtr<Node> increaseSelectionListLevelUnordered(Document*);
60
61private:
62 static RefPtr<Node> increaseSelectionListLevel(Document*, Type);
63
64 IncreaseSelectionListLevelCommand(Document&, Type);
65
66 void doApply() override;
67
68 Type m_listType;
69 RefPtr<Node> m_listElement;
70};
71
72// DecreaseSelectionListLevelCommand moves the selected list items one level shallower.
73class DecreaseSelectionListLevelCommand : public ModifySelectionListLevelCommand {
74public:
75 static bool canDecreaseSelectionListLevel(Document*);
76 static void decreaseSelectionListLevel(Document*);
77
78private:
79 static Ref<DecreaseSelectionListLevelCommand> create(Document& document)
80 {
81 return adoptRef(*new DecreaseSelectionListLevelCommand(document));
82 }
83
84 explicit DecreaseSelectionListLevelCommand(Document&);
85
86 void doApply() override;
87};
88
89} // namespace WebCore
90