#include "manual.h"
#include "timing.h"
#include "log.h"
+#include "gtkcmctree.h"
#define COL_FOLDER_WIDTH 150
#define COL_NUM_WIDTH 32
FolderItem *folderview_get_selected_item(FolderView *folderview)
{
+ g_return_val_if_fail(folderview != NULL, NULL);
+ g_return_val_if_fail(folderview->ctree != NULL, NULL);
+
GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
if (!folderview->selected) return NULL;
FolderItem *folderview_get_opened_item(FolderView *folderview)
{
+ g_return_val_if_fail(folderview != NULL, NULL);
+ g_return_val_if_fail(folderview->ctree != NULL, NULL);
+
GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
if (!folderview->opened) return NULL;
return FALSE;
}
-void folderview_close_opened(FolderView *folderview)
+void folderview_close_opened(FolderView *folderview, gboolean dirty)
{
if (folderview->opened) {
- FolderItem *olditem;
-
- olditem = gtk_cmctree_node_get_row_data(GTK_CMCTREE(folderview->ctree),
+ if (dirty) {
+ folderview->opened = NULL;
+ return;
+ }
+
+ FolderItem *olditem =
+ gtk_cmctree_node_get_row_data(GTK_CMCTREE(folderview->ctree),
folderview->opened);
if (olditem) {
gchar *buf = g_strdup_printf(_("Closing folder %s..."),
/* Save cache for old folder */
/* We don't want to lose all caches if sylpheed crashed */
/* resets folderview->opened to NULL */
- folderview_close_opened(folderview);
+ folderview_close_opened(folderview, FALSE);
/* CLAWS: set compose button type: news folder items
* always have a news folder as parent */
g_hash_table_remove(folderview_popups, fpopup->klass);
}
+void folderview_remove_item(FolderView *folderview, FolderItem *item)
+{
+ g_return_if_fail(folderview != NULL);
+ g_return_if_fail(item != NULL);
+
+ GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
+ g_return_if_fail(ctree != NULL);
+
+ GtkCMCTreeNode *node =
+ gtk_cmctree_find_by_row_data(ctree, NULL, item);
+ g_return_if_fail(node != NULL);
+
+ gtk_cmctree_remove_node(ctree, node);
+}
+
void folderview_freeze(FolderView *folderview)
{
if (folderview)
GdkDragContext *drag_context,
guint time,
FolderItem *item);
-void folderview_close_opened (FolderView *folderview);
+void folderview_close_opened (FolderView *folderview,
+ gboolean dirty);
+void folderview_remove_item(FolderView *folderview,
+ FolderItem *item);
void folderview_freeze(FolderView *folderview);
void folderview_thaw(FolderView *folderview);
gchar *p;
gchar separator = '/';
- if (!folderview->selected) return;
+ if ((item = folderview_get_selected_item(folderview)) == NULL) return;
- item = folderview_get_selected_item(folderview);
cm_return_if_fail(item != NULL);
cm_return_if_fail(item->folder != NULL);
cm_return_if_fail(item->folder->account != NULL);
static void delete_folder_cb(GtkAction *action, gpointer data)
{
FolderView *folderview = (FolderView *)data;
- GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
- FolderItem *item;
+ FolderItem *item, *opened;
gchar *message, *name;
AlertValue avalue;
gchar *old_id;
- if (!folderview->selected) return;
+ if ((item = folderview_get_selected_item(folderview)) == NULL) return;
+ opened = folderview_get_opened_item(folderview);
- item = folderview_get_selected_item(folderview);
cm_return_if_fail(item != NULL);
cm_return_if_fail(item->path != NULL);
cm_return_if_fail(item->folder != NULL);
old_id = folder_item_get_identifier(item);
- if (folderview->opened == folderview->selected ||
- gtk_cmctree_is_ancestor(ctree,
- folderview->selected,
- folderview->opened)) {
+ if (item == opened ||
+ folder_is_child_of(item, opened)) {
summary_clear_all(folderview->summaryview);
- folderview->opened = NULL;
+ folderview_close_opened(folderview, TRUE);
}
if (item->folder->klass->remove_folder(item->folder, item) < 0) {
static void subscribe_cb_full(FolderView *folderview, guint action)
{
- GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
FolderItem *item;
gchar *message, *name;
AlertValue avalue;
GtkWidget *rec_chk;
gboolean recurse = FALSE;
- if (!folderview->selected) return;
-
- item = folderview_get_selected_item(folderview);
- cm_return_if_fail(item != NULL);
+ if ((item = folderview_get_selected_item(folderview)) == NULL) return;
cm_return_if_fail(item->folder != NULL);
name = trim_string(item->name, 32);
g_free(message);
if (avalue != G_ALERTALTERNATE) return;
-
+ FolderItem *opened = folderview_get_opened_item(folderview);
+ FolderItem *selected = folderview_get_selected_item(folderview);
if (!action) {
- if (folderview->opened == folderview->selected ||
- gtk_cmctree_is_ancestor(ctree,
- folderview->selected,
- folderview->opened)) {
+ if (opened == selected ||
+ folder_is_child_of(selected, opened)) {
summary_clear_all(folderview->summaryview);
- folderview->opened = NULL;
+ folderview_close_opened(folderview, TRUE);
}
}
static void subscribed_cb(GtkAction *action, gpointer data)
{
FolderView *folderview = (FolderView *)data;
- GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
FolderItem *item = folderview_get_selected_item(folderview);
+ FolderItem *opened = folderview_get_opened_item(folderview);
if (!item || !item->folder || !item->folder->account)
return;
if (item->folder->account->imap_subsonly == gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)))
return;
- if (folderview->opened == folderview->selected ||
- gtk_cmctree_is_ancestor(ctree,
- folderview->selected,
- folderview->opened)) {
+ if (opened == item ||
+ folder_is_child_of(item, opened)) {
summary_clear_all(folderview->summaryview);
- folderview->opened = NULL;
+ folderview_close_opened(folderview, TRUE);
}
item->folder->account->imap_subsonly = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
FolderView *folderview = (FolderView *)data;
FolderItem *item;
- if (!folderview->selected) return;
-
- item = folderview_get_selected_item(folderview);
+ if ((item = folderview_get_selected_item(folderview)) == NULL) return
imap_gtk_synchronise(item, 0);
}
FolderView *folderview = mainwin->folderview;
if (!mainwin->summaryview->folder_item) return;
- if (!folderview->opened) return;
+ if ((fitem = folderview_get_opened_item(folderview)) == NULL) return;
folder_update_op_count();
-
- fitem = gtk_cmctree_node_get_row_data(GTK_CMCTREE(folderview->ctree),
- folderview->opened);
- if (!fitem) return;
-
folder_item_scan(fitem);
summary_show(mainwin->summaryview, fitem);
}
void mainwindow_exit_folder(MainWindow *mainwin) {
if (prefs_common.layout_mode == SMALL_LAYOUT) {
- folderview_close_opened(mainwin->folderview);
+ folderview_close_opened(mainwin->folderview, FALSE);
mainwin_paned_show_first(GTK_PANED(mainwin->hpaned));
folderview_grab_focus(mainwin->folderview);
}
gchar *name;
gchar *p;
- if (!folderview->selected) return;
+ if (!folderview_get_selected_item(folderview)) return;
item = folderview_get_selected_item(folderview);
cm_return_if_fail(item != NULL);
static void delete_folder_cb(GtkAction *action, gpointer data)
{
FolderView *folderview = (FolderView *)data;
- GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
- FolderItem *item;
+ FolderItem *item, *opened;
gchar *message, *name;
AlertValue avalue;
gchar *old_id;
gint ret;
item = folderview_get_selected_item(folderview);
+ opened = folderview_get_opened_item(folderview);
+
cm_return_if_fail(item != NULL);
cm_return_if_fail(item->path != NULL);
cm_return_if_fail(item->folder != NULL);
old_id = folder_item_get_identifier(item);
- if (folderview->opened == folderview->selected ||
- gtk_cmctree_is_ancestor(ctree,
- folderview->selected,
- folderview->opened)) {
+ if (item == opened ||
+ folder_is_child_of(item, opened)) {
summary_clear_all(folderview->summaryview);
- folderview->opened = NULL;
+ folderview_close_opened(folderview, TRUE);
}
if ((ret = item->folder->klass->remove_folder(item->folder, item)) < 0) {
{
FolderView *folderview = (FolderView *)data;
GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
- GtkCMCTreeNode *servernode, *node;
Folder *folder;
FolderItem *item;
FolderItem *rootitem;
GNode *gnode;
MainWindow *mainwin = mainwindow_get_mainwindow();
- if (!folderview->selected) return;
-
- item = folderview_get_selected_item(folderview);
- 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;
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);
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;
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) {
static void delete_folder_cb(GtkAction *action, gpointer data)
{
FolderView *folderview = (FolderView *)data;
- GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
- FolderItem *item;
+ FolderItem *item, *opened;
gchar *message, *name;
AlertValue avalue;
gchar *old_id;
g_return_if_fail(item != NULL);
g_return_if_fail(item->path != NULL);
g_return_if_fail(item->folder != NULL);
+ opened = folderview_get_opened_item(folderview);
name = trim_string(item->name, 32);
AUTORELEASE_STR(name, {g_free(name); return;});
old_id = folder_item_get_identifier(item);
- if (folderview->opened == folderview->selected ||
- gtk_cmctree_is_ancestor(ctree,
- folderview->selected,
- folderview->opened)) {
+ if (item == opened ||
+ folder_is_child_of(item, opened)) {
summary_clear_all(folderview->summaryview);
- folderview->opened = NULL;
+ folderview_close_opened(folderview, TRUE);
}
if (item->folder->klass->remove_folder(item->folder, item) < 0) {
alertpanel_error(_("Can't remove the folder '%s'."), name);
- if (folderview->opened == folderview->selected)
+ if (item == opened)
summary_show(folderview->summaryview,
folderview->summaryview->folder_item);
g_free(old_id);
gpointer data)
{
FolderView *folderview = (FolderView*)data;
- GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
- FolderItem *item;
+ FolderItem *item, *opened;
gchar *message, *name;
AlertValue avalue;
gchar *old_id;
g_return_if_fail(item != NULL);
g_return_if_fail(item->path != NULL);
g_return_if_fail(item->folder != NULL);
+ opened = folderview_get_opened_item(folderview);
name = trim_string(item->name, 32);
AUTORELEASE_STR(name, {g_free(name); return;});
old_id = folder_item_get_identifier(item);
- if (folderview->opened == folderview->selected ||
- gtk_cmctree_is_ancestor(ctree,
- folderview->selected,
- folderview->opened)) {
+ if (item == opened ||
+ folder_is_child_of(item, opened)) {
summary_clear_all(folderview->summaryview);
- folderview->opened = NULL;
+ folderview_close_opened(folderview, TRUE);
}
if (item->folder->klass->remove_folder(item->folder, item) < 0) {
static void unsubscribe_cal_cb(GtkAction *action, gpointer data)
{
FolderView *folderview = (FolderView *)data;
- GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
- FolderItem *item;
+ FolderItem *item, *opened;
gchar *message;
AlertValue avalue;
gchar *old_id;
g_return_if_fail(item != NULL);
g_return_if_fail(item->path != NULL);
g_return_if_fail(item->folder != NULL);
+ opened = folderview_get_opened_item(folderview);
message = g_strdup_printf
(_("Do you really want to unsubscribe?"));
vcal_item_closed(item);
- if (folderview->opened == folderview->selected ||
- gtk_cmctree_is_ancestor(ctree,
- folderview->selected,
- folderview->opened)) {
+ if (item == opened ||
+ folder_is_child_of(item, opened)) {
summary_clear_all(folderview->summaryview);
- folderview->opened = NULL;
+ folderview_close_opened(folderview, TRUE);
}
if (item->folder->klass->remove_folder(item->folder, item) < 0) {
folderview = mainwindow_get_mainwindow()->folderview;
if (folderview && item->opened) {
- folderview_close_opened(folderview);
+ folderview_close_opened(folderview, FALSE);
was_open = TRUE;
}
folder_item_discard_cache(item);