Code

Connector tool: make connectors avoid the convex hull of shapes.
[inkscape.git] / src / jabber_whiteboard / inkboard-node.cpp
index bcb6cd981af3f522a4f23fb43842cac7b43a5138..4d24cf72a309ebcd2cd2a6eef21dac1cbe0e515e 100644 (file)
 
 #include "util/ucompose.hpp"
 
+#include "pedro/pedrodom.h"
+
+#include "xml/node.h"
+#include "xml/attribute-record.h"
+#include "xml/element-node.h"
+#include "xml/text-node.h"
+
 #include "jabber_whiteboard/message-utilities.h"
 #include "jabber_whiteboard/defines.h"
 #include "jabber_whiteboard/inkboard-document.h"
@@ -26,7 +33,8 @@ namespace Whiteboard {
 Glib::ustring
 InkboardDocument::addNodeToTracker(Inkscape::XML::Node *node)
 {
-    Glib::ustring key = this->tracker->generateKey(this->getRecipient());
+    Glib::ustring rec = this->getRecipient();
+    Glib::ustring key = this->tracker->generateKey(rec);
     this->tracker->put(key,node);
     return key;
 }
@@ -36,7 +44,6 @@ InkboardDocument::composeNewMessage(Inkscape::XML::Node *node)
 {
     Glib::ustring parentKey;
     Glib::ustring key = this->tracker->get(node);
-    Inkscape::XML::Node *parent = node->parent();
 
     Glib::ustring tempParentKey = this->tracker->get(node->parent());
     if(tempParentKey.size() < 1)
@@ -44,30 +51,85 @@ InkboardDocument::composeNewMessage(Inkscape::XML::Node *node)
     else
         parentKey = tempParentKey;
 
-    unsigned int index = parent->_childPosition(*node);
+    unsigned int index = node->position();
 
     Message::Message nodeMessage = MessageUtilities::objectToString(node);
-    Message::Message message = String::ucompose(Vars::NEW_MESSAGE,parentKey,key,index,nodeMessage);
+    Message::Message message = String::ucompose(Vars::NEW_MESSAGE,parentKey,key,index,0,nodeMessage);
 
     return message;
 }
 
 void
-InkboardDocument::changeConfigure(Glib::ustring target, signed int version, 
-        Glib::ustring attribute, Glib::ustring value)
+InkboardDocument::changeConfigureText(Glib::ustring target,
+                                      unsigned int /*version*/,
+                                      Glib::ustring text)
 {
+    XML::Node *node = this->tracker->get(target);
+    //unsigned int elementVersion = this->tracker->getVersion(node);
+
+    if(node)// && version == (elementVersion + 1))
+    {
+        this->tracker->incrementVersion(node);
+        this->tracker->addHistory(node, "text", text);
+        node->setContent(text.c_str());
+    }
+}
+
+void
+InkboardDocument::changeConfigure(Glib::ustring target,
+                                  unsigned int /*version*/, 
+                                  Glib::ustring attribute,
+                                                                 Glib::ustring value)
+{
+    XML::Node *node = this->tracker->get(target);
+    //unsigned int elementVersion = this->tracker->getVersion(node);
+
+    if(node)// && version == (elementVersion + 1))
+    {
+        this->tracker->incrementVersion(node);
+        this->tracker->addHistory(node, attribute, value.c_str());
+
+        if(attribute != "transform")
+            node->setAttribute(attribute.c_str(),value.c_str());
+    }
 }
 
 void 
-InkboardDocument::changeNew(Glib::ustring target, Glib::ustring
-        signed int index, Pedro::Element* data)
+InkboardDocument::changeNew(Glib::ustring parentid, Glib::ustring id
+        signed int /*index*/, Pedro::Element* data)
 {
-    Glib::ustring name = data->getName();
+
+    Glib::ustring name(data->getName());
 
     if(name == "text")
     { 
-        //XML::Node* parent = this->tracker->get(target);
-        //parent->setContent(date->getValue());
+        XML::Node *parent = this->tracker->get(parentid);
+        XML::Node *node = new XML::TextNode(Util::share_string(data->getValue().c_str()), this);
+
+        if(parent && node)
+        {
+            this->tracker->put(id,node);
+            parent->appendChild(node);
+        }
+    }else
+    {
+        XML::Node *node = new XML::ElementNode(g_quark_from_string(name.c_str()), this);
+        this->tracker->put(id,node);
+
+        XML::Node *parent = (parentid != "ROOT") 
+            ? this->tracker->get(parentid.c_str()) : this->root();
+
+        std::vector<Pedro::Attribute> attributes = data->getAttributes();
+
+        for (unsigned int i=0; i<attributes.size(); i++) 
+        {
+            node->setAttribute(
+                (attributes[i].getName()).c_str(),
+                (attributes[i].getValue()).c_str());
+        }
+
+        if(parent != NULL)
+            parent->appendChild(node);
     }
 
 }