X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmaemo%2Fmodest-msg-edit-window.c;h=e3f16cc1585a246a58f831a9aeaf0ce5741c4d4c;hp=053e2bfd68401cae5a95867a98a5b2f1454c05e4;hb=556398d85f1803ab8d4871a107bc4b8938c444ae;hpb=326ddf804e1bc2542650028660f4eb5cc82af96a diff --git a/src/maemo/modest-msg-edit-window.c b/src/maemo/modest-msg-edit-window.c index 053e2bf..e3f16cc 100644 --- a/src/maemo/modest-msg-edit-window.c +++ b/src/maemo/modest-msg-edit-window.c @@ -55,23 +55,14 @@ #include "modest-tny-platform-factory.h" #include "modest-tny-msg.h" #include "modest-address-book.h" +#include "modest-text-utils.h" #include #include #include -#include -#include -#include -#include -#include -#include "widgets/modest-msg-edit-window-ui.h" - -#ifdef MODEST_HILDON_VERSION_0 -#include -#else -#include - -#endif /*MODEST_HILDON_VERSION_0 */ +#include "modest-scroll-area.h" +#include "modest-hildon-includes.h" +#include "widgets/modest-msg-edit-window-ui.h" #define DEFAULT_FONT_SIZE 3 @@ -85,8 +76,17 @@ static void modest_msg_edit_window_class_init (ModestMsgEditWindowClass *klas static void modest_msg_edit_window_init (ModestMsgEditWindow *obj); static void modest_msg_edit_window_finalize (GObject *obj); +static gboolean msg_body_focus (GtkWidget *focus, GdkEventFocus *event, gpointer userdata); +static void to_field_changed (GtkTextBuffer *buffer, ModestMsgEditWindow *editor); +static void send_insensitive_press (GtkWidget *widget, ModestMsgEditWindow *editor); +static void style_insensitive_press (GtkWidget *widget, ModestMsgEditWindow *editor); +static void setup_insensitive_handlers (ModestMsgEditWindow *editor); +static void reset_modified (ModestMsgEditWindow *editor); +static gboolean is_modified (ModestMsgEditWindow *editor); + static void text_buffer_refresh_attributes (WPTextBuffer *buffer, ModestMsgEditWindow *window); static void text_buffer_mark_set (GtkTextBuffer *buffer, GtkTextIter *location, GtkTextMark *mark, gpointer userdata); +static void text_buffer_can_undo (GtkTextBuffer *buffer, gboolean can_undo, ModestMsgEditWindow *window); static void modest_msg_edit_window_color_button_change (ModestMsgEditWindow *window, gpointer userdata); static void modest_msg_edit_window_size_change (GtkCheckMenuItem *menu_item, @@ -107,6 +107,7 @@ static gboolean modest_msg_edit_window_zoom_minus (ModestWindow *window); static gboolean modest_msg_edit_window_zoom_plus (ModestWindow *window); static void modest_msg_edit_window_show_toolbar (ModestWindow *window, gboolean show_toolbar); +static void update_dimmed (ModestMsgEditWindow *window); /* list my signals */ @@ -135,6 +136,8 @@ struct _ModestMsgEditWindowPrivate { GtkTextBuffer *text_buffer; + GtkWidget *font_size_toolitem; + GtkWidget *font_face_toolitem; GtkWidget *font_color_button; GSList *font_items_group; GtkWidget *font_tool_button_label; @@ -149,6 +152,8 @@ struct _ModestMsgEditWindowPrivate { TnyHeaderFlags priority_flags; gdouble zoom_level; + + TnyMsg *draft_msg; }; #define MODEST_MSG_EDIT_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ @@ -226,6 +231,8 @@ modest_msg_edit_window_init (ModestMsgEditWindow *obj) priv->bcc_caption = NULL; priv->priority_flags = 0; + + priv->draft_msg = NULL; } @@ -234,7 +241,7 @@ static void save_settings (ModestMsgEditWindow *self) { modest_widget_memory_save (modest_runtime_get_conf(), - G_OBJECT(self), "modest-edit-msg-window"); + G_OBJECT(self), MODEST_CONF_EDIT_WINDOW_KEY); } @@ -242,7 +249,7 @@ static void restore_settings (ModestMsgEditWindow *self) { modest_widget_memory_restore (modest_runtime_get_conf(), - G_OBJECT(self), "modest-edit-msg-window"); + G_OBJECT(self), MODEST_CONF_EDIT_WINDOW_KEY); } @@ -255,7 +262,8 @@ get_transports (void) GSList *cursor, *accounts; account_mgr = modest_runtime_get_account_mgr(); - cursor = accounts = modest_account_mgr_account_names (account_mgr); + cursor = accounts = modest_account_mgr_account_names (account_mgr, + TRUE /* only enabled accounts. */); while (cursor) { gchar *account_name = (gchar*)cursor->data; gchar *from_string = modest_account_mgr_get_from_string (account_mgr, @@ -345,22 +353,23 @@ init_window (ModestMsgEditWindow *obj) g_object_set (G_OBJECT (priv->subject_field), "hildon-input-mode", HILDON_GTK_INPUT_MODE_FULL, NULL); gtk_box_pack_start (GTK_BOX (subject_box), priv->subject_field, TRUE, TRUE, 0); priv->add_attachment_button = gtk_button_new (); + GTK_WIDGET_UNSET_FLAGS (GTK_WIDGET (priv->add_attachment_button), GTK_CAN_FOCUS); gtk_button_set_relief (GTK_BUTTON (priv->add_attachment_button), GTK_RELIEF_NONE); gtk_button_set_focus_on_click (GTK_BUTTON (priv->add_attachment_button), FALSE); gtk_button_set_alignment (GTK_BUTTON (priv->add_attachment_button), 1.0, 1.0); - attachment_icon = gtk_image_new_from_icon_name ("qgn_list_gene_attacpap", GTK_ICON_SIZE_BUTTON); + attachment_icon = gtk_image_new_from_icon_name (MODEST_HEADER_ICON_ATTACH, GTK_ICON_SIZE_BUTTON); gtk_container_add (GTK_CONTAINER (priv->add_attachment_button), attachment_icon); gtk_box_pack_start (GTK_BOX (subject_box), priv->add_attachment_button, FALSE, FALSE, 0); priv->attachments_view = modest_attachments_view_new (NULL); priv->header_box = gtk_vbox_new (FALSE, 0); - from_caption = hildon_caption_new (size_group, _("From:"), priv->from_field, NULL, 0); - to_caption = hildon_caption_new (size_group, _("To:"), priv->to_field, NULL, 0); - priv->cc_caption = hildon_caption_new (size_group, _("Cc:"), priv->cc_field, NULL, 0); - priv->bcc_caption = hildon_caption_new (size_group, _("Bcc:"), priv->bcc_field, NULL, 0); - subject_caption = hildon_caption_new (size_group, _("Subject:"), subject_box, NULL, 0); - priv->attachments_caption = hildon_caption_new (size_group, _("Attachments:"), priv->attachments_view, NULL, 0); + from_caption = hildon_caption_new (size_group, _("mail_va_from"), priv->from_field, NULL, 0); + to_caption = hildon_caption_new (size_group, _("mail_va_to"), priv->to_field, NULL, 0); + priv->cc_caption = hildon_caption_new (size_group, _("mail_va_cc"), priv->cc_field, NULL, 0); + priv->bcc_caption = hildon_caption_new (size_group, _("mail_va_hotfix1"), priv->bcc_field, NULL, 0); + subject_caption = hildon_caption_new (size_group, _("mail_va_subject"), subject_box, NULL, 0); + priv->attachments_caption = hildon_caption_new (size_group, _("mail_va_attachment"), priv->attachments_view, NULL, 0); g_object_unref (size_group); size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); @@ -392,11 +401,25 @@ init_window (ModestMsgEditWindow *obj) G_CALLBACK (text_buffer_refresh_attributes), obj); g_signal_connect (G_OBJECT (priv->text_buffer), "mark-set", G_CALLBACK (text_buffer_mark_set), obj); + g_signal_connect (G_OBJECT (priv->text_buffer), "can-undo", + G_CALLBACK (text_buffer_can_undo), obj); g_signal_connect (G_OBJECT (obj), "window-state-event", G_CALLBACK (modest_msg_edit_window_window_state_event), NULL); g_signal_connect_swapped (G_OBJECT (priv->to_field), "open-addressbook", G_CALLBACK (modest_msg_edit_window_open_addressbook), obj); + g_signal_connect_swapped (G_OBJECT (priv->cc_field), "open-addressbook", + G_CALLBACK (modest_msg_edit_window_open_addressbook), obj); + g_signal_connect_swapped (G_OBJECT (priv->bcc_field), "open-addressbook", + G_CALLBACK (modest_msg_edit_window_open_addressbook), obj); + + g_signal_connect (G_OBJECT (priv->msg_body), "focus-in-event", + G_CALLBACK (msg_body_focus), obj); + g_signal_connect (G_OBJECT (priv->msg_body), "focus-out-event", + G_CALLBACK (msg_body_focus), obj); + g_signal_connect (G_OBJECT (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->to_field))), + "changed", G_CALLBACK (to_field_changed), obj); + to_field_changed (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->to_field)), MODEST_MSG_EDIT_WINDOW (obj)); priv->scroll = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->scroll), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); @@ -418,7 +441,7 @@ init_window (ModestMsgEditWindow *obj) gtk_widget_hide (priv->bcc_field); gtk_container_add (GTK_CONTAINER(obj), priv->scroll); - scroll_area = hildon_scroll_area_new (priv->scroll, priv->msg_body); + scroll_area = modest_scroll_area_new (priv->scroll, priv->msg_body); gtk_container_add (GTK_CONTAINER (frame), scroll_area); gtk_container_set_focus_vadjustment (GTK_CONTAINER (scroll_area), gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (priv->scroll))); @@ -437,8 +460,39 @@ modest_msg_edit_window_finalize (GObject *obj) static gboolean on_delete_event (GtkWidget *widget, GdkEvent *event, ModestMsgEditWindow *self) { + GtkWidget *close_dialog; + ModestMsgEditWindowPrivate *priv; + gint response; + + priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (self); save_settings (self); - return FALSE; + if (is_modified (self)) { + close_dialog = hildon_note_new_confirmation (GTK_WINDOW (self), _("mcen_nc_no_email_message_modified_save_changes")); + response = gtk_dialog_run (GTK_DIALOG (close_dialog)); + gtk_widget_destroy (close_dialog); + + if (response != GTK_RESPONSE_CANCEL) { + modest_ui_actions_on_save_to_drafts (NULL, self); + } + } +/* /\* remove old message from drafts *\/ */ +/* if (priv->draft_msg) { */ +/* TnyHeader *header = tny_msg_get_header (priv->draft_msg); */ +/* TnyAccount *account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(), */ +/* account_name, */ +/* TNY_ACCOUNT_TYPE_STORE); */ +/* TnyFolder *folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS); */ +/* g_return_val_if_fail (TNY_IS_HEADER (header), FALSE); */ +/* g_return_val_if_fail (TNY_IS_FOLDER (folder), FALSE); */ +/* tny_folder_remove_msg (folder, header, NULL); */ +/* g_object_unref (folder); */ +/* g_object_unref (header); */ +/* g_object_unref (priv->draft_msg); */ +/* priv->draft_msg = NULL; */ +/* } */ + gtk_widget_destroy (GTK_WIDGET (self)); + + return TRUE; } static GtkWidget * @@ -471,8 +525,10 @@ static void set_msg (ModestMsgEditWindow *self, TnyMsg *msg) { TnyHeader *header; - const gchar *to, *cc, *bcc, *subject, *body; + const gchar *to, *cc, *bcc, *subject; + gchar *body; ModestMsgEditWindowPrivate *priv; + GtkTextIter iter; g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (self)); g_return_if_fail (TNY_IS_MSG (msg)); @@ -497,30 +553,26 @@ set_msg (ModestMsgEditWindow *self, TnyMsg *msg) /* gtk_text_buffer_set_can_paste_rich_text (priv->text_buffer, TRUE); */ wp_text_buffer_reset_buffer (WP_TEXT_BUFFER (priv->text_buffer), TRUE); body = modest_tny_msg_get_body (msg, FALSE); - if ((body!=NULL) && (body[0] != '\0')) { - wp_text_buffer_load_document_begin (WP_TEXT_BUFFER (priv->text_buffer), TRUE); - wp_text_buffer_load_document_write (WP_TEXT_BUFFER (priv->text_buffer), - (gchar *) body, - -1); - wp_text_buffer_load_document_end (WP_TEXT_BUFFER (priv->text_buffer)); - } else { - WPTextBufferFormat fmt = {0}; - - fmt.font_size = DEFAULT_FONT_SIZE; - fmt.font = DEFAULT_FONT; - fmt.rich_text = 1; - fmt.text_position = TEXT_POSITION_NORMAL; - fmt.justification = 0; - fmt.cs.font_size = 1; - fmt.cs.font = 1; - fmt.cs.text_position = 1; - fmt.cs.justification = 1; - wp_text_buffer_set_format (WP_TEXT_BUFFER (priv->text_buffer), &fmt); + + if ((body == NULL)||(body[0] == '\0')) { + g_free (body); + body = modest_text_utils_convert_to_html (""); + } + wp_text_buffer_load_document_begin (WP_TEXT_BUFFER (priv->text_buffer), TRUE); + wp_text_buffer_load_document_write (WP_TEXT_BUFFER (priv->text_buffer), + (gchar *) body, + strlen (body)); + wp_text_buffer_load_document_end (WP_TEXT_BUFFER (priv->text_buffer)); + g_free (body); + + /* Get the default format required from configuration */ + if (!modest_conf_get_bool (modest_runtime_get_conf (), MODEST_CONF_PREFER_FORMATTED_TEXT, NULL)) { + wp_text_buffer_enable_rich_text (WP_TEXT_BUFFER (priv->text_buffer), FALSE); } /* Set the default focus depending on having already a To: field or not */ if ((!to)||(*to == '\0')) { - gtk_widget_grab_focus (priv->to_field); + modest_recpt_editor_grab_focus (MODEST_RECPT_EDITOR (priv->to_field)); } else { gtk_widget_grab_focus (priv->msg_body); } @@ -533,6 +585,16 @@ set_msg (ModestMsgEditWindow *self, TnyMsg *msg) modest_attachments_view_set_message (MODEST_ATTACHMENTS_VIEW (priv->attachments_view), msg); if (priv->attachments == NULL) gtk_widget_hide_all (priv->attachments_caption); + + gtk_text_buffer_get_start_iter (priv->text_buffer, &iter); + gtk_text_buffer_place_cursor (priv->text_buffer, &iter); + + reset_modified (self); + + update_dimmed (self); + text_buffer_can_undo (priv->text_buffer, FALSE, self); + + priv->draft_msg = msg; } static void @@ -649,6 +711,7 @@ modest_msg_edit_window_setup_toolbar (ModestMsgEditWindow *window) gtk_tool_item_set_expand (GTK_TOOL_ITEM (tool_item), TRUE); gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (tool_item), TRUE); menu_tool_button_dont_expand (GTK_MENU_TOOL_BUTTON (tool_item)); + priv->font_size_toolitem = tool_item; /* font face */ tool_item = GTK_WIDGET (gtk_menu_tool_button_new (NULL, NULL)); @@ -688,9 +751,10 @@ modest_msg_edit_window_setup_toolbar (ModestMsgEditWindow *window) gtk_tool_item_set_expand (GTK_TOOL_ITEM (tool_item), TRUE); gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (tool_item), TRUE); menu_tool_button_dont_expand (GTK_MENU_TOOL_BUTTON (tool_item)); + priv->font_face_toolitem = tool_item; /* Set expand and homogeneous for remaining items */ - tool_item = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ActionsSend"); + tool_item = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarSend"); gtk_tool_item_set_expand (GTK_TOOL_ITEM (tool_item), TRUE); gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (tool_item), TRUE); tool_item = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ActionsBold"); @@ -724,6 +788,7 @@ modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name) parent_priv->ui_manager = gtk_ui_manager_new(); action_group = gtk_action_group_new ("ModestMsgEditWindowActions"); + gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE); /* Add common actions */ gtk_action_group_add_actions (action_group, @@ -752,6 +817,12 @@ modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name) 0, G_CALLBACK (modest_ui_actions_msg_edit_on_change_priority), obj); + gtk_action_group_add_radio_actions (action_group, + modest_msg_edit_file_format_action_entries, + G_N_ELEMENTS (modest_msg_edit_file_format_action_entries), + modest_conf_get_bool (modest_runtime_get_conf (), MODEST_CONF_PREFER_FORMATTED_TEXT, NULL), + G_CALLBACK (modest_ui_actions_msg_edit_on_change_file_format), + obj); gtk_ui_manager_insert_action_group (parent_priv->ui_manager, action_group, 0); g_object_unref (action_group); @@ -786,6 +857,8 @@ modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name) modest_msg_edit_window_setup_toolbar (MODEST_MSG_EDIT_WINDOW (obj)); + setup_insensitive_handlers (MODEST_MSG_EDIT_WINDOW (obj)); + set_msg (MODEST_MSG_EDIT_WINDOW (obj), msg); text_buffer_refresh_attributes (WP_TEXT_BUFFER (priv->text_buffer), MODEST_MSG_EDIT_WINDOW (obj)); @@ -849,7 +922,10 @@ modest_msg_edit_window_get_msg_data (ModestMsgEditWindow *edit_window) data->bcc = (gchar*) modest_recpt_editor_get_recipients (MODEST_RECPT_EDITOR(priv->bcc_field)); data->subject = (gchar*) gtk_entry_get_text (GTK_ENTRY(priv->subject_field)); data->plain_body = (gchar *) gtk_text_buffer_get_text (priv->text_buffer, &b, &e, FALSE); - data->html_body = get_formatted_data (edit_window); + if (wp_text_buffer_is_rich_text (WP_TEXT_BUFFER (priv->text_buffer))) + data->html_body = get_formatted_data (edit_window); + else + data->html_body = NULL; data->attachments = priv->attachments; data->priority_flags = priv->priority_flags; @@ -1037,6 +1113,16 @@ text_buffer_refresh_attributes (WPTextBuffer *buffer, ModestMsgEditWindow *windo parent_priv = MODEST_WINDOW_GET_PRIVATE (window); priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); + if (wp_text_buffer_is_rich_text (WP_TEXT_BUFFER (priv->text_buffer))) { + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/FormatMenu/FileFormatMenu/FileFormatFormattedTextMenu"); + if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) + toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), TRUE); + } else { + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/FormatMenu/FileFormatMenu/FileFormatPlainTextMenu"); + if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) + toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), TRUE); + } + wp_text_buffer_get_attributes (WP_TEXT_BUFFER (priv->text_buffer), buffer_format, FALSE); action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ActionsBold"); @@ -1098,6 +1184,7 @@ text_buffer_refresh_attributes (WPTextBuffer *buffer, ModestMsgEditWindow *windo } + void modest_msg_edit_window_select_color (ModestMsgEditWindow *window) { @@ -1111,15 +1198,28 @@ modest_msg_edit_window_select_color (ModestMsgEditWindow *window) priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); wp_text_buffer_get_attributes (WP_TEXT_BUFFER (priv->text_buffer), buffer_format, FALSE); +#ifdef MODEST_HILDON_VERSION_0 dialog = hildon_color_selector_new (GTK_WINDOW (window)); - hildon_color_selector_set_color (HILDON_COLOR_SELECTOR (dialog), & (buffer_format->color)); + hildon_color_selector_set_color (HILDON_COLOR_SELECTOR (dialog), &(buffer_format->color)); +#else + dialog = hildon_color_chooser_new (); + hildon_color_chooser_set_color (HILDON_COLOR_CHOOSER (dialog), &(buffer_format->color)); +#endif /*MODEST_HILDON_VERSION_0*/ g_free (buffer_format); response = gtk_dialog_run (GTK_DIALOG (dialog)); switch (response) { - case GTK_RESPONSE_OK: + case GTK_RESPONSE_OK: { +#ifdef MODEST_HILDON_VERSION_0 new_color = hildon_color_selector_get_color (HILDON_COLOR_SELECTOR (dialog)); - break; +#else + GdkColor col; + hildon_color_chooser_get_color (HILDON_COLOR_CHOOSER(dialog), &col); + new_color = &col; +#endif /*MODEST_HILDON_VERSION_0*/ + } + + break; default: break; } @@ -1137,19 +1237,31 @@ modest_msg_edit_window_select_background_color (ModestMsgEditWindow *window) ModestMsgEditWindowPrivate *priv; GtkWidget *dialog = NULL; gint response; - const GdkColor *old_color = NULL; + GdkColor *old_color = NULL; const GdkColor *new_color = NULL; priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); - old_color = wp_text_buffer_get_background_color (WP_TEXT_BUFFER (priv->text_buffer)); + old_color = (GdkColor*)wp_text_buffer_get_background_color (WP_TEXT_BUFFER (priv->text_buffer)); +#ifdef MODEST_HILDON_VERSION_0 dialog = hildon_color_selector_new (GTK_WINDOW (window)); - hildon_color_selector_set_color (HILDON_COLOR_SELECTOR (dialog), (GdkColor *) old_color); + hildon_color_selector_set_color (HILDON_COLOR_SELECTOR (dialog),(GdkColor*)old_color); +#else + dialog = hildon_color_chooser_new (); + hildon_color_chooser_set_color (HILDON_COLOR_CHOOSER (dialog),(GdkColor*)old_color); +#endif /*MODEST_HILDON_VERSION_9*/ response = gtk_dialog_run (GTK_DIALOG (dialog)); switch (response) { - case GTK_RESPONSE_OK: + case GTK_RESPONSE_OK: { +#ifdef MODEST_HILDON_VERSION_0 new_color = hildon_color_selector_get_color (HILDON_COLOR_SELECTOR (dialog)); +#else + GdkColor col; + hildon_color_chooser_get_color (HILDON_COLOR_CHOOSER(dialog), &col); + new_color = &col; +#endif /*MODEST_HILDON_VERSION_0*/ + } break; default: break; @@ -1249,11 +1361,18 @@ modest_msg_edit_window_color_button_change (ModestMsgEditWindow *window, { ModestMsgEditWindowPrivate *priv; GdkColor *new_color; - priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); + +#ifdef MODEST_HILDON_VERSION_0 new_color = hildon_color_button_get_color (HILDON_COLOR_BUTTON (priv->font_color_button)); +#else + GdkColor col; + hildon_color_button_get_color (HILDON_COLOR_BUTTON(priv->font_color_button), &col); + new_color = &col; +#endif /*MODEST_HILDON_VERSION_0*/ wp_text_buffer_set_attribute (WP_TEXT_BUFFER (priv->text_buffer), WPT_FORECOLOR, (gpointer) new_color); + gtk_window_set_focus (GTK_WINDOW (window), priv->msg_body); } @@ -1478,17 +1597,40 @@ modest_msg_edit_window_open_addressbook (ModestMsgEditWindow *window, GtkWidget *view_focus; view_focus = gtk_window_get_focus (GTK_WINDOW (window)); - if (gtk_widget_get_parent (view_focus) && - MODEST_IS_RECPT_EDITOR (gtk_widget_get_parent (view_focus))) { - editor = MODEST_RECPT_EDITOR (gtk_widget_get_parent (view_focus)); - } else { - editor = MODEST_RECPT_EDITOR (priv->to_field); + /* This code should be kept in sync with ModestRecptEditor. The + textview inside the recpt editor is the one that really gets the + focus. As it's inside a scrolled window, and this one inside the + hbox recpt editor inherits from, we'll need to go up in the + hierarchy to know if the text view is part of the recpt editor + or if it's a different text entry */ + + if (gtk_widget_get_parent (view_focus)) { + GtkWidget *first_parent; + + first_parent = gtk_widget_get_parent (view_focus); + if (gtk_widget_get_parent (first_parent) && + MODEST_IS_RECPT_EDITOR (gtk_widget_get_parent (first_parent))) { + editor = MODEST_RECPT_EDITOR (gtk_widget_get_parent (first_parent)); + } } + + if (editor == NULL) + editor = MODEST_RECPT_EDITOR (priv->to_field); + } modest_address_book_select_addresses (editor); } + +void +modest_msg_edit_window_select_contacts (ModestMsgEditWindow *window) +{ + g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); + + modest_msg_edit_window_open_addressbook (window, NULL); +} + static void modest_msg_edit_window_show_toolbar (ModestWindow *self, gboolean show_toolbar) @@ -1537,3 +1679,383 @@ modest_msg_edit_window_set_priority_flags (ModestMsgEditWindow *window, } } } + +void +modest_msg_edit_window_set_file_format (ModestMsgEditWindow *window, + gint file_format) +{ + ModestMsgEditWindowPrivate *priv; + gint current_format; + + g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); + + priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); + + current_format = wp_text_buffer_is_rich_text (WP_TEXT_BUFFER (priv->text_buffer)) + ? MODEST_FILE_FORMAT_FORMATTED_TEXT : MODEST_FILE_FORMAT_PLAIN_TEXT; + + if (current_format != file_format) { + switch (file_format) { + case MODEST_FILE_FORMAT_FORMATTED_TEXT: + wp_text_buffer_enable_rich_text (WP_TEXT_BUFFER (priv->text_buffer), TRUE); + break; + case MODEST_FILE_FORMAT_PLAIN_TEXT: + { + GtkWidget *dialog; + gint response; + dialog = hildon_note_new_confirmation (NULL, _("emev_nc_formatting_lost")); + response = gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + if (response == GTK_RESPONSE_OK) + wp_text_buffer_enable_rich_text (WP_TEXT_BUFFER (priv->text_buffer), FALSE); + } + break; + } + update_dimmed (window); + } +} + +void +modest_msg_edit_window_select_font (ModestMsgEditWindow *window) +{ + GtkWidget *dialog; + ModestMsgEditWindowPrivate *priv; + WPTextBufferFormat oldfmt, fmt; + gint old_position = 0; + gint response = 0; + gint position = 0; + gint font_size; + GdkColor *color = NULL; + gboolean bold, bold_set, italic, italic_set; + gboolean underline, underline_set; + gboolean strikethrough, strikethrough_set; + gboolean position_set; + gboolean font_size_set, font_set, color_set; + gchar *font_name; + + g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); + priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); + + dialog = hildon_font_selection_dialog_new (NULL, NULL); + + /* First we get the currently selected font information */ + wp_text_buffer_get_attributes (WP_TEXT_BUFFER (priv->text_buffer), &oldfmt, TRUE); + g_object_set (G_OBJECT (dialog), "font-scaling", priv->zoom_level, NULL); + + switch (oldfmt.text_position) { + case TEXT_POSITION_NORMAL: + old_position = 0; + break; + case TEXT_POSITION_SUPERSCRIPT: + old_position = 1; + break; + default: + old_position = -1; + break; + } + + g_object_set (G_OBJECT (dialog), + "bold", oldfmt.bold != FALSE, + "bold-set", !oldfmt.cs.bold, + "underline", oldfmt.underline != FALSE, + "underline-set", !oldfmt.cs.underline, + "italic", oldfmt.italic != FALSE, + "italic-set", !oldfmt.cs.italic, + "strikethrough", oldfmt.strikethrough != FALSE, + "strikethrough-set", !oldfmt.cs.strikethrough, + "color", &oldfmt.color, + "color-set", !oldfmt.cs.color, + "size", wp_font_size[oldfmt.font_size], + "size-set", !oldfmt.cs.font_size, + "position", old_position, + "position-set", !oldfmt.cs.text_position, + "family", wp_get_font_name (oldfmt.font), + "family-set", !oldfmt.cs.font, + NULL); + + gtk_widget_show_all (dialog); + response = gtk_dialog_run (GTK_DIALOG (dialog)); + if (response == GTK_RESPONSE_OK) { + + g_object_get( dialog, + "bold", &bold, + "bold-set", &bold_set, + "underline", &underline, + "underline-set", &underline_set, + "italic", &italic, + "italic-set", &italic_set, + "strikethrough", &strikethrough, + "strikethrough-set", &strikethrough_set, + "color", &color, + "color-set", &color_set, + "size", &font_size, + "size-set", &font_size_set, + "family", &font_name, + "family-set", &font_set, + "position", &position, + "position-set", &position_set, + NULL ); + + } + + gtk_widget_destroy (dialog); + + if (response == GTK_RESPONSE_OK) { + memset(&fmt, 0, sizeof(fmt)); + if (bold_set) { + fmt.bold = bold; + fmt.cs.bold = TRUE; + } + if (italic_set) { + fmt.italic = italic; + fmt.cs.italic = TRUE; + } + if (underline_set) { + fmt.underline = underline; + fmt.cs.underline = TRUE; + } + if (strikethrough_set) { + fmt.strikethrough = strikethrough; + fmt.cs.strikethrough = TRUE; + } + if (position_set) { + fmt.text_position = + ( position == 0 ) + ? TEXT_POSITION_NORMAL + : ( ( position == 1 ) + ? TEXT_POSITION_SUPERSCRIPT + : TEXT_POSITION_SUBSCRIPT ); + fmt.cs.text_position = TRUE; + } + if (color_set) { + fmt.color = *color; + fmt.cs.color = TRUE; + } + gdk_color_free(color); + if (font_set) { + fmt.font = wp_get_font_index(font_name, + DEFAULT_FONT); + fmt.cs.font = TRUE; + } + g_free(font_name); + if (font_size_set) { + fmt.font_size = wp_get_font_size_index( + font_size, DEFAULT_FONT_SIZE); + fmt.cs.font_size = TRUE; + } + gtk_widget_grab_focus(GTK_WIDGET(priv->msg_body)); + wp_text_buffer_set_format(WP_TEXT_BUFFER(priv->text_buffer), &fmt); + } + +} + +void +modest_msg_edit_window_undo (ModestMsgEditWindow *window) +{ + ModestMsgEditWindowPrivate *priv; + + g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); + priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); + + wp_text_buffer_undo (WP_TEXT_BUFFER (priv->text_buffer)); + + update_dimmed (window); + +} + +static void +update_dimmed (ModestMsgEditWindow *window) +{ + ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); + ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (window); + GtkAction *action; + GtkWidget *widget; + gboolean rich_text; + gboolean editor_focused; + + rich_text = wp_text_buffer_is_rich_text (WP_TEXT_BUFFER (priv->text_buffer)); + editor_focused = gtk_widget_is_focus (priv->msg_body); + + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/FormatMenu/SelectFontMenu"); + gtk_action_set_sensitive (action, rich_text && editor_focused); + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/FormatMenu/BulletedListMenu"); + gtk_action_set_sensitive (action, rich_text && editor_focused); + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/FormatMenu/AlignmentMenu"); + gtk_action_set_sensitive (action, rich_text && editor_focused); + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/FormatMenu/AlignmentMenu/AlignmentLeftMenu"); + gtk_action_set_sensitive (action, rich_text && editor_focused); + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/FormatMenu/AlignmentMenu/AlignmentCenterMenu"); + gtk_action_set_sensitive (action, rich_text && editor_focused); + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/FormatMenu/AlignmentMenu/AlignmentRightMenu"); + gtk_action_set_sensitive (action, rich_text && editor_focused); + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/AttachmentsMenu/InsertImageMenu"); + gtk_action_set_sensitive (action, rich_text && editor_focused); + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ActionsBold"); + gtk_action_set_sensitive (action, rich_text && editor_focused); + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ActionsItalics"); + gtk_action_set_sensitive (action, rich_text && editor_focused); + widget = priv->font_color_button; + gtk_widget_set_sensitive (widget, rich_text && editor_focused); + widget = priv->font_size_toolitem; + gtk_widget_set_sensitive (widget, rich_text && editor_focused); + widget = priv->font_face_toolitem; + gtk_widget_set_sensitive (widget, rich_text && editor_focused); +} + +static void +setup_insensitive_handlers (ModestMsgEditWindow *window) +{ + ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (window); + ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); + GtkWidget *widget; + + widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarSend"); + g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (send_insensitive_press), window); + widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/MenuBar/EmailMenu/SendMenu"); + g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (send_insensitive_press), window); + + widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/MenuBar/FormatMenu/SelectFontMenu"); + g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window); + widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/MenuBar/FormatMenu/BulletedListMenu"); + g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window); + widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/MenuBar/FormatMenu/AlignmentMenu"); + g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window); + widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/MenuBar/FormatMenu/AlignmentMenu/AlignmentLeftMenu"); + g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window); + widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/MenuBar/FormatMenu/AlignmentMenu/AlignmentCenterMenu"); + g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window); + widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/MenuBar/FormatMenu/AlignmentMenu/AlignmentRightMenu"); + g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window); + widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/MenuBar/AttachmentsMenu/InsertImageMenu"); + g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window); + widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ActionsBold"); + g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window); + widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ActionsItalics"); + g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window); + widget = priv->font_color_button; + g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window); + widget = priv->font_size_toolitem; + g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window); + widget = priv->font_face_toolitem; + g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window); + +} + +static void +text_buffer_can_undo (GtkTextBuffer *buffer, gboolean can_undo, ModestMsgEditWindow *window) +{ + ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (window); + GtkAction *action; + + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/UndoMenu"); + gtk_action_set_sensitive (action, can_undo); +} + +static gboolean +msg_body_focus (GtkWidget *focus, + GdkEventFocus *event, + gpointer userdata) +{ + update_dimmed (MODEST_MSG_EDIT_WINDOW (userdata)); + return FALSE; +} + +static void +to_field_changed (GtkTextBuffer *buffer, + ModestMsgEditWindow *editor) +{ + ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (editor); + GtkAction *action; + + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarSend"); + gtk_action_set_sensitive (action, gtk_text_buffer_get_char_count (buffer) != 0); + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EmailMenu/SendMenu"); + gtk_action_set_sensitive (action, gtk_text_buffer_get_char_count (buffer) != 0); +} + +static void +send_insensitive_press (GtkWidget *widget, ModestMsgEditWindow *editor) +{ + hildon_banner_show_information (NULL, NULL, _("mcen_ib_add_recipients_first")); +} + +static void +style_insensitive_press (GtkWidget *widget, ModestMsgEditWindow *editor) +{ + gboolean rich_text, editor_focused; + + ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (editor); + rich_text = wp_text_buffer_is_rich_text (WP_TEXT_BUFFER (priv->text_buffer)); + editor_focused = gtk_widget_is_focus (priv->msg_body); + + if (!rich_text) + hildon_banner_show_information (NULL, NULL, _("mcen_ib_item_unavailable_plaintext")); + else if (!editor_focused) + hildon_banner_show_information (NULL, NULL, _("mcen_ib_move_cursor_to_message")); +} + +static void +reset_modified (ModestMsgEditWindow *editor) +{ + ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (editor); + GtkTextBuffer *buffer; + + buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR(priv->to_field)); + gtk_text_buffer_set_modified (buffer, FALSE); + buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR(priv->cc_field)); + gtk_text_buffer_set_modified (buffer, FALSE); + buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR(priv->bcc_field)); + gtk_text_buffer_set_modified (buffer, FALSE); + gtk_text_buffer_set_modified (priv->text_buffer, FALSE); +} + +static gboolean +is_modified (ModestMsgEditWindow *editor) +{ + ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (editor); + GtkTextBuffer *buffer; + + buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR(priv->to_field)); + if (gtk_text_buffer_get_modified (buffer)) + return TRUE; + buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR(priv->cc_field)); + if (gtk_text_buffer_get_modified (buffer)) + return TRUE; + buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR(priv->bcc_field)); + if (gtk_text_buffer_get_modified (buffer)) + return TRUE; + if (gtk_text_buffer_get_modified (priv->text_buffer)) + return TRUE; + + return FALSE; +} + +gboolean +modest_msg_edit_window_check_names (ModestMsgEditWindow *window) +{ + ModestMsgEditWindowPrivate *priv = NULL; + + g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window), FALSE); + priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); + + /* check if there's no recipient added */ + if ((gtk_text_buffer_get_char_count (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->to_field))) == 0) && + (gtk_text_buffer_get_char_count (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->cc_field))) == 0) && + (gtk_text_buffer_get_char_count (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->bcc_field))) == 0)) { + /* no recipient contents, then select contacts */ + modest_msg_edit_window_open_addressbook (window, NULL); + return FALSE; + } + + if (!modest_address_book_check_names (MODEST_RECPT_EDITOR (priv->to_field))) + return FALSE; + if (!modest_address_book_check_names (MODEST_RECPT_EDITOR (priv->cc_field))) + return FALSE; + if (!modest_address_book_check_names (MODEST_RECPT_EDITOR (priv->bcc_field))) + return FALSE; + + modest_recpt_editor_grab_focus (MODEST_RECPT_EDITOR (priv->to_field)); + + return TRUE; + +}