* added extra checking to on_account_inserted, on_account_changed.
[modest] / src / widgets / modest-folder-view.c
index 68ed0bb..f1aee88 100644 (file)
@@ -241,7 +241,9 @@ static void
 modest_folder_view_class_init (ModestFolderViewClass *klass)
 {
        GObjectClass *gobject_class;
+       GtkTreeViewClass *treeview_class;
        gobject_class = (GObjectClass*) klass;
+       treeview_class = (GtkTreeViewClass*) klass;
 
        parent_class            = g_type_class_peek_parent (klass);
        gobject_class->finalize = modest_folder_view_finalize;
@@ -275,6 +277,9 @@ modest_folder_view_class_init (ModestFolderViewClass *klass)
                              NULL, NULL,
                              g_cclosure_marshal_VOID__STRING,
                              G_TYPE_NONE, 1, G_TYPE_STRING);
+
+       treeview_class->select_cursor_parent = NULL;
+
 }
 
 /* Simplify checks for NULLs: */
@@ -360,10 +365,10 @@ on_get_mmc_account_name (TnyStoreAccount* account, gpointer user_data)
 }
 
 static void
-text_cell_data  (GtkTreeViewColumn *column,  
+text_cell_data  (GtkTreeViewColumn *column,
                 GtkCellRenderer *renderer,
-                GtkTreeModel *tree_model,  
-                GtkTreeIter *iter,  
+                GtkTreeModel *tree_model,
+                GtkTreeIter *iter,
                 gpointer data)
 {
        ModestFolderViewPrivate *priv;
@@ -377,13 +382,8 @@ text_cell_data  (GtkTreeViewColumn *column,
                            TNY_GTK_FOLDER_STORE_TREE_MODEL_TYPE_COLUMN, &type,
                            TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, &instance,
                            -1);
-       if (!fname)
-               return;
-
-       if (!instance) {
-               g_free (fname);
-               return;
-       }
+       if (!fname || !instance)
+               goto end;
 
        ModestFolderView *self = MODEST_FOLDER_VIEW (data);
        priv =  MODEST_FOLDER_VIEW_GET_PRIVATE (self);
@@ -416,10 +416,16 @@ text_cell_data  (GtkTreeViewColumn *column,
                                                                
                /* Use bold font style if there are unread or unset messages */
                if (number > 0) {
-                       item_name = g_strdup_printf ("%s (%d)", fname, number);
+                       if (type == TNY_FOLDER_TYPE_INBOX)
+                               item_name = g_strdup_printf ("%s (%d)", _("mcen_me_folder_inbox"), number);
+                       else
+                               item_name = g_strdup_printf ("%s (%d)", fname, number);
                        item_weight = 800;
                } else {
-                       item_name = g_strdup (fname);
+                       if (type == TNY_FOLDER_TYPE_INBOX)
+                               item_name = g_strdup (_("mcen_me_folder_inbox"));
+                       else
+                               item_name = g_strdup (fname);
                        item_weight = 400;
                }
                
@@ -476,9 +482,11 @@ text_cell_data  (GtkTreeViewColumn *column,
                modest_tny_account_get_mmc_account_name (TNY_STORE_ACCOUNT (instance), 
                                                         on_get_mmc_account_name, callback_data);
        }
-                       
-       g_object_unref (G_OBJECT (instance));
-       g_free (fname);
+ end:                  
+       if (instance)
+               g_object_unref (G_OBJECT (instance));
+       if (fname)
+               g_free (fname);
 }
 
 
@@ -1130,6 +1138,7 @@ modest_folder_view_finalize (GObject *obj)
                        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
                                                         mail_op);
                        modest_mail_operation_sync_folder (mail_op, TNY_FOLDER (priv->cur_folder_store), FALSE);
+                       g_object_unref (mail_op);
                }
 
                g_object_unref (priv->cur_folder_store);
@@ -1192,22 +1201,6 @@ modest_folder_view_set_account_store (TnyAccountStoreView *self, TnyAccountStore
 }
 
 static void
-on_connection_status_changed (TnyAccount *self, 
-                             TnyConnectionStatus status, 
-                             gpointer user_data)
-{
-       /* If the account becomes online then refresh it */
-       if (status == TNY_CONNECTION_STATUS_CONNECTED) {
-               const gchar *acc_name;
-               GtkWidget *my_window;
-
-               my_window = gtk_widget_get_ancestor (GTK_WIDGET (user_data), MODEST_TYPE_WINDOW);
-               acc_name = modest_tny_account_get_parent_modest_account_name_for_server_account (self);
-               modest_ui_actions_do_send_receive (acc_name, FALSE, MODEST_WINDOW (my_window));
-       }
-}
-
-static void
 on_account_inserted (TnyAccountStore *account_store, 
                     TnyAccount *account,
                     gpointer user_data)
@@ -1222,6 +1215,7 @@ on_account_inserted (TnyAccountStore *account_store,
 
        priv = MODEST_FOLDER_VIEW_GET_PRIVATE (user_data);
 
+
        /* If we're adding a new account, and there is no previous
           one, we need to select the visible server account */
        if (priv->style == MODEST_FOLDER_VIEW_STYLE_SHOW_ONE &&
@@ -1230,20 +1224,32 @@ on_account_inserted (TnyAccountStore *account_store,
                                              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__);
+               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));
-
-
-       /* When the store account gets online refresh it */
-       g_signal_connect (account, "connection_status_changed", 
-                         G_CALLBACK (on_connection_status_changed), 
-                         MODEST_FOLDER_VIEW (user_data));
-
+       
        /* Refilter the model */
        gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (filter_model));
 }
@@ -1262,16 +1268,32 @@ on_account_changed (TnyAccountStore *account_store,
        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;
+       }
+
+
        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__);
+               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;
+       }
 
        /* 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));
@@ -1289,7 +1311,9 @@ on_idle_select_first_inbox_or_local (gpointer user_data)
 {
        ModestFolderView *self = MODEST_FOLDER_VIEW (user_data);
 
+       gdk_threads_enter ();
        modest_folder_view_select_first_inbox_or_local (self);
+       gdk_threads_leave ();
 
        return FALSE;
 }
@@ -1311,6 +1335,11 @@ on_account_removed (TnyAccountStore *account_store,
        if (TNY_IS_TRANSPORT_ACCOUNT (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 (self);
 
@@ -1351,7 +1380,17 @@ on_account_removed (TnyAccountStore *account_store,
 
        /* 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__);
+               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;
+       }
+       
        tny_list_remove (TNY_LIST (gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (sort_model))),
                         G_OBJECT (account));
 
@@ -1593,7 +1632,7 @@ modest_folder_view_update_model (ModestFolderView *self,
        priv =  MODEST_FOLDER_VIEW_GET_PRIVATE(self);
        
        /* Notify that there is no folder selected */
-       g_signal_emit (G_OBJECT(self), 
+       g_signal_emit (G_OBJECT(self),
                       signals[FOLDER_SELECTION_CHANGED_SIGNAL], 0,
                       NULL, FALSE);
        if (priv->cur_folder_store) {
@@ -1630,7 +1669,6 @@ modest_folder_view_update_model (ModestFolderView *self,
        g_signal_connect (G_OBJECT(filter_model), "row-inserted",
                          (GCallback) on_row_inserted_maybe_select_folder, self);
 
-
        g_object_unref (model);
        g_object_unref (filter_model);          
        g_object_unref (sortable);
@@ -1977,16 +2015,19 @@ xfer_folder_cb (ModestMailOperation *mail_op,
                gpointer user_data)
 {
        DndHelper *helper;
+       GtkWidget *folder_view;
 
        helper = (DndHelper *) user_data;
+       folder_view = g_object_ref (helper->folder_view);
 
        /* Common part */
        xfer_cb (mail_op, user_data);
 
        /* Select the folder */
        if (new_folder)
-               modest_folder_view_select_folder (MODEST_FOLDER_VIEW (helper->folder_view),
+               modest_folder_view_select_folder (MODEST_FOLDER_VIEW (folder_view),
                                                  new_folder, FALSE);
+       g_object_unref (folder_view);
 }
 
 
@@ -2250,8 +2291,8 @@ drag_and_drop_from_folder_view (GtkTreeModel     *source_model,
                        forbidden = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
                } else if (TNY_IS_FOLDER_STORE(folder)) {
                        /* enable local root as destination for folders */
-                       if (!MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (folder)
-                                       && TNY_IS_ACCOUNT (folder))
+                       if (!MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (folder) && 
+                           !modest_tny_account_is_memory_card_account (TNY_ACCOUNT (folder)))
                                forbidden = TRUE;
                }
                g_object_unref (folder);
@@ -2531,9 +2572,9 @@ on_drag_motion (GtkWidget      *widget,
 
        /* Expand the selected row after 1/2 second */
        if (!gtk_tree_view_row_expanded (GTK_TREE_VIEW (widget), dest_row)) {
-               gtk_tree_view_set_drag_dest_row (GTK_TREE_VIEW (widget), dest_row, pos);
                priv->timer_expander = g_timeout_add (500, expand_row_timeout, widget);
        }
+       gtk_tree_view_set_drag_dest_row (GTK_TREE_VIEW (widget), dest_row, pos);
 
        /* Select the desired action. By default we pick MOVE */
        suggested_action = GDK_ACTION_MOVE;
@@ -2550,8 +2591,9 @@ on_drag_motion (GtkWidget      *widget,
  out:
        if (folder)
                g_object_unref (folder);
-       if (dest_row)
+       if (dest_row) {
                gtk_tree_path_free (dest_row);
+       }
        g_signal_stop_emission_by_name (widget, "drag-motion");
 
        return valid_location;