[evolution] Bug #668687 - MDN panel left shown when moving to an empty folder



commit 55c1946220af0653c70fe42c6db8dfc169798e8a
Author: Milan Crha <mcrha redhat com>
Date:   Mon Apr 23 17:45:14 2012 +0200

    Bug #668687 - MDN panel left shown when moving to an empty folder

 modules/mdn/evolution-mdn.c |   78 +++++++++++++++++++++++++++++++++++++++----
 1 files changed, 71 insertions(+), 7 deletions(-)
---
diff --git a/modules/mdn/evolution-mdn.c b/modules/mdn/evolution-mdn.c
index fdb7c18..30bdc31 100644
--- a/modules/mdn/evolution-mdn.c
+++ b/modules/mdn/evolution-mdn.c
@@ -31,12 +31,26 @@
 #include <mail/em-utils.h>
 #include <mail/e-mail-reader.h>
 #include <mail/mail-send-recv.h>
+#include <mail/message-list.h>
 #include <mail/em-composer-utils.h>
 
 #define MDN_USER_FLAG "receipt-handled"
 
-typedef EExtension EMdn;
-typedef EExtensionClass EMdnClass;
+#define E_TYPE_MDN (e_mdn_get_type ())
+#define E_MDN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_MDN, EMdn))
+#define E_IS_MDN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_MDN))
+
+typedef struct _EMdn EMdn;
+typedef struct _EMdnClass EMdnClass;
+
+struct _EMdn {
+	EExtension parent;
+	gpointer alert;  /* weak pointer */
+};
+
+struct _EMdnClass {
+	EExtensionClass parent_class;
+};
 
 typedef struct _MdnContext MdnContext;
 
@@ -86,15 +100,34 @@ mdn_context_free (MdnContext *context)
 }
 
 static void
-mdn_submit_alert (EMailReader *reader,
+mdn_remove_alert (EMdn *mdn)
+{
+	g_return_if_fail (E_IS_MDN (mdn));
+
+	if (mdn->alert != NULL)
+		e_alert_response (mdn->alert, GTK_RESPONSE_OK);
+}
+
+static void
+mdn_submit_alert (EMdn *mdn,
+		  EMailReader *reader,
                   EAlert *alert)
 {
 	EPreviewPane *preview_pane;
 
+	g_return_if_fail (E_IS_MDN (mdn));
+
+	mdn_remove_alert (mdn);
+
+	g_return_if_fail (mdn->alert == NULL);
+
 	/* Make sure alerts are shown in the preview pane and not
 	 * wherever e_mail_reader_get_alert_sink() might show it. */
 	preview_pane = e_mail_reader_get_preview_pane (reader);
 	e_alert_sink_submit_alert (E_ALERT_SINK (preview_pane), alert);
+
+	mdn->alert = alert;
+	g_object_add_weak_pointer (G_OBJECT (mdn->alert), &mdn->alert);
 }
 
 static gchar *
@@ -399,9 +432,24 @@ mdn_notify_action_cb (GtkAction *action,
 }
 
 static void
+mdn_mail_reader_changed_cb (EMailReader *reader,
+			    EMdn *mdn)
+{
+	MessageList *message_list;
+
+	g_return_if_fail (E_IS_MAIL_READER (reader));
+
+	message_list = MESSAGE_LIST (e_mail_reader_get_message_list (reader));
+
+	if (!message_list || message_list_selected_count (message_list) != 1)
+		mdn_remove_alert (mdn);
+}
+
+static void
 mdn_message_loaded_cb (EMailReader *reader,
                        const gchar *message_uid,
-                       CamelMimeMessage *message)
+                       CamelMimeMessage *message,
+		       EMdn *mdn)
 {
 	EAlert *alert;
 	EAccount *account;
@@ -411,13 +459,15 @@ mdn_message_loaded_cb (EMailReader *reader,
 
 	folder = e_mail_reader_get_folder (reader);
 
+	mdn_remove_alert (mdn);
+
 	info = camel_folder_get_message_info (folder, message_uid);
 	if (info == NULL)
 		return;
 
 	if (camel_message_info_user_flag (info, MDN_USER_FLAG)) {
 		alert = e_alert_new ("mdn:sender-notified", NULL);
-		mdn_submit_alert (reader, alert);
+		mdn_submit_alert (mdn, reader, alert);
 		g_object_unref (alert);
 		goto exit;
 	}
@@ -463,7 +513,7 @@ mdn_message_loaded_cb (EMailReader *reader,
 
 		alert = e_alert_new ("mdn:notify-sender", NULL);
 		e_alert_add_action (alert, action, GTK_RESPONSE_APPLY);
-		mdn_submit_alert (reader, alert);
+		mdn_submit_alert (mdn, reader, alert);
 		g_object_unref (alert);
 
 		g_object_unref (action);
@@ -525,8 +575,12 @@ mdn_constructed (GObject *object)
 	g_return_if_fail (E_IS_MAIL_READER (extensible));
 
 	g_signal_connect (
+		extensible, "changed",
+		G_CALLBACK (mdn_mail_reader_changed_cb), extension);
+
+	g_signal_connect (
 		extensible, "message-loaded",
-		G_CALLBACK (mdn_message_loaded_cb), NULL);
+		G_CALLBACK (mdn_message_loaded_cb), extension);
 
 	g_signal_connect (
 		extensible, "message-seen",
@@ -537,6 +591,15 @@ mdn_constructed (GObject *object)
 }
 
 static void
+mdn_dispose (GObject *object)
+{
+	mdn_remove_alert (E_MDN (object));
+
+	/* Chain up to parent's dispose() method. */
+	G_OBJECT_CLASS (e_mdn_parent_class)->dispose (object);
+}
+
+static void
 e_mdn_class_init (EMdnClass *class)
 {
 	GObjectClass *object_class;
@@ -544,6 +607,7 @@ e_mdn_class_init (EMdnClass *class)
 
 	object_class = G_OBJECT_CLASS (class);
 	object_class->constructed = mdn_constructed;
+	object_class->dispose = mdn_dispose;
 
 	extension_class = E_EXTENSION_CLASS (class);
 	extension_class->extensible_type = E_TYPE_MAIL_READER;



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