summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMenTaLguY <mental@rydia.net>2007-07-04 23:27:58 +0000
committermental <mental@users.sourceforge.net>2007-07-04 23:27:58 +0000
commit270f8f25ff737fe755e87c057e93bdb9d840faa8 (patch)
treebcd33fdb34b2e5ad0ede9aa2b1f7400d252f54e1 /src
parentFirst stab at a connection UI from Nick (diff)
downloadinkscape-270f8f25ff737fe755e87c057e93bdb9d840faa8.tar.gz
inkscape-270f8f25ff737fe755e87c057e93bdb9d840faa8.zip
make subtree monitoring part of XML::Node's interface
(bzr r3186)
Diffstat (limited to 'src')
-rw-r--r--src/xml/node.h4
-rw-r--r--src/xml/simple-node.cpp14
-rw-r--r--src/xml/simple-node.h11
-rw-r--r--src/xml/subtree.cpp56
-rw-r--r--src/xml/subtree.h19
5 files changed, 41 insertions, 63 deletions
diff --git a/src/xml/node.h b/src/xml/node.h
index 0b22b169e..997f3ccda 100644
--- a/src/xml/node.h
+++ b/src/xml/node.h
@@ -97,10 +97,14 @@ public:
virtual void removeObserver(NodeObserver &observer)=0;
virtual void removeListenerByData(void *data)=0;
+ virtual void addSubtreeObserver(NodeObserver &observer)=0;
+ virtual void removeSubtreeObserver(NodeObserver &observer)=0;
+
protected:
Node(Node const &) : Anchored() {}
public: // ideally these should be protected too somehow...
+ virtual NodeObserver &_subtreeObservers()=0;
virtual void _setParent(Node *parent)=0;
virtual void _setNext(Node *next)=0;
virtual void _bindDocument(Document &document)=0;
diff --git a/src/xml/simple-node.cpp b/src/xml/simple-node.cpp
index c8b0828c4..554752941 100644
--- a/src/xml/simple-node.cpp
+++ b/src/xml/simple-node.cpp
@@ -165,6 +165,8 @@ SimpleNode::SimpleNode(int code)
this->_document = NULL;
this->_parent = this->_next = NULL;
this->_first_child = this->_last_child = NULL;
+
+ _observers.add(_subtree_observers);
}
SimpleNode::SimpleNode(SimpleNode const &node)
@@ -199,6 +201,8 @@ SimpleNode::SimpleNode(SimpleNode const &node)
{
_attributes = cons(*iter, _attributes);
}
+
+ _observers.add(_subtree_observers);
}
gchar const *SimpleNode::name() const {
@@ -267,6 +271,16 @@ bool SimpleNode::matchAttributeName(gchar const *partial_name) const {
return false;
}
+void SimpleNode::_setParent(Node *parent) {
+ if (_parent) {
+ _subtree_observers.remove(_parent->_subtreeObservers());
+ }
+ _parent = parent;
+ if (parent) {
+ _subtree_observers.add(parent->_subtreeObservers());
+ }
+}
+
void SimpleNode::setContent(gchar const *content) {
ptr_shared<char> old_content=_content;
ptr_shared<char> new_content = ( content ? share_string(content) : ptr_shared<char>() );
diff --git a/src/xml/simple-node.h b/src/xml/simple-node.h
index c843dadc5..b4439e289 100644
--- a/src/xml/simple-node.h
+++ b/src/xml/simple-node.h
@@ -103,6 +103,13 @@ public:
_observers.remove(observer);
}
+ void addSubtreeObserver(NodeObserver &observer) {
+ _subtree_observers.add(observer);
+ }
+ void removeSubtreeObserver(NodeObserver &observer) {
+ _subtree_observers.remove(observer);
+ }
+
protected:
SimpleNode(int code);
SimpleNode(SimpleNode const &repr);
@@ -110,7 +117,8 @@ protected:
virtual SimpleNode *_duplicate(Document *doc) const=0;
public: // ideally these should be protected somehow...
- void _setParent(Node *parent) { _parent = parent; }
+ NodeObserver &_subtreeObservers() { return _subtree_observers; }
+ void _setParent(Node *parent);
void _setNext(Node *next) { _next = next; }
void _bindDocument(Document &document);
@@ -140,6 +148,7 @@ private:
Node *_last_child;
CompositeNodeObserver _observers;
+ CompositeNodeObserver _subtree_observers;
};
}
diff --git a/src/xml/subtree.cpp b/src/xml/subtree.cpp
index f19bf055a..c608efd64 100644
--- a/src/xml/subtree.cpp
+++ b/src/xml/subtree.cpp
@@ -19,29 +19,27 @@
namespace Inkscape {
namespace XML {
-namespace {
-
-void recursively(void (Node::*m)(NodeObserver &observer),
- Node &node, NodeObserver &observer)
-{
- (node.*m)(observer);
- for ( NodeSiblingIterator iter = node.firstChild() ; iter ; ++iter ) {
- recursively(m, *iter, observer);
- }
+Subtree::Subtree(Node &root) : _root(root) {
+ _root.addSubtreeObserver(_observers);
}
+Subtree::~Subtree() {
+ _root.removeSubtreeObserver(_observers);
}
-Subtree::Subtree(Node &root) : _root(root) {
- recursively(&Node::addObserver, _root, *this);
+namespace {
+
+void synthesize_events_recursive(Node &node, NodeObserver &observer) {
+ node.synthesizeEvents(observer);
+ for ( NodeSiblingIterator iter = node.firstChild() ; iter ; ++iter ) {
+ synthesize_events_recursive(*iter, observer);
+ }
}
-Subtree::~Subtree() {
- recursively(&Node::removeObserver, _root, *this);
}
void Subtree::synthesizeEvents(NodeObserver &observer) {
- recursively(&Node::synthesizeEvents, _root, *this);
+ synthesize_events_recursive(_root, observer);
}
void Subtree::addObserver(NodeObserver &observer) {
@@ -52,36 +50,6 @@ void Subtree::removeObserver(NodeObserver &observer) {
_observers.remove(observer);
}
-void Subtree::notifyChildAdded(Node &node, Node &child, Node *prev) {
- recursively(&Node::addObserver, child, *this);
- _observers.notifyChildAdded(node, child, prev);
-}
-
-void Subtree::notifyChildRemoved(Node &node, Node &child, Node *prev) {
- recursively(&Node::removeObserver, child, *this);
- _observers.notifyChildRemoved(node, child, prev);
-}
-
-void Subtree::notifyChildOrderChanged(Node &node, Node &child,
- Node *old_prev, Node *new_prev)
-{
- _observers.notifyChildOrderChanged(node, child, old_prev, new_prev);
-}
-
-void Subtree::notifyContentChanged(Node &node,
- Util::ptr_shared<char> old_content,
- Util::ptr_shared<char> new_content)
-{
- _observers.notifyContentChanged(node, old_content, new_content);
-}
-
-void Subtree::notifyAttributeChanged(Node &node, GQuark name,
- Util::ptr_shared<char> old_value,
- Util::ptr_shared<char> new_value)
-{
- _observers.notifyAttributeChanged(node, name, old_value, new_value);
-}
-
}
}
diff --git a/src/xml/subtree.h b/src/xml/subtree.h
index a70598fca..9e2512e83 100644
--- a/src/xml/subtree.h
+++ b/src/xml/subtree.h
@@ -24,9 +24,7 @@ namespace XML {
class Node;
-class Subtree : public GC::Managed<GC::SCANNED, GC::MANUAL>,
- private NodeObserver
-{
+class Subtree : public GC::Managed<GC::SCANNED, GC::MANUAL> {
public:
Subtree(Node &root);
~Subtree();
@@ -36,21 +34,6 @@ public:
void removeObserver(NodeObserver &observer);
private:
- void notifyChildAdded(Node &node, Node &child, Node *prev);
-
- void notifyChildRemoved(Node &node, Node &child, Node *prev);
-
- void notifyChildOrderChanged(Node &node, Node &child,
- Node *old_prev, Node *new_prev);
-
- void notifyContentChanged(Node &node,
- Util::ptr_shared<char> old_content,
- Util::ptr_shared<char> new_content);
-
- void notifyAttributeChanged(Node &node, GQuark name,
- Util::ptr_shared<char> old_value,
- Util::ptr_shared<char> new_value);
-
Node &_root;
CompositeNodeObserver _observers;
};