diff -r 000000000000 -r 6474c204b198 editor/libeditor/base/ChangeAttributeTxn.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/editor/libeditor/base/ChangeAttributeTxn.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,105 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "ChangeAttributeTxn.h" +#include "nsAString.h" +#include "nsDebug.h" // for NS_ASSERTION +#include "nsError.h" // for NS_ERROR_NOT_INITIALIZED, etc +#include "nsIDOMElement.h" // for nsIDOMElement +#include "nsIEditor.h" // for nsIEditor +#include "nsString.h" // for nsString + +ChangeAttributeTxn::ChangeAttributeTxn() + : EditTxn() +{ +} + +NS_IMPL_CYCLE_COLLECTION_INHERITED(ChangeAttributeTxn, EditTxn, + mElement) + +NS_IMPL_ADDREF_INHERITED(ChangeAttributeTxn, EditTxn) +NS_IMPL_RELEASE_INHERITED(ChangeAttributeTxn, EditTxn) +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(ChangeAttributeTxn) +NS_INTERFACE_MAP_END_INHERITING(EditTxn) + +NS_IMETHODIMP ChangeAttributeTxn::Init(nsIEditor *aEditor, + nsIDOMElement *aElement, + const nsAString& aAttribute, + const nsAString& aValue, + bool aRemoveAttribute) +{ + NS_ASSERTION(aEditor && aElement, "bad arg"); + if (!aEditor || !aElement) { return NS_ERROR_NULL_POINTER; } + + mEditor = aEditor; + mElement = do_QueryInterface(aElement); + mAttribute = aAttribute; + mValue = aValue; + mRemoveAttribute = aRemoveAttribute; + mAttributeWasSet=false; + mUndoValue.Truncate(); + return NS_OK; +} + +NS_IMETHODIMP ChangeAttributeTxn::DoTransaction(void) +{ + NS_ASSERTION(mEditor && mElement, "bad state"); + if (!mEditor || !mElement) { return NS_ERROR_NOT_INITIALIZED; } + + // need to get the current value of the attribute and save it, and set mAttributeWasSet + nsresult result = mEditor->GetAttributeValue(mElement, mAttribute, mUndoValue, &mAttributeWasSet); + // XXX: hack until attribute-was-set code is implemented + if (!mUndoValue.IsEmpty()) + mAttributeWasSet = true; + // XXX: end hack + + // now set the attribute to the new value + if (!mRemoveAttribute) + result = mElement->SetAttribute(mAttribute, mValue); + else + result = mElement->RemoveAttribute(mAttribute); + + return result; +} + +NS_IMETHODIMP ChangeAttributeTxn::UndoTransaction(void) +{ + NS_ASSERTION(mEditor && mElement, "bad state"); + if (!mEditor || !mElement) { return NS_ERROR_NOT_INITIALIZED; } + + nsresult result; + if (mAttributeWasSet) + result = mElement->SetAttribute(mAttribute, mUndoValue); + else + result = mElement->RemoveAttribute(mAttribute); + + return result; +} + +NS_IMETHODIMP ChangeAttributeTxn::RedoTransaction(void) +{ + NS_ASSERTION(mEditor && mElement, "bad state"); + if (!mEditor || !mElement) { return NS_ERROR_NOT_INITIALIZED; } + + nsresult result; + if (!mRemoveAttribute) + result = mElement->SetAttribute(mAttribute, mValue); + else + result = mElement->RemoveAttribute(mAttribute); + + return result; +} + +NS_IMETHODIMP ChangeAttributeTxn::GetTxnDescription(nsAString& aString) +{ + aString.AssignLiteral("ChangeAttributeTxn: [mRemoveAttribute == "); + + if (!mRemoveAttribute) + aString.AppendLiteral("false] "); + else + aString.AppendLiteral("true] "); + aString += mAttribute; + return NS_OK; +}