diff options
-rw-r--r-- | configmgr/source/inc/treeactions.hxx | 35 | ||||
-rw-r--r-- | configmgr/source/inc/valuenode.hxx | 12 | ||||
-rw-r--r-- | configmgr/source/tree/treeactions.cxx | 72 |
3 files changed, 113 insertions, 6 deletions
diff --git a/configmgr/source/inc/treeactions.hxx b/configmgr/source/inc/treeactions.hxx index cfcdad143fd2..850412b9dae8 100644 --- a/configmgr/source/inc/treeactions.hxx +++ b/configmgr/source/inc/treeactions.hxx @@ -2,9 +2,9 @@ * * $RCSfile: treeactions.hxx,v $ * - * $Revision: 1.6 $ + * $Revision: 1.7 $ * - * last change: $Author: dg $ $Date: 2000-11-30 09:01:47 $ + * last change: $Author: jb $ $Date: 2000-12-20 12:14:20 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -75,6 +75,37 @@ namespace configmgr { //.......................................................................... +//========================================================================== +//= OIdPropagator +//========================================================================== +/** propagates a node id to a subtree and its descendants +*/ +class OIdPropagator : private NodeModification +{ + ::rtl::OUString sId; + + OIdPropagator(const ::rtl::OUString& _rId) : sId(_rId) { } + virtual void handle(ValueNode& _rValueNode); + virtual void handle(ISubtree& _rSubtree); + +public: + static void propagateIdToChildren(ISubtree& rTree); + static void propagateIdToTree( ::rtl::OUString const& aId, ISubtree& rTree); +}; + +//========================================================================== +//= OIdRemover +//========================================================================== +/** propagates a node id to a subtree and its descendants +*/ +class OIdRemover : private NodeModification +{ + virtual void handle(ValueNode& _rValueNode); + virtual void handle(ISubtree& _rSubtree); + +public: + static void removeIds(INode& rNode); +}; //========================================================================== //= OChangeActionCounter diff --git a/configmgr/source/inc/valuenode.hxx b/configmgr/source/inc/valuenode.hxx index db518a29a18e..a9f4f6fd737a 100644 --- a/configmgr/source/inc/valuenode.hxx +++ b/configmgr/source/inc/valuenode.hxx @@ -2,9 +2,9 @@ * * $RCSfile: valuenode.hxx,v $ * - * $Revision: 1.6 $ + * $Revision: 1.7 $ * - * last change: $Author: dg $ $Date: 2000-12-01 13:31:52 $ + * last change: $Author: jb $ $Date: 2000-12-20 12:14:20 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -155,6 +155,13 @@ namespace configmgr protected: ISubtree():m_nLevel(0){} + ISubtree(ISubtree const& other) + :INode(other) + ,m_nLevel(other.m_nLevel) + ,m_sTemplateName(other.m_sTemplateName) + ,m_sId() // do not copy ID while cloning ! + {} + public: // subtree does current not support attributes in the right way // ISubtree(const configuration::Attributes& _rAttrs) : INode(_rAttrs), m_nLevel(0) {} @@ -164,6 +171,7 @@ namespace configmgr ,m_nLevel(0) ,m_sTemplateName(_rTemplate){} + bool hasId() const { return m_sId.getLength() != 0; } ::rtl::OUString getId() const { return m_sId; } void setId(const ::rtl::OUString& _rId) { m_sId = _rId; } diff --git a/configmgr/source/tree/treeactions.cxx b/configmgr/source/tree/treeactions.cxx index f526c49af3b0..4cec88e0f8b6 100644 --- a/configmgr/source/tree/treeactions.cxx +++ b/configmgr/source/tree/treeactions.cxx @@ -2,9 +2,9 @@ * * $RCSfile: treeactions.cxx,v $ * - * $Revision: 1.3 $ + * $Revision: 1.4 $ * - * last change: $Author: dg $ $Date: 2000-11-30 08:31:49 $ + * last change: $Author: jb $ $Date: 2000-12-20 12:14:21 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -74,6 +74,64 @@ namespace configmgr { //========================================================================== +//= OIdPropagator +//========================================================================== + +void OIdPropagator::propagateIdToChildren(ISubtree& rTree) +{ + if (rTree.hasId()) + { + OIdPropagator aAction(rTree.getId()); + aAction.applyToChildren(rTree); + } +} +//-------------------------------------------------------------------------- + +void OIdPropagator::propagateIdToTree(OUString const& aId, ISubtree& rTree) +{ + OSL_ENSURE(!rTree.hasId(), "OIdPropagator::propagateIdToTree: Tree already has an Id, propagating may not work"); + rTree.setId(aId); + propagateIdToChildren(rTree); +} +//-------------------------------------------------------------------------- + +void OIdPropagator::handle(ValueNode& _rValueNode) +{ /* not interested in value nodes */ } +//-------------------------------------------------------------------------- + +void OIdPropagator::handle(ISubtree& _rSubtree) +{ + if (!_rSubtree.hasId()) + { + _rSubtree.setId(sId); + applyToChildren(_rSubtree); + } +} + +//========================================================================== +//= OIdRemover +//========================================================================== + +void OIdRemover::removeIds(INode& rNode) +{ + OIdRemover().applyToNode(rNode); +} +//-------------------------------------------------------------------------- + +void OIdRemover::handle(ValueNode& _rValueNode) +{ /* not interested in value nodes */ } +//-------------------------------------------------------------------------- + +void OIdRemover::handle(ISubtree& _rSubtree) +{ + if (_rSubtree.hasId()) + { + _rSubtree.setId(OUString()); + applyToChildren(_rSubtree); + } +} + +//========================================================================== //= OChangeActionCounter //========================================================================== @@ -355,11 +413,17 @@ void OCreateSubtreeAction::handle(AddNode& _rChange) if (aOldNode.get() == NULL) aLog.push_back(OString("TreeUpdate: can't recover node being replaced (for AddNode)")); #endif + if (aOldNode.get() != NULL) + { + OIdRemover::removeIds(*aOldNode); + } aAddNode.takeReplacedNode( aOldNode ); } m_pCurrentSubtree->addChild(aAddNode.releaseAddedNode()); + + OIdPropagator::propagateIdToChildren(*m_pCurrentSubtree); } #ifdef DBUG else @@ -376,6 +440,10 @@ void OCreateSubtreeAction::handle(AddNode& _rChange) std::auto_ptr<INode> aOldNode = m_pCurrentSubtree->removeChild(aRemoveNode.getNodeName()); sal_Bool bOk = (NULL != aOldNode.get()); + if (bOk) + { + OIdRemover::removeIds(*aOldNode); + } aRemoveNode.takeRemovedNode( aOldNode ); #ifdef DBUG |