aboutsummaryrefslogtreecommitdiffstats
path: root/composer
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@redhat.com>2009-12-04 03:27:05 +0800
committerMatthew Barnes <mbarnes@redhat.com>2009-12-04 03:27:05 +0800
commitf0adcbbdf79aa6ce112e7bf618453cc9ec2aafb7 (patch)
tree4c16aeb7e5ed8d41d3a5959d83138f698d785b29 /composer
parentcc0b806134fd6e11db610e2e0996918a45d739ec (diff)
downloadgsoc2013-evolution-f0adcbbdf79aa6ce112e7bf618453cc9ec2aafb7.tar.gz
gsoc2013-evolution-f0adcbbdf79aa6ce112e7bf618453cc9ec2aafb7.tar.zst
gsoc2013-evolution-f0adcbbdf79aa6ce112e7bf618453cc9ec2aafb7.zip
BugĀ 551464 - Paste files into composer as attachments
Diffstat (limited to 'composer')
-rw-r--r--composer/e-composer-private.c107
-rw-r--r--composer/e-composer-private.h7
-rw-r--r--composer/e-msg-composer.c62
3 files changed, 118 insertions, 58 deletions
diff --git a/composer/e-composer-private.c b/composer/e-composer-private.c
index 1516b1533e..d16afa32f0 100644
--- a/composer/e-composer-private.c
+++ b/composer/e-composer-private.c
@@ -426,3 +426,110 @@ e_composer_get_default_charset (void)
return charset;
}
+gboolean
+e_composer_paste_image (EMsgComposer *composer,
+ GtkClipboard *clipboard)
+{
+ GtkhtmlEditor *editor;
+ EAttachmentStore *store;
+ EAttachmentView *view;
+ GdkPixbuf *pixbuf = NULL;
+ gchar *filename = NULL;
+ gchar *uri = NULL;
+ gboolean success = FALSE;
+ GError *error = NULL;
+
+ g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE);
+ g_return_val_if_fail (GTK_IS_CLIPBOARD (clipboard), FALSE);
+
+ editor = GTKHTML_EDITOR (composer);
+ view = e_msg_composer_get_attachment_view (composer);
+ store = e_attachment_view_get_store (view);
+
+ /* Extract the image data from the clipboard. */
+ pixbuf = gtk_clipboard_wait_for_image (clipboard);
+ g_return_val_if_fail (pixbuf != NULL, FALSE);
+
+ /* Reserve a temporary file. */
+ filename = e_mktemp (NULL);
+ if (filename == NULL) {
+ g_set_error (
+ &error, G_FILE_ERROR,
+ g_file_error_from_errno (errno),
+ "Could not create temporary file: %s",
+ g_strerror (errno));
+ goto exit;
+ }
+
+ /* Save the pixbuf as a temporary file in image/png format. */
+ if (!gdk_pixbuf_save (pixbuf, filename, "png", &error, NULL))
+ goto exit;
+
+ /* Convert the filename to a URI. */
+ uri = g_filename_to_uri (filename, NULL, &error);
+ if (uri == NULL)
+ goto exit;
+
+ /* In HTML mode, paste the image into the message body.
+ * In text mode, add the image to the attachment store. */
+ if (gtkhtml_editor_get_html_mode (editor))
+ gtkhtml_editor_insert_image (editor, uri);
+ else {
+ EAttachment *attachment;
+
+ attachment = e_attachment_new_for_uri (uri);
+ e_attachment_store_add_attachment (store, attachment);
+ e_attachment_load_async (
+ attachment, (GAsyncReadyCallback)
+ e_attachment_load_handle_error, composer);
+ g_object_unref (attachment);
+ }
+
+ success = TRUE;
+
+exit:
+ if (error != NULL) {
+ g_warning ("%s", error->message);
+ g_error_free (error);
+ }
+
+ g_object_unref (pixbuf);
+ g_free (filename);
+ g_free (uri);
+
+ return success;
+}
+
+gboolean
+e_composer_paste_uris (EMsgComposer *composer,
+ GtkClipboard *clipboard)
+{
+ EAttachmentStore *store;
+ EAttachmentView *view;
+ gchar **uris;
+ gint ii;
+
+ g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE);
+ g_return_val_if_fail (GTK_IS_CLIPBOARD (clipboard), FALSE);
+
+ view = e_msg_composer_get_attachment_view (composer);
+ store = e_attachment_view_get_store (view);
+
+ /* Extract the URI data from the clipboard. */
+ uris = gtk_clipboard_wait_for_uris (clipboard);
+ g_return_val_if_fail (uris != NULL, FALSE);
+
+ /* Add the URIs to the attachment store. */
+ for (ii = 0; uris[ii] != NULL; ii++) {
+ EAttachment *attachment;
+
+ attachment = e_attachment_new_for_uri (uris[ii]);
+ e_attachment_store_add_attachment (store, attachment);
+ e_attachment_load_async (
+ attachment, (GAsyncReadyCallback)
+ e_attachment_load_handle_error, composer);
+ g_object_unref (attachment);
+ }
+
+ return TRUE;
+}
diff --git a/composer/e-composer-private.h b/composer/e-composer-private.h
index df215d0cc8..54837b9093 100644
--- a/composer/e-composer-private.h
+++ b/composer/e-composer-private.h
@@ -22,6 +22,8 @@
#include "e-msg-composer.h"
+#include <errno.h>
+
#include <glib/gi18n-lib.h>
#include <glib/gstdio.h>
@@ -32,6 +34,7 @@
#include "e-composer-header-table.h"
#include "e-util/e-binding.h"
#include "e-util/e-charset.h"
+#include "e-util/e-mktemp.h"
#include "e-util/e-util.h"
#include "e-util/gconf-bridge.h"
#include "widgets/misc/e-attachment-icon-view.h"
@@ -136,6 +139,10 @@ void e_composer_private_finalize (EMsgComposer *composer);
void e_composer_actions_init (EMsgComposer *composer);
gchar * e_composer_find_data_file (const gchar *basename);
gchar * e_composer_get_default_charset (void);
+gboolean e_composer_paste_image (EMsgComposer *composer,
+ GtkClipboard *clipboard);
+gboolean e_composer_paste_uris (EMsgComposer *composer,
+ GtkClipboard *clipboard);
G_END_DECLS
diff --git a/composer/e-msg-composer.c b/composer/e-msg-composer.c
index 07bec1ac13..22f2312fe9 100644
--- a/composer/e-msg-composer.c
+++ b/composer/e-msg-composer.c
@@ -36,7 +36,6 @@
#include <unistd.h>
#include <ctype.h>
#include <fcntl.h>
-#include <errno.h>
#include <glib.h>
@@ -48,7 +47,6 @@
#include "e-util/e-dialog-utils.h"
#include "e-util/e-alert.h"
-#include "e-util/e-mktemp.h"
#include "e-util/e-plugin-ui.h"
#include "e-util/e-util-private.h"
#include "e-util/e-account-utils.h"
@@ -1783,19 +1781,11 @@ static void
msg_composer_paste_clipboard (GtkhtmlEditor *editor)
{
EMsgComposer *composer;
- EAttachmentView *view;
- EAttachmentStore *store;
GtkClipboard *clipboard;
- GdkPixbuf *pixbuf;
GtkWidget *parent;
GtkWidget *widget;
- gchar *filename;
- gchar *uri;
- GError *error = NULL;
composer = E_MSG_COMPOSER (editor);
- view = e_msg_composer_get_attachment_view (composer);
- store = e_attachment_view_get_store (view);
widget = gtk_window_get_focus (GTK_WINDOW (editor));
parent = gtk_widget_get_parent (widget);
@@ -1807,60 +1797,16 @@ msg_composer_paste_clipboard (GtkhtmlEditor *editor)
clipboard = gtk_widget_get_clipboard (widget, GDK_SELECTION_CLIPBOARD);
- /* Assume the clipboard has an image. The return
- * value will be NULL if we assumed wrong. */
- pixbuf = gtk_clipboard_wait_for_image (clipboard);
- if (!GDK_IS_PIXBUF (pixbuf))
- goto chainup;
-
- /* Reserve a temporary file. */
- filename = e_mktemp (NULL);
- if (filename == NULL) {
- g_warning ("%s", g_strerror (errno));
- g_object_unref (pixbuf);
- g_error_free (error);
- return;
- }
-
- /* Save the pixbuf as a temporary file in image/png format. */
- if (!gdk_pixbuf_save (pixbuf, filename, "png", &error, NULL)) {
- g_warning ("%s", error->message);
- g_object_unref (pixbuf);
- g_error_free (error);
- g_free (filename);
+ if (gtk_clipboard_wait_is_image_available (clipboard)) {
+ e_composer_paste_image (composer, clipboard);
return;
}
- /* Convert the filename to a URI. */
- uri = g_filename_to_uri (filename, NULL, &error);
- if (error != NULL) {
- g_warning ("%s", error->message);
- g_object_unref (pixbuf);
- g_error_free (error);
- g_free (filename);
+ if (gtk_clipboard_wait_is_uris_available (clipboard)) {
+ e_composer_paste_uris (composer, clipboard);
return;
}
- if (gtkhtml_editor_get_html_mode (editor))
- gtkhtml_editor_insert_image (editor, uri);
- else {
- EAttachment *attachment;
-
- attachment = e_attachment_new_for_uri (uri);
- e_attachment_store_add_attachment (store, attachment);
- e_attachment_load_async (
- attachment, (GAsyncReadyCallback)
- e_attachment_load_handle_error, composer);
- g_object_unref (attachment);
- }
-
- g_object_unref (pixbuf);
- g_free (filename);
- g_free (uri);
-
- return;
-
-chainup:
/* Chain up to parent's paste_clipboard() method. */
GTKHTML_EDITOR_CLASS (parent_class)->paste_clipboard (editor);
}