Line data Source code
1 : /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* vim: set ts=2 sw=2 et tw=78: */
3 : /* This Source Code Form is subject to the terms of the Mozilla Public
4 : * License, v. 2.0. If a copy of the MPL was not distributed with this
5 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 :
7 : #include "SetTextTransaction.h"
8 :
9 : #include "mozilla/DebugOnly.h" // DebugOnly
10 : #include "mozilla/EditorBase.h" // mEditorBase
11 : #include "mozilla/SelectionState.h" // RangeUpdater
12 : #include "mozilla/dom/Selection.h" // Selection local var
13 : #include "mozilla/dom/Text.h" // mTextNode
14 : #include "nsAString.h" // nsAString parameter
15 : #include "nsDebug.h" // for NS_ASSERTION, etc.
16 : #include "nsError.h" // for NS_OK, etc.
17 : #include "nsQueryObject.h" // for do_QueryObject
18 :
19 : namespace mozilla {
20 :
21 : using namespace dom;
22 :
23 0 : SetTextTransaction::SetTextTransaction(Text& aTextNode,
24 : const nsAString& aStringToSet,
25 : EditorBase& aEditorBase,
26 0 : RangeUpdater* aRangeUpdater)
27 : : mTextNode(&aTextNode)
28 : , mStringToSet(aStringToSet)
29 : , mEditorBase(&aEditorBase)
30 0 : , mRangeUpdater(aRangeUpdater)
31 : {
32 0 : }
33 :
34 0 : SetTextTransaction::~SetTextTransaction()
35 : {
36 0 : }
37 :
38 0 : NS_IMPL_CYCLE_COLLECTION_INHERITED(SetTextTransaction, EditTransactionBase,
39 : mEditorBase,
40 : mTextNode)
41 :
42 0 : NS_IMPL_ADDREF_INHERITED(SetTextTransaction, EditTransactionBase)
43 0 : NS_IMPL_RELEASE_INHERITED(SetTextTransaction, EditTransactionBase)
44 0 : NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(SetTextTransaction)
45 0 : if (aIID.Equals(NS_GET_IID(SetTextTransaction))) {
46 0 : foundInterface = static_cast<nsITransaction*>(this);
47 : } else
48 0 : NS_INTERFACE_MAP_END_INHERITING(EditTransactionBase)
49 :
50 :
51 : NS_IMETHODIMP
52 0 : SetTextTransaction::DoTransaction()
53 : {
54 0 : if (NS_WARN_IF(!mEditorBase) || NS_WARN_IF(!mTextNode)) {
55 0 : return NS_ERROR_NOT_AVAILABLE;
56 : }
57 :
58 0 : nsresult rv = mTextNode->GetData(mPreviousData);
59 0 : if (NS_WARN_IF(NS_FAILED(rv))) {
60 0 : return rv;
61 : }
62 :
63 0 : rv = mTextNode->SetData(mStringToSet);
64 0 : if (NS_WARN_IF(NS_FAILED(rv))) {
65 0 : return rv;
66 : }
67 :
68 : // Only set selection to insertion point if editor gives permission
69 0 : if (mEditorBase->GetShouldTxnSetSelection()) {
70 0 : RefPtr<Selection> selection = mEditorBase->GetSelection();
71 0 : if (NS_WARN_IF(NS_FAILED(rv))) {
72 0 : return NS_ERROR_NULL_POINTER;
73 : }
74 : DebugOnly<nsresult> rv =
75 0 : selection->Collapse(mTextNode, mStringToSet.Length());
76 0 : NS_ASSERTION(NS_SUCCEEDED(rv),
77 : "Selection could not be collapsed after insert");
78 : }
79 0 : mRangeUpdater->SelAdjDeleteText(mTextNode, 0, mPreviousData.Length());
80 0 : mRangeUpdater->SelAdjInsertText(*mTextNode, 0, mStringToSet);
81 :
82 0 : return NS_OK;
83 : }
84 :
85 : NS_IMETHODIMP
86 0 : SetTextTransaction::UndoTransaction()
87 : {
88 0 : return mTextNode->SetData(mPreviousData);
89 : }
90 :
91 : NS_IMETHODIMP
92 0 : SetTextTransaction::Merge(nsITransaction* aTransaction,
93 : bool* aDidMerge)
94 : {
95 : // Set out param default value
96 0 : *aDidMerge = false;
97 :
98 0 : return NS_OK;
99 : }
100 :
101 : NS_IMETHODIMP
102 0 : SetTextTransaction::GetTxnDescription(nsAString& aString)
103 : {
104 0 : aString.AssignLiteral("SetTextTransaction: ");
105 0 : aString += mStringToSet;
106 0 : return NS_OK;
107 : }
108 :
109 : } // namespace mozilla
|