[dia] DiaRenderScript can load what it saves



commit 958cd048c655624f37e2edb0278dcf10c2e5c04d
Author: Hans Breuer <hans breuer org>
Date:   Sun Jun 28 18:13:41 2009 +0200

    DiaRenderScript can load what it saves

 plug-ins/drs/dia-render-script-import.c |   88 ++++++++++++++++++++++++++++--
 plug-ins/drs/dia-render-script.c        |   31 +++++++++--
 2 files changed, 109 insertions(+), 10 deletions(-)
---
diff --git a/plug-ins/drs/dia-render-script-import.c b/plug-ins/drs/dia-render-script-import.c
index b59fedf..8e93a23 100644
--- a/plug-ins/drs/dia-render-script-import.c
+++ b/plug-ins/drs/dia-render-script-import.c
@@ -26,6 +26,8 @@
 #include "geometry.h"
 #include "color.h"
 #include "diagramdata.h"
+#include "group.h"
+#include "message.h"
 
 #include <libxml/tree.h>
 
@@ -138,6 +140,15 @@ struct _RenderOp {
   void *params[6];
 };
 
+xmlNodePtr
+find_child_named (xmlNodePtr node, const char *name)
+{
+  for (node = node->children; node; node = node->next)
+    if (xmlStrcmp (node->name, (const xmlChar *)name) == 0)
+      return node;
+  return NULL;
+}
+
 /*!
  * Fill a GList* with objects which is to be put in a
  * diagram or a group by the caller. 
@@ -154,7 +165,41 @@ read_items (xmlNodePtr startnode)
       continue;
     if (node->type != XML_ELEMENT_NODE)
       continue;
-    
+    if (!xmlStrcmp(node->name, (const xmlChar *)"object")) {
+      xmlChar *sType = xmlGetProp(node, (const xmlChar *)"type");
+      const DiaObjectType *ot = object_get_type (sType);
+      xmlNodePtr child, props = NULL, render = NULL;
+      
+      props = find_child_named (node, "properties");
+      render = find_child_named (node, "render");
+
+      if (ot && !ot->ops) {
+	GList *moreitems;
+        /* FIXME: 'render' is also the grouping element */
+	moreitems = read_items (render->children);
+	if (moreitems) {
+	  DiaObject *group = group_create (moreitems);
+	    /* group eats list */
+	  items = g_list_append (items, group);
+	}
+      } else if (ot) {
+        Point startpoint = {0.0,0.0};
+        Handle *handle1,*handle2;
+	DiaObject *o;
+
+	o = ot->ops->create(&startpoint, 
+                            ot->default_user_data, 
+			    &handle1,&handle2);
+	if (o) {
+	  object_load_props (o, props);
+	  items = g_list_append (items, o);
+	}
+      } else {
+        g_debug ("DRS: unknown object '%s'", sType);
+      }
+    } else {
+      g_debug ("DRS-Import: %s?", node->name);
+    }
   }
   return items;
 }
@@ -165,13 +210,44 @@ import_drs (const gchar *filename, DiagramData *dia, void* user_data)
 {
   GList *item, *items;
   xmlDocPtr doc = xmlParseFile(filename);
+  xmlNodePtr root, node;
+  Layer *active_layer = NULL;
 
-  items = read_items (doc->xmlChildrenNode);
-  for (item = items; item != NULL; item = g_list_next (item)) {
-    DiaObject *obj = (DiaObject *)item->data;
-    layer_add_object(dia->active_layer, obj);
+  for (node = doc->children; node; node = node->next)
+    if (xmlStrcmp (node->name, (const xmlChar *)"drs") == 0)
+      root = node;
+
+  if (!root || !(root = find_child_named (root, "diagram"))) {
+    message_warning (_("Broken file?"));
+    return FALSE;
+  }
+
+  for (node = root->children; node != NULL; node = node->next) {
+    if (xmlStrcmp (node->name, (const xmlChar *)"layer") == 0) {
+      xmlChar *str;
+      xmlChar *name = xmlGetProp (node, (const xmlChar *)"name");
+      Layer *layer = new_layer (g_strdup (name ? (gchar *)name : _("Layer")), dia);
+
+      if (name)
+	xmlFree (name);
+
+      str = xmlGetProp (node, "active");
+      if (xmlStrcmp (str, "true")) {
+	  active_layer = layer;
+	xmlFree (str);
+      }
+
+      items = read_items (node->children);
+      for (item = items; item != NULL; item = g_list_next (item)) {
+        DiaObject *obj = (DiaObject *)item->data;
+        layer_add_object(layer, obj);
+      }
+      g_list_free (items);
+      data_add_layer (dia, layer);
+    }
   }
-  g_list_free (items);
+  if (active_layer)
+    data_set_active_layer (dia, active_layer);
   xmlFreeDoc(doc);
   return TRUE;
 }
diff --git a/plug-ins/drs/dia-render-script.c b/plug-ins/drs/dia-render-script.c
index d439a84..28a772f 100644
--- a/plug-ins/drs/dia-render-script.c
+++ b/plug-ins/drs/dia-render-script.c
@@ -63,10 +63,11 @@
 #include "diagramdata.h"
 #include "dia_xml_libxml.h"
 
+#include "dia-render-script.h"
 #include "dia-render-script-renderer.h"
 
 static void
-drs_render_layer (DiaRenderer *self, Layer *layer)
+drs_render_layer (DiaRenderer *self, Layer *layer, gboolean active)
 {
   DrsRenderer *renderer = DRS_RENDERER (self);
   xmlNodePtr node;
@@ -78,6 +79,8 @@ drs_render_layer (DiaRenderer *self, Layer *layer)
   renderer->root = node = xmlNewChild(renderer->root, NULL, (const xmlChar *)"layer", NULL);
   xmlSetProp(node, (const xmlChar *)"name", (xmlChar *)layer->name);
   xmlSetProp(node, (const xmlChar *)"visible", (xmlChar *)(layer->visible ? "true" : "false"));
+  if (active)
+    xmlSetProp(node, (const xmlChar *)"active", (xmlChar *)"true");
 
   /* Draw all objects: */
   list = layer->objects;
@@ -99,7 +102,7 @@ drs_data_render (DiagramData *data, DiaRenderer *renderer)
   DIA_RENDERER_GET_CLASS(renderer)->begin_render(renderer);
   for (i=0; i<data->layers->len; i++) {
     Layer *layer = (Layer *) g_ptr_array_index(data->layers, i);
-    drs_render_layer (renderer, layer);
+    drs_render_layer (renderer, layer, layer == data->active_layer);
   }
   DIA_RENDERER_GET_CLASS(renderer)->end_render(renderer);
 }
@@ -149,11 +152,29 @@ export_data(DiagramData *data, const gchar *filename,
 }
 
 static const gchar *extensions[] = { "drs", NULL };
-DiaExportFilter export_filter = {
+static DiaExportFilter export_filter = {
   N_("DiaRenderScript"),
   extensions,
   export_data
 };
+static DiaImportFilter import_filter = {
+  N_("DiaRenderScript"),
+  extensions,
+  import_drs
+};
+
+static gboolean
+_plugin_can_unload (PluginInfo *info)
+{
+  return TRUE;
+}
+
+static void
+_plugin_unload (PluginInfo *info)
+{
+  filter_unregister_export(&export_filter);
+  filter_unregister_import(&import_filter);
+}
 
 DIA_PLUGIN_CHECK_INIT
 
@@ -162,10 +183,12 @@ dia_plugin_init(PluginInfo *info)
 {
   if (!dia_plugin_info_init(info, "drs",
 			    N_("DiaRenderScript filter"),
-			    NULL, NULL))
+			    _plugin_can_unload,
+                            _plugin_unload))
     return DIA_PLUGIN_INIT_ERROR;
 
   filter_register_export(&export_filter);
+  filter_register_import(&import_filter);
 
   return DIA_PLUGIN_INIT_OK;
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]