1 diff -Nur dia-0.91-pre3.orig/objects/UML/state.c dia-0.91-pre3/objects/UML/state.c
2 --- dia-0.91-pre3.orig/objects/UML/state.c Sun Jan 26 07:44:52 2003
3 +++ dia-0.91-pre3/objects/UML/state.c Mon Feb 24 10:46:59 2003
5 /* Dia -- an diagram creation/manipulation program
6 * Copyright (C) 1998 Alexander Larsson
8 + * State type for UML diagrams
9 + * Copyright (C) 2003 Alejandro Sierra <asierra@servidor.unam.mx>
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
15 ConnectionPoint connections[8];
29 Warning: break this and you'll get angry UML users after you. */
30 { "type", PROP_TYPE_INT, PROP_FLAG_NO_DEFAULTS|PROP_FLAG_LOAD_ONLY,
36 - { "text", PROP_TYPE_TEXT, 0, N_("Text"), NULL, NULL },
39 + { "text", PROP_TYPE_TEXT, 0, N_("Text"), NULL, NULL },
40 + { "show_internals", PROP_TYPE_BOOL, PROP_FLAG_VISIBLE,
41 + N_("Show internals"),NULL,NULL},
42 + { "internals", PROP_TYPE_TEXT, 0, N_("Internals"), NULL, NULL },
43 + { NULL, 0, 0, NULL, NULL, NULL, 0}
47 static PropDescription *
51 static PropOffset state_offsets[] = {
52 - ELEMENT_COMMON_PROPERTIES_OFFSETS,
53 + ELEMENT_COMMON_PROPERTIES_OFFSETS,
54 {"text",PROP_TYPE_TEXT,offsetof(State,text)},
55 {"text_font",PROP_TYPE_FONT,offsetof(State,attrs.font)},
56 {"text_height",PROP_TYPE_REAL,offsetof(State,attrs.height)},
58 if sizeof(enum) != sizeof(int), we're toast. -- CC
60 { "type", PROP_TYPE_INT, offsetof(State, state_type) },
62 + { "show_internals", PROP_TYPE_BOOL, offsetof(State, show_internals) },
63 + {"internals",PROP_TYPE_TEXT,offsetof(State,internals)},
69 state_set_props(State *state, GPtrArray *props)
71 + TextAttributes attrs;
73 object_set_props_from_offsets(&state->element.object,
75 apply_textattr_properties(props,state->text,"text",&state->attrs);
76 + attrs = state->attrs;
77 + attrs.alignment = ALIGN_LEFT;
78 + apply_textattr_properties(props,state->internals,"internals",&attrs);
79 state_update_data(state);
83 state_select(State *state, Point *clicked_point,
84 DiaRenderer *interactive_renderer)
86 - text_set_cursor(state->text, clicked_point, interactive_renderer);
87 - text_grab_focus(state->text, &state->element.object);
88 + Text *text = (state->show_internals && clicked_point->y >=
89 + state->internals->position.y - state->internals->height) ?
90 + state->internals : state->text;
92 + text_set_cursor(text, clicked_point, interactive_renderer);
93 + text_grab_focus(text, &state->element.object);
94 element_update_handles(&state->element);
98 renderer_ops->set_linewidth(renderer, STATE_LINEWIDTH);
99 renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
101 - if (state->state_type!=STATE_NORMAL) {
104 - if (state->state_type==STATE_END) {
105 - r = STATE_ENDRATIO;
106 - renderer_ops->fill_ellipse(renderer,
111 - renderer_ops->draw_ellipse(renderer,
117 - renderer_ops->fill_ellipse(renderer,
122 + if (state->state_type==STATE_NORMAL) {
126 @@ -257,14 +255,28 @@
127 renderer_ops->fill_rounded_rect(renderer, &p1, &p2, &color_white, 0.5);
128 renderer_ops->draw_rounded_rect(renderer, &p1, &p2, &color_black, 0.5);
129 text_draw(state->text, renderer);
131 + if (state->show_internals) {
132 + p1.x = x; p2.x = x + w;
133 + p1.y = p2.y = state->internals->position.y - state->internals->ascent
134 + - 0.5*STATE_MARGIN_Y;
136 + renderer_ops->set_linewidth(renderer, 0.1);
137 + renderer_ops->draw_line(renderer,
141 + text_draw(state->internals, renderer);
144 + message_warning(_("Please use initial/final state instead"));
150 state_update_data(State *state)
153 + real w=0, h=0, x=0;
155 Element *elem = &state->element;
156 Object *obj = &elem->object;
157 @@ -274,13 +286,24 @@
158 if (state->state_type==STATE_NORMAL) {
159 w = state->text->max_width + 2*STATE_MARGIN_X;
160 h = state->text->height*state->text->numlines +2*STATE_MARGIN_Y;
161 - if (w < STATE_WIDTH)
164 + x = (state->show_internals) ?
165 + state->internals->max_width + 2*STATE_MARGIN_X:
170 p.x = elem->corner.x + w/2.0;
171 - p.y = elem->corner.y + STATE_MARGIN_Y + state->text->ascent;
172 + p.y = elem->corner.y + state->text->ascent +
173 + ((state->show_internals) ? STATE_MARGIN_Y/2.0: STATE_MARGIN_Y);
175 text_set_position(state->text, &p);
177 - w = h = (state->state_type==STATE_END) ? STATE_ENDRATIO: STATE_RATIO;
178 + if (state->show_internals) {
179 + p.x = elem->corner.x + STATE_MARGIN_X;
180 + p.y += STATE_MARGIN_Y + state->internals->height;
181 + h += state->internals->height*state->internals->numlines;
182 + text_set_position(state->internals, &p);
187 @@ -339,11 +362,14 @@
188 p.y += STATE_HEIGHT/2.0;
190 state->text = new_text("", font, 0.8, &p, &color_black, ALIGN_CENTER);
191 - text_get_attributes(state->text,&state->attrs);
192 + text_get_attributes(state->text,&state->attrs);
193 + state->internals = new_text("", font, 0.8, &p, &color_black, ALIGN_LEFT);
195 dia_font_unref(font);
197 state->state_type = STATE_NORMAL;
198 + state->show_internals = 0;
200 element_init(elem, 8, 8);
204 state_destroy(State *state)
206 text_destroy(state->text);
208 + text_destroy(state->internals);
209 element_destroy(&state->element);