* Fixes NB#65015 the Outbox folder is no longer missing in the folder view when...
authorSergio Villar Senin <svillar@igalia.com>
Mon, 3 Sep 2007 07:48:30 +0000 (07:48 +0000)
committerSergio Villar Senin <svillar@igalia.com>
Mon, 3 Sep 2007 07:48:30 +0000 (07:48 +0000)
pmo-trunk-r3182

src/modest-tny-account-store.c
src/modest-tny-local-folders-account.c
src/modest-tny-local-folders-account.h
src/widgets/modest-folder-view.c

index 25bd212..0bc5b23 100644 (file)
@@ -145,6 +145,9 @@ struct _ModestTnyAccountStorePrivate {
        TnyList             *store_accounts;
        TnyList             *transport_accounts;
        TnyList             *store_accounts_outboxes;
+
+       /* Matches transport accounts and outbox folder */
+       GHashTable          *outbox_of_transport;
 };
 
 #define MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
@@ -275,6 +278,12 @@ modest_tny_account_store_instance_init (ModestTnyAccountStore *obj)
        priv->session                = NULL;
        priv->device                 = NULL;
        
+       priv->outbox_of_transport = 
+               g_hash_table_new_full (g_direct_hash,
+                                      g_direct_equal,
+                                      NULL,
+                                      NULL);
+
        /* An in-memory store of passwords, 
         * for passwords that are not remembered in the configuration,
          * so they need to be asked for from the user once in each session:
@@ -793,6 +802,12 @@ modest_tny_account_store_finalize (GObject *obj)
                priv->account_settings_dialog_hash = NULL;
        }
 
+       if (priv->outbox_of_transport) {
+               g_hash_table_destroy (priv->outbox_of_transport);
+               priv->outbox_of_transport = NULL;
+       }
+
+
        /* Disconnect VFS signals */
        volume_monitor = gnome_vfs_get_volume_monitor ();
        if (g_signal_handler_is_connected (volume_monitor, 
@@ -1640,6 +1655,15 @@ insert_account (ModestTnyAccountStore *self,
                local_account = modest_tny_account_store_get_local_folders_account (MODEST_TNY_ACCOUNT_STORE (self));
                modest_tny_local_folders_account_add_folder_to_outbox (MODEST_TNY_LOCAL_FOLDERS_ACCOUNT (local_account), 
                                                                       per_account_outbox);
+               /* Add the pair to the hash table */
+               g_hash_table_insert (priv->outbox_of_transport,
+                                    transport_account,
+                                    per_account_outbox);
+
+               /* Notify that the local folders account chaned */
+               if (notify)
+                       g_signal_emit (G_OBJECT (self), signals [ACCOUNT_CHANGED_SIGNAL], 0, local_account);
+
                g_object_unref (local_account);
                g_object_unref (per_account_outbox);
 
@@ -1689,6 +1713,27 @@ on_account_removed (ModestAccountMgr *acc_mgr,
        /* If there was any problem creating the account, for example,
           with the configuration system this could not exist */
        if (transport_account) {
+               TnyAccount *local_account = NULL;
+               TnyFolder *outbox = NULL;
+               ModestTnyAccountStorePrivate *priv = NULL;
+       
+               /* Remove the OUTBOX of the account from the global outbox */
+               priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
+               outbox = g_hash_table_lookup (priv->outbox_of_transport, transport_account);
+
+               if (TNY_IS_FOLDER (outbox)) {
+                       local_account = modest_tny_account_store_get_local_folders_account (self);
+                       modest_tny_local_folders_account_remove_folder_from_outbox (MODEST_TNY_LOCAL_FOLDERS_ACCOUNT (local_account),
+                                                                                   outbox);
+                       g_hash_table_remove (priv->outbox_of_transport, transport_account);
+
+                       /* Notify the change in the local account */
+                       g_signal_emit (G_OBJECT (self), signals [ACCOUNT_CHANGED_SIGNAL], 0, local_account);
+                       g_object_unref (local_account);
+               } else {
+                       g_warning ("Removing a transport account that has no outbox");
+               }
+
                /* Notify the observers */
                g_signal_emit (G_OBJECT (self), signals [ACCOUNT_REMOVED_SIGNAL], 0, transport_account);
                g_object_unref (transport_account);
index 01202d0..cf244d1 100644 (file)
@@ -248,3 +248,28 @@ modest_tny_local_folders_account_add_folder_to_outbox (ModestTnyLocalFoldersAcco
        /* Add outbox to the global OUTBOX folder */
        tny_merge_folder_add_folder (priv->outbox_folder, per_account_outbox);
 }
+
+void 
+modest_tny_local_folders_account_remove_folder_from_outbox (ModestTnyLocalFoldersAccount *self, 
+                                                           TnyFolder *per_account_outbox)
+{
+       ModestTnyLocalFoldersAccountPrivate *priv;
+       TnyList *merged_folders = NULL;
+
+       g_return_if_fail (MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (self));
+       g_return_if_fail (TNY_IS_FOLDER (per_account_outbox));
+
+       priv = TNY_LOCAL_FOLDERS_ACCOUNT_GET_PRIVATE (self);
+
+       /* Remove outbox from the global OUTBOX folder */
+       tny_merge_folder_remove_folder (priv->outbox_folder, per_account_outbox);
+
+       /* If there is no folder in the outbox the delete it */
+       merged_folders = tny_simple_list_new ();
+       tny_merge_folder_get_folders (priv->outbox_folder, merged_folders);
+       if (tny_list_get_length (merged_folders) == 0) {
+               g_object_unref (priv->outbox_folder);
+               priv->outbox_folder = NULL;
+       }
+       g_object_unref (merged_folders);
+}
index 2687d5c..b4e3bdf 100644 (file)
@@ -78,6 +78,9 @@ gboolean   modest_tny_local_folders_account_folder_name_in_use   (ModestTnyLocal
 void       modest_tny_local_folders_account_add_folder_to_outbox (ModestTnyLocalFoldersAccount *self, 
                                                                  TnyFolder *per_account_outbox);
 
+void       modest_tny_local_folders_account_remove_folder_from_outbox (ModestTnyLocalFoldersAccount *self, 
+                                                                      TnyFolder *per_account_outbox);
+
 G_END_DECLS
 
 #endif /* _MODEST_TNY_LOCAL_FOLDERS_ACCOUNT */
index 0ef0b02..2140365 100644 (file)
@@ -742,10 +742,32 @@ on_account_inserted (TnyAccountStore *account_store,
 
 
 static void
-on_account_changed (TnyAccountStore *account_store, TnyAccount *tny_account,
+on_account_changed (TnyAccountStore *account_store, 
+                   TnyAccount *tny_account,
                    gpointer user_data)
 {
        /* do nothing */
+       ModestFolderViewPrivate *priv;
+       GtkTreeModel *sort_model, *filter_model;
+
+       /* Ignore transport account insertions, we're not showing them
+          in the folder view */
+       if (TNY_IS_TRANSPORT_ACCOUNT (tny_account))
+               return;
+
+       priv = MODEST_FOLDER_VIEW_GET_PRIVATE (user_data);
+
+       /* Get the inner model */
+       filter_model = gtk_tree_view_get_model (GTK_TREE_VIEW (user_data));
+       sort_model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (filter_model));
+
+       /* 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));
+
+       /* 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));
 }