X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fhildon2%2Fmodest-msg-edit-window.c;h=6898f64bbbcaa4f7a9ce9ce1e48127400d8c8882;hp=4a9c9b0f14df06bde29468c27805a468a883d2bd;hb=c96b53b53e89a1389910501fafbd609a1eb0a020;hpb=59891766c8fd7d8f456a9f6a04256b0daa6e6046 diff --git a/src/hildon2/modest-msg-edit-window.c b/src/hildon2/modest-msg-edit-window.c index 4a9c9b0..6898f64 100644 --- a/src/hildon2/modest-msg-edit-window.c +++ b/src/hildon2/modest-msg-edit-window.c @@ -36,6 +36,7 @@ #include #include #include +#include #include @@ -176,6 +177,9 @@ static void font_size_clicked (GtkToolButton *button, ModestMsgEditWindow *window); static void font_face_clicked (GtkToolButton *button, ModestMsgEditWindow *window); +static void update_signature (ModestMsgEditWindow *self, + const gchar *old_account, + const gchar *new_account); static void DEBUG_BUFFER (WPTextBuffer *buffer) { #ifdef DEBUG @@ -241,6 +245,11 @@ struct _ModestMsgEditWindowPrivate { GtkWidget *from_field; gchar *last_from_account; gchar *original_account_name; + + gchar *references; + gchar *in_reply_to; + + gchar *original_mailbox; GtkWidget *to_field; GtkWidget *cc_field; @@ -425,6 +434,9 @@ modest_msg_edit_window_init (ModestMsgEditWindow *obj) priv->font_dialog = NULL; priv->app_menu = NULL; + priv->references = NULL; + priv->in_reply_to = NULL; + if (!is_wp_text_buffer_started) { is_wp_text_buffer_started = TRUE; wp_text_buffer_library_init (); @@ -436,6 +448,45 @@ modest_msg_edit_window_init (ModestMsgEditWindow *obj) HILDON_WINDOW(obj)); } +static gchar * +multimailbox_get_default_mailbox (const gchar *account_name) +{ + gchar *transport_account; + gchar *result = NULL; + + transport_account = modest_account_mgr_get_server_account_name (modest_runtime_get_account_mgr (), + account_name, + TNY_ACCOUNT_TYPE_TRANSPORT); + if (transport_account) { + gchar *proto; + ModestProtocolRegistry *registry; + + registry = modest_runtime_get_protocol_registry (); + + proto = modest_account_mgr_get_string (modest_runtime_get_account_mgr (), transport_account, + MODEST_ACCOUNT_PROTO, TRUE); + if (proto != NULL) { + ModestProtocol *protocol = + modest_protocol_registry_get_protocol_by_name (registry, + MODEST_PROTOCOL_REGISTRY_TRANSPORT_PROTOCOLS, + proto); + if (MODEST_ACCOUNT_PROTOCOL (protocol)) { + ModestPairList *pair_list; + + pair_list = modest_account_protocol_get_from_list (MODEST_ACCOUNT_PROTOCOL (protocol), + account_name); + if (pair_list) { + ModestPair *pair = (ModestPair *) pair_list->data; + result = g_strdup ((const gchar *) pair->first); + modest_pair_list_free (pair_list); + } + } + + } + } + + return result; +} /** * @result: A ModestPairList, which must be freed with modest_pair_list_free(). @@ -452,17 +503,41 @@ get_transports (void) GSList *cursor = accounts; while (cursor) { gchar *account_name = cursor->data; - gchar *from_string = NULL; if (account_name) { - from_string = modest_account_mgr_get_from_string (account_mgr, - account_name); - } - - if (from_string && account_name) { - gchar *name = account_name; - ModestPair *pair = modest_pair_new ((gpointer) name, - (gpointer) from_string , TRUE); - transports = g_slist_prepend (transports, pair); + + gchar *transport_account; + gboolean multi_mailbox = FALSE; + ModestProtocol *protocol = NULL; + + if (modest_account_mgr_account_is_multimailbox (account_mgr, account_name, &protocol)) { + + transport_account = modest_account_mgr_get_server_account_name + (modest_runtime_get_account_mgr (), + account_name, + TNY_ACCOUNT_TYPE_TRANSPORT); + if (protocol && MODEST_IS_ACCOUNT_PROTOCOL (protocol)) { + ModestPairList *pair_list; + pair_list = modest_account_protocol_get_from_list (MODEST_ACCOUNT_PROTOCOL (protocol), + account_name); + if (pair_list) { + transports = g_slist_concat (transports, pair_list); + multi_mailbox = TRUE; + } + } + } + + if (!multi_mailbox) { + gchar *from_string = NULL; + + from_string = modest_account_mgr_get_from_string (account_mgr, + account_name, NULL); + if (from_string && account_name) { + gchar *name = account_name; + ModestPair *pair = modest_pair_new ((gpointer) name, + (gpointer) from_string , TRUE); + transports = g_slist_prepend (transports, pair); + } + } } cursor = cursor->next; @@ -882,8 +957,6 @@ init_window (ModestMsgEditWindow *obj) gtk_container_add (GTK_CONTAINER (window_align), main_vbox); hildon_pannable_area_add_with_viewport (HILDON_PANNABLE_AREA (priv->pannable), window_align); - gtk_container_set_focus_vadjustment (GTK_CONTAINER (main_vbox), - hildon_pannable_area_get_vadjustment (HILDON_PANNABLE_AREA (priv->pannable))); gtk_widget_show_all (GTK_WIDGET(priv->pannable)); window_box = gtk_vbox_new (FALSE, 0); @@ -972,8 +1045,12 @@ modest_msg_edit_window_finalize (GObject *obj) } if (priv->original_account_name) g_free (priv->original_account_name); + if (priv->original_mailbox) + g_free (priv->original_mailbox); g_free (priv->msg_uid); g_free (priv->last_search); + g_free (priv->references); + g_free (priv->in_reply_to); g_object_unref (priv->faces_model); g_object_unref (priv->sizes_model); g_object_unref (priv->attachments); @@ -1212,6 +1289,8 @@ set_msg (ModestMsgEditWindow *self, TnyMsg *msg, gboolean preserve_is_rich) cc = tny_header_dup_cc (header); bcc = tny_header_dup_bcc (header); subject = tny_header_dup_subject (header); + + modest_tny_msg_get_references (TNY_MSG (msg), NULL, &(priv->references), &(priv->in_reply_to)); priority_flags = tny_header_get_priority (header); if (to) @@ -1419,13 +1498,20 @@ modest_msg_edit_window_setup_toolbar (ModestMsgEditWindow *window) priv->font_size_toolitem = tool_item; /* font face */ - tool_item = GTK_WIDGET (gtk_menu_tool_button_new (NULL, NULL)); + tool_item = GTK_WIDGET (gtk_tool_button_new (NULL, NULL)); priv->font_tool_button_label = gtk_label_new (NULL); markup = g_strconcat ("Tt", NULL); gtk_label_set_markup (GTK_LABEL (priv->font_tool_button_label), markup); + gtk_misc_set_alignment (GTK_MISC (priv->font_tool_button_label), 1.0, 0.5); g_free(markup); hildon_helper_set_logical_font (priv->font_tool_button_label, "LargeSystemFont"); - gtk_tool_button_set_label_widget (GTK_TOOL_BUTTON (tool_item), priv->font_tool_button_label); + hbox = gtk_hbox_new (MODEST_MARGIN_DEFAULT, FALSE); + gtk_box_pack_start (GTK_BOX (hbox), priv->font_tool_button_label, TRUE, TRUE, 0); + arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE); + gtk_misc_set_alignment (GTK_MISC (arrow), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (hbox), arrow, TRUE, TRUE, 0); + gtk_widget_set_sensitive (arrow, FALSE); + gtk_tool_button_set_label_widget (GTK_TOOL_BUTTON (tool_item), hbox); fonts_menu = gtk_menu_new (); priv->faces_model = GTK_TREE_MODEL (gtk_list_store_new (1, G_TYPE_STRING)); for (font_index = 0; font_index < wp_get_font_count (); font_index++) { @@ -1471,7 +1557,7 @@ modest_msg_edit_window_setup_toolbar (ModestMsgEditWindow *window) ModestWindow* -modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name, gboolean preserve_is_rich) +modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name, const gchar *mailbox, gboolean preserve_is_rich) { GObject *obj; ModestWindowPrivate *parent_priv; @@ -1492,9 +1578,26 @@ modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name, gboolean pre /* Menubar. Update the state of some toggles */ priv->from_field_protos = get_transports (); + priv->original_mailbox = NULL; modest_selector_picker_set_pair_list (MODEST_SELECTOR_PICKER (priv->from_field), priv->from_field_protos); modest_selector_picker_set_active_id (MODEST_SELECTOR_PICKER (priv->from_field), (gpointer) account_name); priv->last_from_account = modest_selector_picker_get_active_id (MODEST_SELECTOR_PICKER (priv->from_field)); + if (mailbox && modest_pair_list_find_by_first_as_string (priv->from_field_protos, mailbox)) { + modest_selector_picker_set_active_id (MODEST_SELECTOR_PICKER (priv->from_field), (gpointer) mailbox); + priv->original_mailbox = g_strdup (mailbox); + } else if (modest_account_mgr_account_is_multimailbox (modest_runtime_get_account_mgr (), account_name, NULL)) { + /* We set the first mailbox as the active mailbox */ + priv->original_mailbox = multimailbox_get_default_mailbox (account_name); + if (priv->original_mailbox != NULL) + modest_selector_picker_set_active_id (MODEST_SELECTOR_PICKER (priv->from_field), + (gpointer) priv->original_mailbox); + else + modest_selector_picker_set_active_id (MODEST_SELECTOR_PICKER (priv->from_field), + (gpointer) account_name); + } else { + modest_selector_picker_set_active_id (MODEST_SELECTOR_PICKER (priv->from_field), (gpointer) account_name); + } + priv->last_from_account = modest_selector_picker_get_active_id (MODEST_SELECTOR_PICKER (priv->from_field)); hildon_button_set_title (HILDON_BUTTON (priv->from_field), _("mail_va_from")); hildon_button_set_value (HILDON_BUTTON (priv->from_field), @@ -1509,6 +1612,7 @@ modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name, gboolean pre restore_settings (MODEST_MSG_EDIT_WINDOW(obj)); modest_window_set_active_account (MODEST_WINDOW(obj), account_name); + modest_window_set_active_mailbox (MODEST_WINDOW(obj), priv->original_mailbox); priv->original_account_name = (account_name) ? g_strdup (account_name) : NULL; @@ -1603,24 +1707,26 @@ modest_msg_edit_window_get_msg_data (ModestMsgEditWindow *edit_window) const gchar *account_name; ModestMsgEditWindowPrivate *priv; TnyIterator *att_iter; + const gchar *picker_active_id; g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (edit_window), NULL); priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (edit_window); - - account_name = modest_selector_picker_get_active_id (MODEST_SELECTOR_PICKER (priv->from_field)); - g_return_val_if_fail (account_name, NULL); + picker_active_id = modest_selector_picker_get_active_id (MODEST_SELECTOR_PICKER (priv->from_field)); + g_return_val_if_fail (picker_active_id, NULL); + account_name = modest_utils_get_account_name_from_recipient (picker_active_id, NULL); /* don't free these (except from) */ data = g_slice_new0 (MsgData); - data->from = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(), - account_name); + data->from = g_strdup ((gchar *) modest_selector_picker_get_active_display_name (MODEST_SELECTOR_PICKER (priv->from_field))); data->account_name = g_strdup (account_name); data->to = g_strdup (modest_recpt_editor_get_recipients (MODEST_RECPT_EDITOR (priv->to_field))); data->cc = g_strdup (modest_recpt_editor_get_recipients (MODEST_RECPT_EDITOR (priv->cc_field))); data->bcc = g_strdup (modest_recpt_editor_get_recipients (MODEST_RECPT_EDITOR (priv->bcc_field))); data->subject = g_strdup (gtk_entry_get_text (GTK_ENTRY (priv->subject_field))); + data->references = g_strdup (priv->references); + data->in_reply_to = g_strdup (priv->in_reply_to); if (priv->draft_msg) { data->draft_msg = g_object_ref (priv->draft_msg); } else if (priv->outbox_msg) { @@ -1720,6 +1826,8 @@ modest_msg_edit_window_free_msg_data (ModestMsgEditWindow *edit_window, g_free (data->plain_body); g_free (data->html_body); g_free (data->account_name); + g_free (data->references); + g_free (data->in_reply_to); if (data->draft_msg != NULL) { g_object_unref (data->draft_msg); @@ -2173,8 +2281,22 @@ modest_msg_edit_window_insert_image (ModestMsgEditWindow *window) response = gtk_dialog_run (GTK_DIALOG (dialog)); switch (response) { case GTK_RESPONSE_OK: + { + gchar *current_folder; uris = gtk_file_chooser_get_uris (GTK_FILE_CHOOSER (dialog)); - break; + current_folder = gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (dialog)); + if (current_folder && current_folder != '\0') { + GError *err = NULL; + modest_conf_set_string (modest_runtime_get_conf (), MODEST_CONF_LATEST_INSERT_IMAGE_PATH, + current_folder, &err); + if (err != NULL) { + g_debug ("Error storing latest used folder: %s", err->message); + g_error_free (err); + } + } + g_free (current_folder); + } + break; default: break; } @@ -2286,8 +2408,23 @@ on_attach_file_response (GtkDialog *dialog, switch (arg1) { case GTK_RESPONSE_OK: + { + gchar *current_folder; + uris = gtk_file_chooser_get_uris (GTK_FILE_CHOOSER (dialog)); - break; + current_folder = gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (dialog)); + if (current_folder && current_folder != '\0') { + GError *err = NULL; + modest_conf_set_string (modest_runtime_get_conf (), MODEST_CONF_LATEST_ATTACH_FILE_PATH, + current_folder, &err); + if (err != NULL) { + g_debug ("Error storing latest used folder: %s", err->message); + g_error_free (err); + } + } + g_free (current_folder); + } + break; default: break; } @@ -2326,6 +2463,7 @@ modest_msg_edit_window_offer_attach_file (ModestMsgEditWindow *window) { GtkWidget *dialog = NULL; ModestMsgEditWindowPrivate *priv; + gchar *conf_folder; g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(window)); @@ -2337,6 +2475,18 @@ modest_msg_edit_window_offer_attach_file (ModestMsgEditWindow *window) dialog = hildon_file_chooser_dialog_new (GTK_WINDOW (window), GTK_FILE_CHOOSER_ACTION_OPEN); gtk_window_set_title (GTK_WINDOW (dialog), _("mcen_ti_select_attachment_title")); + conf_folder = modest_conf_get_string (modest_runtime_get_conf (), MODEST_CONF_LATEST_ATTACH_FILE_PATH, NULL); + if (conf_folder && conf_folder[0] != '\0') { + gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (dialog), conf_folder); + } else { + gchar *docs_folder; + /* Set the default folder to images folder */ + docs_folder = g_build_filename (g_getenv (MODEST_MAEMO_UTILS_MYDOCS_ENV), + ".documents", NULL); + gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), docs_folder); + g_free (docs_folder); + } + g_free (conf_folder); gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dialog), TRUE); modest_window_mgr_set_modal (modest_runtime_get_window_mgr (), GTK_WINDOW (dialog), GTK_WINDOW (window)); @@ -3183,8 +3333,12 @@ modest_msg_edit_window_is_modified (ModestMsgEditWindow *editor) return TRUE; if (gtk_text_buffer_get_modified (priv->text_buffer)) return TRUE; + account_name = modest_selector_picker_get_active_id (MODEST_SELECTOR_PICKER (priv->from_field)); - if (!priv->original_account_name || strcmp(account_name, priv->original_account_name)) { + if (priv->original_mailbox) { + if (!account_name || strcmp (account_name, priv->original_mailbox)) + return TRUE; + } else if (!priv->original_account_name || strcmp(account_name, priv->original_account_name)) { return TRUE; } @@ -3455,8 +3609,10 @@ gtk_text_iter_forward_search_insensitive (const GtkTextIter *iter, if (!g_utf8_collate (range_subtext, str_casefold)) { gchar *found_text = g_strndup (range_text + offset, str_chars_n); result = TRUE; - gtk_text_iter_forward_search (iter, found_text, GTK_TEXT_SEARCH_VISIBLE_ONLY|GTK_TEXT_SEARCH_TEXT_ONLY, - match_start, match_end, NULL); + if (!gtk_text_iter_forward_search (iter, found_text, GTK_TEXT_SEARCH_VISIBLE_ONLY|GTK_TEXT_SEARCH_TEXT_ONLY, + match_start, match_end, NULL)) { + g_warning ("Matched string with collate, but not matched in model"); + } g_free (found_text); } g_free (range_subtext); @@ -3570,7 +3726,6 @@ modest_msg_edit_window_set_draft (ModestMsgEditWindow *window, g_return_if_fail ((draft == NULL)||(TNY_IS_MSG (draft))); priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); - ModestWindowMgr *mgr = modest_runtime_get_window_mgr (); if (priv->draft_msg != NULL) { g_object_unref (priv->draft_msg); @@ -3584,12 +3739,6 @@ modest_msg_edit_window_set_draft (ModestMsgEditWindow *window, priv->msg_uid = NULL; } priv->msg_uid = modest_tny_folder_get_header_unique_id (header); - if (GTK_WIDGET_REALIZED (window)) { - if (!modest_window_mgr_register_window (mgr, MODEST_WINDOW (window), NULL)) { - gtk_widget_destroy (GTK_WIDGET (window)); - return; - } - } } priv->draft_msg = draft; @@ -3699,9 +3848,9 @@ on_account_removed (TnyAccountStore *account_store, } } -static void -from_field_changed (HildonPickerButton *button, - ModestMsgEditWindow *self) +static void update_signature (ModestMsgEditWindow *self, + const gchar *old_account, + const gchar *new_account) { ModestMsgEditWindowPrivate *priv; gboolean has_old_signature, has_new_signature; @@ -3713,30 +3862,54 @@ from_field_changed (HildonPickerButton *button, priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (self); + gtk_text_buffer_begin_user_action (priv->text_buffer); + gtk_text_buffer_get_start_iter (priv->text_buffer, &iter); mgr = modest_runtime_get_account_mgr (); - signature = modest_account_mgr_get_signature (mgr, priv->last_from_account, &has_old_signature); - if (has_old_signature) { - full_signature = g_strconcat ("\n--\n", signature, NULL); - if (gtk_text_iter_forward_search (&iter, full_signature, 0, &match_start, &match_end, NULL)) { - gtk_text_buffer_delete (priv->text_buffer, &match_start, &match_end); - iter = match_start; - } else if (gtk_text_iter_forward_search (&iter, _("mcen_ia_editor_original_message"), 0, - &match_start, &match_end, NULL)) { - iter = match_start; + + + if (old_account) { + signature = modest_account_mgr_get_signature_from_recipient (mgr, old_account, &has_old_signature); + if (has_old_signature) { + full_signature = g_strconcat ("\n--\n", signature, NULL); + if (gtk_text_iter_forward_search (&iter, full_signature, 0, &match_start, &match_end, NULL)) { + gtk_text_buffer_delete (priv->text_buffer, &match_start, &match_end); + iter = match_start; + } else if (gtk_text_iter_forward_search (&iter, _("mcen_ia_editor_original_message"), 0, + &match_start, &match_end, NULL)) { + iter = match_start; + } + g_free (full_signature); } - g_free (full_signature); + g_free (signature); } - g_free (signature); priv->last_from_account = modest_selector_picker_get_active_id (MODEST_SELECTOR_PICKER (priv->from_field)); - signature = modest_account_mgr_get_signature (mgr, priv->last_from_account, &has_new_signature); + signature = modest_account_mgr_get_signature_from_recipient (mgr, new_account, &has_new_signature); if (has_new_signature) { full_signature = g_strconcat ("\n--\n", signature, NULL); gtk_text_buffer_insert (priv->text_buffer, &iter, full_signature, -1); g_free (full_signature); } g_free (signature); + gtk_text_buffer_end_user_action (priv->text_buffer); +} + +static void +from_field_changed (HildonPickerButton *button, + ModestMsgEditWindow *self) +{ + ModestMsgEditWindowPrivate *priv; + gchar *old_account, *new_account; + + priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (self); + + old_account = priv->last_from_account; + priv->last_from_account = modest_selector_picker_get_active_id (MODEST_SELECTOR_PICKER (priv->from_field)); + new_account = priv->last_from_account; + + update_signature (self, old_account, new_account); + } typedef struct _MessageSettingsHelper {