static DiaObject * beziergon_load(ObjectNode obj_node, int version, DiaContext *ctx) { Beziergon *beziergon; BezierShape *bez; DiaObject *obj; AttributeNode attr; beziergon = g_malloc0(sizeof(Beziergon)); bez = &beziergon->bezier; obj = &bez->object; obj->type = &beziergon_type; obj->ops = &beziergon_ops; beziershape_load(bez, obj_node, ctx); beziergon->line_color = color_black; attr = object_find_attribute(obj_node, "line_color"); if (attr != NULL) data_color(attribute_first_data(attr), &beziergon->line_color, ctx); beziergon->line_width = 0.1; attr = object_find_attribute(obj_node, PROP_STDNAME_LINE_WIDTH); if (attr != NULL) beziergon->line_width = data_real(attribute_first_data(attr), ctx); beziergon->inner_color = color_white; attr = object_find_attribute(obj_node, "inner_color"); if (attr != NULL) data_color(attribute_first_data(attr), &beziergon->inner_color, ctx); beziergon->show_background = TRUE; attr = object_find_attribute(obj_node, "show_background"); if (attr != NULL) beziergon->show_background = data_boolean(attribute_first_data(attr), ctx); beziergon->line_style = LINESTYLE_SOLID; attr = object_find_attribute(obj_node, "line_style"); if (attr != NULL) beziergon->line_style = data_enum(attribute_first_data(attr), ctx); beziergon->line_join = LINEJOIN_MITER; attr = object_find_attribute(obj_node, "line_join"); if (attr != NULL) beziergon->line_join = data_enum(attribute_first_data(attr), ctx); beziergon->dashlength = DEFAULT_LINESTYLE_DASHLEN; attr = object_find_attribute(obj_node, "dashlength"); if (attr != NULL) beziergon->dashlength = data_real(attribute_first_data(attr), ctx); beziergon_update_data(beziergon); return &beziergon->bezier.object; }
static DiaObject * bus_load(ObjectNode obj_node, int version, const char *filename) { Bus *bus; Connection *conn; LineBBExtras *extra; DiaObject *obj; AttributeNode attr; DataNode data; int i; bus = g_malloc0(sizeof(Bus)); conn = &bus->connection; obj = &conn->object; extra = &conn->extra_spacing; obj->type = &bus_type; obj->ops = &bus_ops; connection_load(conn, obj_node); attr = object_find_attribute(obj_node, "bus_handles"); bus->num_handles = 0; if (attr != NULL) bus->num_handles = attribute_num_data(attr); connection_init(conn, 2 + bus->num_handles, 0); data = attribute_first_data(attr); bus->handles = g_malloc(sizeof(Handle *)*bus->num_handles); bus->parallel_points = g_malloc(sizeof(Point)*bus->num_handles); for (i=0;i<bus->num_handles;i++) { bus->handles[i] = g_new0(Handle,1); bus->handles[i]->id = HANDLE_BUS; bus->handles[i]->type = HANDLE_MINOR_CONTROL; bus->handles[i]->connect_type = HANDLE_CONNECTABLE_NOBREAK; bus->handles[i]->connected_to = NULL; data_point(data, &bus->handles[i]->pos); obj->handles[2+i] = bus->handles[i]; data = data_next(data); } bus->line_color = color_black; attr = object_find_attribute(obj_node, "line_color"); if (attr != NULL) data_color(attribute_first_data(attr), &bus->line_color); extra->start_trans = extra->end_trans = extra->start_long = extra->end_long = LINE_WIDTH/2.0; bus_update_data(bus); return &bus->connection.object; }
static DiaObject * textobj_load(ObjectNode obj_node, int version, DiaContext *ctx) { Textobj *textobj; DiaObject *obj; AttributeNode attr; Point startpoint = {0.0, 0.0}; textobj = g_malloc0(sizeof(Textobj)); obj = &textobj->object; obj->type = &textobj_type; obj->ops = &textobj_ops; object_load(obj, obj_node, ctx); attr = object_find_attribute(obj_node, "text"); if (attr != NULL) { textobj->text = data_text(attribute_first_data(attr), ctx); } else { DiaFont* font = dia_font_new_from_style(DIA_FONT_MONOSPACE,1.0); textobj->text = new_text("", font, 1.0, &startpoint, &color_black, ALIGN_CENTER); dia_font_unref(font); } attr = object_find_attribute(obj_node, "valign"); if (attr != NULL) textobj->vert_align = data_enum(attribute_first_data(attr), ctx); else if (version == 0) { textobj->vert_align = VALIGN_FIRST_LINE; } /* default visibility must be off to keep compatibility */ textobj->fill_color = attributes_get_background(); attr = object_find_attribute(obj_node, "fill_color"); if (attr) data_color(attribute_first_data(attr), &textobj->fill_color, ctx); attr = object_find_attribute(obj_node, "show_background"); if (attr) textobj->show_background = data_boolean(attribute_first_data(attr), ctx); else textobj->show_background = FALSE; object_init(obj, 1, 0); obj->handles[0] = &textobj->text_handle; textobj->text_handle.id = HANDLE_TEXT; textobj->text_handle.type = HANDLE_MAJOR_CONTROL; textobj->text_handle.connect_type = HANDLE_CONNECTABLE; textobj->text_handle.connected_to = NULL; textobj_update_data(textobj); return &textobj->object; }
static DiaObject * wanlink_load(ObjectNode obj_node, int version,DiaContext *ctx) { WanLink *wanlink; Connection *conn; DiaObject *obj; AttributeNode attr; DataNode data; wanlink = g_malloc0(sizeof(WanLink)); conn = &wanlink->connection; obj = (DiaObject *) wanlink; obj->type = &wanlink_type; obj->ops = &wanlink_ops; connection_load(conn, obj_node, ctx); connection_init(conn, 2, 0); attr = object_find_attribute(obj_node, "width"); if (attr != NULL) { data = attribute_first_data(attr); wanlink->width = data_real(data, ctx); } wanlink->line_color = color_black; attr = object_find_attribute(obj_node, "line_color"); if (attr != NULL) data_color(attribute_first_data(attr), &wanlink->line_color, ctx); /* both colors where black at the time this was hardcoded ... */ wanlink->fill_color = color_black; attr = object_find_attribute(obj_node, "fill_color"); if (attr != NULL) data_color(attribute_first_data(attr), &wanlink->fill_color, ctx); wanlink_update_data (wanlink); return obj; }
Text * data_text(AttributeNode text_attr) { char *string = ""; Font *font; real height; Point pos = {0.0, 0.0}; Color col; Alignment align; AttributeNode attr; DataNode composite_node; Text *text; composite_node = attribute_first_data(text_attr); attr = composite_find_attribute(text_attr, "string"); if (attr != NULL) string = data_string(attribute_first_data(attr)); font = font_getfont("Courier"); attr = composite_find_attribute(text_attr, "font"); if (attr != NULL) font = data_font(attribute_first_data(attr)); height = 1.0; attr = composite_find_attribute(text_attr, "height"); if (attr != NULL) height = data_real(attribute_first_data(attr)); attr = composite_find_attribute(text_attr, "pos"); if (attr != NULL) data_point(attribute_first_data(attr), &pos); col = color_black; attr = composite_find_attribute(text_attr, "color"); if (attr != NULL) data_color(attribute_first_data(attr), &col); align = ALIGN_LEFT; attr = composite_find_attribute(text_attr, "alignment"); if (attr != NULL) align = data_enum(attribute_first_data(attr)); text = new_text(string, font, height, &pos, &col, align); if (string) free(string); return text; }
Text * data_text(AttributeNode text_attr, DiaContext *ctx) { char *string = NULL; DiaFont *font; real height; Point pos = {0.0, 0.0}; Color col; Alignment align; AttributeNode attr; Text *text; attr = composite_find_attribute(text_attr, "string"); if (attr != NULL) string = data_string(attribute_first_data(attr), ctx); height = 1.0; attr = composite_find_attribute(text_attr, "height"); if (attr != NULL) height = data_real(attribute_first_data(attr), ctx); attr = composite_find_attribute(text_attr, "font"); if (attr != NULL) { font = data_font(attribute_first_data(attr), ctx); } else { font = dia_font_new_from_style(DIA_FONT_SANS,1.0); } attr = composite_find_attribute(text_attr, "pos"); if (attr != NULL) data_point(attribute_first_data(attr), &pos, ctx); col = color_black; attr = composite_find_attribute(text_attr, "color"); if (attr != NULL) data_color(attribute_first_data(attr), &col, ctx); align = ALIGN_LEFT; attr = composite_find_attribute(text_attr, "alignment"); if (attr != NULL) align = data_enum(attribute_first_data(attr), ctx); text = new_text(string ? string : "", font, height, &pos, &col, align); if (font) dia_font_unref(font); if (string) g_free(string); return text; }
static DiaObject * image_load(ObjectNode obj_node, int version, DiaContext *ctx) { Image *image; Element *elem; DiaObject *obj; int i; AttributeNode attr; char *diafile_dir; image = g_malloc0(sizeof(Image)); elem = &image->element; obj = &elem->object; obj->type = &image_type; obj->ops = &image_ops; element_load(elem, obj_node, ctx); image->border_width = 0.1; attr = object_find_attribute(obj_node, "border_width"); if (attr != NULL) image->border_width = data_real(attribute_first_data(attr), ctx); image->border_color = color_black; attr = object_find_attribute(obj_node, "border_color"); if (attr != NULL) data_color(attribute_first_data(attr), &image->border_color, ctx); image->line_style = LINESTYLE_SOLID; attr = object_find_attribute(obj_node, "line_style"); if (attr != NULL) image->line_style = data_enum(attribute_first_data(attr), ctx); image->dashlength = DEFAULT_LINESTYLE_DASHLEN; attr = object_find_attribute(obj_node, "dashlength"); if (attr != NULL) image->dashlength = data_real(attribute_first_data(attr), ctx); image->draw_border = TRUE; attr = object_find_attribute(obj_node, "draw_border"); if (attr != NULL) image->draw_border = data_boolean(attribute_first_data(attr), ctx); image->keep_aspect = TRUE; attr = object_find_attribute(obj_node, "keep_aspect"); if (attr != NULL) image->keep_aspect = data_boolean(attribute_first_data(attr), ctx); attr = object_find_attribute(obj_node, "file"); if (attr != NULL) { image->file = data_filename(attribute_first_data(attr), ctx); } else { image->file = g_strdup(""); } element_init(elem, 8, NUM_CONNECTIONS); for (i=0;i<NUM_CONNECTIONS;i++) { obj->connections[i] = &image->connections[i]; image->connections[i].object = obj; image->connections[i].connected = NULL; } image->connections[8].flags = CP_FLAGS_MAIN; image->image = NULL; if (strcmp(image->file, "")!=0) { diafile_dir = get_directory(dia_context_get_filename(ctx)); if (g_path_is_absolute(image->file)) { /* Absolute pathname */ image->image = dia_image_load(image->file); if (image->image == NULL) { /* Not found as abs path, try in same dir as diagram. */ char *temp_string; const char *image_file_name = image->file; const char *psep; psep = strrchr(image->file, G_DIR_SEPARATOR); /* try the other G_OS as well */ if (!psep) psep = strrchr(image->file, G_DIR_SEPARATOR == '/' ? '\\' : '/'); if (psep) image_file_name = psep + 1; temp_string = g_build_filename(diafile_dir, image_file_name, NULL); image->image = dia_image_load(temp_string); if (image->image != NULL) { /* Found file in same dir as diagram. */ message_warning(_("The image file '%s' was not found in the specified directory.\n" "Using the file '%s' instead.\n"), image->file, temp_string); g_free(image->file); image->file = temp_string; } else { g_free(temp_string); image->image = dia_image_load((char *)image_file_name); if (image->image != NULL) { char *tmp; /* Found file in current dir. */ message_warning(_("The image file '%s' was not found in the specified directory.\n" "Using the file '%s' instead.\n"), image->file, image_file_name); tmp = image->file; image->file = g_strdup(image_file_name); g_free(tmp); } else { message_warning(_("The image file '%s' was not found.\n"), image_file_name); } } } } else { /* Relative pathname: */ char *temp_string; temp_string = g_build_filename (diafile_dir, image->file, NULL); image->image = dia_image_load(temp_string); if (image->image != NULL) { /* Found file in same dir as diagram. */ g_free(image->file); image->file = temp_string; } else { g_free(temp_string); image->image = dia_image_load(image->file); if (image->image == NULL) { /* Didn't find file in current dir. */ message_warning(_("The image file '%s' was not found.\n"), image->file); } } } g_free(diafile_dir); } /* if we don't have an image yet try to recover it from inlined data */ if (!image->image) { attr = object_find_attribute(obj_node, "pixbuf"); if (attr != NULL) { GdkPixbuf *pixbuf = data_pixbuf (attribute_first_data(attr)); if (pixbuf) { image->image = dia_image_new_from_pixbuf (pixbuf); image->inline_data = TRUE; /* avoid loosing it */ /* FIXME: should we reset the filename? */ g_object_unref (pixbuf); } } } /* update mtime */ { struct stat st; if (g_stat (image->file, &st) != 0) st.st_mtime = 0; image->mtime = st.st_mtime; } image_update_data(image); return &image->element.object; }
static Object * bezierline_load(ObjectNode obj_node, int version, const char *filename) { Bezierline *bezierline; BezierConn *bez; Object *obj; AttributeNode attr; bezierline = g_new(Bezierline, 1); bez = &bezierline->bez; obj = (Object *) bezierline; obj->type = &bezierline_type; obj->ops = &bezierline_ops; bezierconn_load(bez, obj_node); bezierline->line_color = color_black; attr = object_find_attribute(obj_node, "line_color"); if (attr != NULL) data_color(attribute_first_data(attr), &bezierline->line_color); bezierline->line_width = 0.1; attr = object_find_attribute(obj_node, "line_width"); if (attr != NULL) bezierline->line_width = data_real(attribute_first_data(attr)); bezierline->line_style = LINESTYLE_SOLID; attr = object_find_attribute(obj_node, "line_style"); if (attr != NULL) bezierline->line_style = data_enum(attribute_first_data(attr)); bezierline->dashlength = DEFAULT_LINESTYLE_DASHLEN; attr = object_find_attribute(obj_node, "dashlength"); if (attr != NULL) bezierline->dashlength = data_real(attribute_first_data(attr)); bezierline->start_arrow.type = ARROW_NONE; bezierline->start_arrow.length = 0.8; bezierline->start_arrow.width = 0.8; attr = object_find_attribute(obj_node, "start_arrow"); if (attr != NULL) bezierline->start_arrow.type = data_enum(attribute_first_data(attr)); attr = object_find_attribute(obj_node, "start_arrow_length"); if (attr != NULL) bezierline->start_arrow.length = data_real(attribute_first_data(attr)); attr = object_find_attribute(obj_node, "start_arrow_width"); if (attr != NULL) bezierline->start_arrow.width = data_real(attribute_first_data(attr)); bezierline->end_arrow.type = ARROW_NONE; bezierline->end_arrow.length = 0.8; bezierline->end_arrow.width = 0.8; attr = object_find_attribute(obj_node, "end_arrow"); if (attr != NULL) bezierline->end_arrow.type = data_enum(attribute_first_data(attr)); attr = object_find_attribute(obj_node, "end_arrow_length"); if (attr != NULL) bezierline->end_arrow.length = data_real(attribute_first_data(attr)); attr = object_find_attribute(obj_node, "end_arrow_width"); if (attr != NULL) bezierline->end_arrow.width = data_real(attribute_first_data(attr)); bezierline_update_data(bezierline); return (Object *)bezierline; }
static DiaObject * compound_load (ObjectNode obj_node, int version, DiaContext *ctx) { Compound * comp; DiaObject * obj; AttributeNode attr; DataNode data; gint i, num_handles; comp = g_new0 (Compound, 1); obj = &comp->object; /* load the objects position and bounding box */ object_load (obj, obj_node, ctx); /* init the object */ obj->type = &compound_type; obj->ops = &compound_ops; /* load the object's handles and its positions */ attr = object_find_attribute (obj_node, "comp_points"); g_assert (attr != NULL); num_handles = attribute_num_data (attr); g_assert (num_handles >= 3); /* allocate space for object handles and connectionpoints point arrays */ object_init (obj, num_handles, 1); data = attribute_first_data (attr); /* init our mount_point */ setup_mount_point (&comp->mount_point, obj, NULL); data_point (data, &comp->mount_point.pos, ctx); obj->connections[0] = &comp->mount_point; /* now init the handles */ comp->num_arms = num_handles-1; comp->handles = g_new0 (Handle, num_handles); setup_handle (&comp->handles[0], HANDLE_MOUNT_POINT, HANDLE_MAJOR_CONTROL, HANDLE_NONCONNECTABLE); comp->handles[0].pos = comp->mount_point.pos; obj->handles[0] = &comp->handles[0]; data = data_next (data); for (i = 1; i < num_handles; i++) { obj->handles[i] = &comp->handles[i]; setup_handle (obj->handles[i], HANDLE_ARM, HANDLE_MINOR_CONTROL, HANDLE_CONNECTABLE_NOBREAK); data_point (data, &obj->handles[i]->pos, ctx); data = data_next (data); } /* load remainding properties */ attr = object_find_attribute (obj_node, PROP_STDTYPE_LINE_WIDTH); if (attr == NULL) comp->line_width = 0.1; else comp->line_width = data_real (attribute_first_data (attr), ctx); attr = object_find_attribute (obj_node, "line_colour"); if (attr == NULL) comp->line_color = color_black; else data_color (attribute_first_data (attr), &comp->line_color, ctx); compound_update_data (comp); compound_sanity_check (comp, "Loaded"); return &comp->object; }
static DiaObject * attribute_load(ObjectNode obj_node, int version,DiaContext *ctx) { Attribute *attribute; Element *elem; DiaObject *obj; int i; AttributeNode attr; attribute = g_malloc0(sizeof(Attribute)); elem = &attribute->element; obj = &elem->object; obj->type = &attribute_type; obj->ops = &attribute_ops; element_load(elem, obj_node, ctx); attribute->border_width = 0.1; attr = object_find_attribute(obj_node, "border_width"); if (attr != NULL) attribute->border_width = data_real(attribute_first_data(attr), ctx); attribute->border_color = color_black; attr = object_find_attribute(obj_node, "border_color"); if (attr != NULL) data_color(attribute_first_data(attr), &attribute->border_color, ctx); attribute->inner_color = color_white; attr = object_find_attribute(obj_node, "inner_color"); if (attr != NULL) data_color(attribute_first_data(attr), &attribute->inner_color, ctx); attribute->name = NULL; attr = object_find_attribute(obj_node, "name"); if (attr != NULL) attribute->name = data_string(attribute_first_data(attr), ctx); attr = object_find_attribute(obj_node, "key"); if (attr != NULL) attribute->key = data_boolean(attribute_first_data(attr), ctx); attr = object_find_attribute(obj_node, "weak_key"); if (attr != NULL) attribute->weakkey = data_boolean(attribute_first_data(attr), ctx); attr = object_find_attribute(obj_node, "derived"); if (attr != NULL) attribute->derived = data_boolean(attribute_first_data(attr), ctx); attr = object_find_attribute(obj_node, "multivalued"); if (attr != NULL) attribute->multivalue = data_boolean(attribute_first_data(attr), ctx); if (attribute->font != NULL) { /* This shouldn't happen, but doesn't hurt */ dia_font_unref(attribute->font); attribute->font = NULL; } attr = object_find_attribute (obj_node, "font"); if (attr != NULL) attribute->font = data_font (attribute_first_data (attr), ctx); attribute->font_height = FONT_HEIGHT; attr = object_find_attribute (obj_node, "font_height"); if (attr != NULL) attribute->font_height = data_real(attribute_first_data(attr), ctx); element_init(elem, 8, NUM_CONNECTIONS); for (i=0;i<NUM_CONNECTIONS;i++) { obj->connections[i] = &attribute->connections[i]; attribute->connections[i].object = obj; attribute->connections[i].connected = NULL; } attribute->connections[8].flags = CP_FLAGS_MAIN; if (attribute->font == NULL) attribute->font = dia_font_new_from_style(DIA_FONT_MONOSPACE, attribute->font_height); attribute->name_width = dia_font_string_width(attribute->name, attribute->font, attribute->font_height); attribute_update_data(attribute); for (i=0;i<8;i++) obj->handles[i]->type = HANDLE_NON_MOVABLE; return &attribute->element.object; }
static DiaObject *ellipse_load(ObjectNode obj_node, int version, DiaContext *ctx) { Ellipse *ellipse; Element *elem; DiaObject *obj; int i; AttributeNode attr; ellipse = g_malloc0(sizeof(Ellipse)); elem = &ellipse->element; obj = &elem->object; obj->type = &ellipse_type; obj->ops = &ellipse_ops; element_load(elem, obj_node, ctx); ellipse->border_width = 0.1; attr = object_find_attribute(obj_node, "border_width"); if (attr != NULL) ellipse->border_width = data_real(attribute_first_data(attr), ctx); ellipse->border_color = color_black; attr = object_find_attribute(obj_node, "border_color"); if (attr != NULL) data_color(attribute_first_data(attr), &ellipse->border_color, ctx); ellipse->inner_color = color_white; attr = object_find_attribute(obj_node, "inner_color"); if (attr != NULL) data_color(attribute_first_data(attr), &ellipse->inner_color, ctx); ellipse->show_background = TRUE; attr = object_find_attribute(obj_node, "show_background"); if (attr != NULL) ellipse->show_background = data_boolean(attribute_first_data(attr), ctx); ellipse->aspect = FREE_ASPECT; attr = object_find_attribute(obj_node, "aspect"); if (attr != NULL) ellipse->aspect = data_enum(attribute_first_data(attr), ctx); ellipse->line_style = LINESTYLE_SOLID; attr = object_find_attribute(obj_node, "line_style"); if (attr != NULL) ellipse->line_style = data_enum(attribute_first_data(attr), ctx); ellipse->dashlength = DEFAULT_LINESTYLE_DASHLEN; attr = object_find_attribute(obj_node, "dashlength"); if (attr != NULL) ellipse->dashlength = data_real(attribute_first_data(attr), ctx); attr = object_find_attribute(obj_node, "pattern"); if (attr != NULL) ellipse->pattern = data_pattern(attribute_first_data(attr), ctx); element_init(elem, 9, 9); obj->handles[8] = &ellipse->center_handle; obj->handles[8]->id = HANDLE_CUSTOM1; obj->handles[8]->type = HANDLE_MAJOR_CONTROL; obj->handles[8]->connected_to = NULL; obj->handles[8]->connect_type = HANDLE_NONCONNECTABLE; for (i=0;i<9;i++) { obj->connections[i] = &ellipse->connections[i]; ellipse->connections[i].object = obj; ellipse->connections[i].connected = NULL; } ellipse->connections[8].flags = CP_FLAGS_MAIN; ellipse_update_data(ellipse); return &ellipse->element.object; }
static DiaObject * arc_load(ObjectNode obj_node, int version,DiaContext *ctx) { Arc *arc; Connection *conn; DiaObject *obj; AttributeNode attr; arc = g_malloc0(sizeof(Arc)); conn = &arc->connection; obj = &conn->object; obj->type = &arc_type; obj->ops = &arc_ops; connection_load(conn, obj_node, ctx); arc->arc_color = color_black; attr = object_find_attribute(obj_node, "arc_color"); if (attr != NULL) data_color(attribute_first_data(attr), &arc->arc_color, ctx); arc->curve_distance = 0.1; attr = object_find_attribute(obj_node, "curve_distance"); if (attr != NULL) arc->curve_distance = data_real(attribute_first_data(attr), ctx); arc->line_width = 0.1; attr = object_find_attribute(obj_node, PROP_STDNAME_LINE_WIDTH); if (attr != NULL) arc->line_width = data_real(attribute_first_data(attr), ctx); arc->line_style = LINESTYLE_SOLID; attr = object_find_attribute(obj_node, "line_style"); if (attr != NULL) arc->line_style = data_enum(attribute_first_data(attr), ctx); arc->dashlength = DEFAULT_LINESTYLE_DASHLEN; attr = object_find_attribute(obj_node, "dashlength"); if (attr != NULL) arc->dashlength = data_real(attribute_first_data(attr), ctx); arc->line_caps = LINECAPS_BUTT; attr = object_find_attribute(obj_node, "line_caps"); if (attr != NULL) arc->line_caps = data_enum(attribute_first_data(attr), ctx); load_arrow(obj_node, &arc->start_arrow, "start_arrow", "start_arrow_length", "start_arrow_width", ctx); load_arrow(obj_node, &arc->end_arrow, "end_arrow", "end_arrow_length", "end_arrow_width", ctx); connection_init(conn, 4, 0); _arc_setup_handles (arc); /* older versions did not prohibit everything reduced to a single point * and afterwards failed on all the calculations producing nan. */ if (distance_point_point (&arc->connection.endpoints[0], &arc->connection.endpoints[1]) < 0.02) { arc->curve_distance = 0.0; arc->connection.endpoints[0].x -= 0.01; arc->connection.endpoints[1].x += 0.01; arc_update_handles (arc); } arc_update_data(arc); return &arc->connection.object; }
static DiaObject * zigzagline_load(ObjectNode obj_node, int version, DiaContext *ctx) { Zigzagline *zigzagline; OrthConn *orth; DiaObject *obj; AttributeNode attr; zigzagline = g_malloc0(sizeof(Zigzagline)); orth = &zigzagline->orth; obj = &orth->object; obj->type = &zigzagline_type; obj->ops = &zigzagline_ops; orthconn_load(orth, obj_node, ctx); zigzagline->line_color = color_black; attr = object_find_attribute(obj_node, "line_color"); if (attr != NULL) data_color(attribute_first_data(attr), &zigzagline->line_color, ctx); zigzagline->line_width = 0.1; attr = object_find_attribute(obj_node, PROP_STDNAME_LINE_WIDTH); if (attr != NULL) zigzagline->line_width = data_real(attribute_first_data(attr), ctx); zigzagline->line_style = LINESTYLE_SOLID; attr = object_find_attribute(obj_node, "line_style"); if (attr != NULL) zigzagline->line_style = data_enum(attribute_first_data(attr), ctx); zigzagline->line_join = LINEJOIN_MITER; attr = object_find_attribute(obj_node, "line_join"); if (attr != NULL) zigzagline->line_join = data_enum(attribute_first_data(attr), ctx); zigzagline->line_caps = LINECAPS_BUTT; attr = object_find_attribute(obj_node, "line_caps"); if (attr != NULL) zigzagline->line_caps = data_enum(attribute_first_data(attr), ctx); load_arrow(obj_node, &zigzagline->start_arrow, "start_arrow", "start_arrow_length", "start_arrow_width", ctx); load_arrow(obj_node, &zigzagline->end_arrow, "end_arrow", "end_arrow_length", "end_arrow_width", ctx); zigzagline->dashlength = DEFAULT_LINESTYLE_DASHLEN; attr = object_find_attribute(obj_node, "dashlength"); if (attr != NULL) zigzagline->dashlength = data_real(attribute_first_data(attr), ctx); zigzagline->corner_radius = 0.0; attr = object_find_attribute(obj_node, "corner_radius"); if (attr != NULL) zigzagline->corner_radius = data_real(attribute_first_data(attr), ctx); zigzagline_update_data(zigzagline); return &zigzagline->orth.object; }
static DiaObject * image_load(ObjectNode obj_node, int version, const char *filename) { EImage *image; Element *elem; DiaObject *obj; int i; AttributeNode attr; char *diafile_dir; Diagram *dia; GList *list; image = g_malloc0(sizeof(EImage)); elem = &image->element; obj = &elem->object; obj->type = &eimage_type; obj->ops = &eimage_ops; element_load(elem, obj_node); image->border_width = 0.1; attr = object_find_attribute(obj_node, "border_width"); if (attr != NULL) image->border_width = data_real( attribute_first_data(attr) ); image->border_color = color_black; attr = object_find_attribute(obj_node, "border_color"); if (attr != NULL) data_color(attribute_first_data(attr), &image->border_color); image->line_style = LINESTYLE_SOLID; attr = object_find_attribute(obj_node, "line_style"); if (attr != NULL) image->line_style = data_enum( attribute_first_data(attr) ); image->dashlength = DEFAULT_LINESTYLE_DASHLEN; attr = object_find_attribute(obj_node, "dashlength"); if (attr != NULL) image->dashlength = data_real(attribute_first_data(attr)); image->draw_border = TRUE; attr = object_find_attribute(obj_node, "draw_border"); if (attr != NULL) image->draw_border = data_boolean( attribute_first_data(attr) ); image->keep_aspect = TRUE; attr = object_find_attribute(obj_node, "keep_aspect"); if (attr != NULL) image->keep_aspect = data_boolean( attribute_first_data(attr) ); image->keep_orig_aspect = TRUE; attr = object_find_attribute(obj_node, "keep_orig_aspect"); if (attr != NULL) image->keep_orig_aspect = data_boolean( attribute_first_data(attr) ); attr = object_find_attribute(obj_node, "file"); if (attr != NULL) { image->file = data_filename( attribute_first_data(attr) ); } else { image->file = g_strdup(""); } attr = object_find_attribute(obj_node, "embed_id"); if (attr) { image->embed_id = dtree_conv_longname_from_xml(data_string(attribute_first_data(attr))); } else { image->embed_id = get_default_embed_id("embed_image"); } register_embed_id(image->embed_id); element_init(elem, 8, NUM_CONNECTIONS); for (i=0;i<NUM_CONNECTIONS;i++) { obj->connections[i] = &image->connections[i]; image->connections[i].object = obj; image->connections[i].connected = NULL; } image->connections[8].flags = CP_FLAGS_MAIN; image->image = NULL; if (strcmp(image->file, "")!=0) { diafile_dir = get_directory(filename); if (g_path_is_absolute(image->file)) { /* Absolute pathname */ image->image = dia_image_load(image->file); if (image->image == NULL) { /* Not found as abs path, try in same dir as diagram. */ char *temp_string; const char *image_file_name = image->file; const char *psep; psep = strrchr(image->file, G_DIR_SEPARATOR); /* try the other G_OS as well */ if (!psep) psep = strrchr(image->file, G_DIR_SEPARATOR == '/' ? '\\' : '/'); if (psep) image_file_name = psep + 1; temp_string = g_build_filename(diafile_dir, image_file_name, NULL); image->image = dia_image_load(temp_string); if (image->image != NULL) { /* Found file in same dir as diagram. */ message_warning(_("The image file '%s' was not found in that directory.\n" "Using the file '%s' instead\n"), image->file, temp_string); g_free(image->file); image->file = temp_string; } else { g_free(temp_string); image->image = dia_image_load((char *)image_file_name); if (image->image != NULL) { char *tmp; /* Found file in current dir. */ message_warning(_("The image file '%s' was not found in that directory.\n" "Using the file '%s' instead\n"), image->file, image_file_name); tmp = image->file; image->file = g_strdup(image_file_name); g_free(tmp); } else { message_warning(_("The image file '%s' was not found.\n"), image_file_name); } } } } else { /* Relative pathname: */ char *temp_string; temp_string = g_build_filename (diafile_dir, image->file, NULL); image->image = dia_image_load(temp_string); if (image->image != NULL) { /* Found file in same dir as diagram. */ g_free(image->file); image->file = temp_string; } else { g_free(temp_string); image->image = dia_image_load(image->file); if (image->image == NULL) { /* Didn't find file in current dir. */ message_warning(_("The image file '%s' was not found.\n"), image->file); } } } g_free(diafile_dir); } /* update mtime */ { struct stat st; if (g_stat (image->file, &st) != 0) st.st_mtime = 0; image->mtime = st.st_mtime; } image_update_data(image); obj->node = NULL; list = dia_open_diagrams(); while (list != NULL) { dia = (Diagram *)list->data; if (!g_strcmp0(dia->filename,filename)) { obj->node = dtree_set_data_by_longname(DIA_DIAGRAM_DATA(dia)->dtree, image->embed_id,&image->element.object); } list = g_list_next(list); } return &image->element.object; }
static DiaObject * line_load(ObjectNode obj_node, int version, DiaContext *ctx) { Line *line; Connection *conn; DiaObject *obj; AttributeNode attr; line = g_malloc0(sizeof(Line)); conn = &line->connection; obj = &conn->object; obj->type = &line_type; obj->ops = &line_ops; connection_load(conn, obj_node, ctx); line->line_color = color_black; attr = object_find_attribute(obj_node, "line_color"); if (attr != NULL) data_color(attribute_first_data(attr), &line->line_color, ctx); line->line_width = 0.1; attr = object_find_attribute(obj_node, PROP_STDNAME_LINE_WIDTH); if (attr != NULL) line->line_width = data_real(attribute_first_data(attr), ctx); line->line_style = LINESTYLE_SOLID; attr = object_find_attribute(obj_node, "line_style"); if (attr != NULL) line->line_style = data_enum(attribute_first_data(attr), ctx); line->line_caps = LINECAPS_BUTT; attr = object_find_attribute(obj_node, "line_caps"); if (attr != NULL) line->line_caps = data_enum(attribute_first_data(attr), ctx); load_arrow(obj_node, &line->start_arrow, "start_arrow", "start_arrow_length", "start_arrow_width", ctx); load_arrow(obj_node, &line->end_arrow, "end_arrow", "end_arrow_length", "end_arrow_width", ctx); line->absolute_start_gap = 0.0; attr = object_find_attribute(obj_node, "absolute_start_gap"); if (attr != NULL) line->absolute_start_gap = data_real(attribute_first_data(attr), ctx); line->absolute_end_gap = 0.0; attr = object_find_attribute(obj_node, "absolute_end_gap"); if (attr != NULL) line->absolute_end_gap = data_real(attribute_first_data(attr), ctx); line->dashlength = DEFAULT_LINESTYLE_DASHLEN; attr = object_find_attribute(obj_node, "dashlength"); if (attr != NULL) line->dashlength = data_real(attribute_first_data(attr), ctx); connection_init(conn, 2, 0); line->cpl = connpointline_load(obj,obj_node,"numcp",1,NULL, ctx); line_update_data(line); return &line->connection.object; }
static Object * line_load(ObjectNode obj_node, int version, const char *filename) { Line *line; Connection *conn; Object *obj; AttributeNode attr; line = g_malloc(sizeof(Line)); conn = &line->connection; obj = (Object *) line; obj->type = &line_type; obj->ops = &line_ops; connection_load(conn, obj_node); line->line_color = color_black; attr = object_find_attribute(obj_node, "line_color"); if (attr != NULL) data_color(attribute_first_data(attr), &line->line_color); line->line_width = 0.1; attr = object_find_attribute(obj_node, "line_width"); if (attr != NULL) line->line_width = data_real(attribute_first_data(attr)); line->line_style = LINESTYLE_SOLID; attr = object_find_attribute(obj_node, "line_style"); if (attr != NULL) line->line_style = data_enum(attribute_first_data(attr)); line->start_arrow.type = ARROW_NONE; line->start_arrow.length = 0.8; line->start_arrow.width = 0.8; attr = object_find_attribute(obj_node, "start_arrow"); if (attr != NULL) line->start_arrow.type = data_enum(attribute_first_data(attr)); attr = object_find_attribute(obj_node, "start_arrow_length"); if (attr != NULL) line->start_arrow.length = data_real(attribute_first_data(attr)); attr = object_find_attribute(obj_node, "start_arrow_width"); if (attr != NULL) line->start_arrow.width = data_real(attribute_first_data(attr)); line->end_arrow.type = ARROW_NONE; line->end_arrow.length = 0.8; line->end_arrow.width = 0.8; attr = object_find_attribute(obj_node, "end_arrow"); if (attr != NULL) line->end_arrow.type = data_enum(attribute_first_data(attr)); attr = object_find_attribute(obj_node, "end_arrow_length"); if (attr != NULL) line->end_arrow.length = data_real(attribute_first_data(attr)); attr = object_find_attribute(obj_node, "end_arrow_width"); if (attr != NULL) line->end_arrow.width = data_real(attribute_first_data(attr)); line->dashlength = DEFAULT_LINESTYLE_DASHLEN; attr = object_find_attribute(obj_node, "dashlength"); if (attr != NULL) line->dashlength = data_real(attribute_first_data(attr)); connection_init(conn, 2, 1); obj->connections[0] = &line->middle_point; line->middle_point.object = obj; line->middle_point.connected = NULL; line_update_data(line); return (Object *)line; }
static DiaObject * polyline_load(ObjectNode obj_node, int version, DiaContext *ctx) { Polyline *polyline; PolyConn *poly; DiaObject *obj; AttributeNode attr; polyline = g_malloc0(sizeof(Polyline)); poly = &polyline->poly; obj = &poly->object; obj->type = &polyline_type; obj->ops = &polyline_ops; polyconn_load(poly, obj_node, ctx); polyline->line_color = color_black; attr = object_find_attribute(obj_node, "line_color"); if (attr != NULL) data_color(attribute_first_data(attr), &polyline->line_color, ctx); polyline->line_width = 0.1; attr = object_find_attribute(obj_node, PROP_STDNAME_LINE_WIDTH); if (attr != NULL) polyline->line_width = data_real(attribute_first_data(attr), ctx); polyline->line_style = LINESTYLE_SOLID; attr = object_find_attribute(obj_node, "line_style"); if (attr != NULL) polyline->line_style = data_enum(attribute_first_data(attr), ctx); polyline->line_join = LINEJOIN_MITER; attr = object_find_attribute(obj_node, "line_join"); if (attr != NULL) polyline->line_join = data_enum(attribute_first_data(attr), ctx); polyline->line_caps = LINECAPS_BUTT; attr = object_find_attribute(obj_node, "line_caps"); if (attr != NULL) polyline->line_caps = data_enum(attribute_first_data(attr), ctx); polyline->dashlength = DEFAULT_LINESTYLE_DASHLEN; attr = object_find_attribute(obj_node, "dashlength"); if (attr != NULL) polyline->dashlength = data_real(attribute_first_data(attr), ctx); load_arrow(obj_node, &polyline->start_arrow, "start_arrow", "start_arrow_length", "start_arrow_width", ctx); load_arrow(obj_node, &polyline->end_arrow, "end_arrow", "end_arrow_length", "end_arrow_width", ctx); polyline->absolute_start_gap = 0.0; attr = object_find_attribute(obj_node, "absolute_start_gap"); if (attr != NULL) polyline->absolute_start_gap = data_real(attribute_first_data(attr), ctx); polyline->absolute_end_gap = 0.0; attr = object_find_attribute(obj_node, "absolute_end_gap"); if (attr != NULL) polyline->absolute_end_gap = data_real(attribute_first_data(attr), ctx); polyline->corner_radius = 0.0; attr = object_find_attribute(obj_node, "corner_radius"); if (attr != NULL) polyline->corner_radius = data_real(attribute_first_data(attr), ctx); polyline_update_data(polyline); return &polyline->poly.object; }
static DiaObject * bezierline_load(ObjectNode obj_node, int version, DiaContext *ctx) { Bezierline *bezierline; BezierConn *bez; DiaObject *obj; AttributeNode attr; bezierline = g_new0(Bezierline, 1); bezierline->bez.object.enclosing_box = g_new0 (Rectangle, 1); bez = &bezierline->bez; obj = &bez->object; obj->type = &bezierline_type; obj->ops = &bezierline_ops; bezierconn_load(bez, obj_node, ctx); bezierline->line_color = color_black; attr = object_find_attribute(obj_node, "line_color"); if (attr != NULL) data_color(attribute_first_data(attr), &bezierline->line_color, ctx); bezierline->line_width = 0.1; attr = object_find_attribute(obj_node, PROP_STDNAME_LINE_WIDTH); if (attr != NULL) bezierline->line_width = data_real(attribute_first_data(attr), ctx); bezierline->line_style = LINESTYLE_SOLID; attr = object_find_attribute(obj_node, "line_style"); if (attr != NULL) bezierline->line_style = data_enum(attribute_first_data(attr), ctx); bezierline->line_join = LINEJOIN_MITER; attr = object_find_attribute(obj_node, "line_join"); if (attr != NULL) bezierline->line_join = data_enum(attribute_first_data(attr), ctx); bezierline->line_caps = LINECAPS_BUTT; attr = object_find_attribute(obj_node, "line_caps"); if (attr != NULL) bezierline->line_caps = data_enum(attribute_first_data(attr), ctx); bezierline->dashlength = DEFAULT_LINESTYLE_DASHLEN; attr = object_find_attribute(obj_node, "dashlength"); if (attr != NULL) bezierline->dashlength = data_real(attribute_first_data(attr), ctx); load_arrow(obj_node, &bezierline->start_arrow, "start_arrow", "start_arrow_length", "start_arrow_width", ctx); load_arrow(obj_node, &bezierline->end_arrow, "end_arrow", "end_arrow_length", "end_arrow_width", ctx); bezierline->absolute_start_gap = 0.0; attr = object_find_attribute(obj_node, "absolute_start_gap"); if (attr != NULL) bezierline->absolute_start_gap = data_real(attribute_first_data(attr), ctx); bezierline->absolute_end_gap = 0.0; attr = object_find_attribute(obj_node, "absolute_end_gap"); if (attr != NULL) bezierline->absolute_end_gap = data_real(attribute_first_data(attr), ctx); /* if "screws up the bounding box if auto_gap" it must be fixed there * not by copying some meaningless bounding_box before this function call! * But the real fix is in connectionpoint.c(connpoint_is_autogap) */ bezierline_update_data(bezierline); return &bezierline->bez.object; }
static DiaObject * ellipse_load(ObjectNode obj_node, int version,DiaContext *ctx) { Ellipse *ellipse; Element *elem; DiaObject *obj; int i; AttributeNode attr; ellipse = g_malloc0(sizeof(Ellipse)); elem = &ellipse->element; obj = &elem->object; obj->type = &fc_ellipse_type; obj->ops = &ellipse_ops; element_load(elem, obj_node, ctx); ellipse->border_width = 0.1; attr = object_find_attribute(obj_node, "border_width"); if (attr != NULL) ellipse->border_width = data_real(attribute_first_data(attr), ctx); ellipse->border_color = color_black; attr = object_find_attribute(obj_node, "border_color"); if (attr != NULL) data_color(attribute_first_data(attr), &ellipse->border_color, ctx); ellipse->inner_color = color_white; attr = object_find_attribute(obj_node, "inner_color"); if (attr != NULL) data_color(attribute_first_data(attr), &ellipse->inner_color, ctx); ellipse->show_background = TRUE; attr = object_find_attribute(obj_node, "show_background"); if (attr != NULL) ellipse->show_background = data_boolean( attribute_first_data(attr), ctx); ellipse->line_style = LINESTYLE_SOLID; attr = object_find_attribute(obj_node, "line_style"); if (attr != NULL) ellipse->line_style = data_enum(attribute_first_data(attr), ctx); ellipse->dashlength = DEFAULT_LINESTYLE_DASHLEN; attr = object_find_attribute(obj_node, "dashlength"); if (attr != NULL) ellipse->dashlength = data_real(attribute_first_data(attr), ctx); ellipse->padding = default_properties.padding; attr = object_find_attribute(obj_node, "padding"); if (attr != NULL) ellipse->padding = data_real(attribute_first_data(attr), ctx); ellipse->text = NULL; attr = object_find_attribute(obj_node, "text"); if (attr != NULL) ellipse->text = data_text(attribute_first_data(attr), ctx); else ellipse->text = new_text_default(&obj->position, &ellipse->border_color, ALIGN_CENTER); /* old default: only growth, manual shrink */ ellipse->text_fitting = TEXTFIT_WHEN_NEEDED; attr = object_find_attribute(obj_node, PROP_STDNAME_TEXT_FITTING); if (attr != NULL) ellipse->text_fitting = data_enum(attribute_first_data(attr), ctx); element_init(elem, 8, NUM_CONNECTIONS); for (i=0;i<NUM_CONNECTIONS;i++) { obj->connections[i] = &ellipse->connections[i]; ellipse->connections[i].object = obj; ellipse->connections[i].connected = NULL; ellipse->connections[i].flags = 0; } ellipse->connections[16].flags = CP_FLAGS_MAIN; ellipse_update_data(ellipse, ANCHOR_MIDDLE, ANCHOR_MIDDLE); return &ellipse->element.object; }
static Object * arc_load(ObjectNode obj_node, int version, const char *filename) { Arc *arc; Connection *conn; Object *obj; AttributeNode attr; arc = g_malloc(sizeof(Arc)); conn = &arc->connection; obj = (Object *) arc; obj->type = &arc_type;; obj->ops = &arc_ops; connection_load(conn, obj_node); arc->arc_color = color_black; attr = object_find_attribute(obj_node, "arc_color"); if (attr != NULL) data_color(attribute_first_data(attr), &arc->arc_color); arc->curve_distance = 0.1; attr = object_find_attribute(obj_node, "curve_distance"); if (attr != NULL) arc->curve_distance = data_real(attribute_first_data(attr)); arc->line_width = 0.1; attr = object_find_attribute(obj_node, "line_width"); if (attr != NULL) arc->line_width = data_real(attribute_first_data(attr)); arc->line_style = LINESTYLE_SOLID; attr = object_find_attribute(obj_node, "line_style"); if (attr != NULL) arc->line_style = data_enum(attribute_first_data(attr)); arc->dashlength = DEFAULT_LINESTYLE_DASHLEN; attr = object_find_attribute(obj_node, "dashlength"); if (attr != NULL) arc->dashlength = data_real(attribute_first_data(attr)); arc->start_arrow.type = ARROW_NONE; arc->start_arrow.length = 0.8; arc->start_arrow.width = 0.8; attr = object_find_attribute(obj_node, "start_arrow"); if (attr != NULL) arc->start_arrow.type = data_enum(attribute_first_data(attr)); attr = object_find_attribute(obj_node, "start_arrow_length"); if (attr != NULL) arc->start_arrow.length = data_real(attribute_first_data(attr)); attr = object_find_attribute(obj_node, "start_arrow_width"); if (attr != NULL) arc->start_arrow.width = data_real(attribute_first_data(attr)); arc->end_arrow.type = ARROW_NONE; arc->end_arrow.length = 0.8; arc->end_arrow.width = 0.8; attr = object_find_attribute(obj_node, "end_arrow"); if (attr != NULL) arc->end_arrow.type = data_enum(attribute_first_data(attr)); attr = object_find_attribute(obj_node, "end_arrow_length"); if (attr != NULL) arc->end_arrow.length = data_real(attribute_first_data(attr)); attr = object_find_attribute(obj_node, "end_arrow_width"); if (attr != NULL) arc->end_arrow.width = data_real(attribute_first_data(attr)); connection_init(conn, 3, 0); obj->handles[2] = &arc->middle_handle; arc->middle_handle.id = HANDLE_MIDDLE; arc->middle_handle.type = HANDLE_MINOR_CONTROL; arc->middle_handle.connect_type = HANDLE_NONCONNECTABLE; arc->middle_handle.connected_to = NULL; arc_update_data(arc); return (Object *)arc; }
static DiaObject * box_load(ObjectNode obj_node, int version, DiaContext *ctx) { Box *box; Element *elem; DiaObject *obj; int i; AttributeNode attr; box = g_malloc0(sizeof(Box)); elem = &box->element; obj = &elem->object; obj->type = &box_type; obj->ops = &box_ops; element_load(elem, obj_node, ctx); box->border_width = 0.1; attr = object_find_attribute(obj_node, "border_width"); if (attr != NULL) box->border_width = data_real(attribute_first_data(attr), ctx); box->border_color = color_black; attr = object_find_attribute(obj_node, "border_color"); if (attr != NULL) data_color(attribute_first_data(attr), &box->border_color, ctx); box->inner_color = color_white; attr = object_find_attribute(obj_node, "inner_color"); if (attr != NULL) data_color(attribute_first_data(attr), &box->inner_color, ctx); box->show_background = TRUE; attr = object_find_attribute(obj_node, "show_background"); if (attr != NULL) box->show_background = data_boolean(attribute_first_data(attr), ctx); box->line_style = LINESTYLE_SOLID; attr = object_find_attribute(obj_node, "line_style"); if (attr != NULL) box->line_style = data_enum(attribute_first_data(attr), ctx); box->dashlength = DEFAULT_LINESTYLE_DASHLEN; attr = object_find_attribute(obj_node, "dashlength"); if (attr != NULL) box->dashlength = data_real(attribute_first_data(attr), ctx); box->line_join = LINEJOIN_MITER; attr = object_find_attribute(obj_node, "line_join"); if (attr != NULL) box->line_join = data_enum(attribute_first_data(attr), ctx); box->corner_radius = 0.0; attr = object_find_attribute(obj_node, "corner_radius"); if (attr != NULL) box->corner_radius = data_real(attribute_first_data(attr), ctx); box->aspect = FREE_ASPECT; attr = object_find_attribute(obj_node, "aspect"); if (attr != NULL) box->aspect = data_enum(attribute_first_data(attr), ctx); element_init(elem, 8, NUM_CONNECTIONS); for (i=0;i<NUM_CONNECTIONS;i++) { obj->connections[i] = &box->connections[i]; box->connections[i].object = obj; box->connections[i].connected = NULL; } box->connections[8].flags = CP_FLAGS_MAIN; box_update_data(box); return &box->element.object; }
static Object * image_load(ObjectNode obj_node, int version, const char *filename) { Image *image; Element *elem; Object *obj; int i; AttributeNode attr; char *diafile_dir; image = g_malloc(sizeof(Image)); elem = (Element *)image; obj = (Object *)image; obj->type = &image_type; obj->ops = &image_ops; element_load(elem, obj_node); image->border_width = 0.1; attr = object_find_attribute(obj_node, "border_width"); if (attr != NULL) image->border_width = data_real( attribute_first_data(attr) ); image->border_color = color_black; attr = object_find_attribute(obj_node, "border_color"); if (attr != NULL) data_color(attribute_first_data(attr), &image->border_color); image->line_style = LINESTYLE_SOLID; attr = object_find_attribute(obj_node, "line_style"); if (attr != NULL) image->line_style = data_enum( attribute_first_data(attr) ); image->draw_border = TRUE; attr = object_find_attribute(obj_node, "draw_border"); if (attr != NULL) image->draw_border = data_boolean( attribute_first_data(attr) ); image->keep_aspect = TRUE; attr = object_find_attribute(obj_node, "keep_aspect"); if (attr != NULL) image->keep_aspect = data_boolean( attribute_first_data(attr) ); attr = object_find_attribute(obj_node, "file"); if (attr != NULL) { image->file = data_string( attribute_first_data(attr) ); } else { image->file = g_strdup(""); } element_init(elem, 8, 8); for (i=0;i<8;i++) { obj->connections[i] = &image->connections[i]; image->connections[i].object = obj; image->connections[i].connected = NULL; } image->image = NULL; if (strcmp(image->file, "")!=0) { diafile_dir = get_directory(filename); if (g_path_is_absolute(image->file)) { /* Absolute pathname */ image->image = dia_image_load(image->file); if (image->image == NULL) { /* Not found as abs path, try in same dir as diagram. */ char *temp_string; const char *image_file_name; image_file_name = strrchr(image->file, G_DIR_SEPARATOR) + 1; temp_string = g_malloc(strlen(diafile_dir) + strlen(image_file_name) +1); strcpy(temp_string, diafile_dir); strcat(temp_string, image_file_name); image->image = dia_image_load(temp_string); if (image->image != NULL) { /* Found file in same dir as diagram. */ message_warning(_("The image file '%s' was not found in that directory.\n" "Using the file '%s' instead\n"), image->file, temp_string); g_free(image->file); image->file = temp_string; } else { g_free(temp_string); image->image = dia_image_load((char *)image_file_name); if (image->image != NULL) { char *tmp; /* Found file in current dir. */ message_warning(_("The image file '%s' was not found in that directory.\n" "Using the file '%s' instead\n"), image->file, image_file_name); tmp = image->file; image->file = strdup(image_file_name); g_free(tmp); } else { message_warning(_("The image file '%s' was not found.\n"), image_file_name); } } } } else { /* Relative pathname: */ char *temp_string; temp_string = g_malloc(strlen(diafile_dir) + strlen(image->file) +1); strcpy(temp_string, diafile_dir); strcat(temp_string, image->file); image->image = dia_image_load(temp_string); if (image->image != NULL) { /* Found file in same dir as diagram. */ g_free(image->file); image->file = temp_string; } else { g_free(temp_string); image->image = dia_image_load(image->file); if (image->image == NULL) { /* Didn't find file in current dir. */ message_warning(_("The image file '%s' was not found.\n"), image->file); } } } g_free(diafile_dir); } image_update_data(image); return (Object *)image; }