From 7068c16e5edce3b80f8ec3f1671fc9eeb6bf84b5 Mon Sep 17 00:00:00 2001 From: Jose Dapena Paz Date: Fri, 22 Jun 2007 10:26:15 +0000 Subject: [PATCH] * src/maemo/modest-address-book.c: * Removed call to osso_abook_select_dialog_set_new_contact as this has been removed from new osso abook API. * src/maemo/modest-msg-edit-window.c: * Now inserted images size are limited to a width of 640 on insertion to buffer, to avoid requiring horizontal scroll. * Now images are also obtained using Gnome VFS. This way we can obtain remote images. * Now we accept selecting multiple image files to insert (fixes NB#59820). * Now we open the insert image filechooser dialog in the images special folder. * src/maemo/modest-maemo-utils.[ch]: * New modest_maemo_utils_setup_images_filechooser method, that sets up a filechooser for saving or browsing images. Sets the filter to images mimetype category, and the default folder to the images one. pmo-trunk-r2373 --- src/maemo/modest-address-book.c | 1 - src/maemo/modest-maemo-utils.c | 36 ++++++++++ src/maemo/modest-maemo-utils.h | 12 ++++ src/maemo/modest-msg-edit-window.c | 135 ++++++++++++++++++++++-------------- 4 files changed, 130 insertions(+), 54 deletions(-) diff --git a/src/maemo/modest-address-book.c b/src/maemo/modest-address-book.c index bf199f7..a0c02d1 100644 --- a/src/maemo/modest-address-book.c +++ b/src/maemo/modest-address-book.c @@ -176,7 +176,6 @@ modest_address_book_select_addresses (ModestRecptEditor *recpt_editor) osso_abook_contact_selector_set_minimum_selection (OSSO_ABOOK_CONTACT_SELECTOR (contact_view), 1); contact_dialog = osso_abook_select_dialog_new (OSSO_ABOOK_TREE_VIEW (contact_view)); - osso_abook_select_dialog_set_new_contact (OSSO_ABOOK_SELECT_DIALOG (contact_dialog), TRUE); gtk_window_set_title (GTK_WINDOW (contact_dialog), _("mcen_ti_select_recipients")); gtk_widget_show (contact_dialog); diff --git a/src/maemo/modest-maemo-utils.c b/src/maemo/modest-maemo-utils.c index 4870f7b..9a27aaa 100644 --- a/src/maemo/modest-maemo-utils.c +++ b/src/maemo/modest-maemo-utils.c @@ -425,3 +425,39 @@ GList* modest_maemo_utils_get_supported_secure_authentication_methods (ModestTra } return result; } + +void +modest_maemo_utils_setup_images_filechooser (GtkFileChooser *chooser) +{ + gchar *images_folder; + GtkFileFilter *file_filter; + GList *image_mimetypes_list; + GList *node; + + g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser)); + + /* Set the default folder to images folder */ + images_folder = g_build_filename (g_get_home_dir (), + MODEST_MAEMO_UTILS_MYDOCS_FOLDER, + MODEST_MAEMO_UTILS_DEFAULT_IMAGE_FOLDER, NULL); + gtk_file_chooser_set_current_folder (chooser, images_folder); + g_free (images_folder); + + /* Set the images mime filter */ + file_filter = gtk_file_filter_new (); +#ifdef MODEST_HILDON_VERSION_0 + image_mimetypes_list = osso_mime_get_mime_types_for_category (OSSO_MIME_CATEGORY_IMAGES); +#else + image_mimetypes_list = hildon_mime_get_mime_types_for_category (HILDON_MIME_CATEGORY_IMAGES); +#endif + for (node = image_mimetypes_list; node != NULL; node = g_list_next (node)) { + gtk_file_filter_add_mime_type (file_filter, node->data); + } + gtk_file_chooser_set_filter (chooser, file_filter); +#ifdef MODEST_HILDON_VERSION_0 + osso_mime_types_list_free (image_mimetypes_list); +#else + hildon_mime_types_list_free (image_mimetypes_list); +#endif + +} diff --git a/src/maemo/modest-maemo-utils.h b/src/maemo/modest-maemo-utils.h index b1d52fc..022ab3a 100644 --- a/src/maemo/modest-maemo-utils.h +++ b/src/maemo/modest-maemo-utils.h @@ -34,6 +34,9 @@ #include #include +#define MODEST_MAEMO_UTILS_MYDOCS_FOLDER "MyDocs" +#define MODEST_MAEMO_UTILS_DEFAULT_IMAGE_FOLDER ".images" + /** * modest_maemo_utils_menubar_to_menu: * @ui_manager: a ui manager, with the menubar at "/MenuBar" @@ -104,4 +107,13 @@ TnyFsStream *modest_maemo_utils_create_temp_stream (const gchar *extension, gcha GList* modest_maemo_utils_get_supported_secure_authentication_methods (ModestTransportStoreProtocol proto, const gchar* hostname, gint port, const gchar* username, GtkWindow *parent_window); +/** + * modest_maemo_utils_setup_images_filechooser: + * @chooser: a #GtkFileChooser + * + * Configures the default folder, and mime filter of a filechooser + * for images. + */ +void modest_maemo_utils_setup_images_filechooser (GtkFileChooser *chooser); + #endif /*__MODEST_MAEMO_UTILS_H__*/ diff --git a/src/maemo/modest-msg-edit-window.c b/src/maemo/modest-msg-edit-window.c index 41385cb..61ae3c2 100644 --- a/src/maemo/modest-msg-edit-window.c +++ b/src/maemo/modest-msg-edit-window.c @@ -65,6 +65,7 @@ #include "modest-hildon-includes.h" #include "widgets/modest-msg-edit-window-ui.h" #include +#include "modest-maemo-utils.h" #define DEFAULT_FONT_SIZE 3 @@ -73,6 +74,7 @@ #define DEFAULT_SIZE_COMBOBOX_WIDTH 80 #define DEFAULT_MAIN_VBOX_SPACING 6 #define SUBJECT_MAX_LENGTH 1000 +#define IMAGE_MAX_WIDTH 640 static void modest_msg_edit_window_class_init (ModestMsgEditWindowClass *klass); static void modest_msg_edit_window_init (ModestMsgEditWindow *obj); @@ -177,6 +179,7 @@ struct _ModestMsgEditWindowPrivate { GtkWidget *find_toolbar; GtkWidget *scroll; + GtkWidget *scroll_area; gint last_cid; GList *attachments; @@ -476,8 +479,8 @@ init_window (ModestMsgEditWindow *obj) 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); + priv->scroll_area = modest_scroll_area_new (priv->scroll, priv->msg_body); + gtk_container_add (GTK_CONTAINER (frame), priv->scroll_area); gtk_container_set_focus_vadjustment (GTK_CONTAINER (scroll_area), gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (priv->scroll))); @@ -1421,6 +1424,7 @@ modest_msg_edit_window_select_background_color (ModestMsgEditWindow *window) } + void modest_msg_edit_window_insert_image (ModestMsgEditWindow *window) { @@ -1428,77 +1432,102 @@ modest_msg_edit_window_insert_image (ModestMsgEditWindow *window) ModestMsgEditWindowPrivate *priv; GtkWidget *dialog = NULL; gint response = 0; - gchar *filename = NULL; + GSList *uris = NULL; + GSList *uri_node = NULL; priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); dialog = hildon_file_chooser_dialog_new (GTK_WINDOW (window), GTK_FILE_CHOOSER_ACTION_OPEN); gtk_window_set_title (GTK_WINDOW (dialog), _("mcen_ia_select_inline_image_title")); + gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dialog), TRUE); + + modest_maemo_utils_setup_images_filechooser (GTK_FILE_CHOOSER (dialog)); response = gtk_dialog_run (GTK_DIALOG (dialog)); switch (response) { case GTK_RESPONSE_OK: - 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 (filename) { - GdkPixbuf *pixbuf = NULL; + for (uri_node = uris; uri_node != NULL; uri_node = g_slist_next (uri_node)) { + const gchar *uri; + GnomeVFSHandle *handle = NULL; + GnomeVFSResult result; GtkTextIter position; GtkTextMark *insert_mark; - pixbuf = gdk_pixbuf_new_from_file (filename, NULL); - if (pixbuf) { - gint image_file_id; - GdkPixbufFormat *pixbuf_format; - - image_file_id = g_open (filename, O_RDONLY, 0); - pixbuf_format = gdk_pixbuf_get_file_info (filename, NULL, NULL); - if ((image_file_id != -1)&&(pixbuf_format != NULL)) { - TnyMimePart *image_part; - TnyStream *image_stream; - gchar **mime_types; - gchar *mime_type; - gchar *basename; - gchar *content_id; - - mime_types = gdk_pixbuf_format_get_mime_types (pixbuf_format); - if ((mime_types != NULL) && (mime_types[0] != NULL)) { - mime_type = mime_types[0]; - } else { - mime_type = "image/unknown"; - } - image_part = tny_platform_factory_new_mime_part - (modest_runtime_get_platform_factory ()); - image_stream = TNY_STREAM (tny_fs_stream_new (image_file_id)); - - tny_mime_part_construct_from_stream (image_part, image_stream, mime_type); - g_strfreev (mime_types); - - content_id = g_strdup_printf ("%d", priv->last_cid); - tny_mime_part_set_content_id (image_part, content_id); - g_free (content_id); - priv->last_cid++; - - basename = g_path_get_basename (filename); - tny_mime_part_set_filename (image_part, basename); - g_free (basename); - + uri = (const gchar *) uri_node->data; + result = gnome_vfs_open (&handle, uri, GNOME_VFS_OPEN_READ); + if (result == GNOME_VFS_OK) { + GdkPixbufLoader *loader; + GdkPixbuf *pixbuf; + GnomeVFSFileInfo info; + gchar *filename, *basename; + TnyMimePart *mime_part; + TnyStream *stream; + gchar *content_id; + const gchar *mime_type = NULL; + + 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); + + loader = gdk_pixbuf_loader_new_with_mime_type (mime_type, NULL); + while (!tny_stream_is_eos (TNY_STREAM (stream))) { + char read_buffer[128]; + gint readed; + readed = tny_stream_read (TNY_STREAM (stream), read_buffer, 128); + if (!gdk_pixbuf_loader_write (loader, read_buffer, readed, NULL)) + break; + } + pixbuf = gdk_pixbuf_loader_get_pixbuf (loader); + g_object_ref (pixbuf); + gdk_pixbuf_loader_close (loader, NULL); + g_object_unref (loader); + + if (gdk_pixbuf_get_width (pixbuf) > IMAGE_MAX_WIDTH) { + GdkPixbuf *new_pixbuf; + gint new_height; + new_height = (gdk_pixbuf_get_height (pixbuf) * IMAGE_MAX_WIDTH) / + gdk_pixbuf_get_width (pixbuf); + new_pixbuf = gdk_pixbuf_scale_simple (pixbuf, IMAGE_MAX_WIDTH, new_height, GDK_INTERP_BILINEAR); + g_object_unref (pixbuf); + pixbuf = new_pixbuf; + } + + if (pixbuf != NULL) { insert_mark = gtk_text_buffer_get_insert (GTK_TEXT_BUFFER (priv->text_buffer)); 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 (image_part)), pixbuf); - 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) { - close (image_file_id); - } + wp_text_buffer_insert_image (WP_TEXT_BUFFER (priv->text_buffer), &position, g_strdup (tny_mime_part_get_content_id (mime_part)), pixbuf); + } } } -- 1.7.9.5