[gnumeric] Make autofilter condition changes undoable. [#625143]



commit 051847439e1bc8d11ac0bab185c6b3117c88dcb6
Author: Andreas J Guelzow <aguelzow pyrshep ca>
Date:   Fri Jul 30 14:53:51 2010 -0600

    Make autofilter condition changes undoable. [#625143]
    
    2010-07-30  Andreas J. Guelzow <aguelzow pyrshep ca>
    
    	* src/commands.c (cmd_autofilter_set_condition): new
    	* src/commands.h (cmd_autofilter_set_condition): new
    	* src/sheet-filter.c (gnm_filter_condition_dup): publish
    	(gnm_filter_condition_free): publish
    	* src/sheet-filter.h (gnm_filter_condition_dup): new
    	(gnm_filter_condition_free): new
    	* src/undo.c (GNM_UNDO_FILTER_SET_CONDITION): new object
    	* src/undo.h (GNM_UNDO_FILTER_SET_CONDITION): new object
    
    2010-07-30  Andreas J. Guelzow <aguelzow pyrshep ca>
    
    	* gnm-filter-combo-view.c (cb_fcombo_count): deleted
    	(fcombo_activate): use cmd_autofilter_set_condition
    
    2010-07-30  Andreas J. Guelzow <aguelzow pyrshep ca>
    
    	* dialog-autofilter.c (cb_autofilter_ok): use
    	cmd_autofilter_set_condition

 ChangeLog                           |   11 +++
 NEWS                                |    1 +
 src/commands.c                      |   37 +++++++++++
 src/commands.h                      |    3 +
 src/dialogs/ChangeLog               |    5 ++
 src/dialogs/dialog-autofilter.c     |   10 ++--
 src/sheet-filter.c                  |    4 +-
 src/sheet-filter.h                  |    2 +
 src/undo.c                          |  117 +++++++++++++++++++++++++++++++++++
 src/undo.h                          |   27 ++++++++
 src/widgets/ChangeLog               |    5 ++
 src/widgets/gnm-filter-combo-view.c |   36 ++---------
 12 files changed, 221 insertions(+), 37 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 8e8a74d..69387bd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2010-07-30  Andreas J. Guelzow <aguelzow pyrshep ca>
+
+	* src/commands.c (cmd_autofilter_set_condition): new
+	* src/commands.h (cmd_autofilter_set_condition): new
+	* src/sheet-filter.c (gnm_filter_condition_dup): publish
+	(gnm_filter_condition_free): publish
+	* src/sheet-filter.h (gnm_filter_condition_dup): new
+	(gnm_filter_condition_free): new
+	* src/undo.c (GNM_UNDO_FILTER_SET_CONDITION): new object
+	* src/undo.h (GNM_UNDO_FILTER_SET_CONDITION): new object
+
 2010-07-29  Andreas J. Guelzow <aguelzow pyrshep ca>
 
 	* src/wbc-gtk.c (cb_accept_input_array): new
diff --git a/NEWS b/NEWS
index 957bce4..0094a18 100644
--- a/NEWS
+++ b/NEWS
@@ -58,6 +58,7 @@ Andreas:
 	* Fix row height dialog. [#625543]
 	* Add menu to specify whether to enter as array, into multiple cells,
 	  etc. Part of [#53733]
+	* Make autofilter condition changes undoable. [#625143]
 
 Jean:
 	* Fix strong/weak cursor display. [#623241]
diff --git a/src/commands.c b/src/commands.c
index b776b39..86cf20d 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -7741,3 +7741,40 @@ cmd_autofilter_add_remove (WorkbookControl *wbc)
 
 
 /******************************************************************/
+
+gboolean cmd_autofilter_set_condition (WorkbookControl *wbc, 
+				       GnmFilter *filter, unsigned i, 
+				       GnmFilterCondition *cond)
+{
+	char *descr = NULL, *name = NULL;
+	GOUndo *undo = NULL;
+	GOUndo *redo = NULL;
+	gboolean result;
+	
+	undo = gnm_undo_filter_set_condition_new (filter, i, 
+						  NULL, TRUE);
+	g_return_val_if_fail (undo != NULL, TRUE);
+	redo = gnm_undo_filter_set_condition_new (filter, i, 
+						 cond, FALSE);
+	g_return_val_if_fail (redo != NULL, TRUE);
+
+	name = undo_range_name (filter->sheet, &(filter->r));
+	descr = g_strdup_printf (_("Change filter condition for %s"),
+				 name);
+	
+	result = cmd_generic (wbc, descr, undo, redo);
+	g_free (name);
+	g_free (descr);
+
+	return result;
+}
+
+
+
+
+
+
+
+
+
+/******************************************************************/
diff --git a/src/commands.h b/src/commands.h
index 6802456..d98fcd4 100644
--- a/src/commands.h
+++ b/src/commands.h
@@ -163,6 +163,9 @@ gboolean cmd_tabulate (WorkbookControl *wbc, gpointer data);
 gboolean cmd_toggle_rtl (WorkbookControl *wbc, Sheet *sheet);
 
 gboolean cmd_autofilter_add_remove (WorkbookControl *wbc);
+gboolean cmd_autofilter_set_condition (WorkbookControl *wbc, 
+				       GnmFilter *filter, unsigned i, 
+				       GnmFilterCondition *cond);
 
 /**************************  Sheet Objects **************************************/
 
diff --git a/src/dialogs/ChangeLog b/src/dialogs/ChangeLog
index 490e297..3296ac6 100644
--- a/src/dialogs/ChangeLog
+++ b/src/dialogs/ChangeLog
@@ -1,3 +1,8 @@
+2010-07-30  Andreas J. Guelzow <aguelzow pyrshep ca>
+
+	* dialog-autofilter.c (cb_autofilter_ok): use 
+	cmd_autofilter_set_condition
+	
 2010-07-29  Andreas J. Guelzow <aguelzow pyrshep ca>
 
 	* dialog-row-height.c (dialog_row_height): make sure the spin 
diff --git a/src/dialogs/dialog-autofilter.c b/src/dialogs/dialog-autofilter.c
index ed85553..6f19885 100644
--- a/src/dialogs/dialog-autofilter.c
+++ b/src/dialogs/dialog-autofilter.c
@@ -34,6 +34,7 @@
 #include <value.h>
 #include <sheet-filter.h>
 #include <number-match.h>
+#include <undo.h>
 
 #include <glade/glade.h>
 #include <gtk/gtk.h>
@@ -152,11 +153,10 @@ cb_autofilter_ok (G_GNUC_UNUSED GtkWidget *button,
 			cond = gnm_filter_condition_new_bucket (
 					!bottom, !percentage, count);
 	}
-	if (cond != NULL) {
-		gnm_filter_set_condition (state->filter, state->field,
-			cond, TRUE);
-		sheet_update (state->filter->sheet);
-	}
+	if (cond != NULL)
+		cmd_autofilter_set_condition (WORKBOOK_CONTROL (state->wbcg), 
+					      state->filter, state->field, 
+					      cond);
 
 	gtk_widget_destroy (state->dialog);
 }
diff --git a/src/sheet-filter.c b/src/sheet-filter.c
index d23b159..06d78ee 100644
--- a/src/sheet-filter.c
+++ b/src/sheet-filter.c
@@ -93,7 +93,7 @@ gnm_filter_condition_new_bucket (gboolean top, gboolean absolute, double n)
 	return res;
 }
 
-static GnmFilterCondition *
+GnmFilterCondition *
 gnm_filter_condition_dup (GnmFilterCondition const *src)
 {
 	GnmFilterCondition *dst;
@@ -111,7 +111,7 @@ gnm_filter_condition_dup (GnmFilterCondition const *src)
 	return dst;
 }
 
-static void
+void
 gnm_filter_condition_free (GnmFilterCondition *cond)
 {
 	if (cond == NULL)
diff --git a/src/sheet-filter.h b/src/sheet-filter.h
index 3f81a85..22346e3 100644
--- a/src/sheet-filter.h
+++ b/src/sheet-filter.h
@@ -61,6 +61,8 @@ struct _GnmFilter {
 	gboolean   is_active;
 };
 
+GnmFilterCondition *gnm_filter_condition_dup        (GnmFilterCondition const *src);
+void                gnm_filter_condition_free       (GnmFilterCondition *cond);
 GnmFilterCondition *gnm_filter_condition_new_single (GnmFilterOp op, GnmValue *v);
 GnmFilterCondition *gnm_filter_condition_new_double (GnmFilterOp op1, GnmValue *v1,
 						     gboolean join_with_and,
diff --git a/src/undo.c b/src/undo.c
index 3582259..83b4ee3 100644
--- a/src/undo.c
+++ b/src/undo.c
@@ -22,8 +22,18 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
+#include <gnumeric-config.h>
+
 #include "undo.h"
+#include "sheet.h"
+#include "sheet-view.h"
+#include "sheet-control-gui.h"
+#include "wbc-gtk.h"
+#include "wbc-gtk-impl.h"
+#include "colrow.h"
+
 #include <gsf/gsf-impl-utils.h>
+#include <glib/gi18n-lib.h>
 
 /* ------------------------------------------------------------------------- */
 
@@ -169,3 +179,110 @@ gnm_undo_colrow_set_sizes_new (Sheet *sheet, gboolean is_cols,
 }
 
 /* ------------------------------------------------------------------------- */
+
+static GObjectClass *gnm_undo_filter_set_condition_parent_class;
+
+static void
+gnm_undo_filter_set_condition_finalize (GObject *o)
+{
+	GNMUndoFilterSetCondition *ua = (GNMUndoFilterSetCondition *)o;
+
+	gnm_filter_condition_free (ua->cond);
+	ua->cond = NULL;
+}
+
+static gboolean
+cb_filter_set_condition_undo (GnmColRowIter const *iter, gint *count)
+{
+	if (iter->cri->visible)
+		(*count)++;
+	return FALSE;
+}
+
+static void
+cb_filter_set_condition_undo_set_pb (SheetControl *control, char *text)
+{
+	SheetControlGUI *scg = (SheetControlGUI *) control;
+	WBCGtk *wbcg = scg_wbcg (scg);
+	if (wbcg != NULL)
+		gtk_progress_bar_set_text 
+			(GTK_PROGRESS_BAR (wbcg->progress_bar), text);
+}
+
+static void
+gnm_undo_filter_set_condition_undo (GOUndo *u, gpointer data)
+{
+	GNMUndoFilterSetCondition *ua = (GNMUndoFilterSetCondition *)u;
+	gint count = 0;
+	char const *format;
+	char *text;
+
+	gnm_filter_set_condition (ua->filter, ua->i, 
+				  gnm_filter_condition_dup (ua->cond), TRUE);
+	sheet_update (ua->filter->sheet);
+
+	colrow_foreach (&ua->filter->sheet->rows,
+			ua->filter->r.start.row + 1,
+			ua->filter->r.end.row,
+			(ColRowHandler) cb_filter_set_condition_undo,
+			&count);
+	format = ngettext ("%d row of %d match",
+			   "%d rows of %d match",
+			   count);
+	text = g_strdup_printf (format, count, 
+				ua->filter->r.end.row - 
+				ua->filter->r.start.row);
+
+	SHEET_FOREACH_CONTROL (ua->filter->sheet, view, control, cb_filter_set_condition_undo_set_pb (control, text););
+	
+	g_free (text);
+}
+
+static void
+gnm_undo_filter_set_condition_class_init (GObjectClass *gobject_class)
+{
+	GOUndoClass *uclass = (GOUndoClass *)gobject_class;
+
+	gnm_undo_filter_set_condition_parent_class = g_type_class_peek_parent 
+		(gobject_class);
+
+	gobject_class->finalize = gnm_undo_filter_set_condition_finalize;
+	uclass->undo = gnm_undo_filter_set_condition_undo;
+}
+
+
+GSF_CLASS (GNMUndoFilterSetCondition, gnm_undo_filter_set_condition,
+	   gnm_undo_filter_set_condition_class_init, NULL, GO_TYPE_UNDO)
+
+/**
+ * gnm_undo_filter_set_condition_new:
+ *
+ * if (retrieve_from_filter), cond is ignored
+ *
+ * Returns: a new undo object.
+ **/
+
+GOUndo *
+gnm_undo_filter_set_condition_new (GnmFilter *filter, unsigned i, 
+				   GnmFilterCondition *cond, 
+				   gboolean retrieve_from_filter)
+{
+	GNMUndoFilterSetCondition *ua;
+
+	g_return_val_if_fail (filter != NULL, NULL);
+	g_return_val_if_fail (i < filter->fields->len , NULL);
+
+	ua = g_object_new (GNM_TYPE_UNDO_FILTER_SET_CONDITION, NULL);
+
+	ua->filter = filter;
+	ua->i = i;
+
+	if (retrieve_from_filter)
+		ua->cond = gnm_filter_condition_dup 
+			(gnm_filter_get_condition (filter, i));
+	else
+		ua->cond = cond;
+
+	return (GOUndo *)ua;
+}
+/* ------------------------------------------------------------------------- */
diff --git a/src/undo.h b/src/undo.h
index ef8d134..f62c51a 100644
--- a/src/undo.h
+++ b/src/undo.h
@@ -5,6 +5,7 @@
 #include "gnumeric.h"
 #include "sheet.h"
 #include "colrow.h"
+#include "sheet-filter.h"
 #include <goffice/goffice.h>
 #include <glib-object.h>
 
@@ -66,6 +67,32 @@ GOUndo *gnm_undo_colrow_set_sizes_new (Sheet *sheet, gboolean is_cols,
 
 /* ------------------------------------------------------------------------- */
 
+#define GNM_TYPE_UNDO_FILTER_SET_CONDITION  (gnm_undo_filter_set_condition_get_type ())
+#define GNM_UNDO_FILTER_SET_CONDITION(o)    (G_TYPE_CHECK_INSTANCE_CAST ((o), GNM_TYPE_UNDO_FILTER_SET_CONDITION, GNMUndoFilterSetCondition))
+#define GNM_IS_UNDO_FILTER_SET_CONDITION(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GNM_TYPE_UNDO_FILTER_SET_CONDITION))
+
+GType gnm_undo_filter_set_condition_get_type (void);
+
+typedef struct _GNMUndoFilterSetCondition GNMUndoFilterSetCondition;
+typedef struct _GNMUndoFilterSetConditionClass GNMUndoFilterSetConditionClass;
+
+struct _GNMUndoFilterSetCondition {
+	GOUndo base;
+	GnmFilter *filter; 
+	unsigned i;
+	GnmFilterCondition *cond;
+};
+
+struct _GNMUndoFilterSetConditionClass {
+	GOUndoClass base;
+};
+
+GOUndo *gnm_undo_filter_set_condition_new (GnmFilter *filter, unsigned i, 
+					   GnmFilterCondition *cond, 
+					   gboolean retrieve_from_filter);
+
+/* ------------------------------------------------------------------------- */
+
 
 G_END_DECLS
 
diff --git a/src/widgets/ChangeLog b/src/widgets/ChangeLog
index e871d45..865b96b 100644
--- a/src/widgets/ChangeLog
+++ b/src/widgets/ChangeLog
@@ -1,5 +1,10 @@
 2010-07-30  Andreas J. Guelzow <aguelzow pyrshep ca>
 
+	* gnm-filter-combo-view.c (cb_fcombo_count): deleted
+	(fcombo_activate): use cmd_autofilter_set_condition
+
+2010-07-30  Andreas J. Guelzow <aguelzow pyrshep ca>
+
 	* gnumeric-expr-entry.c (gee_finalize): fix warning on NULL expr_top
 
 2010-07-30  Andreas J. Guelzow <aguelzow pyrshep ca>
diff --git a/src/widgets/gnm-filter-combo-view.c b/src/widgets/gnm-filter-combo-view.c
index 3d6d444..6b175f5 100644
--- a/src/widgets/gnm-filter-combo-view.c
+++ b/src/widgets/gnm-filter-combo-view.c
@@ -30,6 +30,7 @@
 #include "gnm-format.h"
 #include "value.h"
 #include "cell.h"
+#include "commands.h"
 #include "sheet.h"
 #include "sheet-object-impl.h"
 #include "wbc-gtk.h"
@@ -38,6 +39,7 @@
 #include "sheet-control-gui.h"
 #include "../dialogs/dialogs.h"
 #include "wbc-gtk-impl.h"
+#include <undo.h>
 
 #include <goffice/goffice.h>
 #include <gsf/gsf-impl-utils.h>
@@ -46,14 +48,6 @@
 #include <string.h>
 
 static gboolean
-cb_fcombo_count (GnmColRowIter const *iter, gint *count)
-{
-	if (iter->cri->visible)
-		(*count)++;
-	return FALSE;
-}
-
-static gboolean
 fcombo_activate (SheetObject *so, GtkTreeView *list, WBCGtk *wbcg,
 		 G_GNUC_UNUSED gboolean button)
 {
@@ -102,28 +96,10 @@ fcombo_activate (SheetObject *so, GtkTreeView *list, WBCGtk *wbcg,
 			g_warning ("Unknown type %d", type);
 		}
 
-		if (set_condition) {
-			gint count = 0;
-			char const *format;
-			char *text;
-			gnm_filter_set_condition (fcombo->filter, field_num,
-				cond, TRUE);
-			sheet_update (fcombo->filter->sheet);
-			colrow_foreach (&fcombo->filter->sheet->rows,
-					fcombo->filter->r.start.row + 1,
-					fcombo->filter->r.end.row,
-					(ColRowHandler) cb_fcombo_count,
-					&count);
-			format = ngettext ("%d row of %d match",
-					   "%d rows of %d match",
-					   count);
-			text = g_strdup_printf (format, count, 
-						fcombo->filter->r.end.row - 
-						fcombo->filter->r.start.row);
-			gtk_progress_bar_set_text 
-				(GTK_PROGRESS_BAR (wbcg->progress_bar), text);
-			g_free (text);
-		}
+		if (set_condition)
+			cmd_autofilter_set_condition 
+				(WORKBOOK_CONTROL (wbcg), 
+				 fcombo->filter, field_num, cond);
 	}
 	return TRUE;
 }



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