1 /**
2 * Convenience base class for XML::NodeObservers that need to extract data
3 * from an XMLNodeTracker and queue up added or removed nodes for later
4 * processing
5 *
6 * Authors:
7 * David Yip <yipdw@rose-hulman.edu>
8 *
9 * Copyright (c) 2005 Authors
10 *
11 * Released under GNU GPL, read the file 'COPYING' for more information
12 */
14 #ifndef __WHITEBOARD_NODE_TRACKER_OBSERVER_H__
15 #define __WHITEBOARD_NODE_TRACKER_OBSERVER_H__
17 #include "xml/node-observer.h"
19 #include "jabber_whiteboard/node-tracker-event-tracker.h"
20 #include "jabber_whiteboard/node-tracker.h"
21 #include "jabber_whiteboard/typedefs.h"
23 namespace Inkscape {
25 namespace XML {
27 class Node;
29 }
31 namespace Whiteboard {
33 class NodeTrackerObserver : public XML::NodeObserver {
34 public:
35 NodeTrackerObserver(XMLNodeTracker* xnt) : _xnt(xnt) { }
36 virtual ~NodeTrackerObserver() { }
38 // just reinforce the fact that we don't implement any of the
39 // notification methods here
40 virtual void notifyChildAdded(XML::Node &node, XML::Node &child, XML::Node *prev)=0;
42 virtual void notifyChildRemoved(XML::Node &node, XML::Node &child, XML::Node *prev)=0;
44 virtual void notifyChildOrderChanged(XML::Node &node, XML::Node &child,
45 XML::Node *old_prev, XML::Node *new_prev)=0;
47 virtual void notifyContentChanged(XML::Node &node,
48 Util::ptr_shared<char> old_content,
49 Util::ptr_shared<char> new_content)=0;
51 virtual void notifyAttributeChanged(XML::Node &node, GQuark name,
52 Util::ptr_shared<char> old_value,
53 Util::ptr_shared<char> new_value)=0;
56 // ...but we do provide node tracking facilities
57 KeyToNodeActionList& getNodeTrackerActions()
58 {
59 return this->newnodes;
60 }
62 KeyToNodeActionList getNodeTrackerActionsCopy()
63 {
64 return this->newnodes;
65 }
67 void clearNodeBuffers()
68 {
69 this->newnodes.clear();
70 this->newkeys.clear();
71 this->actions.clear();
72 }
74 protected:
75 std::string _findOrGenerateNodeID(XML::Node& node)
76 {
77 NodeToKeyMap::iterator i = newkeys.find(&node);
78 if (i != newkeys.end()) {
79 // g_log(NULL, G_LOG_LEVEL_DEBUG, "Found key for %p (local): %s", &node, i->second.c_str());
80 return i->second;
81 } else {
82 std::string nodeid = this->_xnt->get(node);
83 if (nodeid.empty()) {
84 // g_log(NULL, G_LOG_LEVEL_DEBUG, "Generating key for %p", &node);
85 return this->_xnt->generateKey();
86 } else {
87 // g_log(NULL, G_LOG_LEVEL_DEBUG, "Found key for %p (tracker): %s", &node, nodeid.c_str());
88 return nodeid;
89 }
90 }
91 }
93 KeyToNodeActionList newnodes;
94 NodeTrackerEventTracker actions;
95 NodeToKeyMap newkeys;
96 XMLNodeTracker* _xnt;
98 private:
99 // noncopyable, nonassignable
100 NodeTrackerObserver(NodeTrackerObserver const& other);
101 NodeTrackerObserver& operator=(NodeTrackerObserver const& other);
103 };
105 }
107 }
108 #endif
110 /*
111 Local Variables:
112 mode:c++
113 c-file-style:"stroustrup"
114 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
115 indent-tabs-mode:nil
116 fill-column:99
117 End:
118 */
119 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :