From bb1653f64c0998f3c90d9cf0e7a2183dccd4611f Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Sat, 14 Nov 2009 10:39:55 -0500 Subject: =?UTF-8?q?Bug=C2=A0600397=20-=20Delete=20option=20enabled=20for?= =?UTF-8?q?=20undeletable=20ESource?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 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 fc283e28d7..24a0997173 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 716523f971..a3eb76c77f 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 d5f160d407..568bc4567a 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 cb09c93ef1..244136ea0f 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 3b7c0fd3b3..47dc9fa191 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 60a2781c71..635f0545e7 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 33a2226c00..6da89988c8 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 068d7436bc..5df8089668 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 7a5b68159d..43dd7e34ea 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 6bd7700fcf..9107d65464 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 5d4c74fe11..81021b8cda 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 a55d120cb8..bab7fa1539 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); -- cgit v1.2.3