X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fhildon2%2Fmodest-address-book.c;h=67d9c0cdfb02e8c8c18fade327aa22e5b82c7b40;hp=f59ab96e33f23f2fbbaf2df28d8b31b14752ab9d;hb=69a53b9ea2ab44b6836f91d39a67ad418b3b98ae;hpb=ebff87b88ed8be6950afe33d19c6b841078e4142;ds=sidebyside diff --git a/src/hildon2/modest-address-book.c b/src/hildon2/modest-address-book.c index f59ab96..67d9c0c 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); @@ -286,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), @@ -325,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; @@ -367,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); @@ -459,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; @@ -475,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; @@ -518,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; @@ -533,10 +540,14 @@ 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), @@ -546,17 +557,18 @@ run_add_email_addr_to_contact_dlg(const gchar * contact_name) 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); @@ -570,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); @@ -590,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; } } @@ -791,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; @@ -815,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 */ @@ -981,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; } @@ -1012,19 +1039,15 @@ 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; @@ -1039,7 +1062,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; } @@ -1062,7 +1084,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);