Line data Source code
1 : /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* This Source Code Form is subject to the terms of the Mozilla Public
3 : * License, v. 2.0. If a copy of the MPL was not distributed with this
4 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 :
6 : #include "DeleteNodeTransaction.h"
7 : #include "mozilla/EditorBase.h"
8 : #include "mozilla/SelectionState.h" // RangeUpdater
9 : #include "nsDebug.h"
10 : #include "nsError.h"
11 : #include "nsAString.h"
12 :
13 : namespace mozilla {
14 :
15 1 : DeleteNodeTransaction::DeleteNodeTransaction(EditorBase& aEditorBase,
16 : nsINode& aNodeToDelete,
17 1 : RangeUpdater* aRangeUpdater)
18 : : mEditorBase(&aEditorBase)
19 : , mNodeToDelete(&aNodeToDelete)
20 : , mParentNode(aNodeToDelete.GetParentNode())
21 1 : , mRangeUpdater(aRangeUpdater)
22 : {
23 : // XXX We're not sure if this is really necessary.
24 1 : if (!CanDoIt()) {
25 0 : mRangeUpdater = nullptr;
26 : }
27 1 : }
28 :
29 2 : DeleteNodeTransaction::~DeleteNodeTransaction()
30 : {
31 3 : }
32 :
33 0 : NS_IMPL_CYCLE_COLLECTION_INHERITED(DeleteNodeTransaction, EditTransactionBase,
34 : mEditorBase,
35 : mNodeToDelete,
36 : mParentNode,
37 : mRefNode)
38 :
39 5 : NS_IMPL_ADDREF_INHERITED(DeleteNodeTransaction, EditTransactionBase)
40 5 : NS_IMPL_RELEASE_INHERITED(DeleteNodeTransaction, EditTransactionBase)
41 7 : NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(DeleteNodeTransaction)
42 2 : NS_INTERFACE_MAP_END_INHERITING(EditTransactionBase)
43 :
44 : bool
45 3 : DeleteNodeTransaction::CanDoIt() const
46 : {
47 12 : if (NS_WARN_IF(!mNodeToDelete) || NS_WARN_IF(!mEditorBase) ||
48 9 : !mParentNode || !mEditorBase->IsModifiableNode(mParentNode)) {
49 0 : return false;
50 : }
51 3 : return true;
52 : }
53 :
54 : NS_IMETHODIMP
55 1 : DeleteNodeTransaction::DoTransaction()
56 : {
57 1 : if (NS_WARN_IF(!CanDoIt())) {
58 0 : return NS_OK;
59 : }
60 :
61 : // Remember which child mNodeToDelete was (by remembering which child was
62 : // next). Note that mRefNode can be nullptr.
63 1 : mRefNode = mNodeToDelete->GetNextSibling();
64 :
65 : // give range updater a chance. SelAdjDeleteNode() needs to be called
66 : // *before* we do the action, unlike some of the other RangeItem update
67 : // methods.
68 1 : if (mRangeUpdater) {
69 1 : mRangeUpdater->SelAdjDeleteNode(mNodeToDelete);
70 : }
71 :
72 2 : ErrorResult error;
73 1 : mParentNode->RemoveChild(*mNodeToDelete, error);
74 1 : return error.StealNSResult();
75 : }
76 :
77 : NS_IMETHODIMP
78 0 : DeleteNodeTransaction::UndoTransaction()
79 : {
80 0 : if (NS_WARN_IF(!CanDoIt())) {
81 : // This is a legal state, the transaction is a no-op.
82 0 : return NS_OK;
83 : }
84 0 : ErrorResult error;
85 0 : nsCOMPtr<nsIContent> refNode = mRefNode;
86 0 : mParentNode->InsertBefore(*mNodeToDelete, refNode, error);
87 0 : return error.StealNSResult();
88 : }
89 :
90 : NS_IMETHODIMP
91 0 : DeleteNodeTransaction::RedoTransaction()
92 : {
93 0 : if (NS_WARN_IF(!CanDoIt())) {
94 : // This is a legal state, the transaction is a no-op.
95 0 : return NS_OK;
96 : }
97 :
98 0 : if (mRangeUpdater) {
99 0 : mRangeUpdater->SelAdjDeleteNode(mNodeToDelete);
100 : }
101 :
102 0 : ErrorResult error;
103 0 : mParentNode->RemoveChild(*mNodeToDelete, error);
104 0 : return error.StealNSResult();
105 : }
106 :
107 : NS_IMETHODIMP
108 0 : DeleteNodeTransaction::GetTxnDescription(nsAString& aString)
109 : {
110 0 : aString.AssignLiteral("DeleteNodeTransaction");
111 0 : return NS_OK;
112 : }
113 :
114 : } // namespace mozilla
|