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 * flow_load(ObjectNode obj_node, int version, DiaContext *ctx) { Flow *flow; AttributeNode attr; Connection *conn; DiaObject *obj; LineBBExtras *extra; flow = g_malloc0(sizeof(Flow)); conn = &flow->connection; obj = &conn->object; extra = &conn->extra_spacing; obj->type = &flow_type; obj->ops = &flow_ops; connection_load(conn, obj_node, ctx); connection_init(conn, 3, 0); flow->text = NULL; attr = object_find_attribute(obj_node, "text"); if (attr != NULL) flow->text = data_text(attribute_first_data(attr), ctx); else { /* pathologic */ DiaFont *font = dia_font_new_from_style(DIA_FONT_SANS, FLOW_FONTHEIGHT); flow->text = new_text("", font, FLOW_FONTHEIGHT, &obj->position, &color_black, ALIGN_CENTER); dia_font_unref(font); } attr = object_find_attribute(obj_node, "type"); if (attr != NULL) flow->type = (FlowType)data_int(attribute_first_data(attr), ctx); flow->text_handle.id = HANDLE_MOVE_TEXT; flow->text_handle.type = HANDLE_MINOR_CONTROL; flow->text_handle.connect_type = HANDLE_NONCONNECTABLE; flow->text_handle.connected_to = NULL; flow->text_handle.pos = flow->text->position; obj->handles[2] = &flow->text_handle; extra->start_long = extra->end_long = extra->start_trans = FLOW_WIDTH/2.0; extra->end_trans = MAX(FLOW_WIDTH, FLOW_ARROWLEN) / 2.0; flow->textpos = flow->text->position; flow_update_data(flow); return &flow->connection.object; }
static DiaObject * function_load(ObjectNode obj_node, int version, const char *filename) { Function *pkg; AttributeNode attr; Element *elem; DiaObject *obj; int i; pkg = g_malloc0(sizeof(Function)); elem = &pkg->element; obj = &elem->object; obj->type = &function_type; obj->ops = &function_ops; element_load(elem, obj_node); pkg->text = NULL; attr = object_find_attribute(obj_node, "text"); if (attr != NULL) pkg->text = data_text(attribute_first_data(attr)); attr = object_find_attribute(obj_node, "is_wish"); if (attr != NULL) pkg->is_wish = data_boolean(attribute_first_data(attr)); else pkg->is_wish = FALSE; attr = object_find_attribute(obj_node, "is_user"); if (attr != NULL) pkg->is_user = data_boolean(attribute_first_data(attr)); else pkg->is_user = FALSE; element_init(elem, 8, NUM_CONNECTIONS); for (i=0;i<NUM_CONNECTIONS;i++) { obj->connections[i] = &pkg->connections[i]; pkg->connections[i].object = obj; pkg->connections[i].connected = NULL; } pkg->connections[8].flags = CP_FLAGS_MAIN; pkg->element.extra_spacing.border_trans = pkg->text ? pkg->text->height : FUNCTION_FONTHEIGHT / FUNCTION_BORDERWIDTH_SCALE/2.0; function_update_data(pkg); for (i=0;i<8;i++) { obj->handles[i]->type = HANDLE_NON_MOVABLE; } return &pkg->element.object; }
Object *render_object_load(ObjectNode obj_node, const RenderObjectDescriptor *desc) { RenderObject *rend_obj; Element *elem; Object *obj; AttributeNode attr; int i; Point startpoint = {0.0, 0.0}; rend_obj = g_malloc(sizeof(RenderObject)); elem = &rend_obj->element; obj = &elem->object; obj->type = desc->obj_type; obj->ops = &rendobj_ops; element_load(elem, obj_node); rend_obj->desc = desc; rend_obj->magnify = 1.0; attr = object_find_attribute(obj_node, "magnify"); if (attr != NULL) rend_obj->magnify = data_real( attribute_first_data(attr) ); if (desc->use_text) { attr = object_find_attribute(obj_node, "text"); if (attr != NULL) rend_obj->text = data_text( attribute_first_data(attr) ); else rend_obj->text = new_text("", font_getfont("Courier"), 1.0, &startpoint, &color_black, ALIGN_CENTER); } element_init(elem, 8, desc->num_connection_points); rend_obj->connections = g_new(ConnectionPoint, desc->num_connection_points); for (i=0;i<desc->num_connection_points;i++) { obj->connections[i] = &rend_obj->connections[i]; rend_obj->connections[i].object = obj; rend_obj->connections[i].connected = NULL; } rendobj_update_data(rend_obj); return (Object *)rend_obj; }
static Object * state_load(ObjectNode obj_node, int version, const char *filename) { State *state; Element *elem; Object *obj; int i; AttributeNode attr; state = g_malloc(sizeof(State)); elem = &state->element; obj = (Object *) state; obj->type = &state_type; obj->ops = &state_ops; element_load(elem, obj_node); attr = object_find_attribute(obj_node, "text"); if (attr != NULL) state->text = data_text(attribute_first_data(attr)); attr = object_find_attribute(obj_node, "type"); if (attr != NULL) state->state_type = data_int(attribute_first_data(attr)); element_init(elem, 8, 8); for (i=0;i<8;i++) { obj->connections[i] = &state->connections[i]; state->connections[i].object = obj; state->connections[i].connected = NULL; } state_update_data(state); for (i=0;i<8;i++) { obj->handles[i]->type = HANDLE_NON_MOVABLE; } return (Object *)state; }
static Object * smallpackage_load(ObjectNode obj_node, int version, const char *filename) { SmallPackage *pkg; AttributeNode attr; Element *elem; Object *obj; int i; pkg = g_malloc(sizeof(SmallPackage)); elem = &pkg->element; obj = (Object *) pkg; obj->type = &smallpackage_type; obj->ops = &smallpackage_ops; element_load(elem, obj_node); pkg->text = NULL; attr = object_find_attribute(obj_node, "text"); if (attr != NULL) pkg->text = data_text(attribute_first_data(attr)); element_init(elem, 8, 8); for (i=0;i<8;i++) { obj->connections[i] = &pkg->connections[i]; pkg->connections[i].object = obj; pkg->connections[i].connected = NULL; } smallpackage_update_data(pkg); for (i=0;i<8;i++) { obj->handles[i]->type = HANDLE_NON_MOVABLE; } return (Object *) pkg; }
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; }