X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmaemo%2Fmodest-msg-edit-window.c;h=42c30cdbde47a9030ce43952a2dea5fbd9557039;hp=9811db73c37fac78c59b9e42489797b9fe3b2f84;hb=f213c6daa765f3de742ba2a2475a5ecf4c181d94;hpb=48d5a2f7db86924385eddd9c23c482a19b50c2bd diff --git a/src/maemo/modest-msg-edit-window.c b/src/maemo/modest-msg-edit-window.c index 9811db7..42c30cd 100644 --- a/src/maemo/modest-msg-edit-window.c +++ b/src/maemo/modest-msg-edit-window.c @@ -119,6 +119,11 @@ 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 +161,8 @@ struct _ModestMsgEditWindowPrivate { GtkWidget *font_tool_button_label; GSList *size_items_group; GtkWidget *size_tool_button_label; + + GtkWidget *find_toolbar; GtkWidget *scroll; @@ -265,6 +272,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; } @@ -282,11 +291,11 @@ get_transports (void) ModestAccountMgr *account_mgr = modest_runtime_get_account_mgr(); GSList *accounts = modest_account_mgr_account_names (account_mgr, - TRUE /* only enabled accounts. */); + TRUE /* only enabled accounts. */); GSList *cursor = accounts; while (cursor) { - const gchar *account_name = cursor->data; + gchar *account_name = cursor->data; gchar *from_string = NULL; if (account_name) { from_string = modest_account_mgr_get_from_string (account_mgr, @@ -294,7 +303,7 @@ get_transports (void) } if (from_string && account_name) { - gchar *name = g_strdup (account_name); + gchar *name = account_name; ModestPair *pair = modest_pair_new ((gpointer) name, (gpointer) from_string , TRUE); transports = g_slist_prepend (transports, pair); @@ -302,7 +311,8 @@ get_transports (void) cursor = cursor->next; } - g_slist_free (accounts); + g_slist_free (accounts); /* only free the accounts, not the elements, + * because they are used in the pairlist */ return transports; } @@ -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); @@ -338,7 +349,8 @@ init_window (ModestMsgEditWindow *obj) priv->priority_icon = gtk_image_new (); gtk_box_pack_start (GTK_BOX (subject_box), priv->priority_icon, FALSE, FALSE, 0); priv->subject_field = gtk_entry_new_with_max_length (SUBJECT_MAX_LENGTH); - g_object_set (G_OBJECT (priv->subject_field), "hildon-input-mode", HILDON_GTK_INPUT_MODE_FULL, NULL); + hildon_gtk_entry_set_input_mode (GTK_ENTRY (priv->subject_field), + HILDON_GTK_INPUT_MODE_FULL | HILDON_GTK_INPUT_MODE_AUTOCAP); 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); @@ -385,6 +397,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", @@ -417,6 +432,9 @@ init_window (ModestMsgEditWindow *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); @@ -440,7 +458,10 @@ init_window (ModestMsgEditWindow *obj) 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), @@ -457,7 +478,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; @@ -490,7 +510,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); */ @@ -541,6 +561,7 @@ set_msg (ModestMsgEditWindow *self, TnyMsg *msg) gchar *body; ModestMsgEditWindowPrivate *priv; GtkTextIter iter; + TnyHeaderFlags priority_flags; g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (self)); g_return_if_fail (TNY_IS_MSG (msg)); @@ -552,6 +573,7 @@ set_msg (ModestMsgEditWindow *self, TnyMsg *msg) cc = tny_header_get_cc (header); bcc = tny_header_get_bcc (header); subject = tny_header_get_subject (header); + priority_flags = tny_header_get_flags (header) & TNY_HEADER_FLAG_PRIORITY; if (to) modest_recpt_editor_set_recipients (MODEST_RECPT_EDITOR (priv->to_field), to); @@ -561,6 +583,8 @@ set_msg (ModestMsgEditWindow *self, TnyMsg *msg) modest_recpt_editor_set_recipients (MODEST_RECPT_EDITOR (priv->bcc_field), bcc); if (subject) gtk_entry_set_text (GTK_ENTRY(priv->subject_field), subject); + modest_msg_edit_window_set_priority_flags (MODEST_MSG_EDIT_WINDOW(self), + priority_flags); update_window_title (self); @@ -812,8 +836,10 @@ modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name) ModestConf *conf; gboolean prefer_formatted; gint file_format; + ModestPair *account_pair = NULL; 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); @@ -861,7 +887,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); @@ -891,6 +918,10 @@ modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name) setup_insensitive_handlers (MODEST_MSG_EDIT_WINDOW (obj)); + account_pair = modest_pair_list_find_by_first_as_string (priv->from_field_protos, account_name); + if (account_pair != NULL) + modest_combo_box_set_active_id (MODEST_COMBO_BOX (priv->from_field), account_pair->first); + set_msg (MODEST_MSG_EDIT_WINDOW (obj), msg); text_buffer_refresh_attributes (WP_TEXT_BUFFER (priv->text_buffer), MODEST_MSG_EDIT_WINDOW (obj)); @@ -1154,7 +1185,7 @@ modest_msg_edit_window_set_format_state (ModestMsgEditWindow *self, wp_text_buffer_set_attribute (WP_TEXT_BUFFER (priv->text_buffer), WPT_BOLD, (gpointer) (buffer_format->font)); } if (buffer_format->cs.bullet) { - wp_text_buffer_set_attribute (WP_TEXT_BUFFER (priv->text_buffer), WPT_BULLET, (gpointer) (buffer_format->bullet)); + wp_text_buffer_set_attribute (WP_TEXT_BUFFER (priv->text_buffer), WPT_BULLET, (gpointer) ((int)buffer_format->bullet)); } /* wp_text_buffer_set_format (WP_TEXT_BUFFER (priv->text_buffer), buffer_format); */ wp_text_buffer_thaw (WP_TEXT_BUFFER (priv->text_buffer)); @@ -1447,36 +1478,41 @@ modest_msg_edit_window_attach_file (ModestMsgEditWindow *window) ModestMsgEditWindowPrivate *priv; GtkWidget *dialog = NULL; gint response = 0; - gchar *uri = NULL, *filename = NULL; + GSList *uris = NULL; + GSList *uri_node; priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); dialog = hildon_file_chooser_dialog_new (GTK_WINDOW (window), GTK_FILE_CHOOSER_ACTION_OPEN); + gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dialog), TRUE); response = gtk_dialog_run (GTK_DIALOG (dialog)); switch (response) { case GTK_RESPONSE_OK: - uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog)); - filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); + uris = gtk_file_chooser_get_uris (GTK_FILE_CHOOSER (dialog)); break; default: break; } gtk_widget_destroy (dialog); - if (uri) { - + for (uri_node = uris; uri_node != NULL; uri_node = g_slist_next (uri_node)) { + const gchar *uri; GnomeVFSHandle *handle = NULL; GnomeVFSResult result; + uri = (const gchar *) uri_node->data; result = gnome_vfs_open (&handle, uri, GNOME_VFS_OPEN_READ); if (result == GNOME_VFS_OK) { TnyMimePart *mime_part; TnyStream *stream; const gchar *mime_type = NULL; gchar *basename; + gchar *filename; gchar *content_id; GnomeVFSFileInfo info; + + filename = g_filename_from_uri (uri, NULL, NULL); if (gnome_vfs_get_file_info_from_handle (handle, &info, GNOME_VFS_FILE_INFO_GET_MIME_TYPE) == GNOME_VFS_OK) mime_type = gnome_vfs_file_info_get_mime_type (&info); @@ -1501,24 +1537,35 @@ modest_msg_edit_window_attach_file (ModestMsgEditWindow *window) 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); + } - g_free (filename); } + g_slist_foreach (uris, (GFunc) g_free, NULL); + g_slist_free (uris); } void modest_msg_edit_window_attach_file_noninteractive ( ModestMsgEditWindow *window, - gchar *filename) + const gchar *file_uri) { ModestMsgEditWindowPrivate *priv; priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); - if (filename) { - gint file_id; + if (file_uri) { + gint file_id = 0; + /* TODO: We should probably try to use only the URI, + * instead of using a filename. + */ + gchar* filename = g_filename_from_uri (file_uri, NULL, NULL); + if (!filename) { + g_warning("%s: g_filename_from_uri(%s) failed.\n", __FUNCTION__, file_uri); + } + file_id = g_open (filename, O_RDONLY, 0); if (file_id != -1) { TnyMimePart *mime_part; @@ -1552,6 +1599,8 @@ modest_msg_edit_window_attach_file_noninteractive ( close (file_id); g_warning("file to be attached does not exist: %s", filename); } + + g_free (filename); } } @@ -1576,14 +1625,18 @@ modest_msg_edit_window_remove_attachments (ModestMsgEditWindow *window, GtkWidget *confirmation_dialog = NULL; gboolean dialog_response; GList *node; + gchar *message = NULL; + const gchar *filename = NULL; + if (att_list->next == NULL) { - gchar *message = g_strdup_printf (_("emev_nc_delete_attachment"), - tny_mime_part_get_filename (TNY_MIME_PART (att_list->data))); - confirmation_dialog = hildon_note_new_confirmation (GTK_WINDOW (window), message); - g_free (message); + filename = tny_mime_part_get_filename (TNY_MIME_PART (att_list->data)); } else { - confirmation_dialog = hildon_note_new_confirmation (GTK_WINDOW (window), _("emev_nc_delete_attachments")); + filename = ""; } + message = g_strdup_printf (ngettext("emev_nc_delete_attachment", "emev_nc_delete_attachments", + att_list->next == NULL), filename); + confirmation_dialog = hildon_note_new_confirmation (GTK_WINDOW (window), message); + g_free (message); dialog_response = (gtk_dialog_run (GTK_DIALOG (confirmation_dialog))==GTK_RESPONSE_OK); gtk_widget_destroy (confirmation_dialog); if (!dialog_response) { @@ -1746,7 +1799,7 @@ modest_msg_edit_window_zoom_plus (ModestWindow *window) group = gtk_radio_action_get_group (zoom_radio_action); if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (group->data))) { - hildon_banner_show_information (NULL, NULL, _("mcen_ib_max_zoom_level")); + hildon_banner_show_information (NULL, NULL, _("ckct_ib_max_zoom_level_reached")); return FALSE; } @@ -1778,7 +1831,7 @@ modest_msg_edit_window_zoom_minus (ModestWindow *window) gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (node->next->data), TRUE); return TRUE; } else - hildon_banner_show_information (NULL, NULL, _("mcen_ib_min_zoom_level")); + hildon_banner_show_information (NULL, NULL, _("ckct_ib_min_zoom_level_reached")); break; } } @@ -1928,13 +1981,16 @@ modest_msg_edit_window_set_priority_flags (ModestMsgEditWindow *window, TnyHeaderFlags priority_flags) { ModestMsgEditWindowPrivate *priv; + ModestWindowPrivate *parent_priv; g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); + parent_priv = MODEST_WINDOW_GET_PRIVATE (window); priority_flags = priority_flags & (TNY_HEADER_FLAG_HIGH_PRIORITY); if (priv->priority_flags != priority_flags) { + GtkAction *priority_action = NULL; priv->priority_flags = priority_flags; @@ -1942,15 +1998,23 @@ modest_msg_edit_window_set_priority_flags (ModestMsgEditWindow *window, case TNY_HEADER_FLAG_HIGH_PRIORITY: gtk_image_set_from_icon_name (GTK_IMAGE (priv->priority_icon), "qgn_list_messaging_high", GTK_ICON_SIZE_MENU); gtk_widget_show (priv->priority_icon); + priority_action = gtk_ui_manager_get_action (parent_priv->ui_manager, + "/MenuBar/ToolsMenu/MessagePriorityMenu/MessagePriorityHighMenu"); break; case TNY_HEADER_FLAG_LOW_PRIORITY: gtk_image_set_from_icon_name (GTK_IMAGE (priv->priority_icon), "qgn_list_messaging_low", GTK_ICON_SIZE_MENU); gtk_widget_show (priv->priority_icon); + priority_action = gtk_ui_manager_get_action (parent_priv->ui_manager, + "/MenuBar/ToolsMenu/MessagePriorityMenu/MessagePriorityLowMenu"); break; default: gtk_widget_hide (priv->priority_icon); + priority_action = gtk_ui_manager_get_action (parent_priv->ui_manager, + "/MenuBar/ToolsMenu/MessagePriorityMenu/MessagePriorityNormalMenu"); break; } + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (priority_action), TRUE); + gtk_text_buffer_set_modified (priv->text_buffer, TRUE); } } @@ -2455,3 +2519,69 @@ subject_field_changed (GtkEditable *editable, 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); +} + +