diff options
Diffstat (limited to 'addressbook')
-rw-r--r-- | addressbook/ChangeLog | 7 | ||||
-rw-r--r-- | addressbook/gui/component/addressbook-view.c | 304 | ||||
-rw-r--r-- | addressbook/gui/widgets/e-addressbook-view.c | 44 | ||||
-rw-r--r-- | addressbook/gui/widgets/e-addressbook-view.h | 6 | ||||
-rw-r--r-- | addressbook/gui/widgets/eab-gui-util.c | 10 |
5 files changed, 279 insertions, 92 deletions
diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog index 40c2a00aee..2d4da27a99 100644 --- a/addressbook/ChangeLog +++ b/addressbook/ChangeLog @@ -1,3 +1,10 @@ +2006-01-25 Devashish Sharma <sdevashish@novell.com> + + * gui/component/addressbook-view.c : + * gui/widgets/e-addressbook-view.[ch] : + Added functions for handling callbacks from the folder menu items and + modified some existing functions. + 2006-01-25 Simon Zheng <simon.zheng@sun.com> ** Fixes #327203 diff --git a/addressbook/gui/component/addressbook-view.c b/addressbook/gui/component/addressbook-view.c index 7a88888039..72f1a79e78 100644 --- a/addressbook/gui/component/addressbook-view.c +++ b/addressbook/gui/component/addressbook-view.c @@ -43,6 +43,7 @@ #include <libedataserverui/e-passwords.h> #include "e-util/e-error.h" +#include "e-util/e-request.h" #include "misc/e-task-bar.h" #include "misc/e-info-label.h" @@ -151,12 +152,22 @@ get_current_view (AddressbookView *view) } static void +save_all_contacts_cb (BonoboUIComponent *uih, void *user_data, const char *path) +{ + AddressbookView *view = (AddressbookView *) user_data; + EABView *v = get_current_view (view); + + if (v) + eab_view_save_as (v, TRUE); +} + +static void save_contact_cb (BonoboUIComponent *uih, void *user_data, const char *path) { AddressbookView *view = (AddressbookView *) user_data; EABView *v = get_current_view (view); if (v) - eab_view_save_as(v); + eab_view_save_as(v, FALSE); } static void @@ -268,12 +279,31 @@ send_contact_to_cb (BonoboUIComponent *uih, void *user_data, const char *path) } static void +copy_all_contacts_to_cb (BonoboUIComponent *uih, void *user_data, const char *path) +{ + AddressbookView *view = (AddressbookView *) user_data; + EABView *v = get_current_view (view); + + if (v) + eab_view_copy_to_folder (v, TRUE); +} + +static void copy_contact_to_cb (BonoboUIComponent *uih, void *user_data, const char *path) { AddressbookView *view = (AddressbookView *) user_data; EABView *v = get_current_view (view); if (v) - eab_view_copy_to_folder (v); + eab_view_copy_to_folder (v, FALSE); +} + +static void +move_all_contacts_to_cb (BonoboUIComponent *uih, void *user_data, const char *path) +{ + AddressbookView *view = (AddressbookView *) user_data; + EABView *v = get_current_view (view); + if (v) + eab_view_move_to_folder (v, TRUE); } static void @@ -282,7 +312,7 @@ move_contact_to_cb (BonoboUIComponent *uih, void *user_data, const char *path) AddressbookView *view = (AddressbookView *) user_data; EABView *v = get_current_view (view); if (v) - eab_view_move_to_folder (v); + eab_view_move_to_folder (v, FALSE); } static void @@ -292,6 +322,174 @@ forget_passwords_cb (BonoboUIComponent *uih, void *user_data, const char *path) } static void +new_addressbook_folder (AddressbookView *view) +{ + AddressbookViewPrivate *priv = view->priv; + addressbook_config_create_new_source (gtk_widget_get_toplevel(priv->notebook)); +} + +static void +new_folder_cb (BonoboUIComponent *uih, void *user_data, const char *path) +{ + AddressbookView *view = (AddressbookView *) user_data; + new_addressbook_folder (view); +} + +static void +delete_addressbook_folder (AddressbookView *view) +{ + AddressbookViewPrivate *priv = view->priv; + ESource *selected_source; + EBook *book; + GError *error = NULL; + GtkWindow *toplevel; + + selected_source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (priv->selector)); + if (!selected_source) + return; + toplevel = (GtkWindow *) gtk_widget_get_toplevel (priv->notebook); + + if (e_error_run (toplevel, "addressbook:ask-delete-addressbook", + e_source_peek_name(selected_source)) != GTK_RESPONSE_YES) + return; + + /* Remove local data */ + book = e_book_new (selected_source, &error); + if (book) { + if (e_book_remove (book, NULL)) { + if (e_source_selector_source_is_selected (E_SOURCE_SELECTOR (priv->selector), + selected_source)) + e_source_selector_unselect_source (E_SOURCE_SELECTOR (priv->selector), + selected_source); + + e_source_group_remove_source (e_source_peek_group (selected_source), selected_source); + + e_source_list_sync (priv->source_list, NULL); + } + else { + e_error_run (toplevel, "addressbook:remove-addressbook", NULL); + } + g_object_unref (book); + } + else { + g_warning ("error removing addressbook : %s", error->message); + g_error_free (error); + } +} + +static void +delete_folder_cb (BonoboUIComponent *uih, void *user_data, const char *path) +{ + AddressbookView *view = (AddressbookView *) user_data; + if (view) + delete_addressbook_folder (view); + +} + +static void +edit_addressbook_folder (AddressbookView *view) +{ + AddressbookViewPrivate *priv = view->priv; + ESource *selected_source; + const char *uid; + EditorUidClosure *closure; + + selected_source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (priv->selector)); + if (!selected_source) + return; + + uid = e_source_peek_uid (selected_source); + + closure = g_hash_table_lookup (priv->uid_to_editor, uid); + if (!closure) { + char *uid_copy = g_strdup (uid); + + closure = g_new (EditorUidClosure, 1); + closure->editor = addressbook_config_edit_source (gtk_widget_get_toplevel(priv->notebook), selected_source); + closure->uid = uid_copy; + closure->view = view; + + g_hash_table_insert (priv->uid_to_editor, + uid_copy, + closure); + + g_object_weak_ref (G_OBJECT (closure->editor), + editor_weak_notify, closure); + } + + gtk_window_present (GTK_WINDOW (closure->editor)); + +} + +static void +edit_folder_cb (BonoboUIComponent *uih, void *user_data, const char *path) +{ + AddressbookView *view = (AddressbookView *) user_data; + if (view) + edit_addressbook_folder (view); + +} + +static void +rename_addressbook_folder (AddressbookView *view) +{ + AddressbookViewPrivate *priv = view->priv; + ESource *source; + const char *old_name; + char *prompt, *new_name; + gboolean done = FALSE; + + source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (priv->selector)); + old_name = e_source_peek_name(source); + prompt = g_strdup_printf (_("Rename the \"%s\" folder to:"), old_name); + + while (!done) { + new_name = e_request_string (NULL, _("Rename Folder"), prompt, old_name); + if (new_name == NULL || !strcmp (old_name, new_name)) { + done = TRUE; + } else if (strchr(new_name, '/') != NULL) { + e_error_run (NULL, + "addressbook:no-rename-folder", old_name, new_name, _("Folder names cannot contain '/'"), NULL); + done = TRUE; + } else if (e_source_group_peek_source_by_name(e_source_peek_group(source), new_name)) { + e_error_run (NULL, "addressbook:no-rename-folder", old_name, new_name, _("A Folder with this name already exists"), NULL); + } else { + e_source_set_name (source, new_name); + done = TRUE; + } + } + g_free (new_name); + +} + +static void +rename_folder_cb (BonoboUIComponent *uih, void *user_data, const char *path) +{ + AddressbookView *view = (AddressbookView *) user_data; + if (view) + rename_addressbook_folder (view); +} + +static gboolean +folder_can_delete (AddressbookView *view) +{ + AddressbookViewPrivate *priv = view->priv; + ESource *source ; + const char *source_uri; + + source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (priv->selector)); + if(source) { + source_uri = e_source_peek_relative_uri (source); + if (source_uri && !strcmp("system", source_uri)) + return 0; + else + return 1; + } + else + return 0; +} + +static void set_status_message (EABView *eav, const char *message, AddressbookView *view) { AddressbookViewPrivate *priv = view->priv; @@ -383,6 +581,8 @@ update_command_state (EABView *eav, AddressbookView *view) SET_SENSITIVE ("/commands/ContactsMoveToFolder", eab_view_can_move_to_folder); SET_SENSITIVE ("/commands/ContactsCopyToFolder", eab_view_can_copy_to_folder); + bonobo_ui_component_set_prop (uic, ("/commands/FolderDelete"), "sensitive", folder_can_delete(view) ? "1" : "0", NULL); + /* Stop */ SET_SENSITIVE ("/commands/ContactStop", eab_view_can_stop); #undef SET_SENSITIVE @@ -412,6 +612,14 @@ static BonoboUIVerb verbs [] = { BONOBO_UI_UNSAFE_VERB ("ContactsForgetPasswords", forget_passwords_cb), /* ContactsViewPreview is a toggle */ + BONOBO_UI_UNSAFE_VERB ("FolderCreate", new_folder_cb), + BONOBO_UI_UNSAFE_VERB ("FolderCopy", copy_all_contacts_to_cb), + BONOBO_UI_UNSAFE_VERB ("FolderMove", move_all_contacts_to_cb), + BONOBO_UI_UNSAFE_VERB ("FolderSave", save_all_contacts_cb), + BONOBO_UI_UNSAFE_VERB ("FolderDelete", delete_folder_cb), + BONOBO_UI_UNSAFE_VERB ("FolderRename", rename_folder_cb), + BONOBO_UI_UNSAFE_VERB ("ChangeFolderProperties", edit_folder_cb), + BONOBO_UI_VERB_END }; @@ -427,6 +635,11 @@ static EPixmap pixmaps [] = { E_PIXMAP ("/Toolbar/ContactsPrint", "stock_print", E_ICON_SIZE_LARGE_TOOLBAR), E_PIXMAP ("/Toolbar/ContactDelete", "stock_delete", E_ICON_SIZE_LARGE_TOOLBAR), + + E_PIXMAP ("/menu/FolderPlaceholder/Folder/FolderCopy", "stock_folder-copy", E_ICON_SIZE_MENU), + E_PIXMAP ("/menu/FolderPlaceholder/Folder/FolderMove", "stock_folder-move", E_ICON_SIZE_MENU), + E_PIXMAP ("/menu/FolderPlaceholder/Folder/ChangeFolderProperties", "stock_folder-properties", E_ICON_SIZE_MENU), + E_PIXMAP ("/menu/FolderPlaceholder/Folder/FolderSave", "stock_save-as", E_ICON_SIZE_MENU), E_PIXMAP_END }; @@ -720,39 +933,20 @@ new_addressbook_cb(EPopup *ep, EPopupItem *pitem, void *data) } static void -edit_addressbook_cb(EPopup *ep, EPopupItem *pitem, void *data) +save_addressbook_cb(EPopup *ep, EPopupItem *pitem, void *data) { AddressbookView *view = data; - AddressbookViewPrivate *priv = view->priv; - ESource *selected_source; - const char *uid; - EditorUidClosure *closure; - - selected_source = - e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (priv->selector)); - if (!selected_source) - return; - - uid = e_source_peek_uid (selected_source); - - closure = g_hash_table_lookup (priv->uid_to_editor, uid); - if (!closure) { - char *uid_copy = g_strdup (uid); - - closure = g_new (EditorUidClosure, 1); - closure->editor = addressbook_config_edit_source (gtk_widget_get_toplevel(ep->target->widget), selected_source); - closure->uid = uid_copy; - closure->view = view; - - g_hash_table_insert (priv->uid_to_editor, - uid_copy, - closure); - - g_object_weak_ref (G_OBJECT (closure->editor), - editor_weak_notify, closure); - } + EABView *v = get_current_view (view); + if (v) + eab_view_save_as (v, TRUE); +} - gtk_window_present (GTK_WINDOW (closure->editor)); +static void +edit_addressbook_cb(EPopup *ep, EPopupItem *pitem, void *data) +{ + AddressbookView *view = data; + if (view) + edit_addressbook_folder (view); } /* Callbacks. */ @@ -768,6 +962,8 @@ primary_source_selection_changed_callback (ESourceSelector *selector, static EPopupItem abv_source_popups[] = { { E_POPUP_ITEM, "10.new", N_("_New Address Book"), new_addressbook_cb, NULL, "stock_contact", 0, 0 }, { E_POPUP_ITEM, "20.delete", N_("_Delete"), delete_addressbook_cb, NULL, "stock_delete", 0, EAB_POPUP_SOURCE_USER|EAB_POPUP_SOURCE_PRIMARY }, + { E_POPUP_BAR, "40.bar"}, + { E_POPUP_ITEM, "40.saveasvcard", N_("Save As Vcard..."), save_addressbook_cb, NULL,"stock_save-as", 0, EAB_POPUP_SOURCE_PRIMARY }, { E_POPUP_BAR, "30.bar"}, { E_POPUP_ITEM, "30.properties", N_("_Properties..."), edit_addressbook_cb, NULL,"stock_folder-properties", 0, EAB_POPUP_SOURCE_PRIMARY }, }; @@ -1094,45 +1290,7 @@ static void source_selector_key_press_event_callback (GtkWidget *widget, GdkEventKey *event, AddressbookView *view) { if (event->keyval == GDK_Delete) { - AddressbookViewPrivate *priv = view->priv; - ESource *selected_source; - EBook *book; - GError *error = NULL; - GtkWindow *toplevel; - - selected_source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (priv->selector)); - if (!selected_source) - return; - - toplevel = (GtkWindow *) gtk_widget_get_toplevel (priv->notebook); - - if (e_error_run (toplevel, "addressbook:ask-delete-addressbook", - e_source_peek_name(selected_source)) != GTK_RESPONSE_YES) - return; - - /* Remove local data */ - book = e_book_new (selected_source, &error); - if (book) { - if (e_book_remove (book, NULL)) { - if (e_source_selector_source_is_selected (E_SOURCE_SELECTOR (priv->selector), - selected_source)) - e_source_selector_unselect_source (E_SOURCE_SELECTOR (priv->selector), - selected_source); - - e_source_group_remove_source (e_source_peek_group (selected_source), selected_source); - - e_source_list_sync (priv->source_list, NULL); - } - else { - e_error_run (toplevel, "addressbook:remove-addressbook", NULL); - } - - g_object_unref (book); - } - else { - g_warning ("error removing addressbook : %s", error->message); - g_error_free (error); - } + delete_addressbook_folder (view); } return; } @@ -1372,7 +1530,7 @@ activate_source (AddressbookView *view, gtk_widget_show (uid_view); gtk_widget_show (label); - + g_object_set (uid_view, "type", EAB_VIEW_TABLE, NULL); gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook), diff --git a/addressbook/gui/widgets/e-addressbook-view.c b/addressbook/gui/widgets/e-addressbook-view.c index 0e05d76192..e7db20275d 100644 --- a/addressbook/gui/widgets/e-addressbook-view.c +++ b/addressbook/gui/widgets/e-addressbook-view.c @@ -900,7 +900,7 @@ copy_to_folder (EPopup *ep, EPopupItem *pitem, void *data) { ContactAndBook *contact_and_book = data; - eab_view_copy_to_folder (contact_and_book->view); + eab_view_copy_to_folder (contact_and_book->view, FALSE); } static void @@ -908,7 +908,7 @@ move_to_folder (EPopup *ep, EPopupItem *pitem, void *data) { ContactAndBook *contact_and_book = data; - eab_view_move_to_folder (contact_and_book->view); + eab_view_move_to_folder (contact_and_book->view, FALSE); } static void @@ -2030,9 +2030,23 @@ get_selected_contacts (EABView *view) } void -eab_view_save_as (EABView *view) +eab_view_save_as (EABView *view, gboolean all) { - GList *list = get_selected_contacts (view); + GList *list = NULL; + EBook *book ; + + g_object_get(view->model, + "book", &book, + NULL); + + if (all) { + EBookQuery *query = e_book_query_any_field_contains(""); + e_book_get_contacts(book, query, &list, NULL); + e_book_query_unref(query); + } + else { + list = get_selected_contacts(view); + } if (list) eab_contact_list_save (_("Save as VCard..."), list, NULL); e_free_object_list(list); @@ -2113,16 +2127,24 @@ eab_view_stop(EABView *view) } static void -view_transfer_contacts (EABView *view, gboolean delete_from_source) +view_transfer_contacts (EABView *view, gboolean delete_from_source, gboolean all) { EBook *book; - GList *contacts; + GList *contacts = NULL; GtkWindow *parent_window; g_object_get(view->model, "book", &book, NULL); - contacts = get_selected_contacts (view); + + if (all) { + EBookQuery *query = e_book_query_any_field_contains(""); + e_book_get_contacts(book, query, &contacts, NULL); + e_book_query_unref(query); + } + else { + contacts = get_selected_contacts (view); + } parent_window = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (view))); eab_transfer_contacts (book, contacts, delete_from_source, parent_window); @@ -2130,15 +2152,15 @@ view_transfer_contacts (EABView *view, gboolean delete_from_source) } void -eab_view_copy_to_folder (EABView *view) +eab_view_copy_to_folder (EABView *view, gboolean all) { - view_transfer_contacts (view, FALSE); + view_transfer_contacts (view, FALSE, all); } void -eab_view_move_to_folder (EABView *view) +eab_view_move_to_folder (EABView *view, gboolean all) { - view_transfer_contacts (view, TRUE); + view_transfer_contacts (view, TRUE, all); } diff --git a/addressbook/gui/widgets/e-addressbook-view.h b/addressbook/gui/widgets/e-addressbook-view.h index 08371ae009..28fe6831bd 100644 --- a/addressbook/gui/widgets/e-addressbook-view.h +++ b/addressbook/gui/widgets/e-addressbook-view.h @@ -126,7 +126,7 @@ void eab_view_discard_menus (EABView *view); RuleContext *eab_view_peek_search_context (EABView *view); FilterRule *eab_view_peek_search_rule (EABView *view); -void eab_view_save_as (EABView *view); +void eab_view_save_as (EABView *view, gboolean all); void eab_view_view (EABView *view); void eab_view_send (EABView *view); void eab_view_send_to (EABView *view); @@ -139,8 +139,8 @@ void eab_view_paste (EABView *view); void eab_view_select_all (EABView *view); void eab_view_show_all (EABView *view); void eab_view_stop (EABView *view); -void eab_view_copy_to_folder (EABView *view); -void eab_view_move_to_folder (EABView *view); +void eab_view_copy_to_folder (EABView *view, gboolean all); +void eab_view_move_to_folder (EABView *view, gboolean all); gboolean eab_view_can_create (EABView *view); gboolean eab_view_can_print (EABView *view); diff --git a/addressbook/gui/widgets/eab-gui-util.c b/addressbook/gui/widgets/eab-gui-util.c index 5b54acaf61..416e613ecc 100644 --- a/addressbook/gui/widgets/eab-gui-util.c +++ b/addressbook/gui/widgets/eab-gui-util.c @@ -454,16 +454,16 @@ eab_select_source (const gchar *title, const gchar *message, const gchar *select if (!e_book_get_addressbooks (&source_list, NULL)) return NULL; - dialog = gtk_dialog_new_with_buttons (title, parent, + dialog = gtk_dialog_new_with_buttons (_("Select Address Book"), parent, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, NULL); - gtk_window_set_default_size (GTK_WINDOW (dialog), 200, 350); + gtk_window_set_default_size (GTK_WINDOW (dialog), 350, 300); cancel_button = gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); ok_button = gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT); gtk_widget_set_sensitive (ok_button, FALSE); - label = gtk_label_new (message); + //label = gtk_label_new (message); selector = e_source_selector_new (source_list); e_source_selector_show_selection (E_SOURCE_SELECTOR (selector), FALSE); @@ -480,7 +480,7 @@ eab_select_source (const gchar *title, const gchar *message, const gchar *select gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN); gtk_container_add (GTK_CONTAINER (scrolled_window), selector); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), label, FALSE, FALSE, 4); + //gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), label, FALSE, FALSE, 4); gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), scrolled_window, TRUE, TRUE, 4); gtk_widget_show_all (dialog); @@ -763,7 +763,7 @@ eab_transfer_contacts (EBook *source, GList *contacts /* adopted */, gboolean de desc = _("Copy contacts to"); } - destination_source = eab_select_source (desc, _("Select target addressbook."), + destination_source = eab_select_source (desc, NULL, last_uid, parent_window); if (!destination_source) |