2 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2004 Hiroyuki Yamamoto
4 * This file (C) 2005 Andrej Kacian <andrej@kacian.sk>
6 * - callback handler functions for folderview rssyl context menu items
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25 #include "claws-features.h"
29 #include <glib/gi18n.h>
33 #include "folderview.h"
34 #include "alertpanel.h"
35 #include "gtk/inputdialog.h"
36 #include "prefs_common.h"
39 #include "folder_item_prefs.h"
42 #include "feedprops.h"
45 #include "rssyl_gtk.h"
47 void rssyl_new_feed_cb(GtkAction *action, gpointer data)
49 FolderView *folderview = (FolderView *)data;
50 GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
54 debug_print("RSSyl: new_feed_cb\n");
56 g_return_if_fail(folderview->selected != NULL);
58 item = gtk_cmctree_node_get_row_data(ctree, folderview->selected);
59 g_return_if_fail(item != NULL);
60 g_return_if_fail(item->folder != NULL);
62 new_feed = input_dialog(_("Subscribe feed"),
63 _("Input the URL of the news feed you wish to subscribe:"),
65 g_return_if_fail(new_feed != NULL);
67 rssyl_subscribe_new_feed(item, new_feed, TRUE);
72 void rssyl_new_folder_cb(GtkAction *action, gpointer data)
74 FolderView *folderview = (FolderView *)data;
75 GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
81 RSSylFolderItem *ritem = NULL;
83 if (!folderview->selected) return;
85 item = gtk_cmctree_node_get_row_data(ctree, folderview->selected);
86 g_return_if_fail(item != NULL);
87 g_return_if_fail(item->folder != NULL);
89 new_folder = input_dialog(_("New folder"),
90 _("Input the name of new folder:"),
92 if (!new_folder) return;
93 AUTORELEASE_STR(new_folder, {g_free(new_folder); return;});
95 p = strchr(new_folder, G_DIR_SEPARATOR);
97 alertpanel_error(_("'%c' can't be included in folder name."),
102 name = trim_string(new_folder, 32);
103 AUTORELEASE_STR(name, {g_free(name); return;});
105 /* find whether the directory already exists */
106 if (folder_find_child_item_by_name(item, new_folder)) {
107 alertpanel_error(_("The folder '%s' already exists."), name);
111 new_item = folder_create_folder(item, new_folder);
113 alertpanel_error(_("Can't create the folder '%s'."), name);
117 ritem = (RSSylFolderItem *)new_item;
123 void rssyl_remove_rss_cb(GtkAction *action, gpointer data)
125 FolderView *folderview = (FolderView *)data;
127 gchar *name, *message;
130 debug_print("RSSyl: remove_rss_cb\n");
132 item = folderview_get_selected_item(folderview);
133 g_return_if_fail(item != NULL);
134 g_return_if_fail(item->folder != NULL);
135 g_return_if_fail( !folder_item_parent(item) );
137 name = trim_string(item->folder->name, 32);
138 message = g_strdup_printf(_("Really remove the folder tree '%s' ?\n"), name);
139 aval = alertpanel_full(_("Remove folder tree"), message,
140 GTK_STOCK_CANCEL, _("_Remove"), NULL, FALSE, NULL,
141 ALERT_WARNING, G_ALERTDEFAULT);
145 if (aval != G_ALERTALTERNATE)
148 folderview_unselect(folderview);
149 summary_clear_all(folderview->summaryview);
151 folder_destroy(item->folder);
154 void rssyl_remove_feed_cb(GtkAction *action, gpointer data)
156 FolderView *folderview = (FolderView *)data;
157 GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
160 GtkWidget *dialog, *rmcache_widget = NULL;
161 gboolean rmcache = FALSE;
162 debug_print("RSSyl: remove_feed_cb\n");
164 item = folderview_get_selected_item(folderview);
165 g_return_if_fail(item != NULL);
166 g_return_if_fail(item->path != NULL);
167 g_return_if_fail(item->folder != NULL);
169 dialog = rssyl_feed_removal_dialog(item->name, &rmcache_widget);
171 g_return_if_fail(dialog != NULL);
173 gtk_widget_show_all(dialog);
175 response = gtk_dialog_run(GTK_DIALOG(dialog));
177 if( response != GTK_RESPONSE_YES ) {
178 debug_print("'No' clicked, returning\n");
179 gtk_widget_destroy(dialog);
183 g_return_if_fail(rmcache_widget != NULL);
185 rmcache = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(rmcache_widget) );
187 gtk_widget_destroy(dialog);
189 if( folderview->opened == folderview->selected ||
190 gtk_cmctree_is_ancestor(ctree,
191 folderview->selected,
192 folderview->opened) ) {
193 summary_clear_all(folderview->summaryview);
194 folderview->opened = NULL;
197 rssyl_remove_feed_props((RSSylFolderItem *)item);
199 if( rmcache == TRUE )
200 rssyl_remove_feed_cache(item);
202 if( item->folder->klass->remove_folder(item->folder, item) < 0 ) {
204 tmp = g_markup_printf_escaped(_("Can't remove feed '%s'."), item->name);
205 alertpanel_error("%s", tmp);
207 if( folderview->opened == folderview->selected )
208 summary_show(folderview->summaryview,
209 folderview->summaryview->folder_item);
216 void rssyl_remove_folder_cb(GtkAction *action, gpointer data)
218 FolderView *folderview = (FolderView *)data;
219 GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
221 gchar *message, *name;
226 item = folderview_get_selected_item(folderview);
227 g_return_if_fail(item != NULL);
228 g_return_if_fail(item->path != NULL);
229 g_return_if_fail(item->folder != NULL);
231 name = trim_string(item->name, 32);
232 AUTORELEASE_STR(name, {g_free(name); return;});
233 message = g_strdup_printf
234 (_("All folders and messages under '%s' will be permanently deleted. "
235 "Recovery will not be possible.\n\n"
236 "Do you really want to delete?"), name);
237 avalue = alertpanel_full(_("Delete folder"), message,
238 GTK_STOCK_CANCEL, GTK_STOCK_DELETE, NULL, FALSE,
239 NULL, ALERT_WARNING, G_ALERTDEFAULT);
241 if (avalue != G_ALERTALTERNATE) return;
243 Xstrdup_a(old_path, item->path, return);
244 old_id = folder_item_get_identifier(item);
246 if (folderview->opened == folderview->selected ||
247 gtk_cmctree_is_ancestor(ctree,
248 folderview->selected,
249 folderview->opened)) {
250 summary_clear_all(folderview->summaryview);
251 folderview->opened = NULL;
254 if (item->folder->klass->remove_folder(item->folder, item) < 0) {
255 folder_item_scan(item);
256 alertpanel_error(_("Can't remove the folder '%s'."), name);
263 prefs_filtering_delete_path(old_id);
268 void rssyl_refresh_cb(GtkAction *action, gpointer data)
270 FolderView *folderview = (FolderView *)data;
272 RSSylFolderItem *ritem;
274 item = folderview_get_selected_item(folderview);
275 g_return_if_fail(item != NULL);
276 g_return_if_fail(item->folder != NULL);
278 ritem = (RSSylFolderItem *)item;
280 if (prefs_common_get_prefs()->work_offline &&
281 !inc_offline_should_override(TRUE,
283 "Claws Mail needs network access in order "
284 "to update the feed.",
285 "Claws Mail needs network access in order "
286 "to update the feeds.", 1))) {
290 main_window_cursor_wait(mainwindow_get_mainwindow());
291 rssyl_update_feed(ritem);
292 main_window_cursor_normal(mainwindow_get_mainwindow());
295 void rssyl_refresh_all_cb(GtkAction *action, gpointer data)
297 main_window_cursor_wait(mainwindow_get_mainwindow());
298 rssyl_refresh_all_feeds();
299 main_window_cursor_normal(mainwindow_get_mainwindow());
302 void rssyl_prop_cb(GtkAction *action, gpointer data)
304 FolderView *folderview = (FolderView *)data;
306 RSSylFolderItem *ritem;
308 item = folderview_get_selected_item(folderview);
309 g_return_if_fail(item != NULL);
310 g_return_if_fail(item->folder != NULL);
312 debug_print("RSSyl: rssyl_prop_cb() for '%s'\n", item->name);
314 ritem = (RSSylFolderItem *)item;
315 rssyl_get_feed_props(ritem);
316 rssyl_gtk_prop(ritem);
319 void rssyl_rename_cb(GtkAction *action, gpointer data)
321 FolderView *folderview = (FolderView *)data;
327 item = folderview_get_selected_item(folderview);
328 g_return_if_fail(item != NULL);
329 g_return_if_fail(item->path != NULL);
330 g_return_if_fail(item->folder != NULL);
332 name = trim_string(item->name, 32);
333 message = g_strdup_printf(_("Input new name for '%s':"), name);
334 new_folder = input_dialog(_("Rename folder"), message, item->name);
337 if (!new_folder) return;
338 AUTORELEASE_STR(new_folder, {g_free(new_folder); return;});
340 if (strchr(new_folder, G_DIR_SEPARATOR) != NULL) {
341 alertpanel_error(_("'%c' can't be included in folder name."),
346 if (folder_find_child_item_by_name(folder_item_parent(item), new_folder)) {
347 name = trim_string(new_folder, 32);
348 alertpanel_error(_("The folder '%s' already exists."), name);
353 if (folder_item_rename(item, new_folder) < 0) {
354 alertpanel_error(_("The folder could not be renamed.\n"
355 "The new folder name is not allowed."));
359 folder_item_prefs_save_config_recursive(item);
363 void rssyl_import_feed_list_cb(GtkAction *action, gpointer data)
365 FolderView *folderview = (FolderView *)data;
366 debug_print("RSSyl: rssyl_import_feed_cb\n");
369 gchar *opmlfile = NULL;
371 item = folderview_get_selected_item(folderview);
372 g_return_if_fail(item != NULL);
373 g_return_if_fail(item->folder != NULL);
375 opmlfile = filesel_select_file_open_with_filter(
376 _("Select a .opml file"), NULL, "*.opml");
378 if (!is_file_exist(opmlfile)) {
383 rssyl_opml_import(opmlfile, item);