[evolution/gnome-3-8] EMailReader: Add a "composer-created" signal.



commit 98dd0ac727e7bff5ad056427fa04d579f838ba75
Author: Matthew Barnes <mbarnes redhat com>
Date:   Sun Jun 2 11:03:34 2013 -0400

    EMailReader: Add a "composer-created" signal.
    
    Emitted to indicate a composer window was created in response to a user
    action on the EMailReader.  Examples of such actions include replying,
    forwarding, and starting a new message.
    
    If applicable, the source message (i.e. the message being replied to or
    forwarded) is included in the signal emission.
    
    New functions:
    
      e_mail_reader_composer_created()
    
    (cherry picked from commit f5e47561f995ca50f2bbd45b940e0a10100281a5)
    
    Conflicts:
        mail/em-composer-utils.c

 mail/e-mail-reader-utils.c |   13 +++++++++--
 mail/e-mail-reader.c       |   49 ++++++++++++++++++++++++++++++++++++++++++-
 mail/e-mail-reader.h       |    7 ++++++
 mail/em-composer-utils.c   |   36 +++++++++++++++++++++++++++++--
 4 files changed, 97 insertions(+), 8 deletions(-)
---
diff --git a/mail/e-mail-reader-utils.c b/mail/e-mail-reader-utils.c
index 90b4215..2e0ebfa 100644
--- a/mail/e-mail-reader-utils.c
+++ b/mail/e-mail-reader-utils.c
@@ -1327,6 +1327,7 @@ mail_reader_reply_message_parsed (GObject *object,
        EMailBackend *backend;
        EMailReader *reader = E_MAIL_READER (object);
        EMailPartList *part_list;
+       EMsgComposer *composer;
        CamelMimeMessage *message;
        AsyncContext *async_context;
 
@@ -1338,7 +1339,7 @@ mail_reader_reply_message_parsed (GObject *object,
        backend = e_mail_reader_get_backend (async_context->reader);
        shell = e_shell_backend_get_shell (E_SHELL_BACKEND (backend));
 
-       em_utils_reply_to_message (
+       composer = em_utils_reply_to_message (
                shell, message,
                async_context->folder,
                async_context->message_uid,
@@ -1347,6 +1348,8 @@ mail_reader_reply_message_parsed (GObject *object,
                part_list,
                async_context->address);
 
+       e_mail_reader_composer_created (reader, composer, message);
+
        g_object_unref (part_list);
 
        async_context_free (async_context);
@@ -1562,7 +1565,7 @@ e_mail_reader_reply_to_message (EMailReader *reader,
        composer = em_utils_reply_to_message (
                shell, new_message, folder, uid,
                reply_type, reply_style, NULL, address);
-       if (composer && (validity_pgp_sum != 0 || validity_smime_sum != 0)) {
+       if (validity_pgp_sum != 0 || validity_smime_sum != 0) {
                GtkToggleAction *action;
 
                if ((validity_pgp_sum & E_MAIL_PART_VALIDITY_PGP) != 0) {
@@ -1590,6 +1593,8 @@ e_mail_reader_reply_to_message (EMailReader *reader,
                }
        }
 
+       e_mail_reader_composer_created (reader, composer, new_message);
+
        if (address)
                g_object_unref (address);
 
@@ -1630,9 +1635,11 @@ whole_message:
                g_object_unref (activity);
 
        } else {
-               em_utils_reply_to_message (
+               composer = em_utils_reply_to_message (
                        shell, src_message, folder, uid,
                        reply_type, reply_style, part_list, address);
+
+               e_mail_reader_composer_created (reader, composer, src_message);
        }
 
        g_clear_object (&address);
diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c
index 9fef119..8c05d8a 100644
--- a/mail/e-mail-reader.c
+++ b/mail/e-mail-reader.c
@@ -97,6 +97,7 @@ struct _EMailReaderPrivate {
 
 enum {
        CHANGED,
+       COMPOSER_CREATED,
        FOLDER_LOADED,
        MESSAGE_LOADED,
        MESSAGE_SEEN,
@@ -964,6 +965,7 @@ action_mail_message_new_cb (GtkAction *action,
        EMailBackend *backend;
        EShellBackend *shell_backend;
        CamelFolder *folder;
+       EMsgComposer *composer;
 
        folder = e_mail_reader_get_folder (reader);
        backend = e_mail_reader_get_backend (reader);
@@ -971,7 +973,9 @@ action_mail_message_new_cb (GtkAction *action,
        shell_backend = E_SHELL_BACKEND (backend);
        shell = e_shell_backend_get_shell (shell_backend);
 
-       em_utils_compose_new_message (shell, folder);
+       composer = em_utils_compose_new_message (shell, folder);
+
+       e_mail_reader_composer_created (reader, composer, NULL);
 }
 
 static void
@@ -1232,6 +1236,7 @@ mail_reader_redirect_cb (CamelFolder *folder,
        EMailBackend *backend;
        EAlertSink *alert_sink;
        CamelMimeMessage *message;
+       EMsgComposer *composer;
        GError *error = NULL;
 
        alert_sink = e_activity_get_alert_sink (closure->activity);
@@ -1259,9 +1264,11 @@ mail_reader_redirect_cb (CamelFolder *folder,
        backend = e_mail_reader_get_backend (closure->reader);
        shell = e_shell_backend_get_shell (E_SHELL_BACKEND (backend));
 
-       em_utils_redirect_message (shell, message);
+       composer = em_utils_redirect_message (shell, message);
        check_close_browser_reader (closure->reader);
 
+       e_mail_reader_composer_created (closure->reader, composer, message);
+
        g_object_unref (message);
 
        mail_reader_closure_free (closure);
@@ -3841,6 +3848,16 @@ e_mail_reader_default_init (EMailReaderInterface *interface)
                g_cclosure_marshal_VOID__VOID,
                G_TYPE_NONE, 0);
 
+       signals[COMPOSER_CREATED] = g_signal_new (
+               "composer-created",
+               G_OBJECT_CLASS_TYPE (interface),
+               G_SIGNAL_RUN_FIRST,
+               G_STRUCT_OFFSET (EMailReaderInterface, composer_created),
+               NULL, NULL, NULL,
+               G_TYPE_NONE, 2,
+               E_TYPE_MSG_COMPOSER,
+               CAMEL_TYPE_MIME_MESSAGE);
+
        signals[FOLDER_LOADED] = g_signal_new (
                "folder-loaded",
                G_OBJECT_CLASS_TYPE (interface),
@@ -4860,3 +4877,31 @@ e_mail_reader_avoid_next_mark_as_seen (EMailReader *reader)
 
        priv->avoid_next_mark_as_seen = TRUE;
 }
+
+/**
+ * e_mail_reader_composer_created:
+ * @reader: an #EMailReader
+ * @composer: an #EMsgComposer
+ * @message: the source #CamelMimeMessage, or %NULL
+ *
+ * Emits a #EMailReader::composer-created signal to indicate the @composer
+ * window was created in response to a user action on @reader.  Examples of
+ * such actions include replying, forwarding, and composing a new message.
+ * If applicable, the source @message (i.e. the message being replied to or
+ * forwarded) should be included.
+ **/
+void
+e_mail_reader_composer_created (EMailReader *reader,
+                                EMsgComposer *composer,
+                                CamelMimeMessage *message)
+{
+       g_return_if_fail (E_IS_MAIL_READER (reader));
+       g_return_if_fail (E_IS_MSG_COMPOSER (composer));
+
+       if (message != NULL)
+               g_return_if_fail (CAMEL_IS_MIME_MESSAGE (message));
+
+       g_signal_emit (
+               reader, signals[COMPOSER_CREATED], 0, composer, message);
+}
+
diff --git a/mail/e-mail-reader.h b/mail/e-mail-reader.h
index 213ba63..6303ce9 100644
--- a/mail/e-mail-reader.h
+++ b/mail/e-mail-reader.h
@@ -30,6 +30,7 @@
 #include <gtk/gtk.h>
 #include <camel/camel.h>
 #include <e-util/e-util.h>
+#include <composer/e-msg-composer.h>
 
 #include <mail/e-mail-backend.h>
 #include <mail/e-mail-display.h>
@@ -113,6 +114,9 @@ struct _EMailReaderInterface {
        gboolean        (*enable_show_folder)   (EMailReader *reader);
 
        /* Signals */
+       void            (*composer_created)     (EMailReader *reader,
+                                                EMsgComposer *composer,
+                                                CamelMimeMessage *source);
        void            (*folder_loaded)        (EMailReader *reader);
        void            (*message_loaded)       (EMailReader *reader,
                                                 const gchar *message_uid,
@@ -178,6 +182,9 @@ void                e_mail_reader_enable_show_folder
                                                (EMailReader *reader);
 void           e_mail_reader_avoid_next_mark_as_seen
                                                (EMailReader *reader);
+void           e_mail_reader_composer_created  (EMailReader *reader,
+                                                EMsgComposer *composer,
+                                                CamelMimeMessage *message);
 
 G_END_DECLS
 
diff --git a/mail/em-composer-utils.c b/mail/em-composer-utils.c
index f1c219b..07a378b 100644
--- a/mail/em-composer-utils.c
+++ b/mail/em-composer-utils.c
@@ -1525,6 +1525,7 @@ edit_messages_cb (GObject *source_object,
        g_hash_table_iter_init (&iter, hash_table);
 
        while (g_hash_table_iter_next (&iter, &key, &value)) {
+               EMsgComposer *composer;
                CamelMimeMessage *message;
                const gchar *message_uid;
 
@@ -1536,7 +1537,11 @@ edit_messages_cb (GObject *source_object,
 
                camel_medium_remove_header (CAMEL_MEDIUM (value), "X-Mailer");
 
-               em_utils_edit_message (shell, folder, message, message_uid);
+               composer = em_utils_edit_message (
+                       shell, folder, message, message_uid);
+
+               e_mail_reader_composer_created (
+                       async_context->reader, composer, message);
        }
 
        g_hash_table_unref (hash_table);
@@ -1750,6 +1755,8 @@ forward_attached_cb (GObject *source_object,
        EActivity *activity;
        EAlertSink *alert_sink;
        CamelMimePart *part;
+       CamelDataWrapper *content;
+       EMsgComposer *composer;
        gchar *subject = NULL;
        AsyncContext *async_context;
        GError *local_error = NULL;
@@ -1785,9 +1792,28 @@ forward_attached_cb (GObject *source_object,
 
        backend = e_mail_reader_get_backend (async_context->reader);
 
-       forward_attached (
+       composer = forward_attached (
                backend, folder, async_context->ptr_array, part, subject);
 
+       content = camel_medium_get_content (CAMEL_MEDIUM (part));
+       if (CAMEL_IS_MIME_MESSAGE (content)) {
+               e_mail_reader_composer_created (
+                       async_context->reader, composer,
+                       CAMEL_MIME_MESSAGE (content));
+       } else {
+               /* XXX What to do for the multipart/digest case?
+                *     Extract the first message from the digest, or
+                *     change the argument type to CamelMimePart and
+                *     just pass the whole digest through?
+                *
+                *     This signal is primarily serving EMailBrowser,
+                *     which can only forward one message at a time.
+                *     So for the moment it doesn't matter, but still
+                *     something to consider. */
+               e_mail_reader_composer_created (
+                       async_context->reader, composer, NULL);
+       }
+
        e_activity_set_state (activity, E_ACTIVITY_COMPLETED);
 
        g_object_unref (part);
@@ -1966,15 +1992,19 @@ forward_got_messages_cb (GObject *source_object,
        g_hash_table_iter_init (&iter, hash_table);
 
        while (g_hash_table_iter_next (&iter, &key, &value)) {
+               EMsgComposer *composer;
                CamelMimeMessage *message;
                const gchar *message_uid;
 
                message_uid = (const gchar *) key;
                message = CAMEL_MIME_MESSAGE (value);
 
-               em_utils_forward_message (
+               composer = em_utils_forward_message (
                        backend, message, async_context->style,
                        folder, message_uid);
+
+               e_mail_reader_composer_created (
+                       async_context->reader, composer, message);
        }
 
        g_hash_table_unref (hash_table);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]