/*! * \brief Parse _DiaObject from the given node * Fill a GList* with objects which is to be put in a * diagram or a group by the caller. * Can be called recursively to allow groups in groups. * This is only using the render branch of the file, if the * object type is not registered with Dia. Otherwise the objects * are just created from their type and properties. * \ingroup DiaRenderScriptImport */ static GList* read_items (xmlNodePtr startnode, DiaContext *ctx) { xmlNodePtr node; GList *items = NULL; for (node = startnode; node != NULL; node = node->next) { if (xmlIsBlankNode(node)) 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 ((gchar *)sType); xmlNodePtr 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, ctx); if (moreitems) { DiaObject *group = group_create (moreitems); /* apply group props, e.g. transform */ object_load_props (group, props, ctx); /* 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, ctx); items = g_list_append (items, o); } } else if (render) { DiaObject *o = _render_object (render, ctx); if (o) items = g_list_append (items, o); } else { g_debug ("DRS-Import: %s?", node->name); } } else { g_debug ("DRS-Import: %s?", node->name); } } return items; }
/* imports the given DRS file, returns TRUE if successful */ gboolean import_drs (const gchar *filename, DiagramData *dia, DiaContext *ctx, void* user_data) { GList *item, *items; xmlDocPtr doc = xmlParseFile(filename); xmlNodePtr root = NULL, node; Layer *active_layer = NULL; 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"))) { dia_context_add_message (ctx, _("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, (const xmlChar *)"active"); if (xmlStrcmp (str, (const xmlChar *)"true")) { active_layer = layer; xmlFree (str); } items = read_items (node->children, ctx); 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); } } if (active_layer) data_set_active_layer (dia, active_layer); xmlFreeDoc(doc); return TRUE; }