static void chronoref_update_data(Chronoref *chronoref) { Element *elem = &chronoref->element; DiaObject *obj = &elem->object; real time_span,t; Point p1,p2; Point ur_corner; int shouldbe,i; real labelwidth; char biglabel[10]; ElementBBExtras *extra = &elem->extra_spacing; chronoref->majgrad_height = elem->height; chronoref->mingrad_height = elem->height / 3.0; /* build i = -log_{10}(time_step), then make a %.if format out of it. */ t = 1; i = 0; while (t > chronoref->time_step) { t /= 10; i++; } chronoref->spec = i; /* update precision */ g_snprintf(biglabel,sizeof(biglabel),"%.*f", chronoref->spec, MIN(-ABS(chronoref->start_time),-ABS(chronoref->end_time))); labelwidth = dia_font_string_width(biglabel,chronoref->font, chronoref->font_size); /* Now, update the drawing helper counters */ time_span = chronoref->end_time - chronoref->start_time; if (time_span == 0) { chronoref->end_time = chronoref->start_time + .1; time_span = .1; } else if (time_span < 0) { chronoref->start_time = chronoref->end_time; time_span = -time_span; chronoref->end_time = chronoref->start_time + time_span; } chronoref->firstmaj = chronoref->time_step * ceil(chronoref->start_time / chronoref->time_step); if (chronoref->firstmaj < chronoref->start_time) chronoref->firstmaj += chronoref->time_step; chronoref->firstmin = chronoref->time_lstep * ceil(chronoref->start_time / chronoref->time_lstep); if (chronoref->firstmin < chronoref->start_time) chronoref->firstmin += chronoref->time_lstep; chronoref->firstmaj_x = elem->corner.x + elem->width*((chronoref->firstmaj-chronoref->start_time)/time_span); chronoref->firstmin_x = elem->corner.x + elem->width*((chronoref->firstmin-chronoref->start_time)/time_span); chronoref->majgrad = (chronoref->time_step * elem->width) / time_span; chronoref->mingrad = (chronoref->time_lstep * elem->width) / time_span; extra->border_trans = chronoref->main_lwidth/2; element_update_boundingbox(elem); /* fix boundingbox for special extras: */ obj->bounding_box.left -= (chronoref->font_size + labelwidth)/2; obj->bounding_box.bottom += chronoref->font_size; obj->bounding_box.right += (chronoref->font_size + labelwidth)/2; obj->position = elem->corner; element_update_handles(elem); /* Update connections: */ ur_corner.x = elem->corner.x + elem->width; ur_corner.y = elem->corner.y; shouldbe = (int)(ceil((chronoref->end_time-chronoref->firstmin)/ chronoref->time_lstep)); if (shouldbe == 0) shouldbe++; if (shouldbe < 0) shouldbe = 0; shouldbe++; /* off by one.. */ connpointline_adjust_count(chronoref->scale,shouldbe,&ur_corner); connpointline_update(chronoref->scale); point_copy(&p1,&elem->corner); point_copy(&p2,&ur_corner); p1.x -= chronoref->mingrad; p2.x += chronoref->mingrad; connpointline_putonaline(chronoref->scale,&p1,&p2, DIR_SOUTH); }
static void lifeline_update_data(Lifeline *lifeline) { Connection *conn = &lifeline->connection; DiaObject *obj = &conn->object; LineBBExtras *extra = &conn->extra_spacing; Point p1, p2, pnw, psw, pne, pse, pmw,pme; obj->position = conn->endpoints[0]; /* Update lifeline rbot using num. of cp and cp_distance */ lifeline->rbot = lifeline->rtop + lifeline_rect_size( lifeline ) ; /* Update conn->endpoints[0].y if rbot is greater */ if( conn->endpoints[1].y < conn->endpoints[0].y + lifeline->rbot ) conn->endpoints[1].y = conn->endpoints[0].y + lifeline->rbot + lifeline->cp_distance; /* box handles: */ p1.x = conn->endpoints[0].x; p1.y = conn->endpoints[0].y + lifeline->rtop; lifeline->boxtop_handle.pos = p1; p2.x = p1.x; p2.y = conn->endpoints[0].y + lifeline->rbot; lifeline->boxbot_handle.pos = p2; /* middle handle - between the cpls */ lifeline->boxmid_handle.pos.x = p1.x; lifeline->boxmid_handle.pos.y = p1.y + (lifeline->cp_distance * (lifeline->northwest->num_connections + 1)); connection_update_handles(conn); /* Boundingbox: */ extra->start_trans = extra->start_long = extra->end_long = extra->end_trans = LIFELINE_LINEWIDTH/2.0; if (lifeline->draw_focuscontrol) { extra->start_trans = extra->end_trans = MAX(LIFELINE_LINEWIDTH/2,(LIFELINE_WIDTH/2+LIFELINE_BOXWIDTH/2)); } if (lifeline->draw_cross) { extra->end_trans += LIFELINE_CROSSLEN; extra->end_long += LIFELINE_CROSSLEN; } connection_update_boundingbox(conn); if (lifeline->draw_focuscontrol) { p1.x -= LIFELINE_WIDTH/2.0; p2.x += LIFELINE_WIDTH/2.0; } /* Update connections: */ pnw.x = p1.x; pnw.y = p1.y; psw.x = p1.x; psw.y = p2.y; pne.x = p2.x; pne.y = p1.y; pse.x = p2.x; pse.y = p2.y; pmw.x = pnw.x; pme.x = pne.x; pmw.y = pme.y = (p1.y + lifeline->cp_distance * (lifeline->northwest->num_connections+1)); lifeline->connections[6].pos.x = conn->endpoints[0].x; lifeline->connections[6].pos.y = conn->endpoints[0].y + lifeline->rbot; lifeline->connections[6].directions = DIR_SOUTH; lifeline->connections[0].pos = pnw; lifeline->connections[1].pos = pne; lifeline->connections[2].pos = pmw; lifeline->connections[3].pos = pme; lifeline->connections[4].pos = psw; lifeline->connections[5].pos = pse; lifeline->connections[0].directions = DIR_NORTH|DIR_WEST; lifeline->connections[1].directions = DIR_NORTH|DIR_EAST; lifeline->connections[2].directions = DIR_WEST; lifeline->connections[3].directions = DIR_EAST; lifeline->connections[4].directions = DIR_SOUTH|DIR_WEST; lifeline->connections[5].directions = DIR_SOUTH|DIR_EAST; connpointline_update(lifeline->northwest); connpointline_putonaline(lifeline->northwest,&pnw,&pmw, DIR_WEST); connpointline_update(lifeline->southwest); connpointline_putonaline(lifeline->southwest,&pmw,&psw, DIR_WEST); connpointline_update(lifeline->northeast); connpointline_putonaline(lifeline->northeast,&pne,&pme, DIR_EAST); connpointline_update(lifeline->southeast); connpointline_putonaline(lifeline->southeast,&pme,&pse, DIR_EAST); }
static void other_update_data(Other *other, AnchorShape horiz, AnchorShape vert) { Element *elem = &other->element; ElementBBExtras *extra = &elem->extra_spacing; DiaObject *obj = &elem->object; Point center, bottom_right; Point p; real width, height; Point nw,ne,se,sw; /* save starting points */ center = bottom_right = elem->corner; center.x += elem->width/2; bottom_right.x += elem->width; center.y += elem->height/2; bottom_right.y += elem->height; text_calc_boundingbox(other->text, NULL); width = other->text->max_width + other->padding*2; height = other->text->height * other->text->numlines + other->padding*2; /* autoscale here */ if (width > elem->width) elem->width = width; if (height > elem->height) elem->height = height; if (elem->width<elem->height*1.5) elem->width=elem->height*1.5; /* move shape if necessary ... */ switch (horiz) { case ANCHOR_MIDDLE: elem->corner.x = center.x - elem->width/2; break; case ANCHOR_END: elem->corner.x = bottom_right.x - elem->width; break; default: break; } switch (vert) { case ANCHOR_MIDDLE: elem->corner.y = center.y - elem->height/2; break; case ANCHOR_END: elem->corner.y = bottom_right.y - elem->height; break; default: break; } p = elem->corner; p.x += elem->width / 2.0; p.y += elem->height / 2.0 - other->text->height * other->text->numlines / 2 + other->text->ascent; text_set_position(other->text, &p); extra->border_trans = OTHER_LINE_WIDTH / 2.0; element_update_boundingbox(elem); obj->position = elem->corner; element_update_handles(elem); /* Update connections: */ nw = elem->corner; se.x = nw.x + elem->width; se.y = nw.y + elem->height; ne.x = se.x; ne.y = nw.y; sw.y = se.y; sw.x = nw.x; connpointline_update(other->north); connpointline_putonaline(other->north,&ne,&nw,DIR_NORTH); connpointline_update(other->west); connpointline_putonaline(other->west,&nw,&sw,DIR_WEST); connpointline_update(other->south); connpointline_putonaline(other->south,&sw,&se,DIR_SOUTH); connpointline_update(other->east); connpointline_putonaline(other->east,&se,&ne,DIR_EAST); }
static void line_update_data(Line *line) { Connection *conn = &line->connection; DiaObject *obj = &conn->object; LineBBExtras *extra = &conn->extra_spacing; Point start, end; extra->start_trans = extra->end_trans = extra->start_long = extra->end_long = (line->line_width / 2.0); if (connpoint_is_autogap(line->connection.endpoint_handles[0].connected_to) || connpoint_is_autogap(line->connection.endpoint_handles[1].connected_to)) { connection_adjust_for_autogap(conn); } if (line->absolute_start_gap || line->absolute_end_gap ) { Point gap_endpoints[2]; line_adjust_for_absolute_gap(line, gap_endpoints); line_bbox(&gap_endpoints[0],&gap_endpoints[1], &conn->extra_spacing,&conn->object.bounding_box); start = gap_endpoints[0]; end = gap_endpoints[1]; } else { connection_update_boundingbox(conn); start = conn->endpoints[0]; end = conn->endpoints[1]; } if (line->start_arrow.type != ARROW_NONE) { Rectangle bbox; Point move_arrow, move_line; Point to = start; Point from = end; calculate_arrow_point(&line->start_arrow, &to, &from, &move_arrow, &move_line, line->line_width); /* move them */ point_sub(&to, &move_arrow); point_sub(&from, &move_line); arrow_bbox (&line->start_arrow, line->line_width, &to, &from, &bbox); rectangle_union (&obj->bounding_box, &bbox); } if (line->end_arrow.type != ARROW_NONE) { Rectangle bbox; Point move_arrow, move_line; Point to = end; Point from = start; calculate_arrow_point(&line->end_arrow, &to, &from, &move_arrow, &move_line, line->line_width); /* move them */ point_sub(&to, &move_arrow); point_sub(&from, &move_line); arrow_bbox (&line->end_arrow, line->line_width, &to, &from, &bbox); rectangle_union (&obj->bounding_box, &bbox); } obj->position = conn->endpoints[0]; connpointline_update(line->cpl); connpointline_putonaline(line->cpl, &start, &end, DIR_ALL); connection_update_handles(conn); }
static void other_update_data(Other *other, AnchorShape horiz, AnchorShape vert) { Element *elem = &other->element; ElementBBExtras *extra = &elem->extra_spacing; DiaObject *obj = &elem->object; Point center, bottom_right; Point p; real width, height; Point nw,ne,se,sw; /* save starting points */ center = bottom_right = elem->corner; center.x += elem->width/2; bottom_right.x += elem->width; center.y += elem->height/2; bottom_right.y += elem->height; text_calc_boundingbox(other->text, NULL); width = other->text->max_width + other->padding*2; /* reserve some place for agent icon */ if (other->type==AGENT) width+=AGENT_LEFT; height = other->text->height * other->text->numlines + other->padding*2; /* autoscale here */ if (width > elem->width) elem->width = width; if (height > elem->height) elem->height = height; /* some personal touch for agent */ if ((other->type==AGENT) && (elem->width<elem->height)) elem->width=elem->height; /* move shape if necessary ... */ switch (horiz) { case ANCHOR_MIDDLE: elem->corner.x = center.x - elem->width/2; break; case ANCHOR_END: elem->corner.x = bottom_right.x - elem->width; break; default: break; } switch (vert) { case ANCHOR_MIDDLE: elem->corner.y = center.y - elem->height/2; break; case ANCHOR_END: elem->corner.y = bottom_right.y - elem->height; break; default: break; } p = elem->corner; if (other->type==AGENT) p.x += (AGENT_LEFT+elem->width) / 2.0; else p.x += elem->width / 2.0; p.y += elem->height / 2.0 - other->text->height * other->text->numlines / 2 + other->text->ascent; text_set_position(other->text, &p); extra->border_trans = OTHER_LINE_DOUBLE_WIDTH / 2.0; element_update_boundingbox(elem); obj->position = elem->corner; element_update_handles(elem); /* Update connections: */ nw = elem->corner; se = bottom_right; ne.x = se.x; ne.y = nw.y; sw.y = se.y; sw.x = nw.x; connpointline_update(other->north); connpointline_putonaline(other->north,&ne,&nw); connpointline_update(other->west); connpointline_putonaline(other->west,&nw,&sw); connpointline_update(other->south); connpointline_putonaline(other->south,&sw,&se); connpointline_update(other->east); connpointline_putonaline(other->east,&se,&ne); other->center_cp.pos.x = (nw.x + se.x) / 2; other->center_cp.pos.y = (nw.y + se.y) / 2; }