#ifndef NTX_NODETREE_H #define NTX_NODETREE_H #include #include #include #include namespace ntx { /** * @brief Service-Schicht für Knoten-Operationen mit Undo/Redo. * * Ist selbst ein NtxINode (Composite-Pattern): Kann als Wurzel * eines Teilbaums dienen und in andere NtxNodeTrees eingehängt werden. * * Bietet: * - Command-basierte Baum-Manipulation (add/delete/move) * - Undo/Redo via NtxUndoStack * - Copy/Cut/Paste via NtxClipboard * - Listen-Operationen via NtxMacroCommand */ class NtxNodeTree //: public NtxNode { friend class NtxNodeFactory; public: //~NtxNodeTree() override = default; NtxNodeTree(const NtxNodeTree&) = delete; NtxNodeTree& operator=(const NtxNodeTree&) = delete; NtxNodePtr clone() const;// override; // ========================================================================= // Command-Ausführung // ========================================================================= /// Führt ein beliebiges Command aus (mit Undo-Support). bool execute(NtxCommandUPtr cmd); bool undo(); bool redo(); bool canUndo() const; bool canRedo() const; NtxString undoText() const; NtxString redoText() const; void setClean(); bool isDirty() const; // ========================================================================= // Einzel-Operationen (erzeugen intern Commands) // ========================================================================= bool addNode(NtxNodePtr parent, NtxNodePtr node, size_t index); bool deleteNode(NtxNodePtr node); bool moveNode(NtxNodePtr node, NtxNodePtr newParent, size_t newIndex); // ========================================================================= // Listen-Operationen (erzeugen NtxMacroCommand) // ========================================================================= bool addNodes(NtxNodePtr parent, const NtxNodeList& nodes, size_t index); bool deleteNodes(const NtxNodeList& nodes); // ========================================================================= // Clipboard // ========================================================================= void copyNodes(const NtxNodeList& nodes); void cutNodes(const NtxNodeList& nodes); NtxNodeList pasteNodes(NtxNodePtr parent, size_t index); bool hasClipboard() const; void clearClipboard(); // ========================================================================= // Zugriff auf Interna // ========================================================================= NtxUndoStack& undoStack() { return m_undoStack; } const NtxUndoStack& undoStack() const { return m_undoStack; } private: NtxNodeTree() = default; explicit NtxNodeTree(NtxClassTypeId id); NtxUndoStack m_undoStack; NtxClipboard m_clipboard; bool m_isCutOperation{false}; }; } // namespace ntx #endif // NTX_NODETREE_H