[gnumeric] Make Autofilter addition & removal undoable [#478152]



commit 32f057e57e14160e0ff9f1aa1123942e14910962
Author: Andreas J. Guelzow <aguelzow pyrshep ca>
Date:   Wed Oct 28 00:55:49 2009 -0600

    Make Autofilter addition & removal undoable [#478152]
    
    2009-10-28  Andreas J. Guelzow <aguelzow pyrshep ca>
    
    	* src/commands.h (cmd_autofilter_add_remove): new
    	* src/commands.c (cmd_autofilter_add_remove): new
    	(cmd_autofilter_add_remove_impl): new
    	(cmd_autofilter_add_remove_undo): new
    	(cmd_autofilter_add_remove_redo): new
    	(cmd_autofilter_add_remove_finalize): new
    	fixes # 478152
    	* src/sheet-filter.h (gnm_filter_attach): publish
    	* src/sheet-filter.c (gnm_filter_attach): publish
    	  create field selectors here rather than in
    	(gnm_filter_new)
    	(gnm_filter_remove): delete field selectors here rather than in
    	(gnm_filter_unref)
    	* src/wbc-gtk-actions.c (cb_auto_filter): just call
    	  cmd_autofilter_add_remove

 ChangeLog             |   18 ++++++++
 NEWS                  |    1 +
 src/commands.c        |  109 +++++++++++++++++++++++++++++++++++++++++++++++++
 src/commands.h        |    4 +-
 src/sheet-filter.c    |   26 ++++++-----
 src/sheet-filter.h    |    1 +
 src/wbc-gtk-actions.c |   39 +-----------------
 7 files changed, 146 insertions(+), 52 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 98c78e7..57d46d4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2009-10-28  Andreas J. Guelzow <aguelzow pyrshep ca>
+
+	* src/commands.h (cmd_autofilter_add_remove): new
+	* src/commands.c (cmd_autofilter_add_remove): new
+	(cmd_autofilter_add_remove_impl): new
+	(cmd_autofilter_add_remove_undo): new
+	(cmd_autofilter_add_remove_redo): new
+	(cmd_autofilter_add_remove_finalize): new
+	fixes # 478152
+	* src/sheet-filter.h (gnm_filter_attach): publish
+	* src/sheet-filter.c (gnm_filter_attach): publish
+	  create field selectors here rather than in 
+	(gnm_filter_new)
+	(gnm_filter_remove): delete field selectors here rather than in
+	(gnm_filter_unref)
+	* src/wbc-gtk-actions.c (cb_auto_filter): just call 
+	  cmd_autofilter_add_remove
+
 2009-10-27  Morten Welinder  <terra gnome org>
 
 	* src/wbc-gtk.c (wbcg_error_error): Don't xml-escape the text.
diff --git a/NEWS b/NEWS
index 9998637..f2cd3e2 100644
--- a/NEWS
+++ b/NEWS
@@ -9,6 +9,7 @@ Andreas:
 	  SHEET and NUMBERVALUE.
 	* Work around OpenOffice.org saving function names in lowercase.
 	* Add BINOM.DIST.RANGE (equivalent to the ODF function B).
+	* Make Autofilter addition & removal undoable [#478152]
 
 Jody:
 	* First steps towards a turnkey win32 build.
diff --git a/src/commands.c b/src/commands.c
index b91a2e6..548ee9e 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -64,7 +64,9 @@
 #include "sheet-object.h"
 #include "sheet-object-graph.h"
 #include "sheet-control.h"
+#include "sheet-utils.h"
 #include "style-color.h"
+#include "sheet-filter.h"
 #include "auto-format.h"
 #include "tools/dao.h"
 #include "gnumeric-gconf.h"
@@ -7573,3 +7575,110 @@ cmd_so_set_adjustment (WorkbookControl *wbc,
 }
 
 /******************************************************************/
+
+#define CMD_AUTOFILTER_ADD_REMOVE_TYPE        (cmd_autofilter_add_remove_get_type ())
+#define CMD_AUTOFILTER_ADD_REMOVE(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), CMD_AUTOFILTER_ADD_REMOVE_TYPE, CmdAutofilterAddRemove))
+
+typedef struct {
+	GnmCommand cmd;
+	
+	GnmFilter *filter;
+	gboolean   add;
+} CmdAutofilterAddRemove;
+
+MAKE_GNM_COMMAND (CmdAutofilterAddRemove, cmd_autofilter_add_remove, NULL)
+
+static gboolean
+cmd_autofilter_add_remove_impl (CmdAutofilterAddRemove *me, gboolean add)
+{
+	if (add)
+		gnm_filter_attach (me->filter, me->cmd.sheet);
+	else
+		gnm_filter_remove (me->filter);	
+
+	return FALSE;
+}
+
+
+static gboolean
+cmd_autofilter_add_remove_undo (GnmCommand *cmd, WorkbookControl *wbc)
+{
+	CmdAutofilterAddRemove *me = CMD_AUTOFILTER_ADD_REMOVE (cmd);
+
+	return cmd_autofilter_add_remove_impl (me, !me->add);
+}
+
+static gboolean
+cmd_autofilter_add_remove_redo (GnmCommand *cmd, WorkbookControl *wbc)
+{
+	CmdAutofilterAddRemove *me = CMD_AUTOFILTER_ADD_REMOVE (cmd);
+
+	return cmd_autofilter_add_remove_impl (me, me->add);
+}
+
+static void
+cmd_autofilter_add_remove_finalize (GObject *cmd)
+{
+	CmdAutofilterAddRemove *me = CMD_AUTOFILTER_ADD_REMOVE (cmd);
+
+	gnm_filter_unref (me->filter);
+	gnm_command_finalize (cmd);
+}
+
+gboolean
+cmd_autofilter_add_remove (WorkbookControl *wbc)
+{
+	CmdAutofilterAddRemove *me;
+	SheetView *sv = wb_control_cur_sheet_view (wbc);
+	GnmFilter *f = sv_editpos_in_filter (sv);
+	gboolean add = FALSE;
+
+	if (f == NULL) {
+		GnmRange region;
+		GnmRange const *src = selection_first_range (sv,
+			GO_CMD_CONTEXT (wbc), _("Add Filter"));
+
+		if (src == NULL)
+			return TRUE;
+
+		/* only one row selected -- assume that the user wants to
+		 * filter the region below this row. */
+		region = *src;
+		if (src->start.row == src->end.row)
+			gnm_sheet_guess_region  (sv->sheet, &region);
+		if (region.start.row == region.end.row) {
+			go_cmd_context_error_invalid	(GO_CMD_CONTEXT (wbc),
+				 _("AutoFilter"), _("Requires more than 1 row"));
+			return TRUE;
+		}
+		f = gnm_filter_new (sv->sheet, &region);
+		if (f == NULL) {
+			go_cmd_context_error_invalid	(GO_CMD_CONTEXT (wbc),
+				 _("AutoFilter"), _("Unable to create Autofilter"));
+			return TRUE;
+		}
+		gnm_filter_remove (f);
+		add = TRUE;
+	} else 
+		gnm_filter_remove (f);
+	
+	me = g_object_new (CMD_AUTOFILTER_ADD_REMOVE_TYPE, NULL);
+
+	me->cmd.sheet = sv->sheet;
+	me->cmd.size = 1;
+
+	me->filter = f;
+	me->add = add;
+
+	me->cmd.cmd_descriptor = add ? g_strdup_printf (_("Add Autofilter to %s"), range_as_string (&(f->r))) 
+		: g_strdup_printf (_("Remove Autofilter from %s"), range_as_string (&(f->r)));
+
+	sheet_redraw_all (sv->sheet, TRUE);
+
+	sheet_mark_dirty (sv->sheet);
+	sheet_update (sv->sheet);
+
+	return gnm_command_push_undo (wbc, G_OBJECT (me));
+}
+
+/******************************************************************/
diff --git a/src/commands.h b/src/commands.h
index 0226a56..c6d2ea9 100644
--- a/src/commands.h
+++ b/src/commands.h
@@ -138,6 +138,8 @@ gboolean cmd_tabulate (WorkbookControl *wbc, gpointer data);
 
 gboolean cmd_toggle_rtl (WorkbookControl *wbc, Sheet *sheet);
 
+gboolean cmd_autofilter_add_remove (WorkbookControl *wbc);
+
 /**************************  Sheet Objects **************************************/
 
 gboolean cmd_objects_delete	(WorkbookControl *wbc, GSList *objects,
@@ -201,8 +203,6 @@ gboolean cmd_so_set_adjustment (WorkbookControl *wbc, SheetObject *so,
 				char const *undo_label);
 
 
-
-
 /********************************************************************************/
 
 G_END_DECLS
diff --git a/src/sheet-filter.c b/src/sheet-filter.c
index 7300a4a..f4b6613 100644
--- a/src/sheet-filter.c
+++ b/src/sheet-filter.c
@@ -570,9 +570,11 @@ gnm_filter_add_field (GnmFilter *filter, int i)
 	/* We hold a reference to fcombo */
 }
 
-static void
+void
 gnm_filter_attach (GnmFilter *filter, Sheet *sheet)
 {
+	int i;
+
 	g_return_if_fail (filter != NULL);
 	g_return_if_fail (filter->sheet == NULL);
 	g_return_if_fail (IS_SHEET (sheet));
@@ -582,6 +584,10 @@ gnm_filter_attach (GnmFilter *filter, Sheet *sheet)
 	filter->sheet = sheet;
 	sheet->filters = g_slist_prepend (sheet->filters, filter);
 	sheet->priv->filters_changed = TRUE;
+
+	for (i = 0 ; i < range_width (&(filter->r)); i++)
+		gnm_filter_add_field (filter, i);
+
 }
 
 
@@ -596,7 +602,6 @@ GnmFilter *
 gnm_filter_new (Sheet *sheet, GnmRange const *r)
 {
 	GnmFilter	*filter;
-	int i;
 
 	g_return_val_if_fail (IS_SHEET (sheet), NULL);
 	g_return_val_if_fail (r != NULL, NULL);
@@ -610,9 +615,6 @@ gnm_filter_new (Sheet *sheet, GnmRange const *r)
 	/* This creates the initial ref.  */
 	gnm_filter_attach (filter, sheet);
 
-	for (i = 0 ; i < range_width (r); i++)
-		gnm_filter_add_field (filter, i);
-
 	return filter;
 }
 
@@ -671,14 +673,7 @@ gnm_filter_unref (GnmFilter *filter)
 	if (filter->ref_count > 0)
 		return;
 
-	for (i = 0 ; i < filter->fields->len ; i++) {
-		SheetObject *so = g_ptr_array_index (filter->fields, i);
-		sheet_object_clear_sheet (so);
-		g_object_unref (so);
-	}
 	g_ptr_array_free (filter->fields, TRUE);
-
-	filter->fields = NULL;
 	g_free (filter);
 }
 
@@ -702,6 +697,13 @@ gnm_filter_remove (GnmFilter *filter)
 		}
 	}
 	filter->sheet = NULL;
+
+	for (i = 0 ; i < filter->fields->len ; i++) {
+		SheetObject *so = g_ptr_array_index (filter->fields, i);
+		sheet_object_clear_sheet (so);
+		g_object_unref (so);
+	}
+	g_ptr_array_set_size (filter->fields, 0);
 }
 
 /**
diff --git a/src/sheet-filter.h b/src/sheet-filter.h
index 35343f3..74bc537 100644
--- a/src/sheet-filter.h
+++ b/src/sheet-filter.h
@@ -75,6 +75,7 @@ GnmFilter		 *gnm_filter_dup	    (GnmFilter const *src,
 GnmFilter *               gnm_filter_ref            (GnmFilter *filter);
 void			  gnm_filter_unref	    (GnmFilter *filter);
 void			  gnm_filter_remove	    (GnmFilter *filter);
+void			  gnm_filter_attach	    (GnmFilter *filter, Sheet *sheet);
 GnmFilterCondition const *gnm_filter_get_condition  (GnmFilter const *filter, unsigned i);
 void			  gnm_filter_set_condition  (GnmFilter *filter, unsigned i,
 						     GnmFilterCondition *cond,
diff --git a/src/wbc-gtk-actions.c b/src/wbc-gtk-actions.c
index d076680..eec6606 100644
--- a/src/wbc-gtk-actions.c
+++ b/src/wbc-gtk-actions.c
@@ -893,44 +893,7 @@ static GNM_ACTION_DEF (cb_data_sort)		{ dialog_cell_sort (wbcg); }
 static GNM_ACTION_DEF (cb_data_shuffle)		{ dialog_shuffle (wbcg); }
 static GNM_ACTION_DEF (cb_data_import_text)	{ gui_file_open (wbcg, "Gnumeric_stf:stf_assistant"); }
 
-static GNM_ACTION_DEF (cb_auto_filter)
-{
-	WorkbookControl *wbc = WORKBOOK_CONTROL (wbcg);
-	SheetView *sv = wb_control_cur_sheet_view (wbc);
-	GnmFilter *filter = sv_editpos_in_filter (sv);
-
-#warning Add undo/redo
-	if (filter == NULL) {
-		GnmRange region;
-		GnmRange const *src = selection_first_range (sv,
-			GO_CMD_CONTEXT (wbcg), _("Add Filter"));
-
-		if (src == NULL)
-			return;
-
-		/* only one row selected -- assume that the user wants to
-		 * filter the region below this row. */
-		region = *src;
-		if (src->start.row == src->end.row)
-			gnm_sheet_guess_region  (sv->sheet, &region);
-		if (region.start.row == region.end.row) {
-			go_cmd_context_error_invalid	(GO_CMD_CONTEXT (wbcg),
-				 _("AutoFilter"), _("Requires more than 1 row"));
-			return;
-		}
-		gnm_filter_new (sv->sheet, &region);
-	} else {
-		/* keep distinct to simplify undo/redo later */
-		gnm_filter_remove (filter);
-		gnm_filter_unref (filter);
-	}
-	/* ensure that the colour changes on the filtered row headers */
-	sheet_redraw_all (sv->sheet, TRUE);
-
-	sheet_mark_dirty (sv->sheet);
-	sheet_update (sv->sheet);
-}
-
+static GNM_ACTION_DEF (cb_auto_filter)          { cmd_autofilter_add_remove (WORKBOOK_CONTROL (wbcg)); }
 static GNM_ACTION_DEF (cb_show_all)		{ filter_show_all (wbcg_cur_sheet (wbcg)); }
 static GNM_ACTION_DEF (cb_data_filter)		{ dialog_advanced_filter (wbcg); }
 static GNM_ACTION_DEF (cb_data_validate)	{ dialog_cell_format (wbcg, FD_VALIDATION); }



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