Remove last outside gtk_cmclist_freeze/thaw for summaryview&folderview ctrees.
[claws.git] / src / news_gtk.c
index edd75acbbae766f9f718363008ac0a00b40403c2..e49c2b8c40e94fb3ce4d7ec5319f898bb0d6fa5e 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2009 Hiroyuki Yamamoto & the Claws Mail Team
+ * Copyright (C) 1999-2012 Hiroyuki Yamamoto & the Claws Mail Team
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,6 +19,7 @@
 
 #ifdef HAVE_CONFIG_H
 #  include "config.h"
+#include "claws-features.h"
 #endif
 
 #include "defs.h"
@@ -148,8 +149,6 @@ static FolderItem *news_find_child_item(FolderItem *item, const gchar *path)
 static void subscribe_newsgroup_cb(GtkAction *action, gpointer data)
 {
        FolderView *folderview = (FolderView *)data;
-       GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
-       GtkCMCTreeNode *servernode, *node;
        Folder *folder;
        FolderItem *item;
        FolderItem *rootitem;
@@ -159,10 +158,7 @@ static void subscribe_newsgroup_cb(GtkAction *action, gpointer data)
        GNode *gnode;
        MainWindow *mainwin = mainwindow_get_mainwindow();
        
-       if (!folderview->selected) return;
-
-       item = gtk_cmctree_node_get_row_data(ctree, folderview->selected);
-       cm_return_if_fail(item != NULL);
+       if ((item = folderview_get_selected_item(folderview)) == NULL) return;
 
        if (mainwin->lock_count || news_folder_locked(item->folder))
                return;
@@ -172,12 +168,8 @@ static void subscribe_newsgroup_cb(GtkAction *action, gpointer data)
        cm_return_if_fail(FOLDER_TYPE(folder) == F_NEWS);
        cm_return_if_fail(folder->account != NULL);
 
-       if (GTK_CMCTREE_ROW(folderview->selected)->parent != NULL)
-               servernode = GTK_CMCTREE_ROW(folderview->selected)->parent;
-       else
-               servernode = folderview->selected;
-
-       rootitem = gtk_cmctree_node_get_row_data(ctree, servernode);
+       if ((rootitem = folder_item_parent(item)) == NULL)
+               rootitem = item;
 
        new_subscr = grouplist_dialog(folder);
 
@@ -192,24 +184,18 @@ static void subscribe_newsgroup_cb(GtkAction *action, gpointer data)
                        continue;
                }
 
-               node = gtk_cmctree_find_by_row_data(ctree, servernode, item);
-               if (!node) {
-                       gnode = next;
-                       continue;
-               }
-
-               if (folderview->opened == node) {
+               if (folderview_get_opened_item(folderview) == item) {
                        summary_clear_all(folderview->summaryview);
-                       folderview->opened = NULL;
+                       folderview_close_opened(folderview, TRUE);
                }
 
-               gtk_cmctree_remove_node(ctree, node);
+               folderview_remove_item(folderview, item);
                folder_item_remove(item);
 
                gnode = next;
        }
 
-       gtk_cmclist_freeze(GTK_CMCLIST(ctree));
+       folderview_freeze(folderview);
 
        /* add subscribed newsgroups */
        for (cur = new_subscr; cur != NULL; cur = cur->next) {
@@ -225,13 +211,13 @@ static void subscribe_newsgroup_cb(GtkAction *action, gpointer data)
                hookdata.folder = newitem->folder;
                hookdata.update_flags = FOLDER_TREE_CHANGED | FOLDER_ADD_FOLDERITEM;
                hookdata.item = newitem;
+               hookdata.item2 = NULL;
                hooks_invoke(FOLDER_UPDATE_HOOKLIST, &hookdata);
        }
 
-       gtk_cmclist_thaw(GTK_CMCLIST(ctree));
+       folderview_thaw(folderview);
 
-       slist_free_strings(new_subscr);
-       g_slist_free(new_subscr);
+       slist_free_strings_full(new_subscr);
 
        folder_write_list();
 }
@@ -239,7 +225,6 @@ static void subscribe_newsgroup_cb(GtkAction *action, gpointer data)
 static void unsubscribe_newsgroup_cb(GtkAction *action, gpointer data)
 {
        FolderView *folderview = (FolderView *)data;
-       GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
        FolderItem *item;
        gchar *name;
        gchar *message;
@@ -249,7 +234,7 @@ static void unsubscribe_newsgroup_cb(GtkAction *action, gpointer data)
        
        if (!folderview->selected) return;
 
-       item = gtk_cmctree_node_get_row_data(ctree, folderview->selected);
+       item = folderview_get_selected_item(folderview);
        cm_return_if_fail(item != NULL);
 
        if (mainwin->lock_count || news_folder_locked(item->folder))
@@ -270,9 +255,9 @@ static void unsubscribe_newsgroup_cb(GtkAction *action, gpointer data)
        g_free(name);
        if (avalue != G_ALERTALTERNATE) return;
 
-       if (folderview->opened == folderview->selected) {
+       if (item == folderview_get_opened_item(folderview)) {
                summary_clear_all(folderview->summaryview);
-               folderview->opened = NULL;
+               folderview_close_opened(folderview, TRUE);
        }
 
        if(item->folder->klass->remove_folder(item->folder, item) < 0) {
@@ -288,21 +273,6 @@ static void unsubscribe_newsgroup_cb(GtkAction *action, gpointer data)
        g_free(old_id);
 }
 
-static FolderItem *find_child_by_name(FolderItem *item, const gchar *name)
-{
-       GNode *node;
-       FolderItem *child;
-
-       for (node = item->node->children; node != NULL; node = node->next) {
-               child = FOLDER_ITEM(node->data);
-               if (strcmp2(child->name, name) == 0) {
-                       return child;
-               }
-       }
-
-       return NULL;
-}
-
 static void rename_newsgroup_cb(GtkAction *action, gpointer data)
 {
        FolderView *folderview = (FolderView *)data;
@@ -331,7 +301,7 @@ static void rename_newsgroup_cb(GtkAction *action, gpointer data)
                return;
        }
 
-       if (find_child_by_name(folder_item_parent(item), new_folder)) {
+       if (folder_find_child_item_by_name(folder_item_parent(item), new_folder)) {
                name = trim_string(new_folder, 32);
                alertpanel_error(_("The folder '%s' already exists."), name);
                g_free(name);
@@ -425,11 +395,10 @@ void news_gtk_synchronise(FolderItem *item, gint days)
 static void download_cb(GtkAction *action, gpointer data)
 {
        FolderView *folderview = (FolderView *)data;
-       GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
        FolderItem *item;
 
        if (!folderview->selected) return;
 
-       item = gtk_cmctree_node_get_row_data(ctree, folderview->selected);
+       item = folderview_get_selected_item(folderview);
        news_gtk_synchronise(item, 0);
 }