[dia] Optional undo info by typedef ObjectChange * (* DiaCallbackFunc) (...)



commit 4fd757e02b1cd8ea0c16fdb6f7e5b31ef8897568
Author: Hans Breuer <hans breuer org>
Date:   Sun Sep 4 20:56:30 2011 +0200

    Optional undo info by typedef ObjectChange * (* DiaCallbackFunc) (...)
    
    Callback functions registered by plug-ins can now deliver change
    information for undo.

 app/menus.c                      |   16 +++++++++++-
 app/undo.c                       |   50 ++++++++++++++++++++++++++-----------
 lib/filter.h                     |    8 +++---
 lib/libdia.def                   |    3 ++
 lib/objchange.c                  |    5 ++-
 plug-ins/cairo/diacairo-print.c  |    3 +-
 plug-ins/cairo/diacairo-print.h  |    2 +-
 plug-ins/cairo/diacairo.c        |   10 ++++---
 plug-ins/postscript/postscript.c |    3 +-
 plug-ins/python/diamodule.c      |    6 +++-
 plug-ins/stress/stress.c         |    3 +-
 plug-ins/wmf/wmf.cpp             |    3 +-
 12 files changed, 79 insertions(+), 33 deletions(-)
---
diff --git a/app/menus.c b/app/menus.c
index 67300f3..b902309 100644
--- a/app/menus.c
+++ b/app/menus.c
@@ -42,6 +42,7 @@
 #include "widgets.h"
 #include "preferences.h"
 #include "filter.h"
+#include "objchange.h"
 
 #define DIA_STOCK_GROUP "dia-stock-group"
 #define DIA_STOCK_UNGROUP "dia-stock-ungroup"
@@ -1233,11 +1234,24 @@ plugin_callback (GtkWidget *widget, gpointer data)
   if (cbf->callback) {
     DDisplay *ddisp = NULL;
     DiagramData* diadata = NULL;
+    ObjectChange *change;
     /* stuff from the toolbox menu should never get a diagram to modify */
     if (strncmp (cbf->menupath, TOOLBOX_MENU, strlen (TOOLBOX_MENU)) != 0) {
       ddisp = ddisplay_active();
       diadata = ddisp ? ddisp->diagram->data : NULL;
     }
-    cbf->callback (diadata, ddisp ? ddisp->diagram->filename : NULL, 0, cbf->user_data);
+    change = cbf->callback (diadata, ddisp ? ddisp->diagram->filename : NULL, 0, cbf->user_data);
+    if (change != NULL) {
+      if (ddisp) {
+        undo_object_change(ddisp->diagram, NULL, change);
+        diagram_modified(ddisp->diagram);
+        diagram_update_extents(ddisp->diagram);
+        undo_set_transactionpoint(ddisp->diagram->undo);
+      } else { /* no diagram to keep the change, throw it away */
+        if (change->free)
+          change->free(change);
+        g_free(change);
+      }   
+    }
   }
 }
diff --git a/app/undo.c b/app/undo.c
index e6a80e5..bcdd4d3 100644
--- a/app/undo.c
+++ b/app/undo.c
@@ -851,39 +851,59 @@ struct ObjectChangeChange {
   ObjectChange *obj_change;
 };
 
-
+static void
+_connections_update_func (gpointer data, gpointer user_data)
+{
+  DiaObject *obj = data;
+  Diagram   *dia = (Diagram *)user_data;
+  
+  diagram_update_connections_object(dia, obj, TRUE);
+}
 static void
 object_change_apply(struct ObjectChangeChange *change,
 		    Diagram *dia)
 {
-  object_add_updates(change->obj, dia);
+  if (change->obj)
+    object_add_updates(change->obj, dia);
+
   change->obj_change->apply(change->obj_change, change->obj);
-  { /* Make sure object updates its data: */
+
+  if (change->obj) {
+    /* Make sure object updates its data: */
     Point p = change->obj->position;
     (change->obj->ops->move)(change->obj,&p);
-  }
-  object_add_updates(change->obj, dia);
-  
-  diagram_update_connections_object(dia, change->obj, TRUE);
 
-  properties_update_if_shown(dia, change->obj);
+    object_add_updates(change->obj, dia);
+    diagram_update_connections_object(dia, change->obj, TRUE);
+    properties_update_if_shown(dia, change->obj);
+  } else {
+    /* pretty big hammer - update all connections */
+    data_foreach_object (DIA_DIAGRAM_DATA (dia), _connections_update_func, dia);
+    diagram_add_update_all(dia);
+  }
 }
 
 static void
 object_change_revert(struct ObjectChangeChange *change,
 		     Diagram *dia)
 {
-  object_add_updates(change->obj, dia);
+  if (change->obj)
+    object_add_updates(change->obj, dia);
+
   change->obj_change->revert(change->obj_change, change->obj);
-  { /* Make sure object updates its data: */
+
+  if (change->obj) {
+    /* Make sure object updates its data: */
     Point p = change->obj->position;
     (change->obj->ops->move)(change->obj,&p);
-  }
-  object_add_updates(change->obj, dia);
-  
-  diagram_update_connections_object(dia, change->obj, TRUE);
 
-  properties_update_if_shown(dia, change->obj);
+    object_add_updates(change->obj, dia);  
+    diagram_update_connections_object(dia, change->obj, TRUE);
+    properties_update_if_shown(dia, change->obj);
+  } else {
+    data_foreach_object (DIA_DIAGRAM_DATA (dia), _connections_update_func, dia);
+    diagram_add_update_all(dia);
+  }
 }
 
 static void
diff --git a/lib/filter.h b/lib/filter.h
index 803d5c8..2d68691 100644
--- a/lib/filter.h
+++ b/lib/filter.h
@@ -75,10 +75,10 @@ struct _DiaImportFilter {
 };
 
 /* gets called as menu callback */
-typedef void (* DiaCallbackFunc) (DiagramData *dia,
-                                  const gchar *filename, /* the original filename */
-                                  guint flags, /* further additions */
-                                  void* user_data);
+typedef ObjectChange * (* DiaCallbackFunc) (DiagramData *dia,
+					    const gchar *filename, /* the original filename */
+					    guint flags, /* further additions */
+					    void* user_data);
 
 struct _DiaCallbackFilter {
   const gchar *action;
diff --git a/lib/libdia.def b/lib/libdia.def
index fa55e43..530cafd 100644
--- a/lib/libdia.def
+++ b/lib/libdia.def
@@ -81,6 +81,9 @@ EXPORTS
 
  calculate_arrow_point
 
+ change_list_add
+ change_list_create
+
  color_convert
  color_equals
  color_init
diff --git a/lib/objchange.c b/lib/objchange.c
index 7695e84..3530662 100644
--- a/lib/objchange.c
+++ b/lib/objchange.c
@@ -155,6 +155,7 @@ void
 change_list_add (ObjectChange *change_list, ObjectChange *change)
 {
   ObjectChangeList *list = (ObjectChangeList *)change_list;
-  
-  g_ptr_array_add (list->changes, change);
+
+  if (change)
+    g_ptr_array_add (list->changes, change);
 }
diff --git a/plug-ins/cairo/diacairo-print.c b/plug-ins/cairo/diacairo-print.c
index 4b4a130..2721297 100644
--- a/plug-ins/cairo/diacairo-print.c
+++ b/plug-ins/cairo/diacairo-print.c
@@ -233,7 +233,7 @@ create_print_operation (DiagramData *data, const char *name)
   return operation;
 }
 
-void
+ObjectChange *
 cairo_print_callback (DiagramData *data,
                       const gchar *filename,
                       guint flags, /* further additions */
@@ -248,4 +248,5 @@ cairo_print_callback (DiagramData *data,
     message_error (error->message);
     g_error_free (error);
   }
+  return NULL;
 }
diff --git a/plug-ins/cairo/diacairo-print.h b/plug-ins/cairo/diacairo-print.h
index ffce88e..526e9bf 100644
--- a/plug-ins/cairo/diacairo-print.h
+++ b/plug-ins/cairo/diacairo-print.h
@@ -8,7 +8,7 @@ GtkPrintOperation *
 create_print_operation (DiagramData *data, 
 			const char *name);
 
-void
+ObjectChange *
 cairo_print_callback (DiagramData *dia,
                       const gchar *filename,
                       guint flags, /* further additions */
diff --git a/plug-ins/cairo/diacairo.c b/plug-ins/cairo/diacairo.c
index 363198f..d32b630 100644
--- a/plug-ins/cairo/diacairo.c
+++ b/plug-ins/cairo/diacairo.c
@@ -453,16 +453,18 @@ static DiaExportFilter wmf_export_filter = {
     FILTER_DONT_GUESS /* don't use this if not asked explicit */
 };
 
-void
+static ObjectChange *
 cairo_clipboard_callback (DiagramData *data,
                           const gchar *filename,
                           guint flags, /* further additions */
                           void *user_data)
 {
-  g_return_if_fail ((OutputKind)user_data == OUTPUT_CLIPBOARD);
-  g_return_if_fail (data != NULL);
+  g_return_val_if_fail ((OutputKind)user_data == OUTPUT_CLIPBOARD, NULL);
+  g_return_val_if_fail (data != NULL, NULL);
   /* filename is not necessary */
-  export_data (data, filename, filename, user_data); 
+  export_data (data, filename, filename, user_data);
+
+  return NULL;
 }
 
 static DiaCallbackFilter cb_clipboard = {
diff --git a/plug-ins/postscript/postscript.c b/plug-ins/postscript/postscript.c
index 9af45ac..26b2223 100644
--- a/plug-ins/postscript/postscript.c
+++ b/plug-ins/postscript/postscript.c
@@ -29,7 +29,7 @@
 #include "render_eps.h"
 #include "paginate_psprint.h"
 
-static void
+static ObjectChange *
 print_callback (DiagramData *data,
                 const gchar *filename,
                 guint flags, /* further additions */
@@ -39,6 +39,7 @@ print_callback (DiagramData *data,
     message_error (_("Nothing to print"));
   else
     diagram_print_ps (data, filename ? filename : "output.ps");
+  return NULL;
 }
 
 static DiaCallbackFilter cb_ps_print = {
diff --git a/plug-ins/python/diamodule.c b/plug-ins/python/diamodule.c
index 01a0b2e..f03c6c6 100644
--- a/plug-ins/python/diamodule.c
+++ b/plug-ins/python/diamodule.c
@@ -342,13 +342,13 @@ PyDia_RegisterImport(PyObject *self, PyObject *args)
  * It needs to be registered before via Python function 
  * dia.register_action (or dia.register_callback)
  */
-static void
+static ObjectChange *
 PyDia_callback_func (DiagramData *dia, const gchar *filename, guint flags, void *user_data)
 {
     PyObject *diaobj, *res, *arg, *func = user_data;
     if (!func || !PyCallable_Check (func)) {
         g_warning ("Callback called without valid callback function.");
-        return;
+        return NULL;
     }
   
     if (dia)
@@ -369,6 +369,8 @@ PyDia_callback_func (DiagramData *dia, const gchar *filename, guint flags, void
 
     Py_DECREF(func);
     Py_XDECREF(diaobj);
+
+    return NULL;
 }
 
 static PyObject *
diff --git a/plug-ins/stress/stress.c b/plug-ins/stress/stress.c
index f746a96..1df306e 100644
--- a/plug-ins/stress/stress.c
+++ b/plug-ins/stress/stress.c
@@ -27,7 +27,7 @@
 
 #include "stress-memory.h"
 
-static void
+static ObjectChange *
 stress_memory_callback (DiagramData *data,
                        const gchar *filename,
                        guint flags, /* further additions */
@@ -51,6 +51,7 @@ stress_memory_callback (DiagramData *data,
   } else {
     message_error ("Failed to calculate available memory.");
   }
+  return NULL;
 }
 
 static DiaCallbackFilter cb_stress_memory = {
diff --git a/plug-ins/wmf/wmf.cpp b/plug-ins/wmf/wmf.cpp
index 6524b0e..5a1e55d 100644
--- a/plug-ins/wmf/wmf.cpp
+++ b/plug-ins/wmf/wmf.cpp
@@ -1478,7 +1478,7 @@ static DiaExportFilter emf_export_filter = {
 };
 
 #ifdef G_OS_WIN32
-static void
+static ObjectChange *
 print_callback (DiagramData *data,
                 const gchar *filename,
 		guint        flags,
@@ -1488,6 +1488,7 @@ print_callback (DiagramData *data,
     message_error (_("Nothing to print"));
   else
     diagram_print_gdi (data, filename);
+  return NULL;
 }
 
 static DiaCallbackFilter cb_gdi_print = {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]