[dia] Allow to increase the width of 'UML - CLass'



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 &umlclass_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 = &umlclass->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 = &umlclass->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]