summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configmgr/source/inc/treeactions.hxx35
-rw-r--r--configmgr/source/inc/valuenode.hxx12
-rw-r--r--configmgr/source/tree/treeactions.cxx72
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