diff options
Diffstat (limited to 'modules/addressbook')
-rw-r--r-- | modules/addressbook/e-book-shell-content.c | 56 | ||||
-rw-r--r-- | modules/addressbook/e-book-shell-content.h | 10 |
2 files changed, 59 insertions, 7 deletions
diff --git a/modules/addressbook/e-book-shell-content.c b/modules/addressbook/e-book-shell-content.c index 1c121adc61..55b11fca5d 100644 --- a/modules/addressbook/e-book-shell-content.c +++ b/modules/addressbook/e-book-shell-content.c @@ -259,6 +259,23 @@ book_shell_content_constructed (GObject *object) gconf_bridge_bind_property_delayed (bridge, key, object, "vposition"); } +static void +book_shell_content_check_state_foreach (gint row, + gpointer user_data) +{ + EContact *contact; + + struct { + EAddressbookModel *model; + GList *list; + } *foreach_data = user_data; + + contact = e_addressbook_model_get_contact (foreach_data->model, row); + g_return_if_fail (E_IS_CONTACT (contact)); + + foreach_data->list = g_list_prepend (foreach_data->list, contact); +} + static guint32 book_shell_content_check_state (EShellContent *shell_content) { @@ -267,10 +284,17 @@ book_shell_content_check_state (EShellContent *shell_content) EAddressbookModel *model; EAddressbookView *view; GtkClipboard *clipboard; + gboolean has_email = TRUE; + gboolean is_contact_list = TRUE; guint32 state = 0; gint n_contacts; gint n_selected; + struct { + EAddressbookModel *model; + GList *list; + } foreach_data; + book_shell_content = E_BOOK_SHELL_CONTENT (shell_content); view = e_book_shell_content_get_current_view (book_shell_content); model = e_addressbook_view_get_model (view); @@ -281,13 +305,43 @@ book_shell_content_check_state (EShellContent *shell_content) n_selected = (selection_model != NULL) ? e_selection_model_selected_count (selection_model) : 0; + foreach_data.model = model; + foreach_data.list = NULL; + + if (selection_model != NULL) + e_selection_model_foreach ( + selection_model, (EForeachFunc) + book_shell_content_check_state_foreach, + &foreach_data); + + while (foreach_data.list != NULL) { + EContact *contact = E_CONTACT (foreach_data.list->data); + GList *email_list; + + email_list = e_contact_get (contact, E_CONTACT_EMAIL); + has_email &= (email_list != NULL); + g_list_foreach (email_list, (GFunc) g_free, NULL); + g_list_free (email_list); + + is_contact_list &= + (e_contact_get (contact, E_CONTACT_IS_LIST) != NULL); + + g_object_unref (contact); + + foreach_data.list = g_list_delete_link ( + foreach_data.list, foreach_data.list); + } + clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD); - /* FIXME Finish the rest of the flags. */ if (n_selected == 1) state |= E_BOOK_SHELL_CONTENT_SELECTION_SINGLE; if (n_selected > 1) state |= E_BOOK_SHELL_CONTENT_SELECTION_MULTIPLE; + if (n_selected > 0 && has_email) + state |= E_BOOK_SHELL_CONTENT_SELECTION_HAS_EMAIL; + if (n_selected == 1 && is_contact_list) + state |= E_BOOK_SHELL_CONTENT_SELECTION_IS_CONTACT_LIST; if (e_addressbook_model_can_stop (model)) state |= E_BOOK_SHELL_CONTENT_SOURCE_IS_BUSY; if (e_addressbook_model_get_editable (model)) diff --git a/modules/addressbook/e-book-shell-content.h b/modules/addressbook/e-book-shell-content.h index 138b60d175..5acfae46c8 100644 --- a/modules/addressbook/e-book-shell-content.h +++ b/modules/addressbook/e-book-shell-content.h @@ -60,12 +60,10 @@ enum { E_BOOK_SHELL_CONTENT_SELECTION_MULTIPLE = 1 << 1, E_BOOK_SHELL_CONTENT_SELECTION_HAS_EMAIL = 1 << 2, E_BOOK_SHELL_CONTENT_SELECTION_IS_CONTACT_LIST = 1 << 3, - E_BOOK_SHELL_CONTENT_SELECTION_HAS_HTTP_URI = 1 << 4, - E_BOOK_SHELL_CONTENT_SELECTION_HAS_MAILTO_URI = 1 << 5, - E_BOOK_SHELL_CONTENT_SOURCE_IS_BUSY = 1 << 6, - E_BOOK_SHELL_CONTENT_SOURCE_IS_EDITABLE = 1 << 7, - E_BOOK_SHELL_CONTENT_SOURCE_IS_EMPTY = 1 << 8, - E_BOOK_SHELL_CONTENT_CLIPBOARD_HAS_DIRECTORY = 1 << 9 + E_BOOK_SHELL_CONTENT_SOURCE_IS_BUSY = 1 << 4, + E_BOOK_SHELL_CONTENT_SOURCE_IS_EDITABLE = 1 << 5, + E_BOOK_SHELL_CONTENT_SOURCE_IS_EMPTY = 1 << 6, + E_BOOK_SHELL_CONTENT_CLIPBOARD_HAS_DIRECTORY = 1 << 7 }; struct _EBookShellContent { |