* src/maemo/modest-address-book.c:
authorJose Dapena Paz <jdapena@igalia.com>
Fri, 22 Jun 2007 10:26:15 +0000 (10:26 +0000)
committerJose Dapena Paz <jdapena@igalia.com>
Fri, 22 Jun 2007 10:26:15 +0000 (10:26 +0000)
        * 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
src/maemo/modest-maemo-utils.c
src/maemo/modest-maemo-utils.h
src/maemo/modest-msg-edit-window.c

index bf199f7..a0c02d1 100644 (file)
@@ -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_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);
        gtk_window_set_title (GTK_WINDOW (contact_dialog), _("mcen_ti_select_recipients"));
 
        gtk_widget_show (contact_dialog);
index 4870f7b..9a27aaa 100644 (file)
@@ -425,3 +425,39 @@ GList* modest_maemo_utils_get_supported_secure_authentication_methods (ModestTra
        }
        return result;
 }
        }
        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
+
+}
index b1d52fc..022ab3a 100644 (file)
@@ -34,6 +34,9 @@
 #include <gtk/gtk.h>
 #include <modest-protocol-info.h>
 
 #include <gtk/gtk.h>
 #include <modest-protocol-info.h>
 
+#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" 
 /**
  * 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);
 
 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__*/
 #endif /*__MODEST_MAEMO_UTILS_H__*/
index 41385cb..61ae3c2 100644 (file)
@@ -65,6 +65,7 @@
 #include "modest-hildon-includes.h"
 #include "widgets/modest-msg-edit-window-ui.h"
 #include <libgnomevfs/gnome-vfs-mime.h>
 #include "modest-hildon-includes.h"
 #include "widgets/modest-msg-edit-window-ui.h"
 #include <libgnomevfs/gnome-vfs-mime.h>
+#include "modest-maemo-utils.h"
 
 
 #define DEFAULT_FONT_SIZE 3
 
 
 #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 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);
 
 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   *find_toolbar;
 
        GtkWidget   *scroll;
+       GtkWidget   *scroll_area;
 
        gint last_cid;
        GList *attachments;
 
        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);
        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)));
 
        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)
 {
 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;
        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"));
        
        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:
 
        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);
 
                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;
 
                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);
                                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);
+                       } 
                }
        }
 
                }
        }