X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-header-view.c;h=d980d3584789eb4fca6bad2ab76f40824838f358;hb=a53f92ed4375cec1094f41a310b9ab7b7f8a2d70;hp=20669ba8daeb695a37d91d2c3644fe1ebe34aeda;hpb=5a3e1b92a02f00bcae5d1f5ae021edc4420014f3;p=modest diff --git a/src/widgets/modest-header-view.c b/src/widgets/modest-header-view.c index 20669ba..d980d35 100644 --- a/src/widgets/modest-header-view.c +++ b/src/widgets/modest-header-view.c @@ -95,6 +95,18 @@ 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 enum { + HEADER_VIEW_NON_EMPTY, + HEADER_VIEW_EMPTY, + HEADER_VIEW_INIT +} HeaderViewStatus; typedef struct _ModestHeaderViewPrivate ModestHeaderViewPrivate; struct _ModestHeaderViewPrivate { @@ -104,6 +116,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 +132,8 @@ struct _ModestHeaderViewPrivate { gulong selection_changed_handler; gulong acc_removed_handler; + + HeaderViewStatus status; }; typedef struct _HeadersCountChangedHelper HeadersCountChangedHelper; @@ -508,6 +526,11 @@ modest_header_view_init (ModestHeaderView *obj) priv->monitor = NULL; priv->observers_lock = g_mutex_new (); + priv->status = HEADER_VIEW_INIT; + + 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 +591,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,13 +823,6 @@ 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_set_style (ModestHeaderView *self, @@ -942,6 +963,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 +1148,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); } } @@ -1314,9 +1339,10 @@ drag_data_get_cb (GtkWidget *widget, GdkDragContext *context, GtkTreeModel *model = NULL; GtkTreeIter iter; GtkTreePath *source_row = NULL; - GtkTreeSelection *sel = NULL; +/* 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) { @@ -1337,12 +1363,15 @@ drag_data_get_cb (GtkWidget *widget, GdkDragContext *context, g_message ("%s: default switch case.", __FUNCTION__); } + /* commenting out the next, fixes NB#62963 */ +#if 0 /* Set focus on next header */ sel = gtk_tree_view_get_selection(GTK_TREE_VIEW (widget)); gtk_tree_path_next (source_row); gtk_tree_selection_select_path (sel, source_row); gtk_tree_path_free (source_row); +#endif } /* Header view drag types */ @@ -1508,7 +1537,7 @@ static void folder_monitor_update (TnyFolderObserver *self, TnyFolderChange *change) { - ModestHeaderViewPrivate *priv; + ModestHeaderViewPrivate *priv = NULL; TnyFolderChangeChanged changed; HeadersCountChangedHelper *helper = NULL; @@ -1535,6 +1564,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->status == HEADER_VIEW_EMPTY; +} + void modest_header_view_clear (ModestHeaderView *self) { @@ -1648,8 +1687,10 @@ filter_row (GtkTreeModel *model, visible = !found; } - /* Free */ frees: + priv->status = priv->status && !visible; + + /* Free */ if (header) g_object_unref (header); g_free(id); @@ -1660,7 +1701,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 +1717,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->status = HEADER_VIEW_EMPTY; /* Hide cut headers */ model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view)); @@ -1714,3 +1759,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); +} +