const gchar *name,
GError **err);
+enum {
+ OUTBOX_DELETED_SIGNAL,
+ LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = {0};
+
static void
modest_tny_local_folders_account_finalize (GObject *object)
{
modest_tny_local_folders_account_class_init (ModestTnyLocalFoldersAccountClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
+
g_type_class_add_private (klass, sizeof (ModestTnyLocalFoldersAccountPrivate));
-
+
object_class->finalize = modest_tny_local_folders_account_finalize;
-
+
+ /* Signals */
+
+ /* Note that this signal is removed before unsetting my own
+ reference to outbox, this means that by the time of this
+ call, modest_tny_local_folders_account_get_merged_outbox is
+ still valid. The reason is that the listeners of the signal
+ might want to do something with the outbox instance */
+ signals[OUTBOX_DELETED_SIGNAL] = g_signal_new
+ ("outbox-deleted", MODEST_TYPE_TNY_LOCAL_FOLDERS_ACCOUNT,
+ G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET
+ (ModestTnyLocalFoldersAccountClass, outbox_deleted), NULL,
+ NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
/* Override virtual functions from the parent class: */
TNY_CAMEL_STORE_ACCOUNT_CLASS(klass)->get_folders = get_folders;
TNY_CAMEL_STORE_ACCOUNT_CLASS(klass)->create_folder = create_folder;
/* Create on-demand */
if (!priv->outbox_folder) {
- priv->outbox_folder = TNY_MERGE_FOLDER (tny_merge_folder_new_with_ui_locker (_("mcen_me_folder_outbox"), tny_gtk_lockable_new ()));
-
+ priv->outbox_folder = (TnyMergeFolder *)
+ tny_merge_folder_new_with_ui_locker (_("mcen_me_folder_outbox"),
+ tny_gtk_lockable_new ());
/* Set type to outbox */
- tny_merge_folder_set_folder_type (priv->outbox_folder, TNY_FOLDER_TYPE_OUTBOX);
+ tny_merge_folder_set_folder_type (priv->outbox_folder,
+ TNY_FOLDER_TYPE_OUTBOX);
}
/* Add outbox to the global OUTBOX folder */
merged_folders = tny_simple_list_new ();
tny_merge_folder_get_folders (priv->outbox_folder, merged_folders);
if (tny_list_get_length (merged_folders) == 0) {
+ /* Emit signal */
+ g_signal_emit ((GObject *)self, signals[OUTBOX_DELETED_SIGNAL], 0);
+
+ /* Unref my own reference */
g_object_unref (priv->outbox_folder);
priv->outbox_folder = NULL;
}
static void on_notify_style (GObject *obj, GParamSpec *spec, gpointer userdata);
static gint get_cmp_pos (TnyFolderType t, TnyFolder *folder_store);
+static gboolean get_inner_models (ModestFolderView *self,
+ GtkTreeModel **filter_model,
+ GtkTreeModel **sort_model,
+ GtkTreeModel **tny_model);
+
enum {
FOLDER_SELECTION_CHANGED_SIGNAL,
FOLDER_DISPLAY_NAME_CHANGED_SIGNAL,
gboolean reexpand; /* next time we expose, we'll expand all root folders */
GtkCellRenderer *messages_renderer;
+
+ gulong outbox_deleted_handler;
};
#define MODEST_FOLDER_VIEW_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE((o), \
}
+/* Retrieves the filter, sort and tny models of the folder view. If
+ any of these does not exist then it returns FALSE */
+static gboolean
+get_inner_models (ModestFolderView *self,
+ GtkTreeModel **filter_model,
+ GtkTreeModel **sort_model,
+ GtkTreeModel **tny_model)
+{
+ GtkTreeModel *s_model, *f_model, *t_model;
+
+ f_model = gtk_tree_view_get_model (GTK_TREE_VIEW (self));
+ if (!GTK_IS_TREE_MODEL_FILTER(f_model)) {
+ g_warning ("BUG: %s: not a valid filter model", __FUNCTION__);
+ return FALSE;
+ }
+
+ s_model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (f_model));
+ if (!GTK_IS_TREE_MODEL_SORT(s_model)) {
+ g_warning ("BUG: %s: not a valid sort model", __FUNCTION__);
+ return FALSE;
+ }
+
+ t_model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (s_model));
+
+ /* Assign values */
+ if (filter_model)
+ *filter_model = f_model;
+ if (sort_model)
+ *sort_model = s_model;
+ if (tny_model)
+ *tny_model = t_model;
+
+ return TRUE;
+}
+
/* Simplify checks for NULLs: */
static gboolean
strings_are_equal (const gchar *a, const gchar *b)
priv->cur_folder_store = NULL;
priv->visible_account_id = NULL;
priv->folder_to_select = NULL;
-
+ priv->outbox_deleted_handler = 0;
priv->reexpand = TRUE;
/* Initialize the local account name */
{
ModestFolderViewPrivate *priv;
GtkTreeSelection *sel;
+ TnyAccount *local_account;
g_return_if_fail (obj);
priv->timer_expander = 0;
}
+ local_account = (TnyAccount *)
+ modest_tny_account_store_get_local_folders_account ((ModestTnyAccountStore *)priv->account_store);
+ if (local_account) {
+ if (g_signal_handler_is_connected (local_account,
+ priv->outbox_deleted_handler))
+ g_signal_handler_disconnect (local_account,
+ priv->outbox_deleted_handler);
+ g_object_unref (local_account);
+ }
+
if (priv->account_store) {
g_signal_handler_disconnect (G_OBJECT(priv->account_store),
priv->account_inserted_signal);
}
static void
+on_outbox_deleted_cb (ModestTnyLocalFoldersAccount *local_account,
+ gpointer user_data)
+{
+ ModestFolderView *self;
+ GtkTreeModel *model, *filter_model;
+ TnyFolder *outbox;
+
+ self = MODEST_FOLDER_VIEW (user_data);
+
+ if (!get_inner_models (self, &filter_model, NULL, &model))
+ return;
+
+ /* Remove outbox from model */
+ outbox = modest_tny_local_folders_account_get_merged_outbox (local_account);
+ tny_list_remove (TNY_LIST (model), G_OBJECT (outbox));
+ g_object_unref (outbox);
+
+ /* Refilter view */
+ gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (filter_model));
+}
+
+static void
on_account_inserted (TnyAccountStore *account_store,
TnyAccount *account,
gpointer user_data)
{
ModestFolderViewPrivate *priv;
- GtkTreeModel *sort_model, *filter_model;
+ GtkTreeModel *model, *filter_model;
/* Ignore transport account insertions, we're not showing them
in the folder view */
G_OBJECT (user_data),
MODEST_CONF_FOLDER_VIEW_KEY);
- if (!GTK_IS_TREE_VIEW(user_data)) {
- g_warning ("BUG: %s: not a valid tree view", __FUNCTION__);
- return;
- }
-
- /* Get the inner model */
- /* check, is some rare cases, we did not get the right thing here,
- * NB#84097 */
- filter_model = gtk_tree_view_get_model (GTK_TREE_VIEW (user_data));
- if (!GTK_IS_TREE_MODEL_FILTER(filter_model)) {
- g_warning ("BUG: %s: not a valid filter model", __FUNCTION__);
- return;
- }
- /* check, is some rare cases, we did not get the right thing here,
- * NB#84097 */
- sort_model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (filter_model));
- if (!GTK_IS_TREE_MODEL_SORT(sort_model)) {
- g_warning ("BUG: %s: not a valid sort model", __FUNCTION__);
+ /* Get models */
+ if (!get_inner_models (MODEST_FOLDER_VIEW (user_data),
+ &filter_model, NULL, &model))
return;
- }
/* Insert the account in the model */
- tny_list_append (TNY_LIST (gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (sort_model))),
- G_OBJECT (account));
+ tny_list_append (TNY_LIST (model), G_OBJECT (account));
+
+ /* When the model is a list store (plain representation) the
+ outbox is not a child of any account so we have to manually
+ delete it because removing the local folders account won't
+ delete it (because tny_folder_get_account() is not defined
+ for a merge folder */
+ if (TNY_IS_GTK_FOLDER_LIST_STORE (model) &&
+ MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (account)) {
+
+ priv->outbox_deleted_handler =
+ g_signal_connect (account,
+ "outbox-deleted",
+ G_CALLBACK (on_outbox_deleted_cb),
+ user_data);
+ }
/* Refilter the model */
gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (filter_model));
{
ModestFolderView *self;
ModestFolderViewPrivate *priv;
- GtkTreeModel *sort_model, *filter_model;
+ GtkTreeModel *model, *filter_model;
GtkTreeSelection *sel;
gboolean same_account;
if (TNY_IS_TRANSPORT_ACCOUNT (tny_account))
return;
- if (!MODEST_IS_FOLDER_VIEW(user_data)) {
- g_warning ("BUG: %s: not a valid folder view", __FUNCTION__);
- return;
- }
-
self = MODEST_FOLDER_VIEW (user_data);
priv = MODEST_FOLDER_VIEW_GET_PRIVATE (user_data);
/* Get the inner model */
- filter_model = gtk_tree_view_get_model (GTK_TREE_VIEW (user_data));
- if (!GTK_IS_TREE_MODEL_FILTER(filter_model)) {
- g_warning ("BUG: %s: not a valid filter model", __FUNCTION__);
+ if (!get_inner_models (MODEST_FOLDER_VIEW (user_data),
+ &filter_model, NULL, &model))
return;
- }
- sort_model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (filter_model));
- if (!GTK_IS_TREE_MODEL_SORT(sort_model)) {
- g_warning ("BUG: %s: not a valid sort model", __FUNCTION__);
- return;
- }
+ filter_model = gtk_tree_view_get_model (GTK_TREE_VIEW (user_data));
/* Invalidate the cur_folder_store only if the selected folder
belongs to the account that is being removed */
}
/* Remove the account from the model */
- tny_list_remove (TNY_LIST (gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (sort_model))),
- G_OBJECT (tny_account));
+ tny_list_remove (TNY_LIST (model), G_OBJECT (tny_account));
/* Insert the account in the model */
- tny_list_append (TNY_LIST (gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (sort_model))),
- G_OBJECT (tny_account));
+ tny_list_append (TNY_LIST (model), G_OBJECT (tny_account));
/* Refilter the model */
gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (filter_model));
{
ModestFolderView *self = NULL;
ModestFolderViewPrivate *priv;
- GtkTreeModel *sort_model, *filter_model;
+ GtkTreeModel *model, *filter_model;
GtkTreeSelection *sel = NULL;
gboolean same_account = FALSE;
g_object_unref (folder_to_select_account);
}
- /* Remove the account from the model */
- filter_model = gtk_tree_view_get_model (GTK_TREE_VIEW (self));
- if (!GTK_IS_TREE_MODEL_FILTER(filter_model)) {
- g_warning ("BUG: %s: not a valid filter model", __FUNCTION__);
+ if (!get_inner_models (MODEST_FOLDER_VIEW (user_data),
+ &filter_model, NULL, &model))
return;
- }
- sort_model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (filter_model));
- if (!GTK_IS_TREE_MODEL_SORT(sort_model)) {
- g_warning ("BUG: %s: not a valid sort model", __FUNCTION__);
- return;
+ /* Disconnect the signal handler */
+ if (TNY_IS_GTK_FOLDER_LIST_STORE (model) &&
+ MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (account)) {
+ if (g_signal_handler_is_connected (account,
+ priv->outbox_deleted_handler))
+ g_signal_handler_disconnect (account,
+ priv->outbox_deleted_handler);
}
- tny_list_remove (TNY_LIST (gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (sort_model))),
- G_OBJECT (account));
+ /* Remove the account from the model */
+ tny_list_remove (TNY_LIST (model), G_OBJECT (account));
/* If the removed account is the currently viewed one then
clear the configuration value. The new visible account will be the default account */
model = tny_gtk_folder_store_tree_model_new (NULL);
#endif
+ /* When the model is a list store (plain representation) the
+ outbox is not a child of any account so we have to manually
+ delete it because removing the local folders account won't
+ delete it (because tny_folder_get_account() is not defined
+ for a merge folder */
+ if (TNY_IS_GTK_FOLDER_LIST_STORE (model)) {
+ TnyAccount *account;
+ ModestTnyAccountStore *acc_store;
+
+ acc_store = MODEST_TNY_ACCOUNT_STORE (priv->account_store);
+ account = modest_tny_account_store_get_local_folders_account (acc_store);
+
+ if (g_signal_handler_is_connected (account,
+ priv->outbox_deleted_handler))
+ g_signal_handler_disconnect (account,
+ priv->outbox_deleted_handler);
+
+ priv->outbox_deleted_handler =
+ g_signal_connect (account,
+ "outbox-deleted",
+ G_CALLBACK (on_outbox_deleted_cb),
+ self);
+ g_object_unref (account);
+ }
+
/* Get the accounts: */
tny_account_store_get_accounts (TNY_ACCOUNT_STORE(account_store),
TNY_LIST (model),