DeleteMultipleRangesTransaction.cpp (4720B)
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 "DeleteMultipleRangesTransaction.h" 7 8 #include "DeleteContentTransactionBase.h" 9 #include "DeleteRangeTransaction.h" 10 #include "EditorBase.h" 11 #include "EditorDOMPoint.h" 12 #include "EditTransactionBase.h" 13 14 #include "nsDebug.h" 15 16 namespace mozilla { 17 18 NS_IMPL_CYCLE_COLLECTION_INHERITED(DeleteMultipleRangesTransaction, 19 EditAggregateTransaction) 20 21 NS_IMPL_ADDREF_INHERITED(DeleteMultipleRangesTransaction, 22 EditAggregateTransaction) 23 NS_IMPL_RELEASE_INHERITED(DeleteMultipleRangesTransaction, 24 EditAggregateTransaction) 25 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(DeleteMultipleRangesTransaction) 26 NS_INTERFACE_MAP_END_INHERITING(EditAggregateTransaction) 27 28 NS_IMETHODIMP DeleteMultipleRangesTransaction::DoTransaction() { 29 MOZ_LOG(GetLogModule(), LogLevel::Info, 30 ("%p DeleteMultipleRangesTransaction::%s this={ mName=%s } " 31 "Start==============================", 32 this, __FUNCTION__, 33 nsAtomCString(mName ? mName.get() : nsGkAtoms::_empty).get())); 34 nsresult rv = EditAggregateTransaction::DoTransaction(); 35 NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), 36 "EditAggregateTransaction::DoTransaction() failed"); 37 38 MOZ_LOG(GetLogModule(), LogLevel::Info, 39 ("%p DeleteMultipleRangesTransaction::%s this={ mName=%s } " 40 "End==============================", 41 this, __FUNCTION__, 42 nsAtomCString(mName ? mName.get() : nsGkAtoms::_empty).get())); 43 return rv; 44 } 45 46 NS_IMETHODIMP DeleteMultipleRangesTransaction::UndoTransaction() { 47 MOZ_LOG(GetLogModule(), LogLevel::Info, 48 ("%p DeleteMultipleRangesTransaction::%s this={ mName=%s } " 49 "Start==============================", 50 this, __FUNCTION__, 51 nsAtomCString(mName ? mName.get() : nsGkAtoms::_empty).get())); 52 53 nsresult rv = EditAggregateTransaction::UndoTransaction(); 54 NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), 55 "EditAggregateTransaction::UndoTransaction() failed"); 56 57 MOZ_LOG(GetLogModule(), LogLevel::Info, 58 ("%p DeleteMultipleRangesTransaction::%s this={ mName=%s } " 59 "End==============================", 60 this, __FUNCTION__, 61 nsAtomCString(mName ? mName.get() : nsGkAtoms::_empty).get())); 62 return rv; 63 } 64 65 NS_IMETHODIMP DeleteMultipleRangesTransaction::RedoTransaction() { 66 MOZ_LOG(GetLogModule(), LogLevel::Info, 67 ("%p DeleteMultipleRangesTransaction::%s this={ mName=%s } " 68 "Start==============================", 69 this, __FUNCTION__, 70 nsAtomCString(mName ? mName.get() : nsGkAtoms::_empty).get())); 71 72 nsresult rv = EditAggregateTransaction::RedoTransaction(); 73 NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), 74 "EditAggregateTransaction::RedoTransaction() failed"); 75 76 MOZ_LOG(GetLogModule(), LogLevel::Info, 77 ("%p DeleteMultipleRangesTransaction::%s this={ mName=%s } " 78 "End==============================", 79 this, __FUNCTION__, 80 nsAtomCString(mName ? mName.get() : nsGkAtoms::_empty).get())); 81 return rv; 82 } 83 84 void DeleteMultipleRangesTransaction::AppendChild( 85 DeleteContentTransactionBase& aTransaction) { 86 mChildren.AppendElement(aTransaction); 87 } 88 89 void DeleteMultipleRangesTransaction::AppendChild( 90 DeleteRangeTransaction& aTransaction) { 91 mChildren.AppendElement(aTransaction); 92 } 93 94 EditorDOMPoint DeleteMultipleRangesTransaction::SuggestPointToPutCaret() const { 95 for (const OwningNonNull<EditTransactionBase>& transaction : 96 Reversed(mChildren)) { 97 if (const DeleteContentTransactionBase* deleteContentTransaction = 98 transaction->GetAsDeleteContentTransactionBase()) { 99 EditorDOMPoint pointToPutCaret = 100 deleteContentTransaction->SuggestPointToPutCaret(); 101 if (pointToPutCaret.IsSet()) { 102 return pointToPutCaret; 103 } 104 continue; 105 } 106 if (const DeleteRangeTransaction* deleteRangeTransaction = 107 transaction->GetAsDeleteRangeTransaction()) { 108 EditorDOMPoint pointToPutCaret = 109 deleteRangeTransaction->SuggestPointToPutCaret(); 110 if (pointToPutCaret.IsSet()) { 111 return pointToPutCaret; 112 } 113 continue; 114 } 115 MOZ_ASSERT_UNREACHABLE( 116 "Child transactions must be DeleteContentTransactionBase or " 117 "DeleteRangeTransaction"); 118 } 119 return EditorDOMPoint(); 120 } 121 122 } // namespace mozilla