[dia] Allow to increase the width of 'UML - CLass'
- From: Hans Breuer <hans src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [dia] Allow to increase the width of 'UML - CLass'
- Date: Sat, 3 Oct 2009 13:59:48 +0000 (UTC)
commit 4e73db4ad9ab4b9f84a86e8091e40be93688b262
Author: Hans Breuer <hans breuer org>
Date: Sat Oct 3 13:48:40 2009 +0200
Allow to increase the width of 'UML - CLass'
Formerly 'UML - Class' was automatically sized by it's content.
Now it's width can be grown beyond that when "<context>/Allow resizing"
is switched on. The default remains off to keep forward compatibility
with previous versions.
lib/libdia.def | 2 +
lib/properties.h | 1 +
lib/propobject.c | 12 ++++++++
objects/UML/class.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++----
objects/UML/class.h | 16 ++++++----
5 files changed, 95 insertions(+), 14 deletions(-)
---
diff --git a/lib/libdia.def b/lib/libdia.def
index d045631..b6b9db8 100644
--- a/lib/libdia.def
+++ b/lib/libdia.def
@@ -373,6 +373,7 @@ EXPORTS
element_init
element_load
element_move_handle
+ element_move_handle_aspect
element_save
element_update_boundingbox
element_update_handles
@@ -516,6 +517,7 @@ EXPORTS
object_save_props
object_save_using_properties
object_set_props_from_offsets
+ object_toggle_prop
object_unconnect
orthconn_add_segment
diff --git a/lib/properties.h b/lib/properties.h
index 091605d..7ebf73d 100644
--- a/lib/properties.h
+++ b/lib/properties.h
@@ -422,6 +422,7 @@ gboolean object_set_props_from_offsets(DiaObject *obj, PropOffset *offsets,
/* apply some properties and return a corresponding object change */
ObjectChange *object_apply_props(DiaObject *obj, GPtrArray *props);
+ObjectChange *object_toggle_prop (DiaObject *obj, const char *pname, gboolean val);
/* standard properties dialogs that can be used for objects that
* implement describe_props, get_props and set_props.
diff --git a/lib/propobject.c b/lib/propobject.c
index a322c44..3b04088 100644
--- a/lib/propobject.c
+++ b/lib/propobject.c
@@ -149,6 +149,18 @@ object_apply_props(DiaObject *obj, GPtrArray *props)
return (ObjectChange *)change;
}
+/*!
+ * Toggle a boolean property including change management
+ */
+ObjectChange *
+object_toggle_prop (DiaObject *obj, const char *pname, gboolean val)
+{
+ Property *prop = make_new_prop (pname, PROP_TYPE_BOOL, 0);
+ GPtrArray *plist = prop_list_from_single (prop);
+
+ ((BoolProperty *)prop)->bool_data = val;
+ return object_apply_props (obj, plist);
+}
/* Get/Set routines */
diff --git a/objects/UML/class.c b/objects/UML/class.c
index 4caa8a2..f28d623 100644
--- a/objects/UML/class.c
+++ b/objects/UML/class.c
@@ -69,6 +69,7 @@ static DiaObject *umlclass_load(ObjectNode obj_node, int version,
static DiaMenu * umlclass_object_menu(DiaObject *obj, Point *p);
static ObjectChange *umlclass_show_comments_callback(DiaObject *obj, Point *pos, gpointer data);
+static ObjectChange *umlclass_allow_resizing_callback(DiaObject *obj, Point *pos, gpointer data);
static PropDescription *umlclass_describe_props(UMLClass *umlclass);
static void umlclass_get_props(UMLClass *umlclass, GPtrArray *props);
@@ -169,6 +170,8 @@ static PropDescription umlclass_props[] = {
N_("Comment line length"), NULL, NULL},
{ "comment_tagging", PROP_TYPE_BOOL, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL,
N_("Comment tagging"), NULL, NULL},
+ { "allow_resizing", PROP_TYPE_BOOL, PROP_FLAG_VISIBLE | PROP_FLAG_OPTIONAL,
+ N_("Allow resizing"), NULL, NULL},
/* all this just to make the defaults selectable ... */
PROP_NOTEBOOK_PAGE("font", PROP_FLAG_DONT_MERGE, N_("Font")),
@@ -282,7 +285,8 @@ static PropOffset umlclass_offsets[] = {
{ "wrap_after_char", PROP_TYPE_INT, offsetof(UMLClass , wrap_after_char) },
{ "comment_line_length", PROP_TYPE_INT, offsetof(UMLClass, comment_line_length) },
{ "comment_tagging", PROP_TYPE_BOOL, offsetof(UMLClass, comment_tagging) },
-
+ { "allow_resizing", PROP_TYPE_BOOL, offsetof(UMLClass, allow_resizing) },
+
/* all this just to make the defaults selectable ... */
PROP_OFFSET_MULTICOL_BEGIN("class"),
PROP_OFFSET_MULTICOL_COLUMN("font"),
@@ -317,7 +321,9 @@ umlclass_get_props(UMLClass * umlclass, GPtrArray *props)
}
static DiaMenuItem umlclass_menu_items[] = {
- { N_("Show Comments"), umlclass_show_comments_callback, NULL,
+ { N_("Show comments"), umlclass_show_comments_callback, NULL,
+ DIAMENU_ACTIVE|DIAMENU_TOGGLE },
+ { N_("Allow resizing"), umlclass_allow_resizing_callback, NULL,
DIAMENU_ACTIVE|DIAMENU_TOGGLE },
};
@@ -333,6 +339,8 @@ umlclass_object_menu(DiaObject *obj, Point *p)
{
umlclass_menu_items[0].active = DIAMENU_ACTIVE|DIAMENU_TOGGLE|
(((UMLClass *)obj)->visible_comments?DIAMENU_TOGGLE_ON:0);
+ umlclass_menu_items[1].active = DIAMENU_ACTIVE|DIAMENU_TOGGLE|
+ (((UMLClass *)obj)->allow_resizing?DIAMENU_TOGGLE_ON:0);
return ¨class_menu;
}
@@ -358,7 +366,7 @@ _comment_set_state (DiaObject *obj, ObjectState *state)
umlclass_update_data((UMLClass *)obj);
}
-ObjectChange *
+static ObjectChange *
umlclass_show_comments_callback(DiaObject *obj, Point *pos, gpointer data)
{
ObjectState *old_state = _comment_get_state(obj);
@@ -370,6 +378,29 @@ umlclass_show_comments_callback(DiaObject *obj, Point *pos, gpointer data)
return change;
}
+static ObjectChange *
+umlclass_allow_resizing_callback(DiaObject *obj, Point *pos, gpointer data)
+{
+ pos; /* unused */
+ data; /* unused */
+
+ return object_toggle_prop(obj, "allow_resizing", !((UMLClass *)obj)->allow_resizing);
+}
+
+static void
+umlclass_reflect_resizing(UMLClass *umlclass)
+{
+ Element *elem = ¨class->element;
+
+ element_update_handles(elem);
+
+ g_assert (elem->resize_handles[3].id == HANDLE_RESIZE_W);
+ g_assert (elem->resize_handles[4].id == HANDLE_RESIZE_E);
+
+ elem->resize_handles[3].type = umlclass->allow_resizing ? HANDLE_MAJOR_CONTROL : HANDLE_NON_MOVABLE;
+ elem->resize_handles[4].type = umlclass->allow_resizing ? HANDLE_MAJOR_CONTROL : HANDLE_NON_MOVABLE;
+}
+
static void
umlclass_set_props(UMLClass *umlclass, GPtrArray *props)
{
@@ -434,6 +465,8 @@ umlclass_set_props(UMLClass *umlclass, GPtrArray *props)
obj->connections[num]->object = obj;
#endif
+ umlclass_reflect_resizing(umlclass);
+
umlclass_calculate_data(umlclass);
umlclass_update_data(umlclass);
#ifdef DEBUG
@@ -462,12 +495,26 @@ umlclass_move_handle(UMLClass *umlclass, Handle *handle,
Point *to, ConnectionPoint *cp,
HandleMoveReason reason, ModifierKeys modifiers)
{
+ Element *elem = ¨class->element;
+
assert(umlclass!=NULL);
assert(handle!=NULL);
assert(to!=NULL);
-
assert(handle->id < UMLCLASS_CONNECTIONPOINTS);
+ if (handle->type != HANDLE_NON_MOVABLE) {
+ if (handle->id == HANDLE_RESIZE_E || handle->id == HANDLE_RESIZE_W) {
+ real dist = (handle->id == HANDLE_RESIZE_E) ?
+ to->x - elem->resize_handles[3].pos.x :
+ elem->resize_handles[4].pos.x - to->x;
+ if (umlclass->min_width <= dist) {
+ ObjectChange *oc = element_move_handle (elem, handle->id, to, cp, reason, modifiers);
+ umlclass_update_data(umlclass);
+ return oc;
+ }
+ }
+ }
+
return NULL;
}
@@ -1603,7 +1650,12 @@ umlclass_calculate_operation_data(UMLClass *umlclass)
}
}
- umlclass->element.width = maxwidth + 2*0.3;
+ if (!umlclass->allow_resizing)
+ umlclass->element.width = maxwidth + 2*0.3;
+ else {
+ umlclass->min_width = maxwidth + 2*0.3;
+ umlclass->element.width = MAX(umlclass->element.width, umlclass->min_width);
+ }
if ((umlclass->operationsbox_height<0.4) || umlclass->suppress_operations ) {
umlclass->operationsbox_height = 0.4;
@@ -1621,7 +1673,9 @@ umlclass_calculate_operation_data(UMLClass *umlclass)
* comment within the box. The various font settings with in the class
* properties contribute to the overall size of the resulting bounding box.
*
- * * @param umlclass a pointer to an object of UMLClass
+ * @param umlclass a pointer to an object of UMLClass
+ *
+ * @return the horizontial size of the box
*
*/
void
@@ -1632,6 +1686,7 @@ umlclass_calculate_data(UMLClass *umlclass)
real maxwidth = 0.0;
real width;
GList *list;
+ real min_box_width;
if (!umlclass->destroyed)
{
@@ -1647,7 +1702,12 @@ umlclass_calculate_data(UMLClass *umlclass)
maxwidth = MAX(umlclass_calculate_operation_data(umlclass), maxwidth);
umlclass->element.height += umlclass->operationsbox_height;
}
- umlclass->element.width = maxwidth+0.5;
+ if (!umlclass->allow_resizing)
+ umlclass->element.width = maxwidth+0.5;
+ else {
+ umlclass->min_width = maxwidth+0.5;
+ umlclass->element.width = MAX(umlclass->element.width, umlclass->min_width);
+ }
/* templates box: */
num_templates = g_list_length(umlclass->formal_params);
@@ -1956,6 +2016,7 @@ umlclass_copy(UMLClass *umlclass)
newumlclass->wrap_after_char = umlclass->wrap_after_char;
newumlclass->comment_line_length = umlclass->comment_line_length;
newumlclass->comment_tagging = umlclass->comment_tagging;
+ newumlclass->allow_resizing = umlclass->allow_resizing;
newumlclass->line_width = umlclass->line_width;
newumlclass->text_color = umlclass->text_color;
newumlclass->line_color = umlclass->line_color;
@@ -2103,6 +2164,8 @@ umlclass_save(UMLClass *umlclass, ObjectNode obj_node,
umlclass->comment_line_length);
data_add_boolean(new_attribute(obj_node, "comment_tagging"),
umlclass->comment_tagging);
+ data_add_boolean(new_attribute(obj_node, "allow_resizing"),
+ umlclass->allow_resizing);
data_add_real(new_attribute(obj_node, PROP_STDNAME_LINE_WIDTH),
umlclass->line_width);
data_add_color(new_attribute(obj_node, "line_color"),
@@ -2306,6 +2369,7 @@ static DiaObject *umlclass_load(ObjectNode obj_node, int version,
for (i=0;i<8;i++) {
obj->handles[i]->type = HANDLE_NON_MOVABLE;
}
+ umlclass_reflect_resizing(umlclass);
#ifdef DEBUG
umlclass_sanity_check(umlclass, "Loaded class");
diff --git a/objects/UML/class.h b/objects/UML/class.h
index 07d5092..539e927 100644
--- a/objects/UML/class.h
+++ b/objects/UML/class.h
@@ -119,6 +119,7 @@ struct _UMLClass {
/** Template parameters */
GList *formal_params;
+ gboolean allow_resizing;
/* Calculated variables: */
real namebox_height;
@@ -127,9 +128,10 @@ struct _UMLClass {
real attributesbox_height;
real operationsbox_height;
-/*
- GList *operations_wrappos;*/
+
int max_wrapped_line_width;
+ /*! chached for resizing */
+ real min_width;
real templates_height;
real templates_width;
@@ -145,11 +147,11 @@ struct _UMLClass {
};
void umlclass_dialog_free (UMLClassDialog *dialog);
-extern GtkWidget *umlclass_get_properties(UMLClass *umlclass, gboolean is_default);
-extern ObjectChange *umlclass_apply_props_from_dialog(UMLClass *umlclass, GtkWidget *widget);
-extern void umlclass_calculate_data(UMLClass *umlclass);
-extern void umlclass_update_data(UMLClass *umlclass);
+GtkWidget *umlclass_get_properties(UMLClass *umlclass, gboolean is_default);
+ObjectChange *umlclass_apply_props_from_dialog(UMLClass *umlclass, GtkWidget *widget);
+void umlclass_calculate_data(UMLClass *umlclass);
+void umlclass_update_data(UMLClass *umlclass);
-extern void umlclass_sanity_check(UMLClass *c, gchar *msg);
+void umlclass_sanity_check(UMLClass *c, gchar *msg);
#endif /* CLASS_H */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]