/* -*- 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/. */ #ifndef InsertNodeTransaction_h #define InsertNodeTransaction_h #include "EditTransactionBase.h" // for EditTransactionBase, etc. #include "EditorDOMPoint.h" // for EditorDOMPoint #include "EditorForwards.h" #include "nsCOMPtr.h" // for nsCOMPtr #include "nsCycleCollectionParticipant.h" #include "nsIContent.h" // for nsIContent #include "nsISupportsImpl.h" // for NS_DECL_ISUPPORTS_INHERITED namespace mozilla { class EditorBase; /** * A transaction that inserts a single element */ class InsertNodeTransaction final : public EditTransactionBase { protected: template InsertNodeTransaction(EditorBase& aEditorBase, nsIContent& aContentToInsert, const EditorDOMPointBase& aPointToInsert); public: /** * Create a transaction for inserting aContentToInsert before the child * at aPointToInsert. * * @param aEditorBase The editor which manages the transaction. * @param aContentToInsert The node to be inserted. * @param aPointToInsert The insertion point of aContentToInsert. * If this refers end of the container, the * transaction will append the node to the * container. Otherwise, will insert the node * before child node referred by this. * @return A InsertNodeTranaction which was initialized * with the arguments. */ template static already_AddRefed Create( EditorBase& aEditorBase, nsIContent& aContentToInsert, const EditorDOMPointBase& aPointToInsert); NS_DECL_ISUPPORTS_INHERITED NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(InsertNodeTransaction, EditTransactionBase) NS_DECL_EDITTRANSACTIONBASE NS_DECL_EDITTRANSACTIONBASE_GETASMETHODS_OVERRIDE(InsertNodeTransaction) MOZ_CAN_RUN_SCRIPT NS_IMETHOD RedoTransaction() override; /** * SuggestPointToPutCaret() suggests a point after doing or redoing the * transaction. */ template EditorDOMPointType SuggestPointToPutCaret() const { if (MOZ_UNLIKELY(!mPointToInsert.IsSet() || !mContentToInsert)) { return EditorDOMPointType(); } return EditorDOMPointType::After(mContentToInsert); } friend std::ostream& operator<<(std::ostream& aStream, const InsertNodeTransaction& aTransaction); protected: virtual ~InsertNodeTransaction() = default; // The element to insert. nsCOMPtr mContentToInsert; // The DOM point we will insert mContentToInsert. EditorDOMPoint mPointToInsert; // The editor for this transaction. RefPtr mEditorBase; }; } // namespace mozilla #endif // #ifndef InsertNodeTransaction_h