[gnumeric] Add menu items to allow clearing of filtered rows only.
- From: Andreas J. Guelzow <guelzow src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnumeric] Add menu items to allow clearing of filtered rows only.
- Date: Sat, 24 Jul 2010 18:40:54 +0000 (UTC)
commit 86dcb3ff52e5016f5a5b74ab91b508ebb1b1e144
Author: Andreas J Guelzow <aguelzow pyrshep ca>
Date: Sat Jul 24 12:42:52 2010 -0600
Add menu items to allow clearing of filtered rows only.
2010-07-24 Andreas J. Guelzow <aguelzow pyrshep ca>
* component/Gnumeric-embed.xml.in: add "clear filtered" menu items
* src/GNOME_Gnumeric-gtk.xml.in: ditto
* src/HILDON_Gnumeric-gtk.xml.in: ditto
* src/commands.c (cmd_selection_clear_row_handler): new
(cmd_selection_clear): adjust selection if only considering filtered rows
* src/ranges.c (range_fragment_free): delete
* src/ranges.h (range_fragment_free): change into a define using
go_slist_custom
* src/sheet.h (SheetClearFlags): add CLEAR_FILTERED_ONLY
* src/wbc-gtk-actions.c (cb_edit_clear_*_filtered): new
(EditClear*Filtered): new actions
ChangeLog | 14 ++++++++++++++
NEWS | 1 +
component/Gnumeric-embed.xml.in | 6 ++++++
src/GNOME_Gnumeric-gtk.xml.in | 6 ++++++
src/HILDON_Gnumeric-gtk.xml.in | 6 ++++++
src/commands.c | 35 +++++++++++++++++++++++++++++++++++
src/ranges.c | 11 -----------
src/ranges.h | 3 ++-
src/sheet.h | 3 ++-
src/wbc-gtk-actions.c | 34 +++++++++++++++++++++++++++++-----
10 files changed, 101 insertions(+), 18 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index d507151..3311f16 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2010-07-24 Andreas J. Guelzow <aguelzow pyrshep ca>
+
+ * component/Gnumeric-embed.xml.in: add "clear filtered" menu items
+ * src/GNOME_Gnumeric-gtk.xml.in: ditto
+ * src/HILDON_Gnumeric-gtk.xml.in: ditto
+ * src/commands.c (cmd_selection_clear_row_handler): new
+ (cmd_selection_clear): adjust selection if only considering filtered rows
+ * src/ranges.c (range_fragment_free): delete
+ * src/ranges.h (range_fragment_free): change into a define using
+ go_slist_custom
+ * src/sheet.h (SheetClearFlags): add CLEAR_FILTERED_ONLY
+ * src/wbc-gtk-actions.c (cb_edit_clear_*_filtered): new
+ (EditClear*Filtered): new actions
+
2010-07-23 Andreas J. Guelzow <aguelzow pyrshep ca>
* src/clipboard.c (cb_clipboard_copy_range_undo): paste everything back
diff --git a/NEWS b/NEWS
index 87a191e..8afb4aa 100644
--- a/NEWS
+++ b/NEWS
@@ -46,6 +46,7 @@ Andreas:
* Add preference settings whether to show function name and/or
argument tooltips.
* Fix undo of Clear->All and Clear->Comments. [#625151]
+ * Add menu items to allow clearing of filtered rows only.
Jean:
* Fix strong/weak cursor display. [#623241]
diff --git a/component/Gnumeric-embed.xml.in b/component/Gnumeric-embed.xml.in
index 1435308..71fbbc1 100644
--- a/component/Gnumeric-embed.xml.in
+++ b/component/Gnumeric-embed.xml.in
@@ -40,7 +40,13 @@
<menu name="Clear" action="MenuEditClear">
<menuitem action="EditClearAll"/>
<menuitem action="EditClearFormats"/>
+ <menuitem action="EditClearComments"/>
<menuitem action="EditClearContent"/>
+ <separator name="clear-sep1"/>
+ <menuitem action="EditClearAllFiltered"/>
+ <menuitem action="EditClearFormatsFiltered"/>
+ <menuitem action="EditClearCommentsFiltered"/>
+ <menuitem action="EditClearContentFiltered"/>
</menu>
<menu name="Delete" action="MenuEditDelete">
<menuitem action="EditDeleteColumns"/>
diff --git a/src/GNOME_Gnumeric-gtk.xml.in b/src/GNOME_Gnumeric-gtk.xml.in
index f84b41d..9aaf114 100644
--- a/src/GNOME_Gnumeric-gtk.xml.in
+++ b/src/GNOME_Gnumeric-gtk.xml.in
@@ -41,7 +41,13 @@
<menu name="Clear" action="MenuEditClear">
<menuitem action="EditClearAll"/>
<menuitem action="EditClearFormats"/>
+ <menuitem action="EditClearComments"/>
<menuitem action="EditClearContent"/>
+ <separator name="clear-sep1"/>
+ <menuitem action="EditClearAllFiltered"/>
+ <menuitem action="EditClearFormatsFiltered"/>
+ <menuitem action="EditClearCommentsFiltered"/>
+ <menuitem action="EditClearContentFiltered"/>
</menu>
<menu name="Delete" action="MenuEditDelete">
<menuitem action="EditDeleteColumns"/>
diff --git a/src/HILDON_Gnumeric-gtk.xml.in b/src/HILDON_Gnumeric-gtk.xml.in
index b897a1c..ed37812 100644
--- a/src/HILDON_Gnumeric-gtk.xml.in
+++ b/src/HILDON_Gnumeric-gtk.xml.in
@@ -52,7 +52,13 @@
<menu name="Clear" action="MenuEditClear">
<menuitem action="EditClearAll"/>
<menuitem action="EditClearFormats"/>
+ <menuitem action="EditClearComments"/>
<menuitem action="EditClearContent"/>
+ <separator name="clear-sep1"/>
+ <menuitem action="EditClearAllFiltered"/>
+ <menuitem action="EditClearFormatsFiltered"/>
+ <menuitem action="EditClearCommentsFiltered"/>
+ <menuitem action="EditClearContentFiltered"/>
</menu>
<menu name="Delete" action="MenuEditDelete">
<menuitem action="EditDeleteColumns"/>
diff --git a/src/commands.c b/src/commands.c
index 59a67e6..2e2b935 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -1417,6 +1417,22 @@ cmd_delete_rows (WorkbookControl *wbc,
/******************************************************************/
+typedef struct {
+ GSList *selection;
+ GnmRange const *r;
+} cmd_selection_clear_row_handler_t;
+
+static gboolean
+cmd_selection_clear_row_handler (GnmColRowIter const *iter,
+ cmd_selection_clear_row_handler_t *data)
+{
+ if ((!iter->cri->in_filter) || iter->cri->visible) {
+ GnmRange *r = gnm_range_dup (data->r);
+ r->start.row = r->end.row = iter->pos;
+ data->selection = g_slist_prepend (data->selection, r);
+ }
+ return FALSE;
+}
gboolean
cmd_selection_clear (WorkbookControl *wbc, int clear_flags)
@@ -1432,6 +1448,25 @@ cmd_selection_clear (WorkbookControl *wbc, int clear_flags)
GOUndo *redo = NULL;
GSList *ranges;
+ if ((clear_flags & CLEAR_FILTERED_ONLY) != 0 && sheet->filters != NULL) {
+ /* We need to modify the selection to only include filtered rows. */
+ cmd_selection_clear_row_handler_t data;
+ data.selection = selection;
+ for (ranges = selection; ranges != NULL ; ranges = ranges->next) {
+ GnmFilter *filter;
+ data.r = ranges->data;
+ filter = gnm_sheet_filter_intersect_rows
+ (sheet, data.r->start.row, data.r->end.row);
+ if (filter) {
+ colrow_foreach (&sheet->rows, data.r->start.row, data.r->end.row,
+ (ColRowHandler) cmd_selection_clear_row_handler, &data);
+ g_free (ranges->data);
+ ranges->data = NULL;
+ }
+ }
+ selection = g_slist_remove_all (data.selection, NULL);
+ }
+
/* We should first determine whether we break anything by clearing */
/* Check for array subdivision *//* Check for locked cells */
if (sheet_ranges_split_region (sheet, selection,
diff --git a/src/ranges.c b/src/ranges.c
index 491fa23..f29cde6 100644
--- a/src/ranges.c
+++ b/src/ranges.c
@@ -466,17 +466,6 @@ range_fragment (GnmRange const *a, GnmRange const *b)
return ans;
}
-void
-range_fragment_free (GSList *fragments)
-{
- GSList *l = fragments;
-
- for (l = fragments; l; l = l->next)
- g_free (l->data);
-
- g_slist_free (fragments);
-}
-
/**
* range_intersection:
* @r: intersection range
diff --git a/src/ranges.h b/src/ranges.h
index f0bf310..6c550bd 100644
--- a/src/ranges.h
+++ b/src/ranges.h
@@ -61,6 +61,8 @@ guint gnm_range_hash (GnmRange const *r);
#define range_valid(r) ((r)->start.col <= (r)->end.col && \
(r)->start.row <= (r)->end.row)
+#define range_fragment_free(f) go_slist_free_custom ((f), g_free)
+
GnmRange *range_init_full_sheet (GnmRange *r, Sheet const *sheet);
GnmRange *range_init_cols (GnmRange *r, Sheet const *sheet,
int start_col, int end_col);
@@ -102,7 +104,6 @@ void range_dump (GnmRange const *r, char const *suffix);
GSList *range_split_ranges (GnmRange const *hard, GnmRange const *soft);
GSList *range_fragment (GnmRange const *a, GnmRange const *b);
-void range_fragment_free (GSList *fragments);
GnmSheetRange *gnm_sheet_range_new (Sheet *sheet, GnmRange const *r);
void gnm_sheet_range_free (GnmSheetRange *r);
diff --git a/src/sheet.h b/src/sheet.h
index a79d2f6..23f38b6 100644
--- a/src/sheet.h
+++ b/src/sheet.h
@@ -359,7 +359,8 @@ typedef enum {
CLEAR_NORESPAN = 0x10,
CLEAR_RECALC_DEPS = 0x20,
CLEAR_MERGES = 0x40,
- CLEAR_OBJECTS = 0x80
+ CLEAR_OBJECTS = 0x80,
+ CLEAR_FILTERED_ONLY = 0x100
} SheetClearFlags;
void sheet_clear_region (Sheet *sheet,
diff --git a/src/wbc-gtk-actions.c b/src/wbc-gtk-actions.c
index 17e8528..05aeb9b 100644
--- a/src/wbc-gtk-actions.c
+++ b/src/wbc-gtk-actions.c
@@ -321,6 +321,18 @@ static GNM_ACTION_DEF (cb_edit_clear_comments)
{ cmd_selection_clear (WORKBOOK_CONTROL (wbcg), CLEAR_COMMENTS); }
static GNM_ACTION_DEF (cb_edit_clear_content)
{ cmd_selection_clear (WORKBOOK_CONTROL (wbcg), CLEAR_VALUES); }
+static GNM_ACTION_DEF (cb_edit_clear_all_filtered)
+{
+ cmd_selection_clear (WORKBOOK_CONTROL (wbcg),
+ CLEAR_VALUES | CLEAR_FORMATS | CLEAR_OBJECTS | CLEAR_COMMENTS | CLEAR_FILTERED_ONLY);
+}
+
+static GNM_ACTION_DEF (cb_edit_clear_formats_filtered)
+ { cmd_selection_clear (WORKBOOK_CONTROL (wbcg), CLEAR_FORMATS | CLEAR_FILTERED_ONLY); }
+static GNM_ACTION_DEF (cb_edit_clear_comments_filtered)
+ { cmd_selection_clear (WORKBOOK_CONTROL (wbcg), CLEAR_COMMENTS | CLEAR_FILTERED_ONLY); }
+static GNM_ACTION_DEF (cb_edit_clear_content_filtered)
+ { cmd_selection_clear (WORKBOOK_CONTROL (wbcg), CLEAR_VALUES | CLEAR_FILTERED_ONLY); }
static GNM_ACTION_DEF (cb_edit_delete_rows)
{
@@ -1935,12 +1947,27 @@ static GtkActionEntry const actions[] = {
{ "EditClearAll", GTK_STOCK_CLEAR, N_("_All"),
NULL, N_("Clear the selected cells' formats, comments, and contents"),
G_CALLBACK (cb_edit_clear_all) },
- { "EditClearFormats", NULL, N_("_Formats"),
- NULL, N_("Clear the selected cells' formats"),
+ { "EditClearFormats", NULL, N_("_Formats & Hyperlinks"),
+ NULL, N_("Clear the selected cells' formats and hyperlinks"),
G_CALLBACK (cb_edit_clear_formats) },
+ { "EditClearComments", "Gnumeric_CommentDelete", N_("Co_mments"),
+ NULL, N_("Delete the selected cells' comments"),
+ G_CALLBACK (cb_edit_clear_comments) },
{ "EditClearContent", GTK_STOCK_CLEAR, N_("_Contents"),
NULL, N_("Clear the selected cells' contents"),
G_CALLBACK (cb_edit_clear_content) },
+ { "EditClearAllFiltered", GTK_STOCK_CLEAR, N_("A_ll Filtered Rows"),
+ NULL, N_("Clear the selected cells' formats, comments, and contents in the filtered rows"),
+ G_CALLBACK (cb_edit_clear_all_filtered) },
+ { "EditClearFormatsFiltered", NULL, N_("F_ormats & Hyperlinks in Filtered Rows"),
+ NULL, N_("Clear the selected cells' formats and hyperlinks in the filtered rows"),
+ G_CALLBACK (cb_edit_clear_formats_filtered) },
+ { "EditClearCommentsFiltered", "Gnumeric_CommentDelete", N_("Comme_nts in Filtered Rows"),
+ NULL, N_("Delete the selected cells' comments in the filtered rows"),
+ G_CALLBACK (cb_edit_clear_comments_filtered) },
+ { "EditClearContentFiltered", GTK_STOCK_CLEAR, N_("Content_s of Filtered Rows"),
+ NULL, N_("Clear the selected cells' contents in the filtered rows"),
+ G_CALLBACK (cb_edit_clear_content_filtered) },
/* Edit -> Delete */
{ "EditDeleteRows", "Gnumeric_RowDelete", N_("_Rows"),
@@ -1952,9 +1979,6 @@ static GtkActionEntry const actions[] = {
{ "EditDeleteCells", NULL, N_("C_ells..."),
"<control>minus", N_("Delete the selected cells, shifting others into their place"),
G_CALLBACK (cb_edit_delete_cells) },
- { "EditClearComments", "Gnumeric_CommentDelete", N_("Co_mments"),
- NULL, N_("Delete the selected cells' comments"),
- G_CALLBACK (cb_edit_clear_comments) },
{ "EditClearHyperlinks", "Gnumeric_Link_Delete", N_("_Hyperlinks"),
NULL, N_("Delete the selected cells' hyperlinks"),
G_CALLBACK (cb_edit_delete_links) },
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]