hildon_banner_... changed to modest_platform_...
[modest] / src / widgets / modest-header-view.c
index 20669ba..d9df75a 100644 (file)
@@ -95,6 +95,10 @@ static void          _clipboard_set_selected_data (ModestHeaderView *header_view
 
 static void          _clear_hidding_filter (ModestHeaderView *header_view);
 
+static void modest_header_view_notify_observers(
+               ModestHeaderView *header_view,
+               GtkTreeModel *model,
+               const gchar *tny_folder_id);
 
 typedef struct _ModestHeaderViewPrivate ModestHeaderViewPrivate;
 struct _ModestHeaderViewPrivate {
@@ -104,6 +108,10 @@ struct _ModestHeaderViewPrivate {
        TnyFolderMonitor     *monitor;
        GMutex               *observers_lock;
 
+       /*header-view-observer observer*/
+       GMutex *observer_list_lock;
+       GSList *observer_list;
+
        /* not unref this object, its a singlenton */
        ModestEmailClipboard *clipboard;
 
@@ -116,6 +124,8 @@ struct _ModestHeaderViewPrivate {
 
        gulong  selection_changed_handler;
        gulong  acc_removed_handler;
+
+       gboolean empty;
 };
 
 typedef struct _HeadersCountChangedHelper HeadersCountChangedHelper;
@@ -508,6 +518,11 @@ modest_header_view_init (ModestHeaderView *obj)
        priv->monitor        = NULL;
        priv->observers_lock = g_mutex_new ();
 
+       priv->empty  = TRUE;
+
+       priv->observer_list_lock = g_mutex_new();
+       priv->observer_list = NULL;
+
        priv->clipboard = modest_runtime_get_email_clipboard ();
        priv->hidding_ids = NULL;
        priv->n_selected = 0;
@@ -568,6 +583,11 @@ modest_header_view_finalize (GObject *obj)
                                             priv->acc_removed_handler);
        }
 
+       /* There is no need to lock because there should not be any
+        * reference to self now. */
+       g_mutex_free(priv->observer_list_lock);
+       g_slist_free(priv->observer_list);
+
        g_mutex_lock (priv->observers_lock);
        if (priv->monitor) {
                tny_folder_monitor_stop (priv->monitor);
@@ -795,12 +815,12 @@ modest_header_view_get_columns (ModestHeaderView *self)
 }
 
 
-gboolean
-modest_header_view_is_empty (ModestHeaderView *self)
-{
-       g_return_val_if_fail (self, FALSE);
-       return FALSE; /* FIXME */
-}
+/* gboolean */
+/* modest_header_view_is_empty (ModestHeaderView *self) */
+/* { */
+/*     g_return_val_if_fail (self, FALSE); */
+/*     return FALSE; /\* FIXME *\/ */
+/* } */
 
 
 gboolean
@@ -942,6 +962,8 @@ modest_header_view_set_folder_intern (ModestHeaderView *self, TnyFolder *folder)
 
        /* Set new model */
        modest_header_view_set_model (GTK_TREE_VIEW (self), filter_model);
+       modest_header_view_notify_observers(self, GTK_TREE_MODEL(filter_model),
+                       tny_folder_get_id(folder));
        g_object_unref (G_OBJECT (filter_model));
 /*     modest_header_view_set_model (GTK_TREE_VIEW (self), sortable); */
 /*     g_object_unref (G_OBJECT (sortable)); */
@@ -1125,6 +1147,8 @@ modest_header_view_set_folder (ModestHeaderView *self,
                }
                modest_header_view_set_model (GTK_TREE_VIEW (self), NULL); 
 
+               modest_header_view_notify_observers(self, NULL, NULL);
+
                g_mutex_unlock (priv->observers_lock);
        }
 }
@@ -1317,6 +1341,7 @@ drag_data_get_cb (GtkWidget *widget, GdkDragContext *context,
        GtkTreeSelection *sel = NULL;   
        
        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) {
@@ -1508,7 +1533,7 @@ static void
 folder_monitor_update (TnyFolderObserver *self, 
                       TnyFolderChange *change)
 {
-       ModestHeaderViewPrivate *priv;
+       ModestHeaderViewPrivate *priv = NULL;
        TnyFolderChangeChanged changed;
        HeadersCountChangedHelper *helper = NULL;
 
@@ -1535,6 +1560,16 @@ folder_monitor_update (TnyFolderObserver *self,
        }       
 }
 
+gboolean
+modest_header_view_is_empty (ModestHeaderView *self)
+{
+       ModestHeaderViewPrivate *priv = NULL;
+               
+       priv = MODEST_HEADER_VIEW_GET_PRIVATE (MODEST_HEADER_VIEW (self));
+
+       return priv->empty;
+}
+
 void
 modest_header_view_clear (ModestHeaderView *self)
 {
@@ -1648,8 +1683,10 @@ filter_row (GtkTreeModel *model,
                visible = !found;
        }
 
-       /* Free */
  frees:
+       priv->empty = priv->empty && !visible;
+       
+       /* Free */
        if (header)
                g_object_unref (header);
        g_free(id);
@@ -1660,7 +1697,7 @@ filter_row (GtkTreeModel *model,
 static void
 _clear_hidding_filter (ModestHeaderView *header_view) 
 {
-       ModestHeaderViewPrivate *priv;
+       ModestHeaderViewPrivate *priv = NULL;
        guint i;
        
        g_return_if_fail (MODEST_IS_HEADER_VIEW (header_view)); 
@@ -1676,9 +1713,13 @@ _clear_hidding_filter (ModestHeaderView *header_view)
 void 
 modest_header_view_refilter (ModestHeaderView *header_view)
 {
-       GtkTreeModel *model;
+       GtkTreeModel *model = NULL;
+       ModestHeaderViewPrivate *priv = NULL;
 
        g_return_if_fail (MODEST_IS_HEADER_VIEW (header_view));
+       priv = MODEST_HEADER_VIEW_GET_PRIVATE(header_view);
+
+       priv->empty = TRUE;
 
        /* Hide cut headers */
        model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
@@ -1714,3 +1755,62 @@ on_account_removed (TnyAccountStore *self,
                g_object_unref (account);
        }
 }
+
+void modest_header_view_add_observer(
+               ModestHeaderView *header_view,
+               ModestHeaderViewObserver *observer)
+{
+       ModestHeaderViewPrivate *priv = NULL;
+
+       g_assert(MODEST_IS_HEADER_VIEW(header_view));
+       g_assert(observer != NULL);
+       g_assert(MODEST_IS_HEADER_VIEW_OBSERVER(observer));
+
+       priv = MODEST_HEADER_VIEW_GET_PRIVATE(header_view);
+
+       g_mutex_lock(priv->observer_list_lock);
+       priv->observer_list = g_slist_prepend(priv->observer_list, observer);
+       g_mutex_unlock(priv->observer_list_lock);
+}
+
+void modest_header_view_remove_observer(
+               ModestHeaderView *header_view,
+               ModestHeaderViewObserver *observer)
+{
+       ModestHeaderViewPrivate *priv = NULL;
+
+       g_assert(MODEST_IS_HEADER_VIEW(header_view));
+       g_assert(observer != NULL);
+       g_assert(MODEST_IS_HEADER_VIEW_OBSERVER(observer));
+
+       priv = MODEST_HEADER_VIEW_GET_PRIVATE(header_view);
+
+       g_mutex_lock(priv->observer_list_lock);
+       priv->observer_list = g_slist_remove(priv->observer_list, observer);
+       g_mutex_unlock(priv->observer_list_lock);
+}
+
+static void modest_header_view_notify_observers(
+               ModestHeaderView *header_view,
+               GtkTreeModel *model,
+               const gchar *tny_folder_id)
+{
+       ModestHeaderViewPrivate *priv = NULL;
+       GSList *iter;
+       ModestHeaderViewObserver *observer;
+
+       g_assert(MODEST_IS_HEADER_VIEW(header_view));
+
+       priv = MODEST_HEADER_VIEW_GET_PRIVATE(header_view);
+
+       g_mutex_lock(priv->observer_list_lock);
+       iter = priv->observer_list;
+       while(iter != NULL){
+               observer = MODEST_HEADER_VIEW_OBSERVER(iter->data);
+               modest_header_view_observer_update(observer, model,
+                               tny_folder_id);
+               iter = g_slist_next(iter);
+       }
+       g_mutex_unlock(priv->observer_list_lock);
+}
+