[gnumeric] Make Autofilter addition & removal undoable [#478152]
- From: Andreas J. Guelzow <guelzow src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gnumeric] Make Autofilter addition & removal undoable [#478152]
- Date: Wed, 28 Oct 2009 06:56:17 +0000 (UTC)
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, ®ion);
+ 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, ®ion);
+ 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, ®ion);
- 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, ®ion);
- } 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]