X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmaemo%2Fmodest-msg-edit-window.c;h=8de04e3a998a86c896e98c04219bfce6b9a9ffd4;hp=fc1a520a5ab971d5818f02ee25f14c67db129671;hb=8125ec9d64e509b2238ff58a8cd905791f717c3e;hpb=cba956ca83b6354a6c1d3fa90a3e6172cb6a35a4 diff --git a/src/maemo/modest-msg-edit-window.c b/src/maemo/modest-msg-edit-window.c index fc1a520..8de04e3 100644 --- a/src/maemo/modest-msg-edit-window.c +++ b/src/maemo/modest-msg-edit-window.c @@ -82,7 +82,7 @@ #define DEFAULT_SIZE_COMBOBOX_WIDTH 80 #define DEFAULT_MAIN_VBOX_SPACING 6 #define SUBJECT_MAX_LENGTH 1000 -#define IMAGE_MAX_WIDTH 640 +#define IMAGE_MAX_WIDTH 608 #define DEFAULT_FONT_SCALE 1.5 static void modest_msg_edit_window_class_init (ModestMsgEditWindowClass *klass); @@ -127,9 +127,6 @@ static void modest_msg_edit_window_show_toolbar (ModestWindow *window, static void modest_msg_edit_window_clipboard_owner_change (GtkClipboard *clipboard, GdkEvent *event, ModestMsgEditWindow *window); -static void modest_msg_edit_window_system_clipboard_owner_change (GtkClipboard *clipboard, - GdkEvent *event, - ModestMsgEditWindow *window); static void update_window_title (ModestMsgEditWindow *window); static void update_dimmed (ModestMsgEditWindow *window); static void update_paste_dimming (ModestMsgEditWindow *window); @@ -209,7 +206,6 @@ struct _ModestMsgEditWindowPrivate { gdouble zoom_level; gulong clipboard_change_handler_id; - gulong system_clipboard_change_handler_id; TnyMsg *draft_msg; gboolean sent; @@ -315,7 +311,6 @@ modest_msg_edit_window_init (ModestMsgEditWindow *obj) priv->draft_msg = NULL; priv->clipboard_change_handler_id = 0; - priv->system_clipboard_change_handler_id = 0; priv->sent = FALSE; } @@ -389,6 +384,7 @@ 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), "truncate-multiline", TRUE, 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); @@ -434,9 +430,10 @@ init_window (ModestMsgEditWindow *obj) priv->text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->msg_body)); g_object_set (priv->text_buffer, "font_scale", DEFAULT_FONT_SCALE, NULL); wp_text_buffer_enable_rich_text (WP_TEXT_BUFFER (priv->text_buffer), TRUE); +#if (GTK_MINOR_VERSION >= 10) gtk_text_buffer_register_serialize_tagset(GTK_TEXT_BUFFER(priv->text_buffer), "wp-text-buffer"); gtk_text_buffer_register_deserialize_tagset(GTK_TEXT_BUFFER(priv->text_buffer), "wp-text-buffer"); - +#endif wp_text_buffer_reset_buffer (WP_TEXT_BUFFER (priv->text_buffer), TRUE); priv->find_toolbar = hildon_find_toolbar_new (NULL); @@ -484,7 +481,8 @@ init_window (ModestMsgEditWindow *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); - + modest_maemo_set_thumbable_scrollbar (GTK_SCROLLED_WINDOW(priv->scroll), TRUE); + main_vbox = gtk_vbox_new (FALSE, DEFAULT_MAIN_VBOX_SPACING); gtk_box_pack_start (GTK_BOX(main_vbox), priv->header_box, FALSE, FALSE, 0); @@ -511,17 +509,11 @@ init_window (ModestMsgEditWindow *obj) priv->scroll_area = modest_scroll_area_new (priv->scroll, priv->msg_body); gtk_container_add (GTK_CONTAINER (frame), priv->scroll_area); - /* - TODO: scroll_area was never instantiated. - Stop building without warnings-as-errors. murrayc. - gtk_container_set_focus_vadjustment (GTK_CONTAINER (scroll_area), + gtk_container_set_focus_vadjustment (GTK_CONTAINER (priv->scroll_area), gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (priv->scroll))); - */ priv->clipboard_change_handler_id = g_signal_connect (G_OBJECT (gtk_clipboard_get (GDK_SELECTION_PRIMARY)), "owner-change", G_CALLBACK (modest_msg_edit_window_clipboard_owner_change), obj); - priv->system_clipboard_change_handler_id = g_signal_connect (G_OBJECT (gtk_clipboard_get (GDK_SELECTION_CLIPBOARD)), "owner-change", - G_CALLBACK (modest_msg_edit_window_system_clipboard_owner_change), obj); } @@ -536,12 +528,6 @@ modest_msg_edit_window_finalize (GObject *obj) priv->clipboard_change_handler_id = 0; } - if (priv->system_clipboard_change_handler_id > 0) { - g_signal_handler_disconnect (gtk_clipboard_get (GDK_SELECTION_CLIPBOARD), - priv->system_clipboard_change_handler_id); - priv->system_clipboard_change_handler_id = 0; - } - if (priv->draft_msg != NULL) { TnyHeader *header = tny_msg_get_header (priv->draft_msg); if (TNY_IS_HEADER (header)) { @@ -685,7 +671,7 @@ set_msg (ModestMsgEditWindow *self, TnyMsg *msg) msg_folder = tny_msg_get_folder (msg); if (msg_folder) { if (modest_tny_folder_is_local_folder (msg_folder) && - modest_tny_folder_get_local_folder_type (msg_folder) == TNY_FOLDER_TYPE_DRAFTS) + modest_tny_folder_get_local_or_mmc_folder_type (msg_folder) == TNY_FOLDER_TYPE_DRAFTS) priv->draft_msg = g_object_ref(msg); g_object_unref (msg_folder); } @@ -974,7 +960,10 @@ modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name) /* Set window icon */ window_icon = modest_platform_get_icon (MODEST_APP_MSG_EDIT_ICON); - gtk_window_set_icon (GTK_WINDOW (obj), window_icon); + if (window_icon) { + gtk_window_set_icon (GTK_WINDOW (obj), window_icon); + g_object_unref (window_icon); + } /* Dim at start clipboard actions */ action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/CutMenu"); @@ -1089,6 +1078,7 @@ modest_msg_edit_window_get_msg_data (ModestMsgEditWindow *edit_window) while (cursor) { if (!(TNY_IS_MIME_PART(cursor->data))) { g_warning ("strange data in attachment list"); + cursor = g_list_next (cursor); continue; } data->attachments = g_list_append (data->attachments, @@ -1467,6 +1457,23 @@ modest_msg_edit_window_select_background_color (ModestMsgEditWindow *window) } +static TnyStream* create_stream_for_uri (const gchar* uri) +{ + if (!uri) + return NULL; + + TnyStream *result = NULL; + + GnomeVFSHandle *handle = NULL; + GnomeVFSResult test = gnome_vfs_open (&handle, uri, GNOME_VFS_OPEN_READ); + if (test == GNOME_VFS_OK) { + /* Create the tinymail stream: */ + /* Presumably tinymai will call gnome_vfs_close (handle) later. */ + result = TNY_STREAM (tny_vfs_stream_new (handle)); + } + + return result; +} void modest_msg_edit_window_insert_image (ModestMsgEditWindow *window) @@ -1509,21 +1516,28 @@ modest_msg_edit_window_insert_image (ModestMsgEditWindow *window) GdkPixbufLoader *loader; GdkPixbuf *pixbuf; GnomeVFSFileInfo info; - gchar *filename, *basename; + gchar *filename, *basename, *escaped_filename; TnyMimePart *mime_part; - TnyStream *stream; gchar *content_id; const gchar *mime_type = NULL; + GnomeVFSURI *vfs_uri; + + vfs_uri = gnome_vfs_uri_new (uri); - 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) + escaped_filename = g_path_get_basename (gnome_vfs_uri_get_path (vfs_uri)); + filename = gnome_vfs_unescape_string_for_display (escaped_filename); + g_free (escaped_filename); + gnome_vfs_uri_unref (vfs_uri); + + if (gnome_vfs_get_file_info (uri, &info, GNOME_VFS_FILE_INFO_GET_MIME_TYPE + | GNOME_VFS_FILE_INFO_FORCE_SLOW_MIME_TYPE) == GNOME_VFS_OK) mime_type = gnome_vfs_file_info_get_mime_type (&info); mime_part = tny_platform_factory_new_mime_part (modest_runtime_get_platform_factory ()); - stream = TNY_STREAM (tny_vfs_stream_new (handle)); - + + TnyStream *stream = create_stream_for_uri (uri); tny_mime_part_construct_from_stream (mime_part, stream, mime_type); content_id = g_strdup_printf ("%d", priv->last_cid); @@ -1535,14 +1549,7 @@ modest_msg_edit_window_insert_image (ModestMsgEditWindow *window) tny_mime_part_set_filename (mime_part, basename); g_free (basename); - priv->attachments = g_list_prepend (priv->attachments, mime_part); - modest_attachments_view_add_attachment (MODEST_ATTACHMENTS_VIEW (priv->attachments_view), - 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); - + tny_stream_reset (TNY_STREAM (stream)); loader = gdk_pixbuf_loader_new_with_mime_type (mime_type, NULL); while (!tny_stream_is_eos (TNY_STREAM (stream))) { unsigned char read_buffer[128]; @@ -1571,6 +1578,15 @@ modest_msg_edit_window_insert_image (ModestMsgEditWindow *window) gtk_text_buffer_get_iter_at_mark (GTK_TEXT_BUFFER (priv->text_buffer), &position, insert_mark); wp_text_buffer_insert_image (WP_TEXT_BUFFER (priv->text_buffer), &position, g_strdup (tny_mime_part_get_content_id (mime_part)), pixbuf); } + + priv->attachments = g_list_prepend (priv->attachments, mime_part); + modest_attachments_view_add_attachment (MODEST_ATTACHMENTS_VIEW (priv->attachments_view), + 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); + } } @@ -1578,7 +1594,7 @@ modest_msg_edit_window_insert_image (ModestMsgEditWindow *window) } void -modest_msg_edit_window_attach_file (ModestMsgEditWindow *window) +modest_msg_edit_window_offer_attach_file (ModestMsgEditWindow *window) { ModestMsgEditWindowPrivate *priv; @@ -1604,112 +1620,72 @@ modest_msg_edit_window_attach_file (ModestMsgEditWindow *window) gtk_widget_destroy (dialog); 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); - mime_part = tny_platform_factory_new_mime_part - (modest_runtime_get_platform_factory ()); - stream = TNY_STREAM (tny_vfs_stream_new (handle)); - - tny_mime_part_construct_from_stream (mime_part, stream, mime_type); - - content_id = g_strdup_printf ("%d", priv->last_cid); - tny_mime_part_set_content_id (mime_part, content_id); - g_free (content_id); - priv->last_cid++; - - basename = g_path_get_basename (filename); - tny_mime_part_set_filename (mime_part, basename); - g_free (basename); - - priv->attachments = g_list_prepend (priv->attachments, mime_part); - modest_attachments_view_add_attachment (MODEST_ATTACHMENTS_VIEW (priv->attachments_view), - 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); - - } + const gchar *uri = (const gchar *) uri_node->data; + modest_msg_edit_window_attach_file_one (window, uri); } g_slist_foreach (uris, (GFunc) g_free, NULL); g_slist_free (uris); } void -modest_msg_edit_window_attach_file_noninteractive ( +modest_msg_edit_window_attach_file_one ( ModestMsgEditWindow *window, - const gchar *file_uri) + const gchar *uri) { + g_return_if_fail (window); + g_return_if_fail (uri); + + ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); - ModestMsgEditWindowPrivate *priv; - priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); - - if (file_uri && strlen(file_uri)) { - gint file_id = 0; + GnomeVFSHandle *handle = NULL; + GnomeVFSResult 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 *escaped_filename; + gchar *filename; + gchar *content_id; + GnomeVFSFileInfo info; + GnomeVFSURI *vfs_uri; + + vfs_uri = gnome_vfs_uri_new (uri); - /* 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; - TnyStream *stream; - const gchar *mime_type; - gchar *basename; - gchar *content_id; -#ifdef MODEST_HAVE_HILDON0_WIDGETS - mime_type = gnome_vfs_get_mime_type(filename); -#else - mime_type = gnome_vfs_get_file_mime_type_fast (filename, NULL); -#endif - mime_part = tny_platform_factory_new_mime_part - (modest_runtime_get_platform_factory ()); - stream = TNY_STREAM (tny_fs_stream_new (file_id)); - - tny_mime_part_construct_from_stream (mime_part, stream, mime_type); - - content_id = g_strdup_printf ("%d", priv->last_cid); - tny_mime_part_set_content_id (mime_part, content_id); - g_free (content_id); - priv->last_cid++; - - basename = g_path_get_basename (filename); - tny_mime_part_set_filename (mime_part, basename); - g_free (basename); - - priv->attachments = g_list_prepend (priv->attachments, mime_part); - modest_attachments_view_add_attachment (MODEST_ATTACHMENTS_VIEW (priv->attachments_view), - mime_part); - gtk_widget_set_no_show_all (priv->attachments_caption, FALSE); - 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); - } + escaped_filename = g_path_get_basename (gnome_vfs_uri_get_path (vfs_uri)); + filename = gnome_vfs_unescape_string_for_display (escaped_filename); + g_free (escaped_filename); + gnome_vfs_uri_unref (vfs_uri); + + if (gnome_vfs_get_file_info (uri, + &info, + GNOME_VFS_FILE_INFO_GET_MIME_TYPE | + GNOME_VFS_FILE_INFO_FORCE_SLOW_MIME_TYPE) + == GNOME_VFS_OK) + mime_type = gnome_vfs_file_info_get_mime_type (&info); + mime_part = tny_platform_factory_new_mime_part + (modest_runtime_get_platform_factory ()); + stream = TNY_STREAM (tny_vfs_stream_new (handle)); + + tny_mime_part_construct_from_stream (mime_part, stream, mime_type); + + content_id = g_strdup_printf ("%d", priv->last_cid); + tny_mime_part_set_content_id (mime_part, content_id); + g_free (content_id); + priv->last_cid++; + + basename = g_path_get_basename (filename); + tny_mime_part_set_filename (mime_part, basename); + g_free (basename); + + priv->attachments = g_list_prepend (priv->attachments, mime_part); + modest_attachments_view_add_attachment (MODEST_ATTACHMENTS_VIEW (priv->attachments_view), + 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); } } @@ -2601,10 +2577,10 @@ modest_msg_edit_window_is_modified (ModestMsgEditWindow *editor) } gboolean -modest_msg_edit_window_check_names (ModestMsgEditWindow *window) +modest_msg_edit_window_check_names (ModestMsgEditWindow *window, gboolean add_to_addressbook) { ModestMsgEditWindowPrivate *priv = NULL; - + g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window), FALSE); priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); @@ -2617,11 +2593,11 @@ modest_msg_edit_window_check_names (ModestMsgEditWindow *window) return FALSE; } - if (!modest_address_book_check_names (MODEST_RECPT_EDITOR (priv->to_field))) + if (!modest_address_book_check_names (MODEST_RECPT_EDITOR (priv->to_field), add_to_addressbook)) return FALSE; - if (!modest_address_book_check_names (MODEST_RECPT_EDITOR (priv->cc_field))) + if (!modest_address_book_check_names (MODEST_RECPT_EDITOR (priv->cc_field), add_to_addressbook)) return FALSE; - if (!modest_address_book_check_names (MODEST_RECPT_EDITOR (priv->bcc_field))) + if (!modest_address_book_check_names (MODEST_RECPT_EDITOR (priv->bcc_field), add_to_addressbook)) return FALSE; modest_recpt_editor_grab_focus (MODEST_RECPT_EDITOR (priv->to_field)); @@ -2634,7 +2610,7 @@ static void modest_msg_edit_window_add_attachment_clicked (GtkButton *button, ModestMsgEditWindow *window) { - modest_msg_edit_window_attach_file (window); + modest_msg_edit_window_offer_attach_file (window); } static void @@ -2652,6 +2628,9 @@ modest_msg_edit_window_clipboard_owner_change (GtkClipboard *clipboard, priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); parent_priv = MODEST_WINDOW_GET_PRIVATE (window); + + if (!GTK_WIDGET_VISIBLE (window)) + return; has_selection = gtk_clipboard_wait_for_targets (clipboard, NULL, NULL); focused = gtk_window_get_focus (GTK_WINDOW (window)); @@ -2694,6 +2673,25 @@ subject_field_changed (GtkEditable *editable, gtk_text_buffer_set_modified (priv->text_buffer, TRUE); } +gboolean +message_is_empty (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); + + /** TODO: Add wpeditor API to tell us if there is any _visible_ text, + * so we can ignore markup. + */ + GtkTextBuffer *buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->msg_body)); + gint count = 0; + if (buf) + count = gtk_text_buffer_get_char_count (buf); + + return count == 0; +} + void modest_msg_edit_window_toggle_find_toolbar (ModestMsgEditWindow *window, gboolean show) @@ -2704,6 +2702,13 @@ modest_msg_edit_window_toggle_find_toolbar (ModestMsgEditWindow *window, priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); gtk_widget_set_no_show_all (priv->find_toolbar, FALSE); + + /* Show a warning if there is nothing to search: */ + if (show && message_is_empty (window)) { + hildon_banner_show_information (GTK_WIDGET (window), NULL, _("mail_ib_nothing_to_find")); + return; + } + if (show) { gtk_widget_show_all (priv->find_toolbar); hildon_find_toolbar_highlight_entry (HILDON_FIND_TOOLBAR (priv->find_toolbar), TRUE); @@ -2862,15 +2867,6 @@ update_paste_dimming (ModestMsgEditWindow *window) } - -static void -modest_msg_edit_window_system_clipboard_owner_change (GtkClipboard *clipboard, - GdkEvent *event, - ModestMsgEditWindow *window) -{ - update_paste_dimming (window); -} - static void update_select_all_dimming (ModestMsgEditWindow *window) { @@ -2915,6 +2911,7 @@ edit_menu_activated (GtkAction *action, ModestMsgEditWindow *window = MODEST_MSG_EDIT_WINDOW (userdata); update_select_all_dimming (window); + update_paste_dimming (window); } static void view_menu_activated (GtkAction *action,