Remove last outside gtk_cmclist_freeze/thaw for summaryview&folderview ctrees.
[claws.git] / src / news_gtk.c
index 01743233afd285b42dd12fa702e068da29dc274d..e49c2b8c40e94fb3ce4d7ec5319f898bb0d6fa5e 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2007 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"
@@ -130,11 +131,24 @@ static void set_sensitivity(GtkUIManager *ui_manager, FolderItem *item)
 #undef SET_SENS
 }
 
+static FolderItem *news_find_child_item(FolderItem *item, const gchar *path)
+{
+       GNode *node;
+       FolderItem *child;
+
+       for (node = item->node->children; node != NULL; node = node->next) {
+               child = FOLDER_ITEM(node->data);
+               if (strcmp2(child->path, path) == 0) {
+                       return child;
+               }
+       }
+
+       return NULL;
+}
+
 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;
@@ -144,25 +158,18 @@ 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);
-       g_return_if_fail(item != NULL);
+       if ((item = folderview_get_selected_item(folderview)) == NULL) return;
 
        if (mainwin->lock_count || news_folder_locked(item->folder))
                return;
 
        folder = item->folder;
-       g_return_if_fail(folder != NULL);
-       g_return_if_fail(FOLDER_TYPE(folder) == F_NEWS);
-       g_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;
+       cm_return_if_fail(folder != NULL);
+       cm_return_if_fail(FOLDER_TYPE(folder) == F_NEWS);
+       cm_return_if_fail(folder->account != NULL);
 
-       rootitem = gtk_cmctree_node_get_row_data(ctree, servernode);
+       if ((rootitem = folder_item_parent(item)) == NULL)
+               rootitem = item;
 
        new_subscr = grouplist_dialog(folder);
 
@@ -177,31 +184,25 @@ 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) {
                gchar *name = (gchar *)cur->data;
                FolderUpdateData hookdata;
 
-               if (folder_find_child_item_by_name(rootitem, name) != NULL)
+               if (news_find_child_item(rootitem, name) != NULL)
                        continue;
 
                newitem = folder_item_new(folder, name, name);
@@ -210,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();
 }
@@ -224,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;
@@ -234,15 +234,15 @@ static void unsubscribe_newsgroup_cb(GtkAction *action, gpointer data)
        
        if (!folderview->selected) return;
 
-       item = gtk_cmctree_node_get_row_data(ctree, folderview->selected);
-       g_return_if_fail(item != NULL);
+       item = folderview_get_selected_item(folderview);
+       cm_return_if_fail(item != NULL);
 
        if (mainwin->lock_count || news_folder_locked(item->folder))
                return;
 
-       g_return_if_fail(item->folder != NULL);
-       g_return_if_fail(FOLDER_TYPE(item->folder) == F_NEWS);
-       g_return_if_fail(item->folder->account != NULL);
+       cm_return_if_fail(item->folder != NULL);
+       cm_return_if_fail(FOLDER_TYPE(item->folder) == F_NEWS);
+       cm_return_if_fail(item->folder->account != NULL);
 
        old_id = folder_item_get_identifier(item);
 
@@ -255,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) {
@@ -273,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;
@@ -297,9 +282,9 @@ static void rename_newsgroup_cb(GtkAction *action, gpointer data)
        gchar *message;
 
        item = folderview_get_selected_item(folderview);
-       g_return_if_fail(item != NULL);
-       g_return_if_fail(item->path != NULL);
-       g_return_if_fail(item->folder != NULL);
+       cm_return_if_fail(item != NULL);
+       cm_return_if_fail(item->path != NULL);
+       cm_return_if_fail(item->folder != NULL);
 
        name = trim_string(item->name, 32);
        message = g_strdup_printf(_("Input new name for '%s':"), name);
@@ -316,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);
@@ -339,14 +324,14 @@ static void update_tree_cb(GtkAction *action, gpointer data)
        MainWindow *mainwin = mainwindow_get_mainwindow();
        
        item = folderview_get_selected_item(folderview);
-       g_return_if_fail(item != NULL);
+       cm_return_if_fail(item != NULL);
 
        if (mainwin->lock_count || news_folder_locked(item->folder))
                return;
 
        summary_show(folderview->summaryview, NULL);
 
-       g_return_if_fail(item->folder != NULL);
+       cm_return_if_fail(item->folder != NULL);
 
        folderview_check_new(item->folder);
 }
@@ -357,7 +342,7 @@ static void sync_cb(GtkAction *action, gpointer data)
        FolderItem *item;
 
        item = folderview_get_selected_item(folderview);
-       g_return_if_fail(item != NULL);
+       cm_return_if_fail(item != NULL);
        folder_synchronise(item->folder);
 }
 
@@ -371,8 +356,8 @@ void news_gtk_synchronise(FolderItem *item, gint days)
        gint total = 0;
        time_t t = time(NULL);
 
-       g_return_if_fail(item != NULL);
-       g_return_if_fail(item->folder != NULL);
+       cm_return_if_fail(item != NULL);
+       cm_return_if_fail(item->folder != NULL);
 
        if (mainwin->lock_count || news_folder_locked(item->folder))
                return;
@@ -410,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);
 }