[evolution] Cleanup delete actions in shell views.



commit 611fda70547f7a5258a1eaf52691cb05f8b3ec63
Author: Matthew Barnes <mbarnes redhat com>
Date:   Sat Jan 9 16:17:23 2010 -0500

    Cleanup delete actions in shell views.

 addressbook/gui/widgets/e-addressbook-view.c    |   17 ++
 calendar/gui/e-calendar-view.c                  |  339 ++++++++++++-----------
 calendar/gui/e-calendar-view.h                  |    4 -
 calendar/gui/e-memo-table.c                     |  155 ++++++-----
 calendar/gui/e-memo-table.h                     |    1 -
 calendar/gui/e-task-table.c                     |  312 +++++++++++-----------
 calendar/gui/e-task-table.h                     |    1 -
 modules/addressbook/e-book-shell-view-actions.c |   11 +-
 modules/addressbook/e-book-shell-view-private.h |    1 +
 modules/calendar/e-cal-shell-content.c          |  133 +---------
 modules/calendar/e-cal-shell-content.h          |    4 -
 modules/calendar/e-cal-shell-view-actions.c     |   44 ++--
 modules/calendar/e-cal-shell-view-actions.h     |    4 -
 modules/calendar/e-cal-shell-view-memopad.c     |   31 --
 modules/calendar/e-cal-shell-view-private.h     |    3 +-
 modules/calendar/e-cal-shell-view-taskpad.c     |   31 --
 modules/calendar/e-memo-shell-view-actions.c    |   22 +--
 modules/calendar/e-memo-shell-view-private.h    |    3 +-
 modules/calendar/e-task-shell-view-actions.c    |   22 +--
 modules/calendar/e-task-shell-view-private.h    |    3 +-
 ui/evolution-calendars.ui                       |    7 +-
 ui/evolution-contacts.ui                        |   15 +-
 ui/evolution-memos.ui                           |    5 +-
 ui/evolution-tasks.ui                           |    5 +-
 24 files changed, 487 insertions(+), 686 deletions(-)
---
diff --git a/addressbook/gui/widgets/e-addressbook-view.c b/addressbook/gui/widgets/e-addressbook-view.c
index 37d1376..bcf6ed6 100644
--- a/addressbook/gui/widgets/e-addressbook-view.c
+++ b/addressbook/gui/widgets/e-addressbook-view.c
@@ -587,6 +587,12 @@ addressbook_view_update_actions (ESelectable *selectable,
 	gtk_action_set_sensitive (action, sensitive);
 	gtk_action_set_tooltip (action, tooltip);
 
+	action = e_focus_tracker_get_delete_selection_action (focus_tracker);
+	sensitive = source_is_editable && (n_selected > 0);
+	tooltip = _("Delete selected contacts");
+	gtk_action_set_sensitive (action, sensitive);
+	gtk_action_set_tooltip (action, tooltip);
+
 	action = e_focus_tracker_get_select_all_action (focus_tracker);
 	sensitive = (n_contacts > 0);
 	tooltip = _("Select all visible contacts");
@@ -660,6 +666,16 @@ addressbook_view_paste_clipboard (ESelectable *selectable)
 }
 
 static void
+addressbook_view_delete_selection (ESelectable *selectable)
+{
+	EAddressbookView *view;
+
+	view = E_ADDRESSBOOK_VIEW (selectable);
+
+	e_addressbook_view_delete_selection (view, TRUE);
+}
+
+static void
 addressbook_view_select_all (ESelectable *selectable)
 {
 	EAddressbookView *view;
@@ -782,6 +798,7 @@ addressbook_view_selectable_init (ESelectableInterface *interface)
 	interface->cut_clipboard = addressbook_view_cut_clipboard;
 	interface->copy_clipboard = addressbook_view_copy_clipboard;
 	interface->paste_clipboard = addressbook_view_paste_clipboard;
+	interface->delete_selection = addressbook_view_delete_selection;
 	interface->select_all = addressbook_view_select_all;
 }
 
diff --git a/calendar/gui/e-calendar-view.c b/calendar/gui/e-calendar-view.c
index 2bfa091..5797382 100644
--- a/calendar/gui/e-calendar-view.c
+++ b/calendar/gui/e-calendar-view.c
@@ -103,6 +103,138 @@ G_DEFINE_ABSTRACT_TYPE_WITH_CODE (ECalendarView, e_calendar_view, GTK_TYPE_TABLE
 	G_IMPLEMENT_INTERFACE (E_TYPE_SELECTABLE, calendar_view_selectable_init));
 
 static void
+calendar_view_add_retract_data (ECalComponent *comp,
+                                const gchar *retract_comment,
+                                CalObjModType mod)
+{
+	icalcomponent *icalcomp = NULL;
+	icalproperty *icalprop = NULL;
+
+	icalcomp = e_cal_component_get_icalcomponent (comp);
+	if (retract_comment && *retract_comment)
+		icalprop = icalproperty_new_x (retract_comment);
+	else
+		icalprop = icalproperty_new_x ("0");
+	icalproperty_set_x_name (icalprop, "X-EVOLUTION-RETRACT-COMMENT");
+	icalcomponent_add_property (icalcomp, icalprop);
+
+	if (mod == CALOBJ_MOD_ALL)
+		icalprop = icalproperty_new_x ("All");
+	else
+		icalprop = icalproperty_new_x ("This");
+	icalproperty_set_x_name (icalprop, "X-EVOLUTION-RECUR-MOD");
+	icalcomponent_add_property (icalcomp, icalprop);
+}
+
+static gboolean
+calendar_view_check_for_retract (ECalComponent *comp,
+                                 ECal *client)
+{
+	ECalComponentOrganizer organizer;
+	const gchar *strip;
+	gchar *email = NULL;
+	gboolean ret_val;
+
+	if (!e_cal_component_has_attendees (comp))
+		return FALSE;
+
+	if (!e_cal_get_save_schedules (client))
+		return FALSE;
+
+	e_cal_component_get_organizer (comp, &organizer);
+	strip = itip_strip_mailto (organizer.value);
+
+	ret_val =
+		e_cal_get_cal_address (client, &email, NULL) &&
+		(g_ascii_strcasecmp (email, strip) == 0);
+
+	g_free (email);
+
+	return ret_val;
+}
+
+static void
+calendar_view_delete_event (ECalendarView *cal_view,
+                            ECalendarViewEvent *event)
+{
+	ECalComponent *comp;
+	ECalComponentVType vtype;
+	gboolean  delete = FALSE;
+	GError *error = NULL;
+
+	comp = e_cal_component_new ();
+	e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
+	vtype = e_cal_component_get_vtype (comp);
+
+	/*FIXME remove it once the we dont set the recurrence id for all the generated instances */
+	if (!e_cal_get_static_capability (event->comp_data->client, CAL_STATIC_CAPABILITY_RECURRENCES_NO_MASTER))
+		e_cal_component_set_recurid (comp, NULL);
+
+	/*FIXME Retract should be moved to Groupwise features plugin */
+	if (calendar_view_check_for_retract (comp, event->comp_data->client)) {
+		gchar *retract_comment = NULL;
+		gboolean retract = FALSE;
+
+		delete = prompt_retract_dialog (comp, &retract_comment, GTK_WIDGET (cal_view), &retract);
+		if (retract) {
+			GList *users = NULL;
+			icalcomponent *icalcomp = NULL, *mod_comp = NULL;
+
+			calendar_view_add_retract_data (
+				comp, retract_comment, CALOBJ_MOD_ALL);
+			icalcomp = e_cal_component_get_icalcomponent (comp);
+			icalcomponent_set_method (icalcomp, ICAL_METHOD_CANCEL);
+			if (!e_cal_send_objects (event->comp_data->client, icalcomp, &users,
+						&mod_comp, &error))	{
+				delete_error_dialog (error, E_CAL_COMPONENT_EVENT);
+				g_clear_error (&error);
+				error = NULL;
+			} else {
+
+				if (mod_comp)
+					icalcomponent_free (mod_comp);
+
+				if (users) {
+					g_list_foreach (users, (GFunc) g_free, NULL);
+					g_list_free (users);
+				}
+			}
+		}
+	} else
+		delete = delete_component_dialog (comp, FALSE, 1, vtype, GTK_WIDGET (cal_view));
+
+	if (delete) {
+		const gchar *uid;
+		gchar *rid = NULL;
+
+		if ((itip_organizer_is_user (comp, event->comp_data->client) || itip_sentby_is_user (comp, event->comp_data->client))
+		    && cancel_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (GTK_WIDGET (cal_view)),
+						event->comp_data->client,
+						comp, TRUE))
+			itip_send_comp (E_CAL_COMPONENT_METHOD_CANCEL, comp,
+					event->comp_data->client, NULL, NULL, NULL, TRUE, FALSE);
+
+		e_cal_component_get_uid (comp, &uid);
+		if (!uid || !*uid) {
+			g_object_unref (comp);
+			return;
+		}
+		rid = e_cal_component_get_recurid_as_string (comp);
+		if (e_cal_util_component_is_instance (event->comp_data->icalcomp) || e_cal_util_component_has_recurrences (event->comp_data->icalcomp))
+			e_cal_remove_object_with_mod (event->comp_data->client, uid,
+				rid, CALOBJ_MOD_ALL, &error);
+		else
+			e_cal_remove_object (event->comp_data->client, uid, &error);
+
+		delete_error_dialog (error, E_CAL_COMPONENT_EVENT);
+		g_clear_error (&error);
+		g_free (rid);
+	}
+
+	g_object_unref (comp);
+}
+
+static void
 calendar_view_set_model (ECalendarView *calendar_view,
                          ECalModel *model)
 {
@@ -189,6 +321,7 @@ calendar_view_update_actions (ESelectable *selectable,
 	GList *list, *iter;
 	gboolean sources_are_editable = TRUE;
 	gboolean clipboard_has_calendar;
+	gboolean recurring = FALSE;
 	gboolean sensitive;
 	const gchar *tooltip;
 	gint n_selected;
@@ -200,13 +333,22 @@ calendar_view_update_actions (ESelectable *selectable,
 
 	for (iter = list; iter != NULL; iter = iter->next) {
 		ECalendarViewEvent *event = iter->data;
+		ECal *client;
+		icalcomponent *icalcomp;
 		gboolean read_only;
 
 		if (event == NULL || event->comp_data == NULL)
 			continue;
 
-		e_cal_is_read_only (event->comp_data->client, &read_only, NULL);
+		client = event->comp_data->client;
+		icalcomp = event->comp_data->icalcomp;
+
+		e_cal_is_read_only (client, &read_only, NULL);
 		sources_are_editable &= !read_only;
+
+		recurring |=
+			e_cal_util_component_is_instance (icalcomp) ||
+			e_cal_util_component_has_recurrences (icalcomp);
 	}
 
 	g_list_free (list);
@@ -232,6 +374,12 @@ calendar_view_update_actions (ESelectable *selectable,
 	tooltip = _("Paste events from the clipboard");
 	gtk_action_set_sensitive (action, sensitive);
 	gtk_action_set_tooltip (action, tooltip);
+
+	action = e_focus_tracker_get_delete_selection_action (focus_tracker);
+	sensitive = (n_selected > 0) && sources_are_editable && !recurring;
+	tooltip = _("Delete selected events");
+	gtk_action_set_sensitive (action, sensitive);
+	gtk_action_set_tooltip (action, tooltip);
 }
 
 static void
@@ -520,6 +668,29 @@ calendar_view_paste_clipboard (ESelectable *selectable)
 }
 
 static void
+calendar_view_delete_selection (ESelectable *selectable)
+{
+	ECalendarView *cal_view;
+	GList *selected, *iter;
+
+	cal_view = E_CALENDAR_VIEW (selectable);
+
+	selected = e_calendar_view_get_selected_events (cal_view);
+
+	for (iter = selected; iter != NULL; iter = iter->next) {
+		ECalendarViewEvent *event = iter->data;
+
+		/* XXX Why would this ever be NULL? */
+		if (event == NULL)
+			continue;
+
+		calendar_view_delete_event (cal_view, event);
+	}
+
+	g_list_free (selected);
+}
+
+static void
 e_calendar_view_class_init (ECalendarViewClass *class)
 {
 	GObjectClass *object_class;
@@ -659,6 +830,7 @@ calendar_view_selectable_init (ESelectableInterface *interface)
 	interface->cut_clipboard = calendar_view_cut_clipboard;
 	interface->copy_clipboard = calendar_view_copy_clipboard;
 	interface->paste_clipboard = calendar_view_paste_clipboard;
+	interface->delete_selection = calendar_view_delete_selection;
 }
 
 void
@@ -938,166 +1110,6 @@ e_calendar_view_update_query (ECalendarView *cal_view)
 	class->update_query (cal_view);
 }
 
-static void
-add_retract_data (ECalComponent *comp, const gchar *retract_comment, CalObjModType mod)
-{
-	icalcomponent *icalcomp = NULL;
-	icalproperty *icalprop = NULL;
-
-	icalcomp = e_cal_component_get_icalcomponent (comp);
-	if (retract_comment && *retract_comment)
-		icalprop = icalproperty_new_x (retract_comment);
-	else
-		icalprop = icalproperty_new_x ("0");
-	icalproperty_set_x_name (icalprop, "X-EVOLUTION-RETRACT-COMMENT");
-	icalcomponent_add_property (icalcomp, icalprop);
-
-	if (mod == CALOBJ_MOD_ALL)
-		icalprop = icalproperty_new_x ("All");
-	else
-		icalprop = icalproperty_new_x ("This");
-	icalproperty_set_x_name (icalprop, "X-EVOLUTION-RECUR-MOD");
-	icalcomponent_add_property (icalcomp, icalprop);
-}
-
-static gboolean
-check_for_retract (ECalComponent *comp, ECal *client)
-{
-	ECalComponentOrganizer org;
-	gchar *email = NULL;
-	const gchar *strip = NULL;
-	gboolean ret_val = FALSE;
-
-	if (!(e_cal_component_has_attendees (comp) &&
-				e_cal_get_save_schedules (client)))
-		return ret_val;
-
-	e_cal_component_get_organizer (comp, &org);
-	strip = itip_strip_mailto (org.value);
-
-	if (e_cal_get_cal_address (client, &email, NULL) && !g_ascii_strcasecmp (email, strip)) {
-		ret_val = TRUE;
-	}
-
-	g_free (email);
-	return ret_val;
-}
-
-static void
-delete_event (ECalendarView *cal_view, ECalendarViewEvent *event)
-{
-	ECalComponent *comp;
-	ECalComponentVType vtype;
-	gboolean  delete = FALSE;
-	GError *error = NULL;
-
-	comp = e_cal_component_new ();
-	e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
-	vtype = e_cal_component_get_vtype (comp);
-
-	/*FIXME remove it once the we dont set the recurrence id for all the generated instances */
-	if (!e_cal_get_static_capability (event->comp_data->client, CAL_STATIC_CAPABILITY_RECURRENCES_NO_MASTER))
-		e_cal_component_set_recurid (comp, NULL);
-
-	/*FIXME Retract should be moved to Groupwise features plugin */
-	if (check_for_retract (comp, event->comp_data->client)) {
-		gchar *retract_comment = NULL;
-		gboolean retract = FALSE;
-
-		delete = prompt_retract_dialog (comp, &retract_comment, GTK_WIDGET (cal_view), &retract);
-		if (retract) {
-			GList *users = NULL;
-			icalcomponent *icalcomp = NULL, *mod_comp = NULL;
-
-			add_retract_data (comp, retract_comment, CALOBJ_MOD_ALL);
-			icalcomp = e_cal_component_get_icalcomponent (comp);
-			icalcomponent_set_method (icalcomp, ICAL_METHOD_CANCEL);
-			if (!e_cal_send_objects (event->comp_data->client, icalcomp, &users,
-						&mod_comp, &error))	{
-				delete_error_dialog (error, E_CAL_COMPONENT_EVENT);
-				g_clear_error (&error);
-				error = NULL;
-			} else {
-
-				if (mod_comp)
-					icalcomponent_free (mod_comp);
-
-				if (users) {
-					g_list_foreach (users, (GFunc) g_free, NULL);
-					g_list_free (users);
-				}
-			}
-		}
-	} else
-		delete = delete_component_dialog (comp, FALSE, 1, vtype, GTK_WIDGET (cal_view));
-
-	if (delete) {
-		const gchar *uid;
-		gchar *rid = NULL;
-
-		if ((itip_organizer_is_user (comp, event->comp_data->client) || itip_sentby_is_user (comp, event->comp_data->client))
-		    && cancel_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (GTK_WIDGET (cal_view)),
-						event->comp_data->client,
-						comp, TRUE))
-			itip_send_comp (E_CAL_COMPONENT_METHOD_CANCEL, comp,
-					event->comp_data->client, NULL, NULL, NULL, TRUE, FALSE);
-
-		e_cal_component_get_uid (comp, &uid);
-		if (!uid || !*uid) {
-			g_object_unref (comp);
-			return;
-		}
-		rid = e_cal_component_get_recurid_as_string (comp);
-		if (e_cal_util_component_is_instance (event->comp_data->icalcomp) || e_cal_util_component_has_recurrences (event->comp_data->icalcomp))
-			e_cal_remove_object_with_mod (event->comp_data->client, uid,
-				rid, CALOBJ_MOD_ALL, &error);
-		else
-			e_cal_remove_object (event->comp_data->client, uid, &error);
-
-		delete_error_dialog (error, E_CAL_COMPONENT_EVENT);
-		g_clear_error (&error);
-		g_free (rid);
-	}
-
-	g_object_unref (comp);
-}
-
-void
-e_calendar_view_delete_selected_event (ECalendarView *cal_view)
-{
-	GList *selected;
-	ECalendarViewEvent *event;
-
-	selected = e_calendar_view_get_selected_events (cal_view);
-	if (!selected)
-		return;
-
-	event = (ECalendarViewEvent *) selected->data;
-	if (event)
-		delete_event (cal_view, event);
-
-	g_list_free (selected);
-}
-
-void
-e_calendar_view_delete_selected_events (ECalendarView *cal_view)
-{
-	GList *selected, *l;
-	ECalendarViewEvent *event;
-
-	selected = e_calendar_view_get_selected_events (cal_view);
-	if (!selected)
-		return;
-
-	for (l = selected; l != NULL; l = l->next) {
-		event = (ECalendarViewEvent *) l->data;
-		if (event)
-			delete_event (cal_view, event);
-	}
-
-	g_list_free (selected);
-}
-
 void
 e_calendar_view_delete_selected_occurrence (ECalendarView *cal_view)
 {
@@ -1117,7 +1129,7 @@ e_calendar_view_delete_selected_occurrence (ECalendarView *cal_view)
 	vtype = e_cal_component_get_vtype (comp);
 
 	/*FIXME Retract should be moved to Groupwise features plugin */
-	if (check_for_retract (comp, event->comp_data->client)) {
+	if (calendar_view_check_for_retract (comp, event->comp_data->client)) {
 		gchar *retract_comment = NULL;
 		gboolean retract = FALSE;
 
@@ -1126,7 +1138,8 @@ e_calendar_view_delete_selected_occurrence (ECalendarView *cal_view)
 			GList *users = NULL;
 			icalcomponent *icalcomp = NULL, *mod_comp = NULL;
 
-			add_retract_data (comp, retract_comment, CALOBJ_MOD_THIS);
+			calendar_view_add_retract_data (
+				comp, retract_comment, CALOBJ_MOD_THIS);
 			icalcomp = e_cal_component_get_icalcomponent (comp);
 			icalcomponent_set_method (icalcomp, ICAL_METHOD_CANCEL);
 			if (!e_cal_send_objects (event->comp_data->client, icalcomp, &users,
diff --git a/calendar/gui/e-calendar-view.h b/calendar/gui/e-calendar-view.h
index 3ad9565..d79a6fd 100644
--- a/calendar/gui/e-calendar-view.h
+++ b/calendar/gui/e-calendar-view.h
@@ -176,10 +176,6 @@ gboolean	e_calendar_view_get_visible_time_range
 						 time_t *end_time);
 void		e_calendar_view_update_query	(ECalendarView *cal_view);
 
-void		e_calendar_view_delete_selected_event
-						(ECalendarView *cal_view);
-void		e_calendar_view_delete_selected_events
-						(ECalendarView *cal_view);
 void		e_calendar_view_delete_selected_occurrence
 						(ECalendarView *cal_view);
 CompEditor *	e_calendar_view_open_event_with_flags
diff --git a/calendar/gui/e-memo-table.c b/calendar/gui/e-memo-table.c
index 62c0b99..5f2cd26 100644
--- a/calendar/gui/e-memo-table.c
+++ b/calendar/gui/e-memo-table.c
@@ -731,6 +731,12 @@ memo_table_update_actions (ESelectable *selectable,
 	gtk_action_set_sensitive (action, sensitive);
 	gtk_action_set_tooltip (action, tooltip);
 
+	action = e_focus_tracker_get_delete_selection_action (focus_tracker);
+	sensitive = (n_selected > 0) && sources_are_editable;
+	tooltip = _("Delete selected memos");
+	gtk_action_set_sensitive (action, sensitive);
+	gtk_action_set_tooltip (action, tooltip);
+
 	action = e_focus_tracker_get_select_all_action (focus_tracker);
 	sensitive = TRUE;
 	tooltip = _("Select all visible memos");
@@ -939,6 +945,77 @@ memo_table_paste_clipboard (ESelectable *selectable)
 	}
 }
 
+/* Used from e_table_selected_row_foreach(); puts the selected row number in an
+ * gint pointed to by the closure data.
+ */
+static void
+get_selected_row_cb (gint model_row, gpointer data)
+{
+	gint *row;
+
+	row = data;
+	*row = model_row;
+}
+
+/*
+ * Returns the component that is selected in the table; only works if there is
+ * one and only one selected row.
+ */
+static ECalModelComponent *
+get_selected_comp (EMemoTable *memo_table)
+{
+	ECalModel *model;
+	gint row;
+
+	model = e_memo_table_get_model (memo_table);
+	if (e_table_selected_count (E_TABLE (memo_table)) != 1)
+		return NULL;
+
+	row = -1;
+	e_table_selected_row_foreach (
+		E_TABLE (memo_table), get_selected_row_cb, &row);
+	g_return_val_if_fail (row != -1, NULL);
+
+	return e_cal_model_get_component_at (model, row);
+}
+
+static void
+memo_table_delete_selection (ESelectable *selectable)
+{
+	EMemoTable *memo_table;
+	ECalComponent *comp = NULL;
+	ECalModelComponent *comp_data;
+	gint n_selected;
+
+	memo_table = E_MEMO_TABLE (selectable);
+
+	n_selected = e_table_selected_count (E_TABLE (memo_table));
+	if (n_selected <= 0)
+		return;
+
+	if (n_selected == 1)
+		comp_data = get_selected_comp (memo_table);
+	else
+		comp_data = NULL;
+
+	/* FIXME: this may be something other than a TODO component */
+
+	if (comp_data) {
+		comp = e_cal_component_new ();
+		e_cal_component_set_icalcomponent (
+			comp, icalcomponent_new_clone (comp_data->icalcomp));
+	}
+
+	if (delete_component_dialog (
+		comp, FALSE, n_selected, E_CAL_COMPONENT_JOURNAL,
+		GTK_WIDGET (memo_table)))
+		delete_selected_components (memo_table);
+
+	/* free memory */
+	if (comp)
+		g_object_unref (comp);
+}
+
 static void
 memo_table_select_all (ESelectable *selectable)
 {
@@ -1044,6 +1121,7 @@ memo_table_selectable_init (ESelectableInterface *interface)
 	interface->cut_clipboard = memo_table_cut_clipboard;
 	interface->copy_clipboard = memo_table_copy_clipboard;
 	interface->paste_clipboard = memo_table_paste_clipboard;
+	interface->delete_selection = memo_table_delete_selection;
 	interface->select_all = memo_table_select_all;
 }
 
@@ -1128,40 +1206,6 @@ e_memo_table_get_shell_view (EMemoTable *memo_table)
 	return memo_table->priv->shell_view;
 }
 
-/* Used from e_table_selected_row_foreach(); puts the selected row number in an
- * gint pointed to by the closure data.
- */
-static void
-get_selected_row_cb (gint model_row, gpointer data)
-{
-	gint *row;
-
-	row = data;
-	*row = model_row;
-}
-
-/*
- * Returns the component that is selected in the table; only works if there is
- * one and only one selected row.
- */
-static ECalModelComponent *
-get_selected_comp (EMemoTable *memo_table)
-{
-	ECalModel *model;
-	gint row;
-
-	model = e_memo_table_get_model (memo_table);
-	if (e_table_selected_count (E_TABLE (memo_table)) != 1)
-		return NULL;
-
-	row = -1;
-	e_table_selected_row_foreach (
-		E_TABLE (memo_table), get_selected_row_cb, &row);
-	g_return_val_if_fail (row != -1, NULL);
-
-	return e_cal_model_get_component_at (model, row);
-}
-
 struct get_selected_uids_closure {
 	EMemoTable *memo_table;
 	GSList *objects;
@@ -1184,49 +1228,6 @@ add_uid_cb (gint model_row, gpointer data)
 }
 
 /**
- * e_memo_table_delete_selected:
- * @memo_table: A memo table.
- *
- * Deletes the selected components in the table; asks the user first.
- **/
-void
-e_memo_table_delete_selected (EMemoTable *memo_table)
-{
-	gint n_selected;
-	ECalModelComponent *comp_data;
-	ECalComponent *comp = NULL;
-
-	g_return_if_fail (memo_table != NULL);
-	g_return_if_fail (E_IS_MEMO_TABLE (memo_table));
-
-	n_selected = e_table_selected_count (E_TABLE (memo_table));
-	if (n_selected <= 0)
-		return;
-
-	if (n_selected == 1)
-		comp_data = get_selected_comp (memo_table);
-	else
-		comp_data = NULL;
-
-	/* FIXME: this may be something other than a TODO component */
-
-	if (comp_data) {
-		comp = e_cal_component_new ();
-		e_cal_component_set_icalcomponent (
-			comp, icalcomponent_new_clone (comp_data->icalcomp));
-	}
-
-	if (delete_component_dialog (
-		comp, FALSE, n_selected, E_CAL_COMPONENT_JOURNAL,
-		GTK_WIDGET (memo_table)))
-		delete_selected_components (memo_table);
-
-	/* free memory */
-	if (comp)
-		g_object_unref (comp);
-}
-
-/**
  * e_memo_table_get_selected:
  * @memo_table:
  *
diff --git a/calendar/gui/e-memo-table.h b/calendar/gui/e-memo-table.h
index a5707ec..c891117 100644
--- a/calendar/gui/e-memo-table.h
+++ b/calendar/gui/e-memo-table.h
@@ -102,7 +102,6 @@ gboolean	e_memo_table_get_use_24_hour_format
 void		e_memo_table_set_use_24_hour_format
 						(EMemoTable *memo_table,
 						 gboolean use_24_hour_format);
-void		e_memo_table_delete_selected	(EMemoTable *memo_table);
 GSList *	e_memo_table_get_selected	(EMemoTable *memo_table);
 
 G_END_DECLS
diff --git a/calendar/gui/e-task-table.c b/calendar/gui/e-task-table.c
index 5136a56..9f0962d 100644
--- a/calendar/gui/e-task-table.c
+++ b/calendar/gui/e-task-table.c
@@ -271,6 +271,7 @@ delete_selected_components (ETaskTable *task_table)
 
 	g_slist_free (objs);
 }
+
 static void
 task_table_set_model (ETaskTable *task_table,
                       ECalModel *model)
@@ -911,6 +912,12 @@ task_table_update_actions (ESelectable *selectable,
 	gtk_action_set_sensitive (action, sensitive);
 	gtk_action_set_tooltip (action, tooltip);
 
+	action = e_focus_tracker_get_delete_selection_action (focus_tracker);
+	sensitive = (n_selected > 0) && sources_are_editable;
+	tooltip = _("Delete selected tasks");
+	gtk_action_set_sensitive (action, sensitive);
+	gtk_action_set_tooltip (action, tooltip);
+
 	action = e_focus_tracker_get_select_all_action (focus_tracker);
 	sensitive = TRUE;
 	tooltip = _("Select all visible tasks");
@@ -1119,6 +1126,155 @@ task_table_paste_clipboard (ESelectable *selectable)
 	}
 }
 
+/* Used from e_table_selected_row_foreach(); puts the selected row number in an
+ * gint pointed to by the closure data.
+ */
+static void
+get_selected_row_cb (gint model_row, gpointer data)
+{
+	gint *row;
+
+	row = data;
+	*row = model_row;
+}
+
+/*
+ * Returns the component that is selected in the table; only works if there is
+ * one and only one selected row.
+ */
+static ECalModelComponent *
+get_selected_comp (ETaskTable *task_table)
+{
+	ECalModel *model;
+	gint row;
+
+	model = e_task_table_get_model (task_table);
+	if (e_table_selected_count (E_TABLE (task_table)) != 1)
+		return NULL;
+
+	row = -1;
+	e_table_selected_row_foreach (
+		E_TABLE (task_table), get_selected_row_cb, &row);
+	g_return_val_if_fail (row != -1, NULL);
+
+	return e_cal_model_get_component_at (model, row);
+}
+
+static void
+add_retract_data (ECalComponent *comp, const gchar *retract_comment)
+{
+	icalcomponent *icalcomp = NULL;
+	icalproperty *icalprop = NULL;
+
+	icalcomp = e_cal_component_get_icalcomponent (comp);
+	if (retract_comment && *retract_comment)
+		icalprop = icalproperty_new_x (retract_comment);
+	else
+		icalprop = icalproperty_new_x ("0");
+	icalproperty_set_x_name (icalprop, "X-EVOLUTION-RETRACT-COMMENT");
+	icalcomponent_add_property (icalcomp, icalprop);
+}
+
+static gboolean
+check_for_retract (ECalComponent *comp, ECal *client)
+{
+	ECalComponentOrganizer org;
+	gchar *email = NULL;
+	const gchar *strip = NULL;
+	gboolean ret_val;
+
+	if (!e_cal_component_has_attendees (comp))
+		return FALSE;
+
+	if (!e_cal_get_save_schedules (client))
+		return FALSE;
+
+	e_cal_component_get_organizer (comp, &org);
+	strip = itip_strip_mailto (org.value);
+
+	ret_val =
+		e_cal_get_cal_address (client, &email, NULL) &&
+		g_ascii_strcasecmp (email, strip) == 0;
+
+	g_free (email);
+
+	return ret_val;
+}
+
+static void
+task_table_delete_selection (ESelectable *selectable)
+{
+	ETaskTable *task_table;
+	ECalModelComponent *comp_data;
+	ECalComponent *comp = NULL;
+	gboolean delete = FALSE;
+	gint n_selected;
+	GError *error = NULL;
+
+	task_table = E_TASK_TABLE (selectable);
+
+	n_selected = e_table_selected_count (E_TABLE (task_table));
+	if (n_selected <= 0)
+		return;
+
+	if (n_selected == 1)
+		comp_data = get_selected_comp (task_table);
+	else
+		comp_data = NULL;
+
+	/* FIXME: this may be something other than a TODO component */
+
+	if (comp_data) {
+		comp = e_cal_component_new ();
+		e_cal_component_set_icalcomponent (
+			comp, icalcomponent_new_clone (comp_data->icalcomp));
+	}
+
+	if ((n_selected == 1) && comp && check_for_retract (comp, comp_data->client)) {
+		gchar *retract_comment = NULL;
+		gboolean retract = FALSE;
+
+		delete = prompt_retract_dialog (
+			comp, &retract_comment,
+			GTK_WIDGET (task_table), &retract);
+		if (retract) {
+			GList *users = NULL;
+			icalcomponent *icalcomp = NULL, *mod_comp = NULL;
+
+			add_retract_data (comp, retract_comment);
+			icalcomp = e_cal_component_get_icalcomponent (comp);
+			icalcomponent_set_method (icalcomp, ICAL_METHOD_CANCEL);
+			if (!e_cal_send_objects (comp_data->client, icalcomp, &users,
+						&mod_comp, &error))	{
+				delete_error_dialog (error, E_CAL_COMPONENT_TODO);
+				g_clear_error (&error);
+				error = NULL;
+			} else {
+
+				if (mod_comp)
+					icalcomponent_free (mod_comp);
+
+				if (users) {
+					g_list_foreach (users, (GFunc) g_free, NULL);
+					g_list_free (users);
+				}
+			}
+
+		}
+	} else {
+		delete = delete_component_dialog (
+			comp, FALSE, n_selected,
+			E_CAL_COMPONENT_TODO, GTK_WIDGET (task_table));
+	}
+
+	if (delete)
+		delete_selected_components (task_table);
+
+	/* free memory */
+	if (comp)
+		g_object_unref (comp);
+}
+
 static void
 task_table_select_all (ESelectable *selectable)
 {
@@ -1224,6 +1380,7 @@ task_table_selectable_init (ESelectableInterface *interface)
 	interface->cut_clipboard = task_table_cut_clipboard;
 	interface->copy_clipboard = task_table_copy_clipboard;
 	interface->paste_clipboard = task_table_paste_clipboard;
+	interface->delete_selection = task_table_delete_selection;
 	interface->select_all = task_table_select_all;
 }
 
@@ -1307,40 +1464,6 @@ e_task_table_get_shell_view (ETaskTable *task_table)
 	return task_table->priv->shell_view;
 }
 
-/* Used from e_table_selected_row_foreach(); puts the selected row number in an
- * gint pointed to by the closure data.
- */
-static void
-get_selected_row_cb (gint model_row, gpointer data)
-{
-	gint *row;
-
-	row = data;
-	*row = model_row;
-}
-
-/*
- * Returns the component that is selected in the table; only works if there is
- * one and only one selected row.
- */
-static ECalModelComponent *
-get_selected_comp (ETaskTable *task_table)
-{
-	ECalModel *model;
-	gint row;
-
-	model = e_task_table_get_model (task_table);
-	if (e_table_selected_count (E_TABLE (task_table)) != 1)
-		return NULL;
-
-	row = -1;
-	e_table_selected_row_foreach (
-		E_TABLE (task_table), get_selected_row_cb, &row);
-	g_return_val_if_fail (row != -1, NULL);
-
-	return e_cal_model_get_component_at (model, row);
-}
-
 struct get_selected_uids_closure {
 	ETaskTable *task_table;
 	GSList *objects;
@@ -1360,127 +1483,6 @@ add_uid_cb (gint model_row, gpointer data)
 	closure->objects = g_slist_prepend (closure->objects, comp_data);
 }
 
-static void
-add_retract_data (ECalComponent *comp, const gchar *retract_comment)
-{
-	icalcomponent *icalcomp = NULL;
-	icalproperty *icalprop = NULL;
-
-	icalcomp = e_cal_component_get_icalcomponent (comp);
-	if (retract_comment && *retract_comment)
-		icalprop = icalproperty_new_x (retract_comment);
-	else
-		icalprop = icalproperty_new_x ("0");
-	icalproperty_set_x_name (icalprop, "X-EVOLUTION-RETRACT-COMMENT");
-	icalcomponent_add_property (icalcomp, icalprop);
-}
-
-static gboolean
-check_for_retract (ECalComponent *comp, ECal *client)
-{
-	ECalComponentOrganizer org;
-	gchar *email = NULL;
-	const gchar *strip = NULL;
-	gboolean ret_val;
-
-	if (!e_cal_component_has_attendees (comp))
-		return FALSE;
-
-	if (!e_cal_get_save_schedules (client))
-		return FALSE;
-
-	e_cal_component_get_organizer (comp, &org);
-	strip = itip_strip_mailto (org.value);
-
-	ret_val =
-		e_cal_get_cal_address (client, &email, NULL) &&
-		g_ascii_strcasecmp (email, strip) == 0;
-
-	g_free (email);
-
-	return ret_val;
-}
-
-/**
- * e_task_table_delete_selected:
- * @task_table: A calendar table.
- *
- * Deletes the selected components in the table; asks the user first.
- **/
-void
-e_task_table_delete_selected (ETaskTable *task_table)
-{
-	gint n_selected;
-	ECalModelComponent *comp_data;
-	ECalComponent *comp = NULL;
-	gboolean delete = FALSE;
-	GError *error = NULL;
-
-	g_return_if_fail (task_table != NULL);
-	g_return_if_fail (E_IS_CALENDAR_TABLE (task_table));
-
-	n_selected = e_table_selected_count (E_TABLE (task_table));
-	if (n_selected <= 0)
-		return;
-
-	if (n_selected == 1)
-		comp_data = get_selected_comp (task_table);
-	else
-		comp_data = NULL;
-
-	/* FIXME: this may be something other than a TODO component */
-
-	if (comp_data) {
-		comp = e_cal_component_new ();
-		e_cal_component_set_icalcomponent (
-			comp, icalcomponent_new_clone (comp_data->icalcomp));
-	}
-
-	if ((n_selected == 1) && comp && check_for_retract (comp, comp_data->client)) {
-		gchar *retract_comment = NULL;
-		gboolean retract = FALSE;
-
-		delete = prompt_retract_dialog (
-			comp, &retract_comment,
-			GTK_WIDGET (task_table), &retract);
-		if (retract) {
-			GList *users = NULL;
-			icalcomponent *icalcomp = NULL, *mod_comp = NULL;
-
-			add_retract_data (comp, retract_comment);
-			icalcomp = e_cal_component_get_icalcomponent (comp);
-			icalcomponent_set_method (icalcomp, ICAL_METHOD_CANCEL);
-			if (!e_cal_send_objects (comp_data->client, icalcomp, &users,
-						&mod_comp, &error))	{
-				delete_error_dialog (error, E_CAL_COMPONENT_TODO);
-				g_clear_error (&error);
-				error = NULL;
-			} else {
-
-				if (mod_comp)
-					icalcomponent_free (mod_comp);
-
-				if (users) {
-					g_list_foreach (users, (GFunc) g_free, NULL);
-					g_list_free (users);
-				}
-			}
-
-		}
-	} else {
-		delete = delete_component_dialog (
-			comp, FALSE, n_selected,
-			E_CAL_COMPONENT_TODO, GTK_WIDGET (task_table));
-	}
-
-	if (delete)
-		delete_selected_components (task_table);
-
-	/* free memory */
-	if (comp)
-		g_object_unref (comp);
-}
-
 /**
  * e_task_table_get_selected:
  * @task_table:
diff --git a/calendar/gui/e-task-table.h b/calendar/gui/e-task-table.h
index 8564d99..b23f128 100644
--- a/calendar/gui/e-task-table.h
+++ b/calendar/gui/e-task-table.h
@@ -92,7 +92,6 @@ GtkWidget *	e_task_table_new		(EShellView *shell_view,
 						 ECalModel *model);
 ECalModel *	e_task_table_get_model		(ETaskTable *task_table);
 EShellView *	e_task_table_get_shell_view	(ETaskTable *task_table);
-void		e_task_table_delete_selected	(ETaskTable *task_table);
 GSList *	e_task_table_get_selected	(ETaskTable *task_table);
 ECalModelComponent *
 		e_task_table_get_selected_comp
diff --git a/modules/addressbook/e-book-shell-view-actions.c b/modules/addressbook/e-book-shell-view-actions.c
index 61434d4..e791f8e 100644
--- a/modules/addressbook/e-book-shell-view-actions.c
+++ b/modules/addressbook/e-book-shell-view-actions.c
@@ -337,7 +337,7 @@ action_contact_delete_cb (GtkAction *action,
 	view = e_book_shell_content_get_current_view (book_shell_content);
 	g_return_if_fail (view != NULL);
 
-	e_addressbook_view_delete_selection (view, TRUE);
+	e_selectable_delete_selection (E_SELECTABLE (view));
 }
 
 static void
@@ -661,7 +661,7 @@ static GtkActionEntry contact_entries[] = {
 
 	{ "address-book-delete",
 	  GTK_STOCK_DELETE,
-	  N_("Del_ete Address Book"),
+	  N_("D_elete Address Book"),
 	  NULL,
 	  N_("Delete the selected address book"),
 	  G_CALLBACK (action_address_book_delete_cb) },
@@ -803,10 +803,6 @@ static EPopupActionEntry contact_popup_entries[] = {
 	  NULL,
 	  "contact-copy" },
 
-	{ "contact-popup-delete",
-	  NULL,
-	  "contact-delete" },
-
 	{ "contact-popup-forward",
 	  NULL,
 	  "contact-forward" },
@@ -1042,9 +1038,6 @@ e_book_shell_view_actions_init (EBookShellView *book_shell_view)
 
 	/* Fine tuning. */
 
-	action = ACTION (CONTACT_DELETE);
-	g_object_set (action, "short-label", _("Delete"), NULL);
-
 	g_signal_connect (
 		ACTION (GAL_SAVE_CUSTOM_VIEW), "activate",
 		G_CALLBACK (action_gal_save_custom_view_cb), book_shell_view);
diff --git a/modules/addressbook/e-book-shell-view-private.h b/modules/addressbook/e-book-shell-view-private.h
index c0fb2f0..97fe64e 100644
--- a/modules/addressbook/e-book-shell-view-private.h
+++ b/modules/addressbook/e-book-shell-view-private.h
@@ -41,6 +41,7 @@
 #include "shell/e-shell-sidebar.h"
 #include "shell/e-shell-utils.h"
 #include "misc/e-popup-action.h"
+#include "misc/e-selectable.h"
 
 #include "addressbook/util/eab-book-util.h"
 #include "addressbook/gui/contact-editor/e-contact-editor.h"
diff --git a/modules/calendar/e-cal-shell-content.c b/modules/calendar/e-cal-shell-content.c
index 1ab680e..5213480 100644
--- a/modules/calendar/e-cal-shell-content.c
+++ b/modules/calendar/e-cal-shell-content.c
@@ -28,6 +28,7 @@
 #include "e-util/gconf-bridge.h"
 #include "widgets/menus/gal-view-etable.h"
 #include "widgets/misc/e-paned.h"
+#include "widgets/misc/e-selectable.h"
 
 #include "calendar/gui/calendar-config.h"
 #include "calendar/gui/calendar-view.h"
@@ -139,81 +140,6 @@ cal_shell_content_notify_view_id_cb (ECalShellContent *cal_shell_content)
 	cal_shell_content->priv->paned_binding_id = binding_id;
 }
 
-static FocusLocation
-cal_shell_content_get_focus_location (ECalShellContent *cal_shell_content)
-{
-	GnomeCalendar *calendar;
-	GnomeCalendarViewType view_type;
-	ECalendarView *calendar_view;
-	EMemoTable *memo_table;
-	ETaskTable *task_table;
-	ETable *table;
-
-	/* XXX This function is silly.  Certainly there are better ways
-	 *     of directing user input to the focused area than polling
-	 *     a bunch of widgets to see what's focused. */
-
-	calendar = GNOME_CALENDAR (cal_shell_content->priv->calendar);
-	view_type = gnome_calendar_get_view (calendar);
-	calendar_view = gnome_calendar_get_calendar_view (calendar, view_type);
-
-	memo_table = E_MEMO_TABLE (cal_shell_content->priv->memo_table);
-	task_table = E_TASK_TABLE (cal_shell_content->priv->task_table);
-
-	table = E_TABLE (memo_table);
-	if (gtk_widget_is_focus (GTK_WIDGET (table->table_canvas)))
-		return FOCUS_MEMO_TABLE;
-
-	table = E_TABLE (task_table);
-	if (gtk_widget_is_focus (GTK_WIDGET (table->table_canvas)))
-		return FOCUS_TASK_TABLE;
-
-	if (E_IS_DAY_VIEW (calendar_view)) {
-		EDayView *day_view = E_DAY_VIEW (calendar_view);
-
-		if (gtk_widget_is_focus (day_view->top_canvas))
-			return FOCUS_CALENDAR;
-
-		if (GNOME_CANVAS (day_view->top_canvas)->focused_item != NULL)
-			return FOCUS_CALENDAR;
-
-		if (gtk_widget_is_focus (day_view->main_canvas))
-			return FOCUS_CALENDAR;
-
-		if (GNOME_CANVAS (day_view->main_canvas)->focused_item != NULL)
-			return FOCUS_CALENDAR;
-
-		if (gtk_widget_is_focus (GTK_WIDGET (day_view)))
-			return FOCUS_CALENDAR;
-
-	} else if (E_IS_WEEK_VIEW (calendar_view)) {
-		EWeekView *week_view = E_WEEK_VIEW (calendar_view);
-
-		if (gtk_widget_is_focus (week_view->main_canvas))
-			return FOCUS_CALENDAR;
-
-		if (GNOME_CANVAS (week_view->main_canvas)->focused_item != NULL)
-			return FOCUS_CALENDAR;
-
-		if (gtk_widget_is_focus (GTK_WIDGET (week_view)))
-			return FOCUS_CALENDAR;
-
-	} else if (E_IS_CAL_LIST_VIEW (calendar_view)) {
-		ECalListView *list_view = E_CAL_LIST_VIEW (calendar_view);
-
-		if (gtk_widget_is_focus (GTK_WIDGET (list_view->table)))
-			return FOCUS_CALENDAR;
-
-		if (gtk_widget_is_focus (GTK_WIDGET (list_view->table->table_canvas)))
-			return FOCUS_CALENDAR;
-
-		if (gtk_widget_is_focus (GTK_WIDGET (list_view)))
-			return FOCUS_CALENDAR;
-	}
-
-	return FOCUS_OTHER;
-}
-
 static void
 cal_shell_content_set_property (GObject *object,
                                 guint property_id,
@@ -720,60 +646,3 @@ e_cal_shell_content_get_view_instance (ECalShellContent *cal_shell_content)
 
 	return cal_shell_content->priv->view_instance;
 }
-
-void
-e_cal_shell_content_delete_selection (ECalShellContent *cal_shell_content)
-{
-	GnomeCalendar *calendar;
-	EMemoTable *memo_table;
-	ETaskTable *task_table;
-	GnomeCalendarViewType view_type;
-	ECalendarView *calendar_view;
-
-	g_return_if_fail (E_IS_CAL_SHELL_CONTENT (cal_shell_content));
-
-	calendar = e_cal_shell_content_get_calendar (cal_shell_content);
-	memo_table = e_cal_shell_content_get_memo_table (cal_shell_content);
-	task_table = e_cal_shell_content_get_task_table (cal_shell_content);
-
-	view_type = gnome_calendar_get_view (calendar);
-	calendar_view = gnome_calendar_get_calendar_view (calendar, view_type);
-
-	switch (cal_shell_content_get_focus_location (cal_shell_content)) {
-		case FOCUS_CALENDAR:
-			e_calendar_view_delete_selected_events (calendar_view);
-			break;
-
-		case FOCUS_MEMO_TABLE:
-			e_memo_table_delete_selected (memo_table);
-			break;
-
-		case FOCUS_TASK_TABLE:
-			e_task_table_delete_selected (task_table);
-			break;
-
-		default:
-			g_return_if_reached ();
-	}
-}
-
-void
-e_cal_shell_content_delete_selected_occurrence (ECalShellContent *cal_shell_content)
-{
-	GnomeCalendar *calendar;
-	GnomeCalendarViewType view_type;
-	ECalendarView *calendar_view;
-	FocusLocation focus;
-
-	g_return_if_fail (E_IS_CAL_SHELL_CONTENT (cal_shell_content));
-
-	focus = cal_shell_content_get_focus_location (cal_shell_content);
-	if (focus != FOCUS_CALENDAR)
-		return;
-
-	calendar = e_cal_shell_content_get_calendar (cal_shell_content);
-	view_type = gnome_calendar_get_view (calendar);
-	calendar_view = gnome_calendar_get_calendar_view (calendar, view_type);
-
-	e_calendar_view_delete_selected_occurrence (calendar_view);
-}
diff --git a/modules/calendar/e-cal-shell-content.h b/modules/calendar/e-cal-shell-content.h
index 78c2199..92acbaa 100644
--- a/modules/calendar/e-cal-shell-content.h
+++ b/modules/calendar/e-cal-shell-content.h
@@ -97,10 +97,6 @@ EShellSearchbar *
 GalViewInstance *
 		e_cal_shell_content_get_view_instance
 					(ECalShellContent *cal_shell_content);
-void		e_cal_shell_content_delete_selection
-					(ECalShellContent *cal_shell_content);
-void		e_cal_shell_content_delete_selected_occurrence
-					(ECalShellContent *cal_shell_content);
 
 G_END_DECLS
 
diff --git a/modules/calendar/e-cal-shell-view-actions.c b/modules/calendar/e-cal-shell-view-actions.c
index 0e361c5..ca50b56 100644
--- a/modules/calendar/e-cal-shell-view-actions.c
+++ b/modules/calendar/e-cal-shell-view-actions.c
@@ -659,9 +659,17 @@ action_event_delete_cb (GtkAction *action,
                         ECalShellView *cal_shell_view)
 {
 	ECalShellContent *cal_shell_content;
+	GnomeCalendar *calendar;
+	GnomeCalendarViewType view_type;
+	ECalendarView *calendar_view;
 
 	cal_shell_content = cal_shell_view->priv->cal_shell_content;
-	e_cal_shell_content_delete_selection (cal_shell_content);
+	calendar = e_cal_shell_content_get_calendar (cal_shell_content);
+
+	view_type = gnome_calendar_get_view (calendar);
+	calendar_view = gnome_calendar_get_calendar_view (calendar, view_type);
+
+	e_selectable_delete_selection (E_SELECTABLE (calendar_view));
 }
 
 static void
@@ -669,20 +677,17 @@ action_event_delete_occurrence_cb (GtkAction *action,
                                    ECalShellView *cal_shell_view)
 {
 	ECalShellContent *cal_shell_content;
+	GnomeCalendar *calendar;
+	GnomeCalendarViewType view_type;
+	ECalendarView *calendar_view;
 
 	cal_shell_content = cal_shell_view->priv->cal_shell_content;
-	e_cal_shell_content_delete_selected_occurrence (cal_shell_content);
-}
+	calendar = e_cal_shell_content_get_calendar (cal_shell_content);
 
-static void
-action_event_delete_occurrence_all_cb (GtkAction *action,
-                                       ECalShellView *cal_shell_view)
-{
-	ECalShellContent *cal_shell_content;
+	view_type = gnome_calendar_get_view (calendar);
+	calendar_view = gnome_calendar_get_calendar_view (calendar, view_type);
 
-	/* XXX Same as "event-delete". */
-	cal_shell_content = cal_shell_view->priv->cal_shell_content;
-	e_cal_shell_content_delete_selection (cal_shell_content);
+	e_calendar_view_delete_selected_occurrence (calendar_view);
 }
 
 static void
@@ -1236,9 +1241,9 @@ static GtkActionEntry calendar_entries[] = {
 
 	{ "calendar-delete",
 	  GTK_STOCK_DELETE,
+	  N_("D_elete Calendar"),
 	  NULL,
-	  NULL,
-	  NULL,  /* XXX Add a tooltip! */
+	  N_("Delete the selected calendar"),
 	  G_CALLBACK (action_calendar_delete_cb) },
 
 	{ "calendar-go-back",
@@ -1327,9 +1332,9 @@ static GtkActionEntry calendar_entries[] = {
 
 	{ "event-delete",
 	  GTK_STOCK_DELETE,
-	  NULL,
+	  N_("_Delete Appointment"),
 	  "<Control>d",
-	  N_("Delete the appointment"),
+	  N_("Delete selected appointments"),
 	  G_CALLBACK (action_event_delete_cb) },
 
 	{ "event-delete-occurrence",
@@ -1341,10 +1346,10 @@ static GtkActionEntry calendar_entries[] = {
 
 	{ "event-delete-occurrence-all",
 	  GTK_STOCK_DELETE,
-	  N_("Delete _All Occurrences"),
+	  N_("Delete All Occ_urrences"),
 	  NULL,
 	  N_("Delete all occurrences"),
-	  G_CALLBACK (action_event_delete_occurrence_all_cb) },
+	  G_CALLBACK (action_event_delete_cb) },
 
 	{ "event-all-day-new",
 	  "stock_new-24h-appointment",
@@ -1451,7 +1456,7 @@ static EPopupActionEntry calendar_popup_entries[] = {
 	  "calendar-copy" },
 
 	{ "calendar-popup-delete",
-	  NULL,
+	  N_("_Delete"),
 	  "calendar-delete" },
 
 	{ "calendar-popup-go-today",
@@ -1750,9 +1755,6 @@ e_cal_shell_view_actions_init (ECalShellView *cal_shell_view)
 	action = ACTION (CALENDAR_VIEW_WORKWEEK);
 	g_object_set (action, "is-important", TRUE, NULL);
 
-	action = ACTION (EVENT_DELETE);
-	g_object_set (action, "short-label", _("Delete"), NULL);
-
 	g_signal_connect (
 		ACTION (GAL_SAVE_CUSTOM_VIEW), "activate",
 		G_CALLBACK (action_gal_save_custom_view_cb), cal_shell_view);
diff --git a/modules/calendar/e-cal-shell-view-actions.h b/modules/calendar/e-cal-shell-view-actions.h
index a1cb313..a69b82f 100644
--- a/modules/calendar/e-cal-shell-view-actions.h
+++ b/modules/calendar/e-cal-shell-view-actions.h
@@ -91,8 +91,6 @@
 	E_SHELL_WINDOW_ACTION ((window), "event-occurrence-movable")
 
 /* Memo Pad Actions */
-#define E_SHELL_WINDOW_ACTION_CALENDAR_MEMOPAD_DELETE(window) \
-        E_SHELL_WINDOW_ACTION ((window), "calendar-memopad-delete")
 #define E_SHELL_WINDOW_ACTION_CALENDAR_MEMOPAD_FORWARD(window) \
         E_SHELL_WINDOW_ACTION ((window), "calendar-memopad-forward")
 #define E_SHELL_WINDOW_ACTION_CALENDAR_MEMOPAD_NEW(window) \
@@ -109,8 +107,6 @@
 /* Task Pad Actions */
 #define E_SHELL_WINDOW_ACTION_CALENDAR_TASKPAD_ASSIGN(window) \
 	E_SHELL_WINDOW_ACTION ((window), "calendar-taskpad-assign")
-#define E_SHELL_WINDOW_ACTION_CALENDAR_TASKPAD_DELETE(window) \
-        E_SHELL_WINDOW_ACTION ((window), "calendar-taskpad-delete")
 #define E_SHELL_WINDOW_ACTION_CALENDAR_TASKPAD_FORWARD(window) \
         E_SHELL_WINDOW_ACTION ((window), "calendar-taskpad-forward")
 #define E_SHELL_WINDOW_ACTION_CALENDAR_TASKPAD_MARK_COMPLETE(window) \
diff --git a/modules/calendar/e-cal-shell-view-memopad.c b/modules/calendar/e-cal-shell-view-memopad.c
index e34dac9..61ef73d 100644
--- a/modules/calendar/e-cal-shell-view-memopad.c
+++ b/modules/calendar/e-cal-shell-view-memopad.c
@@ -24,23 +24,6 @@
 /* Much of this file is based on e-memo-shell-view-actions.c. */
 
 static void
-action_calendar_memopad_delete_cb (GtkAction *action,
-                                   ECalShellView *cal_shell_view)
-{
-	ECalShellContent *cal_shell_content;
-	EMemoTable *memo_table;
-
-	cal_shell_content = cal_shell_view->priv->cal_shell_content;
-	memo_table = e_cal_shell_content_get_memo_table (cal_shell_content);
-
-	e_cal_shell_view_memopad_set_status_message (
-		cal_shell_view, _("Deleting selected memos..."), -1.0);
-	e_memo_table_delete_selected (memo_table);
-	e_cal_shell_view_memopad_set_status_message (
-		cal_shell_view, NULL, -1.0);
-}
-
-static void
 action_calendar_memopad_forward_cb (GtkAction *action,
                                     ECalShellView *cal_shell_view)
 {
@@ -255,13 +238,6 @@ action_calendar_memopad_save_as_cb (GtkAction *action,
 
 static GtkActionEntry calendar_memopad_entries[] = {
 
-	{ "calendar-memopad-delete",
-	  GTK_STOCK_DELETE,
-	  N_("_Delete Memo"),
-	  NULL,
-	  N_("Delete selected memos"),
-	  G_CALLBACK (action_calendar_memopad_delete_cb) },
-
 	{ "calendar-memopad-forward",
 	  "mail-forward",
 	  N_("_Forward as iCalendar..."),
@@ -340,7 +316,6 @@ e_cal_shell_view_memopad_actions_update (ECalShellView *cal_shell_view)
 	EMemoTable *memo_table;
 	GtkAction *action;
 	GSList *list, *iter;
-	const gchar *label;
 	gboolean editable = TRUE;
 	gboolean has_url = FALSE;
 	gboolean sensitive;
@@ -369,12 +344,6 @@ e_cal_shell_view_memopad_actions_update (ECalShellView *cal_shell_view)
 	}
 	g_slist_free (list);
 
-	action = ACTION (CALENDAR_MEMOPAD_DELETE);
-	sensitive = (n_selected > 0) && editable;
-	gtk_action_set_sensitive (action, sensitive);
-	label = ngettext ("Delete Memo", "Delete Memos", n_selected);
-	g_object_set (action, "label", label, NULL);
-
 	action = ACTION (CALENDAR_MEMOPAD_FORWARD);
 	sensitive = (n_selected == 1);
 	gtk_action_set_sensitive (action, sensitive);
diff --git a/modules/calendar/e-cal-shell-view-private.h b/modules/calendar/e-cal-shell-view-private.h
index 1f9dc17..c69ffc7 100644
--- a/modules/calendar/e-cal-shell-view-private.h
+++ b/modules/calendar/e-cal-shell-view-private.h
@@ -37,7 +37,8 @@
 #include "e-util/e-file-utils.h"
 #include "e-util/e-util.h"
 #include "shell/e-shell-utils.h"
-#include "widgets/misc/e-popup-action.h"
+#include "misc/e-popup-action.h"
+#include "misc/e-selectable.h"
 
 #include "calendar/common/authentication.h"
 #include "calendar/gui/calendar-config.h"
diff --git a/modules/calendar/e-cal-shell-view-taskpad.c b/modules/calendar/e-cal-shell-view-taskpad.c
index 67a355a..c7269bc 100644
--- a/modules/calendar/e-cal-shell-view-taskpad.c
+++ b/modules/calendar/e-cal-shell-view-taskpad.c
@@ -47,23 +47,6 @@ action_calendar_taskpad_assign_cb (GtkAction *action,
 }
 
 static void
-action_calendar_taskpad_delete_cb (GtkAction *action,
-                                   ECalShellView *cal_shell_view)
-{
-	ECalShellContent *cal_shell_content;
-	ETaskTable *task_table;
-
-	cal_shell_content = cal_shell_view->priv->cal_shell_content;
-	task_table = e_cal_shell_content_get_task_table (cal_shell_content);
-
-	e_cal_shell_view_taskpad_set_status_message (
-		cal_shell_view, _("Deleting selected tasks..."), -1.0);
-	e_task_table_delete_selected (task_table);
-	e_cal_shell_view_taskpad_set_status_message (
-		cal_shell_view, NULL, -1.0);
-}
-
-static void
 action_calendar_taskpad_forward_cb (GtkAction *action,
                                     ECalShellView *cal_shell_view)
 {
@@ -329,13 +312,6 @@ static GtkActionEntry calendar_taskpad_entries[] = {
 	  NULL,  /* XXX Add a tooltip! */
 	  G_CALLBACK (action_calendar_taskpad_assign_cb) },
 
-	{ "calendar-taskpad-delete",
-	  GTK_STOCK_DELETE,
-	  N_("_Delete Task"),
-	  NULL,
-	  N_("Delete selected tasks"),
-	  G_CALLBACK (action_calendar_taskpad_delete_cb) },
-
 	{ "calendar-taskpad-forward",
 	  "mail-forward",
 	  N_("_Forward as iCalendar..."),
@@ -428,7 +404,6 @@ e_cal_shell_view_taskpad_actions_update (ECalShellView *cal_shell_view)
 	ETaskTable *task_table;
 	GtkAction *action;
 	GSList *list, *iter;
-	const gchar *label;
 	gboolean assignable = TRUE;
 	gboolean editable = TRUE;
 	gboolean has_url = FALSE;
@@ -480,12 +455,6 @@ e_cal_shell_view_taskpad_actions_update (ECalShellView *cal_shell_view)
 	sensitive = (n_selected == 1) && editable && assignable;
 	gtk_action_set_sensitive (action, sensitive);
 
-	action = ACTION (CALENDAR_TASKPAD_DELETE);
-	sensitive = (n_selected > 0) && editable;
-	gtk_action_set_sensitive (action, sensitive);
-	label = ngettext ("Delete Task", "Delete Tasks", n_selected);
-	g_object_set (action, "label", label, NULL);
-
 	action = ACTION (CALENDAR_TASKPAD_FORWARD);
 	sensitive = (n_selected == 1);
 	gtk_action_set_sensitive (action, sensitive);
diff --git a/modules/calendar/e-memo-shell-view-actions.c b/modules/calendar/e-memo-shell-view-actions.c
index 7891a5a..1c0a7ef 100644
--- a/modules/calendar/e-memo-shell-view-actions.c
+++ b/modules/calendar/e-memo-shell-view-actions.c
@@ -47,19 +47,12 @@ action_memo_delete_cb (GtkAction *action,
                        EMemoShellView *memo_shell_view)
 {
 	EMemoShellContent *memo_shell_content;
-	ECalComponentPreview *memo_preview;
 	EMemoTable *memo_table;
 
 	memo_shell_content = memo_shell_view->priv->memo_shell_content;
 	memo_table = e_memo_shell_content_get_memo_table (memo_shell_content);
-	memo_preview = e_memo_shell_content_get_memo_preview (memo_shell_content);
-
-	e_memo_shell_view_set_status_message (
-		memo_shell_view, _("Deleting selected memos..."), -1.0);
-	e_memo_table_delete_selected (memo_table);
-	e_memo_shell_view_set_status_message (memo_shell_view, NULL, -1.0);
 
-	e_cal_component_preview_clear (memo_preview);
+	e_selectable_delete_selection (E_SELECTABLE (memo_table));
 }
 
 static void
@@ -587,9 +580,9 @@ static GtkActionEntry memo_entries[] = {
 
 	{ "memo-list-delete",
 	  GTK_STOCK_DELETE,
-	  N_("_Delete"),
+	  N_("D_elete Memo List"),
 	  NULL,
-	  NULL,  /* XXX Add a tooltip! */
+	  N_("Delete the selected memo list"),
 	  G_CALLBACK (action_memo_list_delete_cb) },
 
 	{ "memo-list-new",
@@ -665,7 +658,7 @@ static EPopupActionEntry memo_popup_entries[] = {
 	  "memo-list-copy" },
 
 	{ "memo-list-popup-delete",
-	  NULL,
+	  N_("_Delete"),
 	  "memo-list-delete" },
 
 	{ "memo-list-popup-properties",
@@ -684,10 +677,6 @@ static EPopupActionEntry memo_popup_entries[] = {
 	  NULL,
 	  "memo-list-select-one" },
 
-	{ "memo-popup-delete",
-	  NULL,
-	  "memo-delete" },
-
 	{ "memo-popup-forward",
 	  NULL,
 	  "memo-forward" },
@@ -919,9 +908,6 @@ e_memo_shell_view_actions_init (EMemoShellView *memo_shell_view)
 
 	/* Fine tuning. */
 
-	action = ACTION (MEMO_DELETE);
-	g_object_set (action, "short-label", _("Delete"), NULL);
-
 	g_signal_connect (
 		ACTION (GAL_SAVE_CUSTOM_VIEW), "activate",
 		G_CALLBACK (action_gal_save_custom_view_cb), memo_shell_view);
diff --git a/modules/calendar/e-memo-shell-view-private.h b/modules/calendar/e-memo-shell-view-private.h
index ac50d20..06db399 100644
--- a/modules/calendar/e-memo-shell-view-private.h
+++ b/modules/calendar/e-memo-shell-view-private.h
@@ -35,7 +35,8 @@
 #include "e-util/e-util.h"
 #include "e-util/gconf-bridge.h"
 #include "shell/e-shell-utils.h"
-#include "widgets/misc/e-popup-action.h"
+#include "misc/e-popup-action.h"
+#include "misc/e-selectable.h"
 
 #include "calendar/gui/comp-util.h"
 #include "calendar/gui/e-cal-component-preview.h"
diff --git a/modules/calendar/e-task-shell-view-actions.c b/modules/calendar/e-task-shell-view-actions.c
index 2b25f33..bd3d062 100644
--- a/modules/calendar/e-task-shell-view-actions.c
+++ b/modules/calendar/e-task-shell-view-actions.c
@@ -78,19 +78,12 @@ action_task_delete_cb (GtkAction *action,
                        ETaskShellView *task_shell_view)
 {
 	ETaskShellContent *task_shell_content;
-	ECalComponentPreview *task_preview;
 	ETaskTable *task_table;
 
 	task_shell_content = task_shell_view->priv->task_shell_content;
 	task_table = e_task_shell_content_get_task_table (task_shell_content);
-	task_preview = e_task_shell_content_get_task_preview (task_shell_content);
-
-	e_task_shell_view_set_status_message (
-		task_shell_view, _("Deleting selected tasks..."), -1.0);
-	e_task_table_delete_selected (task_table);
-	e_task_shell_view_set_status_message (task_shell_view, NULL, -1.0);
 
-	e_cal_component_preview_clear (task_preview);
+	e_selectable_delete_selection (E_SELECTABLE (task_table));
 }
 
 static void
@@ -711,9 +704,9 @@ static GtkActionEntry task_entries[] = {
 
 	{ "task-list-delete",
 	  GTK_STOCK_DELETE,
-	  N_("_Delete"),
+	  N_("D_elete Task List"),
 	  NULL,
-	  NULL,  /* XXX Add a tooltip! */
+	  N_("Delete the selected task list"),
 	  G_CALLBACK (action_task_list_delete_cb) },
 
 	{ "task-list-new",
@@ -817,7 +810,7 @@ static EPopupActionEntry task_popup_entries[] = {
 	  "task-list-copy" },
 
 	{ "task-list-popup-delete",
-	  NULL,
+	  N_("_Delete"),
 	  "task-list-delete" },
 
 	{ "task-list-popup-properties",
@@ -840,10 +833,6 @@ static EPopupActionEntry task_popup_entries[] = {
 	  NULL,
 	  "task-assign" },
 
-	{ "task-popup-delete",
-	  NULL,
-	  "task-delete" },
-
 	{ "task-popup-forward",
 	  NULL,
 	  "task-forward" },
@@ -1118,9 +1107,6 @@ e_task_shell_view_actions_init (ETaskShellView *task_shell_view)
 
 	/* Fine tuning. */
 
-	action = ACTION (TASK_DELETE);
-	g_object_set (action, "short-label", _("Delete"), NULL);
-
 	g_signal_connect (
 		ACTION (GAL_SAVE_CUSTOM_VIEW), "activate",
 		G_CALLBACK (action_gal_save_custom_view_cb), task_shell_view);
diff --git a/modules/calendar/e-task-shell-view-private.h b/modules/calendar/e-task-shell-view-private.h
index a76403f..5b0231e 100644
--- a/modules/calendar/e-task-shell-view-private.h
+++ b/modules/calendar/e-task-shell-view-private.h
@@ -36,7 +36,8 @@
 #include "e-util/e-util.h"
 #include "e-util/gconf-bridge.h"
 #include "shell/e-shell-utils.h"
-#include "widgets/misc/e-popup-action.h"
+#include "misc/e-popup-action.h"
+#include "misc/e-selectable.h"
 
 #include "calendar/common/authentication.h"
 #include "calendar/gui/calendar-config.h"
diff --git a/ui/evolution-calendars.ui b/ui/evolution-calendars.ui
index 818ed17..feef83d 100644
--- a/ui/evolution-calendars.ui
+++ b/ui/evolution-calendars.ui
@@ -14,6 +14,7 @@
         <menuitem action='event-delete'/>
         <menuitem action='event-delete-occurrence'/>
         <menuitem action='event-delete-occurrence-all'/>
+        <menuitem action='calendar-delete'/>
       </placeholder>
     </menu>
     <menu action='view-menu'>
@@ -28,7 +29,7 @@
   </menubar>
   <toolbar name='main-toolbar'>
     <toolitem action='calendar-print'/>
-    <toolitem action='event-delete'/>
+    <toolitem action='delete-selection'/>
     <separator/>
     <toolitem action='calendar-go-back'/>
     <toolitem action='calendar-go-today'/>
@@ -115,7 +116,7 @@
     <separator/>
     <menuitem action='calendar-memopad-forward'/>
     <separator/>
-    <menuitem action='calendar-memopad-delete'/>
+    <menuitem action='popup-delete-selection'/>
   </popup>
   <popup name='calendar-taskpad-popup'>
     <menuitem action='calendar-taskpad-new'/>
@@ -134,7 +135,7 @@
     <menuitem action='calendar-taskpad-mark-complete'/>
     <menuitem action='calendar-taskpad-mark-incomplete'/>
     <separator/>
-    <menuitem action='calendar-taskpad-delete'/>
+    <menuitem action='popup-delete-selection'/>
   </popup>
   <popup name='calendar-search-options'>
     <menuitem action='calendar-search-advanced-hidden'/>
diff --git a/ui/evolution-contacts.ui b/ui/evolution-contacts.ui
index c3ce871..1dc66b4 100644
--- a/ui/evolution-contacts.ui
+++ b/ui/evolution-contacts.ui
@@ -45,7 +45,7 @@
   </menubar>
   <toolbar name='main-toolbar'>
     <toolitem action='address-book-print'/>
-    <toolitem action='contact-delete'/>
+    <toolitem action='delete-selection'/>
     <toolitem action='address-book-stop'/>
   </toolbar>
   <popup name='address-book-popup'>
@@ -64,17 +64,18 @@
     <separator/>
     <menuitem action='contact-popup-open'/>
     <menuitem action='contact-popup-save-as'/>
-    <menuitem action='contact-popup-forward'/>
-    <menuitem action='contact-popup-send-message'/>
     <menuitem action='contact-popup-print'/>
     <separator/>
-    <menuitem action='contact-popup-copy'/>
-    <menuitem action='contact-popup-move'/>
-    <separator/>
     <menuitem action='popup-cut-clipboard'/>
     <menuitem action='popup-copy-clipboard'/>
     <menuitem action='popup-paste-clipboard'/>
-    <menuitem action='contact-popup-delete'/>
+    <separator/>
+    <menuitem action='contact-popup-copy'/>
+    <menuitem action='contact-popup-move'/>
+    <menuitem action='contact-popup-forward'/>
+    <menuitem action='contact-popup-send-message'/>
+    <separator/>
+    <menuitem action='popup-delete-selection'/>
   </popup>
   <popup name='contact-search-options'>
     <menuitem action='contact-search-advanced-hidden'/>
diff --git a/ui/evolution-memos.ui b/ui/evolution-memos.ui
index 29c4263..c20ebc5 100644
--- a/ui/evolution-memos.ui
+++ b/ui/evolution-memos.ui
@@ -12,6 +12,7 @@
     <menu action='edit-menu'>
       <placeholder name='edit-actions'>
         <menuitem action='memo-delete'/>
+        <menuitem action='memo-list-delete'/>
       </placeholder>
     </menu>
     <menu action='view-menu'>
@@ -32,7 +33,7 @@
       <toolitem action='paste-clipboard'/>
       <separator/>
       <toolitem action='memo-list-print'/>
-      <toolitem action='memo-delete'/>
+      <toolitem action='delete-selection'/>
     </placeholder>
   </toolbar>
   <popup name='memo-popup'>
@@ -49,7 +50,7 @@
     <separator/>
     <menuitem action='memo-popup-forward'/>
     <separator/>
-    <menuitem action='memo-popup-delete'/>
+    <menuitem action='popup-delete-selection'/>
   </popup>
   <popup name='memo-list-popup'>
     <menuitem action='memo-list-new'/>
diff --git a/ui/evolution-tasks.ui b/ui/evolution-tasks.ui
index de4d97e..4483c95 100644
--- a/ui/evolution-tasks.ui
+++ b/ui/evolution-tasks.ui
@@ -12,6 +12,7 @@
     <menu action='edit-menu'>
       <placeholder name='edit-actions'>
         <menuitem action='task-delete'/>
+        <menuitem action='task-list-delete'/>
         <separator/>
         <menuitem action='task-mark-complete'/>
         <menuitem action='task-mark-incomplete'/>
@@ -41,7 +42,7 @@
     <toolitem action='paste-clipboard'/>
     <separator/>
     <toolitem action='task-print'/>
-    <toolitem action='task-delete'/>
+    <toolitem action='delete-selection'/>
   </toolbar>
   <popup name='task-popup'>
     <menuitem action='task-new'/>
@@ -60,7 +61,7 @@
     <menuitem action='task-popup-mark-complete'/>
     <menuitem action='task-popup-mark-incomplete'/>
     <separator/>
-    <menuitem action='task-popup-delete'/>
+    <menuitem action='popup-delete-selection'/>
   </popup>
   <popup name='task-list-popup'>
     <menuitem action='task-list-new'/>



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