2007-05-28 Murray Cumming <murrayc@murrayc.com>
[modest] / src / widgets / modest-header-view.c
index cb9b1e9..1f84bb2 100644 (file)
@@ -42,6 +42,7 @@
 #include <modest-text-utils.h>
 #include <modest-icon-names.h>
 #include <modest-runtime.h>
+#include "modest-platform.h"
 
 static void modest_header_view_class_init  (ModestHeaderViewClass *klass);
 static void modest_header_view_init        (ModestHeaderView *obj);
@@ -67,13 +68,18 @@ static gboolean      on_focus_in            (GtkWidget     *sef,
                                             GdkEventFocus *event,
                                             gpointer       user_data);
 
+static void          folder_monitor_update  (TnyFolderObserver *self, 
+                                            TnyFolderChange *change);
+
+static void          tny_folder_observer_init (TnyFolderObserverIface *klass);
+
 typedef struct _ModestHeaderViewPrivate ModestHeaderViewPrivate;
 struct _ModestHeaderViewPrivate {
        TnyFolder            *folder;
        ModestHeaderViewStyle style;
 
        TnyFolderMonitor     *monitor;
-       GMutex               *monitor_lock;
+       GMutex               *observers_lock;
 
        gint                  sort_colid[2][TNY_FOLDER_TYPE_NUM];
        gint                  sort_type[2][TNY_FOLDER_TYPE_NUM];
@@ -120,9 +126,21 @@ modest_header_view_get_type (void)
                        (GInstanceInitFunc) modest_header_view_init,
                        NULL
                };
+
+               static const GInterfaceInfo tny_folder_observer_info = 
+               {
+                       (GInterfaceInitFunc) tny_folder_observer_init, /* interface_init */
+                       NULL,         /* interface_finalize */
+                       NULL          /* interface_data */
+               };
                my_type = g_type_register_static (GTK_TYPE_TREE_VIEW,
                                                  "ModestHeaderView",
                                                  &my_info, 0);
+
+               g_type_add_interface_static (my_type, TNY_TYPE_FOLDER_OBSERVER,
+                                            &tny_folder_observer_info);
+
+
        }
        return my_type;
 }
@@ -176,6 +194,12 @@ modest_header_view_class_init (ModestHeaderViewClass *klass)
                              G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT);
 }
 
+static void
+tny_folder_observer_init (TnyFolderObserverIface *klass)
+{
+       klass->update_func = folder_monitor_update;
+}
+
 static GtkTreeViewColumn*
 get_new_column (const gchar *name, GtkCellRenderer *renderer,
                gboolean resizable, gint sort_col_id, gboolean show_as_text,
@@ -419,7 +443,7 @@ modest_header_view_init (ModestHeaderView *obj)
        priv->folder  = NULL;
 
        priv->monitor        = NULL;
-       priv->monitor_lock   = g_mutex_new ();
+       priv->observers_lock = g_mutex_new ();
 
        /* Sort parameters */
        for (j=0; j < 2; j++) {
@@ -441,15 +465,16 @@ modest_header_view_finalize (GObject *obj)
        self = MODEST_HEADER_VIEW(obj);
        priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
 
-       g_mutex_lock (priv->monitor_lock);
+       g_mutex_lock (priv->observers_lock);
        if (priv->monitor) {
                tny_folder_monitor_stop (priv->monitor);
                g_object_unref (G_OBJECT (priv->monitor));
        }
-       g_mutex_unlock (priv->monitor_lock);
-       g_mutex_free (priv->monitor_lock);
+       g_mutex_unlock (priv->observers_lock);
+       g_mutex_free (priv->observers_lock);
 
        if (priv->folder) {
+               tny_folder_remove_observer (priv->folder, TNY_FOLDER_OBSERVER (obj));
                g_object_unref (G_OBJECT (priv->folder));
                priv->folder   = NULL;
        }
@@ -738,8 +763,9 @@ modest_header_view_set_folder_intern (ModestHeaderView *self, TnyFolder *folder)
        tny_gtk_header_list_model_set_folder (TNY_GTK_HEADER_LIST_MODEL(headers),
                                              folder, FALSE);
 
-       /* Add a folder observer */
-       g_mutex_lock (priv->monitor_lock);
+       /* Add IDLE observer (monitor) and another folder observer for
+          new messages (self) */
+       g_mutex_lock (priv->observers_lock);
        if (priv->monitor) {
                tny_folder_monitor_stop (priv->monitor);
                g_object_unref (G_OBJECT (priv->monitor));
@@ -747,8 +773,8 @@ modest_header_view_set_folder_intern (ModestHeaderView *self, TnyFolder *folder)
        priv->monitor = TNY_FOLDER_MONITOR (tny_folder_monitor_new (folder));
        tny_folder_monitor_add_list (priv->monitor, TNY_LIST (headers));
        tny_folder_monitor_start (priv->monitor);
-       g_mutex_unlock (priv->monitor_lock);
-
+       tny_folder_add_observer (folder, TNY_FOLDER_OBSERVER (self));
+       g_mutex_unlock (priv->observers_lock);
 
        sortable = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL(headers));
        g_object_unref (G_OBJECT (headers));
@@ -856,15 +882,15 @@ void
 modest_header_view_set_folder (ModestHeaderView *self, TnyFolder *folder)
 {
        ModestHeaderViewPrivate *priv;
-       ModestWindow *win = NULL;
 
        priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
-       win = MODEST_WINDOW(gtk_widget_get_toplevel (GTK_WIDGET(self)));
-       g_return_if_fail (MODEST_IS_WINDOW (win));
 
        if (priv->folder) {
+               g_mutex_lock (priv->observers_lock);
+               tny_folder_remove_observer (priv->folder, TNY_FOLDER_OBSERVER (self));
                g_object_unref (priv->folder);
                priv->folder = NULL;
+               g_mutex_unlock (priv->observers_lock);
        }
 
        if (folder) {
@@ -880,7 +906,7 @@ modest_header_view_set_folder (ModestHeaderView *self, TnyFolder *folder)
                g_signal_emit (G_OBJECT(self), signals[HEADER_SELECTED_SIGNAL], 0, NULL);
 
                /* Create the mail operation */
-               mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE, G_OBJECT(win));
+               mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, NULL);
                modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
                                                 mail_op);
 
@@ -891,15 +917,16 @@ modest_header_view_set_folder (ModestHeaderView *self, TnyFolder *folder)
                g_object_unref (mail_op);
 
        } else {
-               g_mutex_lock (priv->monitor_lock);
-               modest_header_view_set_model (GTK_TREE_VIEW (self), NULL); 
+               g_mutex_lock (priv->observers_lock);
 
                if (priv->monitor) {
                        tny_folder_monitor_stop (priv->monitor);
                        g_object_unref (G_OBJECT (priv->monitor));
                        priv->monitor = NULL;
                }
-               g_mutex_unlock (priv->monitor_lock);
+               modest_header_view_set_model (GTK_TREE_VIEW (self), NULL); 
+
+               g_mutex_unlock (priv->observers_lock);
        }
 }
 
@@ -1162,11 +1189,11 @@ drag_data_get_cb (GtkWidget *widget, GdkDragContext *context,
                  GtkSelectionData *selection_data, 
                  guint info,  guint time, gpointer data)
 {
-       GtkTreeModel *model;
+       GtkTreeModel *model = NULL;
        GtkTreeIter iter;
-       GtkTreePath *source_row;
+       GtkTreePath *source_row = NULL;
        
-       source_row = get_selected_row (GTK_TREE_VIEW(widget), &model);
+       source_row = get_selected_row (GTK_TREE_VIEW (widget), &model);
        if ((source_row == NULL) || (!gtk_tree_model_get_iter(model, &iter, source_row))) return;
 
        switch (info) {
@@ -1184,7 +1211,7 @@ drag_data_get_cb (GtkWidget *widget, GdkDragContext *context,
                break;
        }
        default:
-               g_message ("default");
+               g_message ("%s: default switch case.", __FUNCTION__);
        }
 
        gtk_tree_path_free (source_row);
@@ -1193,8 +1220,7 @@ drag_data_get_cb (GtkWidget *widget, GdkDragContext *context,
 /* Header view drag types */
 const GtkTargetEntry header_view_drag_types[] = {
        { "GTK_TREE_MODEL_ROW", GTK_TARGET_SAME_APP, MODEST_HEADER_ROW },
-       { "text/uri-list",      0,                   MODEST_MSG },
+       { "text/uri-list",      0,                   MODEST_MSG }, 
 };
 
 static void
@@ -1299,3 +1325,38 @@ on_focus_in (GtkWidget     *self,
 
        return FALSE;
 }
+
+/*
+ *
+ */
+static void
+folder_monitor_update (TnyFolderObserver *self, 
+                      TnyFolderChange *change)
+{
+       ModestHeaderViewPrivate *priv = MODEST_HEADER_VIEW_GET_PRIVATE (self);
+       TnyFolderChangeChanged changed;
+
+       g_mutex_lock (priv->observers_lock);
+
+       changed = tny_folder_change_get_changed (change);
+
+       if (changed & TNY_FOLDER_CHANGE_CHANGED_ADDED_HEADERS) {
+/*     TnyIterator *iter; */
+/*     TnyList *list; */
+/*             /\* The added headers *\/ */
+/*             list = tny_simple_list_new (); */
+/*             tny_folder_change_get_added_headers (change, list); */
+/*             iter = tny_list_create_iterator (list); */
+/*             while (!tny_iterator_is_done (iter)) */
+/*             { */
+/*                     TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter)); */
+/*                     g_object_unref (G_OBJECT (header)); */
+/*                     tny_iterator_next (iter); */
+/*             } */
+/*             g_object_unref (G_OBJECT (iter)); */
+/*             g_object_unref (G_OBJECT (list)); */
+               modest_platform_on_new_msg ();
+       }
+
+       g_mutex_unlock (priv->observers_lock);
+}