fix lost processing rules when renaming folder
[claws.git] / src / plugins / rssyl / rssyl_cb_menu.c
index 771791b1032b0ee1cd8372a327b606147a2b468b..a527bf7b80b70ad4ab28f7a688fe3f1fe2be31ee 100644 (file)
@@ -1,7 +1,8 @@
 /*
- * Claws-Mail-- a GTK+ based, lightweight, and fast e-mail client
+ * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
  * Copyright (C) 1999-2004 Hiroyuki Yamamoto
- * This file (C) 2005 Andrej Kacian <andrej@kacian.sk>
+ * This file (C) 2005-2018 Andrej Kacian <andrej@kacian.sk> and the
+ * Claws Mail team
  *
  * - callback handler functions for folderview rssyl context menu items
  *
@@ -51,7 +52,6 @@ void rssyl_new_feed_cb(GtkAction *action,
                gpointer data)
 {
        FolderView *folderview = (FolderView*)data;
-       GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
        FolderItem *item;
        gchar *url;
 
@@ -59,7 +59,7 @@ void rssyl_new_feed_cb(GtkAction *action,
 
        g_return_if_fail(folderview->selected != NULL);
 
-       item = gtk_cmctree_node_get_row_data(ctree, folderview->selected);
+       item = folderview_get_selected_item(folderview);
        g_return_if_fail(item != NULL);
        g_return_if_fail(item->folder != NULL);
 
@@ -69,7 +69,7 @@ void rssyl_new_feed_cb(GtkAction *action,
        if( url == NULL )       /* User cancelled */
                return;
 
-       rssyl_subscribe(item, url, TRUE);
+       rssyl_subscribe(item, url, RSSYL_SHOW_ERRORS | RSSYL_SHOW_RENAME_DIALOG);
 
        g_free(url);
 }
@@ -78,7 +78,6 @@ void rssyl_new_folder_cb(GtkAction *action,
                gpointer data)
 {
        FolderView *folderview = (FolderView*)data;
-       GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
        FolderItem *item;
        FolderItem *new_item;
        gchar *new_folder, *p, *tmp;
@@ -86,7 +85,7 @@ void rssyl_new_folder_cb(GtkAction *action,
 
        if (!folderview->selected) return;
 
-       item = gtk_cmctree_node_get_row_data(ctree, folderview->selected);
+       item = folderview_get_selected_item(folderview);
        g_return_if_fail(item != NULL);
        g_return_if_fail(item->folder != NULL);
 
@@ -137,8 +136,7 @@ void rssyl_remove_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;
@@ -147,6 +145,7 @@ void rssyl_remove_folder_cb(GtkAction *action,
        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;});
@@ -155,19 +154,17 @@ void rssyl_remove_folder_cb(GtkAction *action,
                   "Recovery will not be possible.\n\n"
                   "Do you really want to delete?"), name);
        avalue = alertpanel_full(_("Delete folder"), message,
-                                GTK_STOCK_CANCEL, GTK_STOCK_DELETE, NULL, FALSE,
-                                NULL, ALERT_WARNING, G_ALERTDEFAULT);
+                                GTK_STOCK_CANCEL, GTK_STOCK_DELETE, NULL, ALERTFOCUS_FIRST, FALSE,
+                                NULL, ALERT_WARNING);
        g_free(message);
        if (avalue != G_ALERTALTERNATE) 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) {
@@ -189,7 +186,6 @@ void rssyl_rename_cb(GtkAction *action,
 {
        FolderItem *item;
        gchar *new_folder;
-       gchar *name;
        gchar *message;
        FolderView *folderview = (FolderView*)data;
        item = folderview_get_selected_item(folderview);
@@ -197,11 +193,9 @@ void rssyl_rename_cb(GtkAction *action,
        g_return_if_fail(item->path != NULL);
        g_return_if_fail(item->folder != NULL);
 
-       name = trim_string(item->name, 32);
-       message = g_strdup_printf(_("Input new name for '%s':"), name);
-       new_folder = input_dialog(_("Rename folder"), message, name);
+       message = g_strdup_printf(_("Input new name for '%s':"), item->name);
+       new_folder = input_dialog(_("Rename folder"), message, item->name);
        g_free(message);
-       g_free(name);
        if (!new_folder) return;
 
        if (strchr(new_folder, G_DIR_SEPARATOR) != NULL) {
@@ -217,9 +211,7 @@ void rssyl_rename_cb(GtkAction *action,
        }
 
        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);
+               alertpanel_error(_("The folder '%s' already exists."), new_folder);
                g_free(new_folder);
                return;
        }
@@ -233,6 +225,7 @@ void rssyl_rename_cb(GtkAction *action,
        g_free(new_folder);
 
        folder_item_prefs_save_config(item);
+       prefs_matcher_write_config();
        folder_write_list();
 }
 
@@ -250,7 +243,7 @@ void rssyl_refresh_feed_cb(GtkAction *action,
        ritem = (RFolderItem *)item;
 
        /* Offline check */
-       if( prefs_common.work_offline &&
+       if( prefs_common_get_prefs()->work_offline &&
                        !inc_offline_should_override(TRUE,
                                        ngettext("Claws Mail needs network access in order "
                                        "to update the feed.",
@@ -260,7 +253,7 @@ void rssyl_refresh_feed_cb(GtkAction *action,
        }
 
        /* Update feed, displaying errors if any. */
-       rssyl_update_feed(ritem, TRUE);
+       rssyl_update_feed(ritem, RSSYL_SHOW_ERRORS);
 }
 
 void rssyl_prop_cb(GtkAction *action, gpointer data)
@@ -296,6 +289,16 @@ void rssyl_update_all_cb( GtkAction *action, gpointer data)
                return;
        }
 
+       /* Offline check */
+       if( prefs_common_get_prefs()->work_offline &&
+                       !inc_offline_should_override(TRUE,
+                                       ngettext("Claws Mail needs network access in order "
+                                       "to update the feed.",
+                                       "Claws Mail needs network access in order "
+                                       "to update feeds.", 1))) {
+               return;
+       }
+
        rssyl_update_recursively(item);
 }
 
@@ -317,8 +320,8 @@ void rssyl_remove_mailbox_cb(GtkAction *action, gpointer data)
        n = trim_string(item->folder->name, 32);
        message = g_strdup_printf(_("Really remove the feed tree `%s' ?\n"), n);
        avalue = alertpanel_full(_("Remove feed tree"), message,
-                                GTK_STOCK_CANCEL, _("_Remove"), NULL, FALSE,
-                                NULL, ALERT_WARNING, G_ALERTDEFAULT);
+                                GTK_STOCK_CANCEL, _("_Remove"), NULL, ALERTFOCUS_FIRST, FALSE,
+                                NULL, ALERT_WARNING);
        g_free(message);
        g_free(n);
 
@@ -330,7 +333,7 @@ void rssyl_remove_mailbox_cb(GtkAction *action, gpointer data)
 
        n = folder_item_get_path(item);
        if( remove_dir_recursive(n) < 0 ) {
-               g_warning("can't remove directory '%s'\n", n);
+               g_warning("can't remove directory '%s'", n);
                g_free(n);
                return;
        }
@@ -342,7 +345,6 @@ void rssyl_remove_mailbox_cb(GtkAction *action, gpointer data)
 void rssyl_import_feed_list_cb(GtkAction *action, gpointer data)
 {
        FolderView *folderview = (FolderView *)data;
-       GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
        FolderItem *item = NULL;
        gchar *path = NULL;
        OPMLImportCtx *ctx = NULL;
@@ -359,16 +361,13 @@ void rssyl_import_feed_list_cb(GtkAction *action, gpointer data)
 
        /* Find the destination folder for the import */
        g_return_if_fail(folderview->selected != NULL);
-       item = gtk_cmctree_node_get_row_data(ctree, folderview->selected);
+       item = folderview_get_selected_item(folderview);
        g_return_if_fail(item != NULL);
        g_return_if_fail(item->folder != NULL);
 
        ctx = malloc( sizeof(OPMLImportCtx) );
        ctx->failures = 0;
-       /* This needs to be +2, since we will be comparing it to depth of
-        * <outline> tag in OPML's XML structure. Topmost outlines are under
-        * <opml> and <body>, hence 2. */
-       ctx->depth = rssyl_folder_depth(item) + 2;
+       ctx->depth = rssyl_folder_depth(item) + 1;
        ctx->current = NULL;
        ctx->current = g_slist_append(ctx->current, item);