X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmaemo%2Fmodest-msg-edit-window.c;h=559d027d7dbbb4fd0b21d4e11daba2f10bdd6ec4;hb=1e992fe6d5d1bb508a84cba052e0c18f555767c7;hp=eb3522b0cf9b6f3a1eba5cf1a707c3dc36fd9af9;hpb=88786cd07eebd5d16cfd462dea327a6c718cff53;p=modest diff --git a/src/maemo/modest-msg-edit-window.c b/src/maemo/modest-msg-edit-window.c index eb3522b..559d027 100644 --- a/src/maemo/modest-msg-edit-window.c +++ b/src/maemo/modest-msg-edit-window.c @@ -79,7 +79,7 @@ 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 recpt_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); @@ -119,6 +119,12 @@ static void modest_msg_edit_window_clipboard_owner_change (GtkClipboard *clipboa static void update_window_title (ModestMsgEditWindow *window); static void update_dimmed (ModestMsgEditWindow *window); +/* Find toolbar */ +static void modest_msg_edit_window_find_toolbar_search (GtkWidget *widget, + ModestMsgEditWindow *window); +static void modest_msg_edit_window_find_toolbar_close (GtkWidget *widget, + ModestMsgEditWindow *window); + /* list my signals */ enum { @@ -156,6 +162,8 @@ struct _ModestMsgEditWindowPrivate { GtkWidget *font_tool_button_label; GSList *size_items_group; GtkWidget *size_tool_button_label; + + GtkWidget *find_toolbar; GtkWidget *scroll; @@ -265,6 +273,8 @@ modest_msg_edit_window_init (ModestMsgEditWindow *obj) priv->priority_flags = 0; + priv->find_toolbar = NULL; + priv->draft_msg = NULL; priv->clipboard_change_handler_id = 0; } @@ -319,6 +329,7 @@ init_window (ModestMsgEditWindow *obj) GtkWidget *scroll_area; GtkWidget *subject_box; GtkWidget *attachment_icon; + GtkWidget *window_box; priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE(obj); @@ -385,6 +396,9 @@ init_window (ModestMsgEditWindow *obj) /* gtk_text_buffer_set_can_paste_rich_text (priv->text_buffer, TRUE); */ wp_text_buffer_reset_buffer (WP_TEXT_BUFFER (priv->text_buffer), TRUE); + priv->find_toolbar = hildon_find_toolbar_new (NULL); + gtk_widget_set_no_show_all (priv->find_toolbar, TRUE); + g_signal_connect (G_OBJECT (priv->text_buffer), "refresh_attributes", G_CALLBACK (text_buffer_refresh_attributes), obj); g_signal_connect (G_OBJECT (priv->text_buffer), "delete-range", @@ -409,10 +423,17 @@ init_window (ModestMsgEditWindow *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)); + "changed", G_CALLBACK (recpt_field_changed), obj); + g_signal_connect (G_OBJECT (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->cc_field))), + "changed", G_CALLBACK (recpt_field_changed), obj); + g_signal_connect (G_OBJECT (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->bcc_field))), + "changed", G_CALLBACK (recpt_field_changed), obj); + recpt_field_changed (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->to_field)), MODEST_MSG_EDIT_WINDOW (obj)); g_signal_connect (G_OBJECT (priv->subject_field), "changed", G_CALLBACK (subject_field_changed), obj); + g_signal_connect (G_OBJECT (priv->find_toolbar), "close", G_CALLBACK (modest_msg_edit_window_find_toolbar_close), obj); + g_signal_connect (G_OBJECT (priv->find_toolbar), "search", G_CALLBACK (modest_msg_edit_window_find_toolbar_search), 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); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (priv->scroll), GTK_SHADOW_NONE); @@ -427,12 +448,19 @@ init_window (ModestMsgEditWindow *obj) gtk_container_set_focus_vadjustment (GTK_CONTAINER (main_vbox), gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (priv->scroll))); gtk_widget_show_all (GTK_WIDGET(priv->scroll)); - if (!modest_conf_get_bool(modest_runtime_get_conf(), MODEST_CONF_SHOW_CC, NULL)) - gtk_widget_hide (priv->cc_field); - if (!modest_conf_get_bool(modest_runtime_get_conf(), MODEST_CONF_SHOW_BCC, NULL)) - gtk_widget_hide (priv->bcc_field); + if (!modest_conf_get_bool(modest_runtime_get_conf(), MODEST_CONF_SHOW_CC, NULL)) { + gtk_widget_set_no_show_all (priv->cc_caption, TRUE); + gtk_widget_hide (priv->cc_caption); + } + if (!modest_conf_get_bool(modest_runtime_get_conf(), MODEST_CONF_SHOW_BCC, NULL)) { + gtk_widget_set_no_show_all (priv->bcc_caption, TRUE); + gtk_widget_hide (priv->bcc_caption); + } - gtk_container_add (GTK_CONTAINER(obj), priv->scroll); + window_box = gtk_vbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX (window_box), priv->scroll, TRUE, TRUE, 0); + gtk_box_pack_end (GTK_BOX (window_box), priv->find_toolbar, FALSE, FALSE, 0); + gtk_container_add (GTK_CONTAINER(obj), window_box); 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), @@ -449,7 +477,6 @@ modest_msg_edit_window_finalize (GObject *obj) { ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (obj); - if (priv->clipboard_change_handler_id > 0) { g_signal_handler_disconnect (gtk_clipboard_get (GDK_SELECTION_PRIMARY), priv->clipboard_change_handler_id); priv->clipboard_change_handler_id = 0; @@ -482,7 +509,7 @@ on_delete_event (GtkWidget *widget, GdkEvent *event, ModestMsgEditWindow *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(), */ +/* TnyAccount *account = modest_tny_account_store_get_server_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); */ @@ -589,8 +616,13 @@ set_msg (ModestMsgEditWindow *self, TnyMsg *msg) /* Add attachments to the view */ modest_attachments_view_set_message (MODEST_ATTACHMENTS_VIEW (priv->attachments_view), msg); - if (priv->attachments == NULL) - gtk_widget_hide_all (priv->attachments_caption); + priv->attachments = modest_attachments_view_get_attachments (MODEST_ATTACHMENTS_VIEW (priv->attachments_view)); + if (priv->attachments == NULL) { + gtk_widget_hide (priv->attachments_caption); + } else { + gtk_widget_set_no_show_all (priv->attachments_caption, FALSE); + gtk_widget_show_all (priv->attachments_caption); + } gtk_text_buffer_get_start_iter (priv->text_buffer, &iter); gtk_text_buffer_place_cursor (priv->text_buffer, &iter); @@ -801,6 +833,7 @@ modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name) gint file_format; g_return_val_if_fail (msg, NULL); + g_return_val_if_fail (account_name, NULL); obj = g_object_new(MODEST_TYPE_MSG_EDIT_WINDOW, NULL); @@ -848,7 +881,8 @@ modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name) g_object_unref (action_group); /* Load the UI definition */ - gtk_ui_manager_add_ui_from_file (parent_priv->ui_manager, MODEST_UIDIR "modest-msg-edit-window-ui.xml", &error); + gtk_ui_manager_add_ui_from_file (parent_priv->ui_manager, MODEST_UIDIR "modest-msg-edit-window-ui.xml", + &error); if (error != NULL) { g_warning ("Could not merge modest-msg-edit-window-ui.xml: %s", error->message); g_clear_error (&error); @@ -892,6 +926,14 @@ modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name) action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/CopyMenu"); gtk_action_set_sensitive (action, FALSE); + /* set initial state of cc and bcc */ + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ViewCcFieldMenu"); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), + modest_conf_get_bool(modest_runtime_get_conf(), MODEST_CONF_SHOW_CC, NULL)); + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ViewBccFieldMenu"); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), + modest_conf_get_bool(modest_runtime_get_conf(), MODEST_CONF_SHOW_BCC, NULL)); + /* Setup the file format */ conf = modest_runtime_get_conf (); prefer_formatted = modest_conf_get_bool (conf, MODEST_CONF_PREFER_FORMATTED_TEXT, &error); @@ -1407,6 +1449,7 @@ modest_msg_edit_window_insert_image (ModestMsgEditWindow *window) priv->attachments = g_list_prepend (priv->attachments, image_part); modest_attachments_view_add_attachment (MODEST_ATTACHMENTS_VIEW (priv->attachments_view), image_part); + gtk_text_buffer_set_modified (priv->text_buffer, TRUE); gtk_widget_set_no_show_all (priv->attachments_caption, FALSE); gtk_widget_show_all (priv->attachments_caption); } else if (image_file_id == -1) { @@ -1478,6 +1521,7 @@ modest_msg_edit_window_attach_file (ModestMsgEditWindow *window) mime_part); gtk_widget_set_no_show_all (priv->attachments_caption, FALSE); gtk_widget_show_all (priv->attachments_caption); + gtk_text_buffer_set_modified (priv->text_buffer, TRUE); } g_free (filename); } @@ -1527,6 +1571,7 @@ modest_msg_edit_window_attach_file_noninteractive ( gtk_widget_show_all (priv->attachments_caption); } else if (file_id == -1) { close (file_id); + g_warning("file to be attached does not exist: %s", filename); } } } @@ -1562,6 +1607,11 @@ modest_msg_edit_window_remove_attachments (ModestMsgEditWindow *window, } dialog_response = (gtk_dialog_run (GTK_DIALOG (confirmation_dialog))==GTK_RESPONSE_OK); gtk_widget_destroy (confirmation_dialog); + if (!dialog_response) { + if (clean_list) + g_list_free (att_list); + return; + } hildon_banner_show_information (NULL, NULL, _("mcen_ib_removing_attachment")); for (node = att_list; node != NULL; node = g_list_next (node)) { @@ -1571,11 +1621,14 @@ modest_msg_edit_window_remove_attachments (ModestMsgEditWindow *window, modest_attachments_view_remove_attachment (MODEST_ATTACHMENTS_VIEW (priv->attachments_view), mime_part); + if (priv->attachments == NULL) + gtk_widget_hide (priv->attachments_caption); att_id = tny_mime_part_get_content_id (mime_part); if (att_id != NULL) text_buffer_delete_images_by_id (gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->msg_body)), att_id); g_object_unref (mime_part); + gtk_text_buffer_set_modified (priv->text_buffer, TRUE); } } @@ -1800,10 +1853,12 @@ modest_msg_edit_window_show_cc (ModestMsgEditWindow *window, g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); + gtk_widget_set_no_show_all (priv->cc_caption, TRUE); if (show) gtk_widget_show (priv->cc_caption); else gtk_widget_hide (priv->cc_caption); + modest_conf_set_bool(modest_runtime_get_conf(), MODEST_CONF_SHOW_CC, show, NULL); } void @@ -1814,10 +1869,12 @@ modest_msg_edit_window_show_bcc (ModestMsgEditWindow *window, g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); + gtk_widget_set_no_show_all (priv->bcc_caption, TRUE); if (show) gtk_widget_show (priv->bcc_caption); else gtk_widget_hide (priv->bcc_caption); + modest_conf_set_bool(modest_runtime_get_conf(), MODEST_CONF_SHOW_BCC, show, NULL); } static void @@ -2259,16 +2316,27 @@ msg_body_focus (GtkWidget *focus, } static void -to_field_changed (GtkTextBuffer *buffer, +recpt_field_changed (GtkTextBuffer *buffer, ModestMsgEditWindow *editor) { ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (editor); + ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (editor); + GtkTextBuffer *to_buffer, *cc_buffer, *bcc_buffer; + gboolean dim = FALSE; GtkAction *action; + to_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->to_field)); + cc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->cc_field)); + bcc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->bcc_field)); + + dim = ((gtk_text_buffer_get_char_count (to_buffer) + + gtk_text_buffer_get_char_count (cc_buffer) + + gtk_text_buffer_get_char_count (bcc_buffer)) == 0); + 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); + gtk_action_set_sensitive (action, !dim); 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); + gtk_action_set_sensitive (action, !dim); } static void @@ -2404,5 +2472,72 @@ static void subject_field_changed (GtkEditable *editable, ModestMsgEditWindow *window) { + ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); update_window_title (window); + gtk_text_buffer_set_modified (priv->text_buffer, TRUE); +} + +void +modest_msg_edit_window_toggle_find_toolbar (ModestMsgEditWindow *window, + gboolean show) +{ + ModestMsgEditWindowPrivate *priv = NULL; + + g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); + priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); + + gtk_widget_set_no_show_all (priv->find_toolbar, FALSE); + if (show) { + gtk_widget_show_all (priv->find_toolbar); + hildon_find_toolbar_highlight_entry (HILDON_FIND_TOOLBAR (priv->find_toolbar), TRUE); + } else { + gtk_widget_hide_all (priv->find_toolbar); + gtk_widget_grab_focus (priv->msg_body); + } + +} + +static void +modest_msg_edit_window_find_toolbar_search (GtkWidget *widget, + ModestMsgEditWindow *window) +{ + gchar *current_search = NULL; + ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); + gboolean result; + GtkTextIter selection_start, selection_end; + GtkTextIter match_start, match_end; + + g_object_get (G_OBJECT (widget), "prefix", ¤t_search, NULL); + if ((current_search == NULL) && (strcmp (current_search, "") == 0)) { + g_free (current_search); + return; + } + + gtk_text_buffer_get_selection_bounds (priv->text_buffer, &selection_start, &selection_end); + result = gtk_text_iter_forward_search (&selection_end, current_search, GTK_TEXT_SEARCH_VISIBLE_ONLY, &match_start, &match_end, NULL); + if (!result) { + GtkTextIter buffer_start; + gtk_text_buffer_get_start_iter (priv->text_buffer, &buffer_start); + result = gtk_text_iter_forward_search (&buffer_start, current_search, GTK_TEXT_SEARCH_VISIBLE_ONLY, &match_start, &match_end, &selection_start); + } + if (result) { + gtk_text_buffer_select_range (priv->text_buffer, &match_start, &match_end); + gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW (priv->msg_body), &match_start, 0.0, TRUE, 0.0, 0.0); + } else { + /* TODO: warning about non succesful search */ + } + g_free (current_search); } + +static void +modest_msg_edit_window_find_toolbar_close (GtkWidget *widget, + ModestMsgEditWindow *window) +{ + GtkToggleAction *toggle; + ModestWindowPrivate *parent_priv; + parent_priv = MODEST_WINDOW_GET_PRIVATE (window); + + toggle = GTK_TOGGLE_ACTION (gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ToolsMenu/FindInMessageMenu")); + gtk_toggle_action_set_active (toggle, FALSE); +} +