[evolution] Bug 600397 - Delete option enabled for undeletable ESource



commit bb1653f64c0998f3c90d9cf0e7a2183dccd4611f
Author: Matthew Barnes <mbarnes redhat com>
Date:   Sat Nov 14 10:39:55 2009 -0500

    Bug 600397 - Delete option enabled for undeletable ESource

 modules/addressbook/e-book-shell-sidebar.c |    8 +++++
 modules/addressbook/e-book-shell-sidebar.h |    3 +-
 modules/addressbook/e-book-shell-view.c    |    5 ++-
 modules/calendar/e-cal-shell-sidebar.c     |   40 ++++++++++++++++++++++++++
 modules/calendar/e-cal-shell-sidebar.h     |    5 +--
 modules/calendar/e-cal-shell-view.c        |   42 +++++++++++++++------------
 modules/calendar/e-memo-shell-sidebar.c    |    8 +++++
 modules/calendar/e-memo-shell-sidebar.h    |    3 +-
 modules/calendar/e-memo-shell-view.c       |    7 +++-
 modules/calendar/e-task-shell-sidebar.c    |    8 +++++
 modules/calendar/e-task-shell-sidebar.h    |    3 +-
 modules/calendar/e-task-shell-view.c       |    5 ++-
 12 files changed, 108 insertions(+), 29 deletions(-)
---
diff --git a/modules/addressbook/e-book-shell-sidebar.c b/modules/addressbook/e-book-shell-sidebar.c
index fc283e2..24a0997 100644
--- a/modules/addressbook/e-book-shell-sidebar.c
+++ b/modules/addressbook/e-book-shell-sidebar.c
@@ -126,6 +126,7 @@ book_shell_sidebar_check_state (EShellSidebar *shell_sidebar)
 	EBookShellSidebar *book_shell_sidebar;
 	ESourceSelector *selector;
 	ESource *source;
+	gboolean can_delete = FALSE;
 	gboolean is_system = FALSE;
 	guint32 state = 0;
 
@@ -135,13 +136,20 @@ book_shell_sidebar_check_state (EShellSidebar *shell_sidebar)
 
 	if (source != NULL) {
 		const gchar *uri;
+		const gchar *delete;
 
 		uri = e_source_peek_relative_uri (source);
 		is_system = (uri == NULL || strcmp (uri, "system") == 0);
+
+		can_delete = !is_system;
+		delete = e_source_get_property (source, "delete");
+		can_delete &= (delete == NULL || strcmp (delete, "no") != 0);
 	}
 
 	if (source != NULL)
 		state |= E_BOOK_SHELL_SIDEBAR_HAS_PRIMARY_SOURCE;
+	if (can_delete)
+		state |= E_BOOK_SHELL_SIDEBAR_CAN_DELETE_PRIMARY_SOURCE;
 	if (is_system)
 		state |= E_BOOK_SHELL_SIDEBAR_PRIMARY_SOURCE_IS_SYSTEM;
 
diff --git a/modules/addressbook/e-book-shell-sidebar.h b/modules/addressbook/e-book-shell-sidebar.h
index 716523f..a3eb76c 100644
--- a/modules/addressbook/e-book-shell-sidebar.h
+++ b/modules/addressbook/e-book-shell-sidebar.h
@@ -54,7 +54,8 @@ typedef struct _EBookShellSidebarPrivate EBookShellSidebarPrivate;
 
 enum {
 	E_BOOK_SHELL_SIDEBAR_HAS_PRIMARY_SOURCE		= 1 << 0,
-	E_BOOK_SHELL_SIDEBAR_PRIMARY_SOURCE_IS_SYSTEM	= 1 << 1
+	E_BOOK_SHELL_SIDEBAR_CAN_DELETE_PRIMARY_SOURCE	= 1 << 1,
+	E_BOOK_SHELL_SIDEBAR_PRIMARY_SOURCE_IS_SYSTEM	= 1 << 2
 };
 
 struct _EBookShellSidebar {
diff --git a/modules/addressbook/e-book-shell-view.c b/modules/addressbook/e-book-shell-view.c
index d5f160d..568bc45 100644
--- a/modules/addressbook/e-book-shell-view.c
+++ b/modules/addressbook/e-book-shell-view.c
@@ -237,6 +237,7 @@ book_shell_view_update_actions (EShellView *shell_view)
 
 	/* Be descriptive. */
 	gboolean any_contacts_selected;
+	gboolean can_delete_primary_source;
 	gboolean has_primary_source;
 	gboolean multiple_contacts_selected;
 	gboolean primary_source_is_system;
@@ -277,6 +278,8 @@ book_shell_view_update_actions (EShellView *shell_view)
 
 	has_primary_source =
 		(state & E_BOOK_SHELL_SIDEBAR_HAS_PRIMARY_SOURCE);
+	can_delete_primary_source =
+		(state & E_BOOK_SHELL_SIDEBAR_CAN_DELETE_PRIMARY_SOURCE);
 	primary_source_is_system =
 		(state & E_BOOK_SHELL_SIDEBAR_PRIMARY_SOURCE_IS_SYSTEM);
 
@@ -284,7 +287,7 @@ book_shell_view_update_actions (EShellView *shell_view)
 		(single_contact_selected || multiple_contacts_selected);
 
 	action = ACTION (ADDRESS_BOOK_DELETE);
-	sensitive = has_primary_source && !primary_source_is_system;
+	sensitive = can_delete_primary_source;
 	gtk_action_set_sensitive (action, sensitive);
 
 	action = ACTION (ADDRESS_BOOK_PRINT);
diff --git a/modules/calendar/e-cal-shell-sidebar.c b/modules/calendar/e-cal-shell-sidebar.c
index cb09c93..244136e 100644
--- a/modules/calendar/e-cal-shell-sidebar.c
+++ b/modules/calendar/e-cal-shell-sidebar.c
@@ -502,6 +502,42 @@ cal_shell_sidebar_constructed (GObject *object)
 	gconf_bridge_bind_property_delayed (bridge, key, object, "vposition");
 }
 
+static guint32
+cal_shell_sidebar_check_state (EShellSidebar *shell_sidebar)
+{
+	ECalShellSidebar *cal_shell_sidebar;
+	ESourceSelector *selector;
+	ESource *source;
+	gboolean can_delete = FALSE;
+	gboolean is_system = FALSE;
+	guint32 state = 0;
+
+	cal_shell_sidebar = E_CAL_SHELL_SIDEBAR (shell_sidebar);
+	selector = e_cal_shell_sidebar_get_selector (cal_shell_sidebar);
+	source = e_source_selector_peek_primary_selection (selector);
+
+	if (source != NULL) {
+		const gchar *uri;
+		const gchar *delete;
+
+		uri = e_source_peek_relative_uri (source);
+		is_system = (uri == NULL || strcmp (uri, "system") == 0);
+
+		can_delete = !is_system;
+		delete = e_source_get_property (source, "delete");
+		can_delete &= (delete == NULL || strcmp (delete, "no") != 0);
+	}
+
+	if (source != NULL)
+		state |= E_CAL_SHELL_SIDEBAR_HAS_PRIMARY_SOURCE;
+	if (can_delete)
+		state |= E_CAL_SHELL_SIDEBAR_CAN_DELETE_PRIMARY_SOURCE;
+	if (is_system)
+		state |= E_CAL_SHELL_SIDEBAR_PRIMARY_SOURCE_IS_SYSTEM;
+
+	return state;
+}
+
 static void
 cal_shell_sidebar_client_removed (ECalShellSidebar *cal_shell_sidebar,
                                   ECal *client)
@@ -531,6 +567,7 @@ static void
 cal_shell_sidebar_class_init (ECalShellSidebarClass *class)
 {
 	GObjectClass *object_class;
+	EShellSidebarClass *shell_sidebar_class;
 
 	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (ECalShellSidebarPrivate));
@@ -541,6 +578,9 @@ cal_shell_sidebar_class_init (ECalShellSidebarClass *class)
 	object_class->finalize = cal_shell_sidebar_finalize;
 	object_class->constructed = cal_shell_sidebar_constructed;
 
+	shell_sidebar_class = E_SHELL_SIDEBAR_CLASS (class);
+	shell_sidebar_class->check_state = cal_shell_sidebar_check_state;
+
 	class->client_removed = cal_shell_sidebar_client_removed;
 
 	g_object_class_install_property (
diff --git a/modules/calendar/e-cal-shell-sidebar.h b/modules/calendar/e-cal-shell-sidebar.h
index 3b7c0fd..47dc9fa 100644
--- a/modules/calendar/e-cal-shell-sidebar.h
+++ b/modules/calendar/e-cal-shell-sidebar.h
@@ -56,9 +56,8 @@ typedef struct _ECalShellSidebarPrivate ECalShellSidebarPrivate;
 
 enum {
 	E_CAL_SHELL_SIDEBAR_HAS_PRIMARY_SOURCE		= 1 << 0,
-	E_CAL_SHELL_SIDEBAR_PRIMARY_SOURCE_IS_EMPTY	= 1 << 1,
-	E_CAL_SHELL_SIDEBAR_SOURCE_CAN_GO_OFFLINE	= 1 << 2,
-	E_CAL_SHELL_SIDEBAR_SOURCE_CAN_DELETE		= 1 << 3
+	E_CAL_SHELL_SIDEBAR_CAN_DELETE_PRIMARY_SOURCE	= 1 << 1,
+	E_CAL_SHELL_SIDEBAR_PRIMARY_SOURCE_IS_SYSTEM	= 1 << 2
 };
 
 struct _ECalShellSidebar {
diff --git a/modules/calendar/e-cal-shell-view.c b/modules/calendar/e-cal-shell-view.c
index 60a2781..635f054 100644
--- a/modules/calendar/e-cal-shell-view.c
+++ b/modules/calendar/e-cal-shell-view.c
@@ -266,26 +266,28 @@ cal_shell_view_update_actions (EShellView *shell_view)
 {
 	ECalShellViewPrivate *priv;
 	ECalShellContent *cal_shell_content;
-	ECalShellSidebar *cal_shell_sidebar;
+	EShellSidebar *shell_sidebar;
 	EShellWindow *shell_window;
 	GnomeCalendarViewType view_type;
 	GnomeCalendar *calendar;
 	ECalendarView *view;
 	ECalModel *model;
-	ESourceSelector *selector;
-	ESource *source;
 	GtkAction *action;
 	GList *list, *iter;
-	const gchar *uri = NULL;
-	gboolean user_created_source;
+	gboolean sensitive;
+	guint32 state;
+	gint n_selected;
+
+	/* Be descriptive. */
+	gboolean can_delete_primary_source;
 	gboolean editable = TRUE;
+	gboolean has_primary_source;
+	gboolean primary_source_is_system;
 	gboolean recurring = FALSE;
 	gboolean is_instance = FALSE;
-	gboolean sensitive;
 	gboolean is_meeting = FALSE;
 	gboolean is_delegatable = FALSE;
 	gboolean clipboard_has_calendar;
-	gint n_selected;
 
 	priv = E_CAL_SHELL_VIEW_GET_PRIVATE (shell_view);
 
@@ -297,9 +299,6 @@ cal_shell_view_update_actions (EShellView *shell_view)
 	view = gnome_calendar_get_calendar_view (calendar, view_type);
 	model = e_calendar_view_get_model (view);
 
-	cal_shell_sidebar = priv->cal_shell_sidebar;
-	selector = e_cal_shell_sidebar_get_selector (cal_shell_sidebar);
-
 	list = e_calendar_view_get_selected_events (view);
 	n_selected = g_list_length (list);
 
@@ -352,29 +351,34 @@ cal_shell_view_update_actions (EShellView *shell_view)
 
 	g_list_free (list);
 
-	source = e_source_selector_peek_primary_selection (selector);
-	if (source != NULL)
-		uri = e_source_peek_relative_uri (source);
-	user_created_source = (uri != NULL && strcmp (uri, "system") != 0);
-
 	clipboard_has_calendar =
 		e_clipboard_wait_is_calendar_available (
 		gtk_clipboard_get (GDK_SELECTION_CLIPBOARD));
 
+	shell_sidebar = e_shell_view_get_shell_sidebar (shell_view);
+	state = e_shell_sidebar_check_state (shell_sidebar);
+
+	has_primary_source =
+		(state & E_CAL_SHELL_SIDEBAR_HAS_PRIMARY_SOURCE);
+	can_delete_primary_source =
+		(state & E_CAL_SHELL_SIDEBAR_CAN_DELETE_PRIMARY_SOURCE);
+	primary_source_is_system =
+		(state & E_CAL_SHELL_SIDEBAR_PRIMARY_SOURCE_IS_SYSTEM);
+
 	action = ACTION (CALENDAR_COPY);
-	sensitive = (source != NULL);
+	sensitive = has_primary_source;
 	gtk_action_set_sensitive (action, sensitive);
 
 	action = ACTION (CALENDAR_DELETE);
-	sensitive = user_created_source;
+	sensitive = can_delete_primary_source;
 	gtk_action_set_sensitive (action, sensitive);
 
 	action = ACTION (CALENDAR_PROPERTIES);
-	sensitive = (source != NULL);
+	sensitive = has_primary_source;
 	gtk_action_set_sensitive (action, sensitive);
 
 	action = ACTION (CALENDAR_RENAME);
-	sensitive = (source != NULL);
+	sensitive = has_primary_source;
 	gtk_action_set_sensitive (action, sensitive);
 
 	action = ACTION (EVENT_CLIPBOARD_COPY);
diff --git a/modules/calendar/e-memo-shell-sidebar.c b/modules/calendar/e-memo-shell-sidebar.c
index 33a2226..6da8998 100644
--- a/modules/calendar/e-memo-shell-sidebar.c
+++ b/modules/calendar/e-memo-shell-sidebar.c
@@ -453,6 +453,7 @@ memo_shell_sidebar_check_state (EShellSidebar *shell_sidebar)
 	EMemoShellSidebar *memo_shell_sidebar;
 	ESourceSelector *selector;
 	ESource *source;
+	gboolean can_delete = FALSE;
 	gboolean is_system = FALSE;
 	guint32 state = 0;
 
@@ -462,13 +463,20 @@ memo_shell_sidebar_check_state (EShellSidebar *shell_sidebar)
 
 	if (source != NULL) {
 		const gchar *uri;
+		const gchar *delete;
 
 		uri = e_source_peek_relative_uri (source);
 		is_system = (uri == NULL || strcmp (uri, "system") == 0);
+
+		can_delete = !is_system;
+		delete = e_source_get_property (source, "delete");
+		can_delete &= (delete == NULL || strcmp (delete, "no") != 0);
 	}
 
 	if (source != NULL)
 		state |= E_MEMO_SHELL_SIDEBAR_HAS_PRIMARY_SOURCE;
+	if (can_delete)
+		state |= E_MEMO_SHELL_SIDEBAR_CAN_DELETE_PRIMARY_SOURCE;
 	if (is_system)
 		state |= E_MEMO_SHELL_SIDEBAR_PRIMARY_SOURCE_IS_SYSTEM;
 
diff --git a/modules/calendar/e-memo-shell-sidebar.h b/modules/calendar/e-memo-shell-sidebar.h
index 068d743..5df8089 100644
--- a/modules/calendar/e-memo-shell-sidebar.h
+++ b/modules/calendar/e-memo-shell-sidebar.h
@@ -55,7 +55,8 @@ typedef struct _EMemoShellSidebarPrivate EMemoShellSidebarPrivate;
 
 enum {
 	E_MEMO_SHELL_SIDEBAR_HAS_PRIMARY_SOURCE		= 1 << 0,
-	E_MEMO_SHELL_SIDEBAR_PRIMARY_SOURCE_IS_SYSTEM	= 1 << 1
+	E_MEMO_SHELL_SIDEBAR_CAN_DELETE_PRIMARY_SOURCE	= 1 << 1,
+	E_MEMO_SHELL_SIDEBAR_PRIMARY_SOURCE_IS_SYSTEM	= 1 << 2
 };
 
 struct _EMemoShellSidebar {
diff --git a/modules/calendar/e-memo-shell-view.c b/modules/calendar/e-memo-shell-view.c
index 7a5b681..43dd7e3 100644
--- a/modules/calendar/e-memo-shell-view.c
+++ b/modules/calendar/e-memo-shell-view.c
@@ -165,13 +165,14 @@ memo_shell_view_update_actions (EShellView *shell_view)
 
 	/* Be descriptive. */
 	gboolean any_memos_selected;
+	gboolean can_delete_primary_source;
+	gboolean clipboard_has_calendar;
 	gboolean has_primary_source;
 	gboolean multiple_memos_selected;
 	gboolean primary_source_is_system;
 	gboolean selection_has_url;
 	gboolean single_memo_selected;
 	gboolean sources_are_editable;
-	gboolean clipboard_has_calendar;
 
 	priv = E_MEMO_SHELL_VIEW_GET_PRIVATE (shell_view);
 
@@ -196,6 +197,8 @@ memo_shell_view_update_actions (EShellView *shell_view)
 
 	has_primary_source =
 		(state & E_MEMO_SHELL_SIDEBAR_HAS_PRIMARY_SOURCE);
+	can_delete_primary_source =
+		(state & E_MEMO_SHELL_SIDEBAR_CAN_DELETE_PRIMARY_SOURCE);
 	primary_source_is_system =
 		(state & E_MEMO_SHELL_SIDEBAR_PRIMARY_SOURCE_IS_SYSTEM);
 
@@ -232,7 +235,7 @@ memo_shell_view_update_actions (EShellView *shell_view)
 	gtk_action_set_sensitive (action, sensitive);
 
 	action = ACTION (MEMO_LIST_DELETE);
-	sensitive = has_primary_source && !primary_source_is_system;
+	sensitive = can_delete_primary_source;
 	gtk_action_set_sensitive (action, sensitive);
 
 	action = ACTION (MEMO_LIST_PROPERTIES);
diff --git a/modules/calendar/e-task-shell-sidebar.c b/modules/calendar/e-task-shell-sidebar.c
index 6bd7700..9107d65 100644
--- a/modules/calendar/e-task-shell-sidebar.c
+++ b/modules/calendar/e-task-shell-sidebar.c
@@ -451,6 +451,7 @@ task_shell_sidebar_check_state (EShellSidebar *shell_sidebar)
 	ETaskShellSidebar *task_shell_sidebar;
 	ESourceSelector *selector;
 	ESource *source;
+	gboolean can_delete = FALSE;
 	gboolean is_system = FALSE;
 	guint32 state = 0;
 
@@ -460,13 +461,20 @@ task_shell_sidebar_check_state (EShellSidebar *shell_sidebar)
 
 	if (source != NULL) {
 		const gchar *uri;
+		const gchar *delete;
 
 		uri = e_source_peek_relative_uri (source);
 		is_system = (uri == NULL || strcmp (uri, "system") == 0);
+
+		can_delete = !is_system;
+		delete = e_source_get_property (source, "delete");
+		can_delete &= (delete == NULL || strcmp (delete, "no") != 0);
 	}
 
 	if (source != NULL)
 		state |= E_TASK_SHELL_SIDEBAR_HAS_PRIMARY_SOURCE;
+	if (can_delete)
+		state |= E_TASK_SHELL_SIDEBAR_CAN_DELETE_PRIMARY_SOURCE;
 	if (is_system)
 		state |= E_TASK_SHELL_SIDEBAR_PRIMARY_SOURCE_IS_SYSTEM;
 
diff --git a/modules/calendar/e-task-shell-sidebar.h b/modules/calendar/e-task-shell-sidebar.h
index 5d4c74f..81021b8 100644
--- a/modules/calendar/e-task-shell-sidebar.h
+++ b/modules/calendar/e-task-shell-sidebar.h
@@ -55,7 +55,8 @@ typedef struct _ETaskShellSidebarPrivate ETaskShellSidebarPrivate;
 
 enum {
 	E_TASK_SHELL_SIDEBAR_HAS_PRIMARY_SOURCE		= 1 << 0,
-	E_TASK_SHELL_SIDEBAR_PRIMARY_SOURCE_IS_SYSTEM	= 1 << 1
+	E_TASK_SHELL_SIDEBAR_CAN_DELETE_PRIMARY_SOURCE	= 1 << 1,
+	E_TASK_SHELL_SIDEBAR_PRIMARY_SOURCE_IS_SYSTEM	= 1 << 2
 };
 
 struct _ETaskShellSidebar {
diff --git a/modules/calendar/e-task-shell-view.c b/modules/calendar/e-task-shell-view.c
index a55d120..bab7fa1 100644
--- a/modules/calendar/e-task-shell-view.c
+++ b/modules/calendar/e-task-shell-view.c
@@ -277,6 +277,7 @@ task_shell_view_update_actions (EShellView *shell_view)
 
 	/* Be descriptive. */
 	gboolean any_tasks_selected;
+	gboolean can_delete_primary_source;
 	gboolean has_primary_source;
 	gboolean multiple_tasks_selected;
 	gboolean primary_source_is_system;
@@ -317,6 +318,8 @@ task_shell_view_update_actions (EShellView *shell_view)
 
 	has_primary_source =
 		(state & E_TASK_SHELL_SIDEBAR_HAS_PRIMARY_SOURCE);
+	can_delete_primary_source =
+		(state & E_TASK_SHELL_SIDEBAR_CAN_DELETE_PRIMARY_SOURCE);
 	primary_source_is_system =
 		(state & E_TASK_SHELL_SIDEBAR_PRIMARY_SOURCE_IS_SYSTEM);
 
@@ -359,7 +362,7 @@ task_shell_view_update_actions (EShellView *shell_view)
 	gtk_action_set_sensitive (action, sensitive);
 
 	action = ACTION (TASK_LIST_DELETE);
-	sensitive = has_primary_source && !primary_source_is_system;
+	sensitive = can_delete_primary_source;
 	gtk_action_set_sensitive (action, sensitive);
 
 	action = ACTION (TASK_LIST_PROPERTIES);



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