+ }
+}
+
+/*
+ * Called when an account is removed. If I'm showing a folder of the
+ * account that has been removed then clear the view
+ */
+static void
+on_account_removed (TnyAccountStore *self,
+ TnyAccount *account,
+ gpointer user_data)
+{
+ ModestHeaderViewPrivate *priv = NULL;
+
+ /* Ignore changes in transport accounts */
+ if (TNY_IS_TRANSPORT_ACCOUNT (account))
+ return;
+
+ priv = MODEST_HEADER_VIEW_GET_PRIVATE (user_data);
+
+ if (priv->folder) {
+ TnyAccount *my_account;
+
+ my_account = tny_folder_get_account (priv->folder);
+ if (my_account == account)
+ modest_header_view_clear (MODEST_HEADER_VIEW (user_data));
+ g_object_unref (my_account);
+ }
+}
+
+void
+modest_header_view_add_observer(ModestHeaderView *header_view,
+ ModestHeaderViewObserver *observer)
+{
+ ModestHeaderViewPrivate *priv;
+
+ g_return_if_fail (header_view && MODEST_IS_HEADER_VIEW(header_view));
+ g_return_if_fail (observer && 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;
+
+ g_return_if_fail (header_view && MODEST_IS_HEADER_VIEW(header_view));
+ g_return_if_fail (observer && 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_return_if_fail (header_view && 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);
+}
+
+const gchar *
+_modest_header_view_get_display_date (ModestHeaderView *self, time_t date)
+{
+ ModestHeaderViewPrivate *priv = NULL;
+
+ priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
+ return modest_datetime_formatter_display_datetime (priv->datetime_formatter, date);
+}
+
+void
+modest_header_view_set_filter (ModestHeaderView *self,
+ ModestHeaderViewFilter filter)
+{
+ ModestHeaderViewPrivate *priv;
+ GtkTreeModel *filter_model;
+
+ g_return_if_fail (MODEST_IS_HEADER_VIEW (self));
+ priv = MODEST_HEADER_VIEW_GET_PRIVATE (self);
+
+ priv->filter |= filter;
+
+ filter_model = gtk_tree_view_get_model (GTK_TREE_VIEW (self));
+ if (GTK_IS_TREE_MODEL_FILTER(filter_model)) {
+ gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (filter_model));
+ }
+}
+
+void
+modest_header_view_unset_filter (ModestHeaderView *self,
+ ModestHeaderViewFilter filter)
+{
+ ModestHeaderViewPrivate *priv;
+ GtkTreeModel *filter_model;
+
+ g_return_if_fail (MODEST_IS_HEADER_VIEW (self));
+ priv = MODEST_HEADER_VIEW_GET_PRIVATE (self);
+
+ priv->filter &= ~filter;
+
+ filter_model = gtk_tree_view_get_model (GTK_TREE_VIEW (self));
+ if (GTK_IS_TREE_MODEL_FILTER(filter_model)) {
+ gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (filter_model));
+ }