X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fhildon2%2Fmodest-address-book.c;h=783c02ce6771209a666166a0e57f28a27102f4cf;hp=50e95ddf3d86852e8ad47a11dc5b4fdc72713365;hb=c3ac189b10be518611b467d9c9f0f733748f598e;hpb=e3ec8ba7cf5a362e1f5f4d659b14779bdcef2dec diff --git a/src/hildon2/modest-address-book.c b/src/hildon2/modest-address-book.c index 50e95dd..783c02c 100644 --- a/src/hildon2/modest-address-book.c +++ b/src/hildon2/modest-address-book.c @@ -49,19 +49,20 @@ #include #include #include +#include static OssoABookContactModel *contact_model = NULL; static EBook *book = NULL; static EBookView * book_view = NULL; -static GSList *get_recipients_for_given_contact(EContact * contact); +static GSList *get_recipients_for_given_contact (EContact * contact, gboolean *canceled); static void commit_contact(EContact * contact, gboolean is_new); -static gchar *get_email_addr_from_user(const gchar * given_name); +static gchar *get_email_addr_from_user(const gchar * given_name, gboolean *canceled); static gchar *ui_get_formatted_email_id(gchar * current_given_name, gchar * current_sur_name, gchar * current_email_id); -static gchar *run_add_email_addr_to_contact_dlg(const gchar * contact_name); +static gchar *run_add_email_addr_to_contact_dlg(const gchar * contact_name, gboolean *canceled); static GSList *select_email_addrs_for_contact(GList * email_addr_list); -static gboolean resolve_address (const gchar *address, GSList **resolved_addresses, gchar **contact_id); +static gboolean resolve_address (const gchar *address, GSList **resolved_addresses, gchar **contact_id, gboolean *canceled); static gchar *unquote_string (const gchar *str); @@ -123,13 +124,79 @@ open_addressbook () return TRUE; /* FIXME */ } +typedef struct _OpenAddressbookSyncInfo { + gboolean retval; + GMainLoop *mainloop; +} OpenAddressbookSyncInfo; + +static void +get_book_view_sync_cb (EBook *book, EBookStatus status, EBookView *bookview, gpointer data) +{ + OpenAddressbookSyncInfo *info = (OpenAddressbookSyncInfo *) data; + + if (status != E_BOOK_ERROR_OK) { + g_object_unref (book); + book = NULL; + info->retval = FALSE; + g_main_loop_quit (info->mainloop); + return; + } + book_view = bookview; + + if (contact_model) +#if MODEST_ABOOK_API < 4 + osso_abook_tree_model_set_book_view (OSSO_ABOOK_TREE_MODEL (contact_model), + book_view); +#else /* MODEST_ABOOK_API < 4 */ + osso_abook_list_store_set_book_view (OSSO_ABOOK_LIST_STORE (contact_model), + book_view); +#endif /* MODEST_ABOOK_API < 4 */ + + e_book_view_start (book_view); + info->retval = TRUE; + g_main_loop_quit (info->mainloop); +} + +static void +book_open_sync_cb (EBook *view, EBookStatus status, gpointer data) +{ + EBookQuery *query = NULL; + OpenAddressbookSyncInfo *info = (OpenAddressbookSyncInfo *) data; + + if (status != E_BOOK_ERROR_OK) { + g_object_unref (book); + book = NULL; + info->retval = FALSE; + g_main_loop_quit (info->mainloop); + return; + } + query = e_book_query_any_field_contains (""); + e_book_async_get_book_view (book, query, NULL, -1, get_book_view_sync_cb, info); + e_book_query_unref (query); +} + static gboolean open_addressbook_sync () { + OpenAddressbookSyncInfo *info; + gboolean retval; + book = e_book_new_system_addressbook (NULL); if (!book) return FALSE; + info = g_slice_new (OpenAddressbookSyncInfo); + info->mainloop = g_main_loop_new (NULL, FALSE); + info->retval = FALSE; + if (e_book_async_open (book, FALSE, book_open_sync_cb, info) == E_BOOK_ERROR_OK) { + GDK_THREADS_LEAVE (); + g_main_loop_run (info->mainloop); + GDK_THREADS_ENTER (); + } + retval = info->retval; + g_main_loop_unref (info->mainloop); + g_slice_free (OpenAddressbookSyncInfo, info); + /* Make it launch a main loop */ return e_book_open (book, FALSE, NULL); } @@ -220,8 +287,9 @@ modest_address_book_select_addresses (ModestRecptEditor *recpt_editor) for (node = contacts_list; node != NULL; node = g_list_next (node)) { EContact *contact = (EContact *) node->data; + gboolean canceled; - email_addrs_per_contact = get_recipients_for_given_contact (contact); + email_addrs_per_contact = get_recipients_for_given_contact (contact, &canceled); if (email_addrs_per_contact) { econtact_id = (gchar *) e_contact_get_const (contact, E_CONTACT_UID); modest_recpt_editor_add_resolved_recipient (MODEST_RECPT_EDITOR (recpt_editor), @@ -259,7 +327,9 @@ modest_address_book_select_addresses (ModestRecptEditor *recpt_editor) * @param Contact of type #EContact * @return List of resolved recipient strings, to be freed by calling function. */ -static GSList *get_recipients_for_given_contact(EContact * contact) +static GSList * +get_recipients_for_given_contact (EContact * contact, + gboolean *canceled) { gchar *givenname = NULL; gchar *familyname = NULL; @@ -301,15 +371,15 @@ static GSList *get_recipients_for_given_contact(EContact * contact) /*Launch the 'Add e-mail addr to contact' dialog if required */ if (email_not_present) { #if MODEST_ABOOK_API < 4 - display_name = osso_abook_contact_get_display_name(contact); + display_name = osso_abook_contact_get_display_name(contact); #else OssoABookContact *abook_contact; - + abook_contact = osso_abook_contact_new_from_template (contact); display_name = osso_abook_contact_get_display_name(abook_contact); #endif - emailid = get_email_addr_from_user(display_name); + emailid = get_email_addr_from_user(display_name, canceled); if (emailid) { e_contact_set(contact, E_CONTACT_EMAIL_1, emailid); commit_contact(contact, FALSE); @@ -393,7 +463,7 @@ commit_contact(EContact * contact, gboolean is_new) * @return E-mail address string entered by user, to be freed by calling function. */ static gchar * -get_email_addr_from_user(const gchar * given_name) +get_email_addr_from_user(const gchar * given_name, gboolean *canceled) { gchar *notification = NULL; gchar *email_addr = NULL; @@ -409,7 +479,7 @@ get_email_addr_from_user(const gchar * given_name) g_free(notification); if (note_response == GTK_RESPONSE_OK) { - email_addr = run_add_email_addr_to_contact_dlg(given_name); + email_addr = run_add_email_addr_to_contact_dlg (given_name, canceled); } return email_addr; @@ -452,11 +522,14 @@ ui_get_formatted_email_id(gchar * current_given_name, * It allows user to enter an e-mail address, and shows appropriate infonote if the * entered string is not a valid e-mail address. * + * It must return TRUE in canceled if the dialog was canceled by the user + * * @param contact_name Full name of the contact * @return E-mail address string entered by user, to be freed by calling function. */ static gchar * -run_add_email_addr_to_contact_dlg(const gchar * contact_name) +run_add_email_addr_to_contact_dlg(const gchar * contact_name, + gboolean *canceled) { GtkWidget *add_email_addr_to_contact_dlg = NULL; GtkSizeGroup *size_group = NULL; @@ -467,26 +540,35 @@ run_add_email_addr_to_contact_dlg(const gchar * contact_name) gchar *new_email_addr = NULL; gboolean run_dialog = TRUE; + g_return_val_if_fail (canceled, NULL); + + *canceled = FALSE; + add_email_addr_to_contact_dlg = - gtk_dialog_new_with_buttons(_AB("addr_ti_sel_contact"), NULL, + gtk_dialog_new_with_buttons(_("mcen_ti_add_email_title"), NULL, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, - _HL("wdgt_bd_done"), GTK_RESPONSE_ACCEPT, NULL); + _HL("wdgt_bd_save"), GTK_RESPONSE_ACCEPT, NULL); gtk_dialog_set_has_separator(GTK_DIALOG(add_email_addr_to_contact_dlg), FALSE); +#ifdef MODEST_TOOLKIT_HILDON2 + gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (add_email_addr_to_contact_dlg)->vbox), + HILDON_MARGIN_DOUBLE); +#endif /*Set app_name & state_save related tags to the window */ size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); name_label = gtk_label_new(contact_name); - gtk_misc_set_alignment(GTK_MISC(name_label), 0, 0); + gtk_misc_set_alignment(GTK_MISC(name_label), 0.0, 0.5); cptn_cntrl = - hildon_caption_new(size_group, _("mcen_ia_add_email_name"), name_label, NULL, - HILDON_CAPTION_OPTIONAL); + modest_maemo_utils_create_captioned (size_group, NULL, + _("mcen_ia_add_email_name"), FALSE, + name_label); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(add_email_addr_to_contact_dlg)->vbox), cptn_cntrl, FALSE, FALSE, 0); - email_entry = gtk_entry_new(); - cptn_cntrl = - hildon_caption_new(size_group, _("mcen_fi_add_email_name"), email_entry, NULL, - HILDON_CAPTION_OPTIONAL); + email_entry = hildon_entry_new (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH); + cptn_cntrl = modest_maemo_utils_create_captioned (size_group, NULL, + _("mcen_fi_add_email_name"), FALSE, + email_entry); hildon_gtk_entry_set_input_mode(GTK_ENTRY(email_entry), HILDON_GTK_INPUT_MODE_FULL); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(add_email_addr_to_contact_dlg)->vbox), cptn_cntrl, TRUE, TRUE, 0); @@ -500,7 +582,7 @@ run_add_email_addr_to_contact_dlg(const gchar * contact_name) if (result == GTK_RESPONSE_ACCEPT) { const gchar *invalid_char_offset = NULL; - new_email_addr = g_strdup(gtk_entry_get_text(GTK_ENTRY(email_entry))); + new_email_addr = g_strdup(hildon_entry_get_text(HILDON_ENTRY(email_entry))); new_email_addr = g_strstrip(new_email_addr); if (!modest_text_utils_validate_email_address (new_email_addr, &invalid_char_offset)) { gtk_widget_grab_focus(email_entry); @@ -520,6 +602,8 @@ run_add_email_addr_to_contact_dlg(const gchar * contact_name) g_free(new_email_addr); new_email_addr = NULL; } + } else { + *canceled = TRUE; } } @@ -721,14 +805,15 @@ modest_address_book_check_names (ModestRecptEditor *recpt_editor, gboolean updat char_in_string); g_free (char_in_string); hildon_banner_show_information (NULL, NULL, message ); - g_free (message); + g_free (message); result = FALSE; } else if (strstr (address, "@") == NULL) { /* here goes searching in addressbook */ + gboolean canceled; gchar *contact_id = NULL; GSList *resolved_addresses = NULL; - result = resolve_address (address, &resolved_addresses, &contact_id); + result = resolve_address (address, &resolved_addresses, &contact_id, &canceled); if (result) { gint new_length; @@ -745,7 +830,13 @@ modest_address_book_check_names (ModestRecptEditor *recpt_editor, gboolean updat recipients = modest_recpt_editor_get_recipients (recpt_editor); new_length = g_utf8_strlen (recipients, -1); offset_delta = offset_delta + new_length - last_length; - last_length = new_length; + last_length = new_length; + } else if (canceled) { + /* We have to remove the recipient if not resolved */ + modest_recpt_editor_replace_with_resolved_recipient (recpt_editor, + &start_iter, &end_iter, + NULL, + NULL); } } else { /* this address is not valid, select it and return control to user showing banner */ @@ -806,12 +897,32 @@ modest_address_book_check_names (ModestRecptEditor *recpt_editor, gboolean updat } +typedef struct _GetContactsInfo { + GMainLoop *mainloop; + GList *result; +} GetContactsInfo; + +static void +get_contacts_for_name_cb (EBook *book, + EBookStatus status, + GList *list, + gpointer userdata) +{ + GetContactsInfo *info = (GetContactsInfo *) userdata; + + if (status == E_BOOK_ERROR_OK) + info->result = list; + + g_main_loop_quit (info->mainloop); +} + static GList * get_contacts_for_name (const gchar *name) { EBookQuery *full_name_book_query = NULL; GList *result; gchar *unquoted; + GetContactsInfo *info; if (name == NULL) return NULL; @@ -820,8 +931,19 @@ get_contacts_for_name (const gchar *name) full_name_book_query = e_book_query_field_test (E_CONTACT_FULL_NAME, E_BOOK_QUERY_CONTAINS, unquoted); g_free (unquoted); - e_book_get_contacts (book, full_name_book_query, &result, NULL); + /* TODO: Make it launch a mainloop */ + info = g_slice_new (GetContactsInfo); + info->mainloop = g_main_loop_new (NULL, FALSE); + info->result = NULL; + if (e_book_async_get_contacts (book, full_name_book_query, get_contacts_for_name_cb, info) == 0) { + GDK_THREADS_LEAVE (); + g_main_loop_run (info->mainloop); + GDK_THREADS_ENTER (); + } + result = info->result; e_book_query_unref (full_name_book_query); + g_main_loop_unref (info->mainloop); + g_slice_free (GetContactsInfo, info); return result; } @@ -880,30 +1002,36 @@ select_contacts_for_name_dialog (const gchar *name) } static gboolean -resolve_address (const gchar *address, GSList **resolved_addresses, gchar **contact_id) +resolve_address (const gchar *address, + GSList **resolved_addresses, + gchar **contact_id, + gboolean *canceled) { GList *resolved_contacts; guint banner_timeout; GtkWidget *banner = NULL; + g_return_val_if_fail (canceled, FALSE); + + *canceled = FALSE; banner_timeout = g_timeout_add (500, show_check_names_banner, &banner); contact_model = osso_abook_contact_model_new (); if (!open_addressbook_sync ()) { + hide_check_names_banner (&banner, banner_timeout); if (contact_model) { g_object_unref (contact_model); contact_model = NULL; } return FALSE; } + hide_check_names_banner (&banner, banner_timeout); resolved_contacts = get_contacts_for_name (address); if (resolved_contacts == NULL) { /* no matching contacts for the search string */ modest_platform_run_information_dialog (NULL, _("mcen_nc_no_matching_contacts"), FALSE); - hide_check_names_banner (&banner, banner_timeout); - return FALSE; } @@ -911,19 +1039,17 @@ resolve_address (const gchar *address, GSList **resolved_addresses, gchar **cont /* show a dialog to select the contact from the resolved ones */ g_list_free (resolved_contacts); - hide_check_names_banner (&banner, banner_timeout); resolved_contacts = select_contacts_for_name_dialog (address); banner_timeout = g_timeout_add (500, show_check_names_banner, &banner); } - + /* get the resolved contacts (can be no contact) */ if (resolved_contacts) { gboolean found; EContact *contact = (EContact *) resolved_contacts->data; - *resolved_addresses = get_recipients_for_given_contact (contact); - hide_check_names_banner (&banner, banner_timeout); + *resolved_addresses = get_recipients_for_given_contact (contact, canceled); if (*resolved_addresses) { *contact_id = g_strdup (e_contact_get_const (contact, E_CONTACT_UID)); found = TRUE; @@ -938,7 +1064,6 @@ resolve_address (const gchar *address, GSList **resolved_addresses, gchar **cont } else { /* cancelled dialog to select more than one contact or * selected no contact */ - hide_check_names_banner (&banner, banner_timeout); return FALSE; } @@ -961,7 +1086,7 @@ unquote_string (const gchar *str) if (*p == '\\') { g_string_append_unichar (buffer, g_utf8_get_char (p)); p = g_utf8_next_char (p); - + } g_string_append_unichar (buffer, g_utf8_get_char (p)); p = g_utf8_next_char (p);