#include <gtk/gtkcellrenderertext.h>
#include <gtk/gtktreeselection.h>
#include <gtk/gtkentry.h>
+#include <modest-maemo-utils.h>
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, GSList **contact_id, gboolean *canceled);
static gchar *unquote_string (const gchar *str);
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),
* @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;
/*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);
* @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;
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;
* 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;
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),
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);
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);
gchar *message = g_strdup_printf(
_CS("ckdg_ib_illegal_characters_entered"),
char_in_string);
+ g_free (char_in_string);
hildon_banner_show_information (
add_email_addr_to_contact_dlg, NULL, message );
g_free (message);
g_free(new_email_addr);
new_email_addr = NULL;
}
+ } else {
+ *canceled = TRUE;
}
}
err ? err->message : "<unknown>");
if (err)
g_error_free (err);
+ g_free (email);
+ e_book_query_unref (query);
return FALSE;
}
e_book_query_unref (query);
return TRUE;
}
-static gboolean
-show_check_names_banner (gpointer userdata)
+typedef struct _CheckNamesInfo {
+ GtkWidget *banner;
+ guint show_banner_timeout;
+ guint hide_banner_timeout;
+ gboolean hide;
+ gboolean free_info;
+} CheckNamesInfo;
+
+static void
+hide_check_names_banner (CheckNamesInfo *info)
{
- GtkWidget **banner = (GtkWidget **) userdata;
+ if (info->show_banner_timeout > 0) {
+ g_source_remove (info->show_banner_timeout);
+ info->show_banner_timeout = 0;
+ }
+ if (info->hide_banner_timeout > 0) {
+ info->hide = TRUE;
+ return;
+ }
- gdk_threads_enter ();
- *banner = hildon_banner_show_animation (NULL, NULL, _("mail_ib_checking_names"));
- gdk_threads_leave ();
+ if (info->banner) {
+ gtk_widget_destroy (info->banner);
+ info->banner = NULL;
+ info->hide = FALSE;
+ }
+ if (info->free_info) {
+ g_slice_free (CheckNamesInfo, info);
+ }
+}
+
+static gboolean hide_banner_timeout_handler (CheckNamesInfo *info)
+{
+ info->hide_banner_timeout = 0;
+ if (info->hide) {
+ gtk_widget_destroy (info->banner);
+ info->banner = NULL;
+ }
+ if (info->free_info) {
+ g_slice_free (CheckNamesInfo, info);
+ }
return FALSE;
}
-static void
-hide_check_names_banner (GtkWidget **banner, guint banner_timeout)
+static gboolean show_banner_timeout_handler (CheckNamesInfo *info)
+{
+ info->show_banner_timeout = 0;
+ info->banner = hildon_banner_show_animation (NULL, NULL, _("mail_ib_checking_names"));
+ info->hide_banner_timeout = g_timeout_add (1000, (GSourceFunc) hide_banner_timeout_handler, (gpointer) info);
+ return FALSE;
+}
+
+static void show_check_names_banner (CheckNamesInfo *info)
{
- if (*banner != NULL) {
- gtk_widget_destroy (*banner);
- *banner = NULL;
+ if (info->hide_banner_timeout > 0) {
+ g_source_remove (info->hide_banner_timeout);
+ info->hide_banner_timeout = 0;
+ }
+
+ info->hide = FALSE;
+ if (info->show_banner_timeout > 0)
+ return;
+
+ if (info->banner == NULL) {
+ info->show_banner_timeout = g_timeout_add (500, (GSourceFunc) show_banner_timeout_handler, (gpointer) info);
+ }
+}
+
+static void clean_check_names_banner (CheckNamesInfo *info)
+{
+ if (info->hide_banner_timeout) {
+ info->free_info = TRUE;
} else {
- g_source_remove (banner_timeout);
+ if (info->show_banner_timeout) {
+ g_source_remove (info->show_banner_timeout);
+ }
+ if (info->banner)
+ gtk_widget_destroy (info->banner);
+ g_slice_free (CheckNamesInfo, info);
}
+}
+void free_resolved_addresses_list (gpointer data,
+ gpointer ignored)
+{
+ GSList *list = (GSList *)data;
+ g_slist_foreach (list, (GFunc) g_free, NULL);
+ g_slist_free (list);
}
gboolean
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 */
- gchar *contact_id = NULL;
+ gboolean canceled;
+ GSList *contact_ids = NULL;
GSList *resolved_addresses = NULL;
- result = resolve_address (address, &resolved_addresses, &contact_id);
+ result = resolve_address (address, &resolved_addresses, &contact_ids, &canceled);
if (result) {
gint new_length;
- /* replace string */
- modest_recpt_editor_replace_with_resolved_recipient (recpt_editor,
- &start_iter, &end_iter,
- resolved_addresses,
- contact_id);
- g_free (contact_id);
- g_slist_foreach (resolved_addresses, (GFunc) g_free, NULL);
+
+ modest_recpt_editor_replace_with_resolved_recipients (recpt_editor,
+ &start_iter, &end_iter,
+ resolved_addresses,
+ contact_ids);
+ g_slist_foreach (contact_ids, (GFunc) g_free, NULL);
+ g_slist_foreach (resolved_addresses, free_resolved_addresses_list, NULL);
+ g_slist_free (contact_ids);
g_slist_free (resolved_addresses);
/* update offset delta */
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 */
_AB("addr_ti_dia_select_contacts"),
OSSO_ABOOK_CAPS_EMAIL,
OSSO_ABOOK_CONTACT_ORDER_NAME);
+ /* Enable multiselection */
+ osso_abook_contact_chooser_set_maximum_selection (OSSO_ABOOK_CONTACT_CHOOSER (contact_dialog),
+ G_MAXUINT);
osso_abook_contact_chooser_set_model (OSSO_ABOOK_CONTACT_CHOOSER (contact_dialog),
contact_model);
}
static gboolean
-resolve_address (const gchar *address, GSList **resolved_addresses, gchar **contact_id)
+resolve_address (const gchar *address,
+ GSList **resolved_addresses,
+ GSList **contact_ids,
+ gboolean *canceled)
{
GList *resolved_contacts;
- guint banner_timeout;
- GtkWidget *banner = NULL;
+ CheckNamesInfo *info;;
- banner_timeout = g_timeout_add (500, show_check_names_banner, &banner);
+ g_return_val_if_fail (canceled, FALSE);
+ *resolved_addresses = NULL;
+ *contact_ids = NULL;
+ *canceled = FALSE;
+ info = g_slice_new0 (CheckNamesInfo);
+ show_check_names_banner (info);
+
contact_model = osso_abook_contact_model_new ();
if (!open_addressbook_sync ()) {
+ hide_check_names_banner (info);
if (contact_model) {
g_object_unref (contact_model);
contact_model = NULL;
}
+ clean_check_names_banner (info);
return FALSE;
}
+ hide_check_names_banner (info);
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);
-
+ clean_check_names_banner (info);
return FALSE;
}
/* 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);
- if (*resolved_addresses) {
- *contact_id = g_strdup (e_contact_get_const (contact, E_CONTACT_UID));
- found = TRUE;
- } else {
- found = FALSE;
+ GList *node;
+ gboolean found = FALSE;
+
+ for (node = resolved_contacts; node != NULL; node = g_list_next (node)) {
+ EContact *contact = (EContact *) node->data;
+ GSList *resolved;
+ gchar *contact_id;
+
+ resolved = get_recipients_for_given_contact (contact, canceled);
+ if (resolved) {
+ contact_id = g_strdup (e_contact_get_const (contact, E_CONTACT_UID));
+ *contact_ids = g_slist_append (*contact_ids, contact_id);
+ found = TRUE;
+ *resolved_addresses = g_slist_append (*resolved_addresses, resolved);
+ }
}
g_list_foreach (resolved_contacts, (GFunc)unref_gobject, NULL);
g_list_free (resolved_contacts);
+ clean_check_names_banner (info);
return found;
} else {
/* cancelled dialog to select more than one contact or
* selected no contact */
- hide_check_names_banner (&banner, banner_timeout);
+ clean_check_names_banner (info);
return FALSE;
}
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);
err ? err->message : "<unknown>");
if (err)
g_error_free (err);
+ g_free (email);
+ e_book_query_unref (query);
return FALSE;
}
e_book_query_unref (query);