2013-02-20 [colin] 3.9.0cvs95
[claws.git] / src / plugins / rssyl / rssyl_cb_menu.c
1 /*
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>
5  *
6  * - callback handler functions for folderview rssyl context menu items
7  *
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.
12  *
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.
17  *
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.
21  */
22
23 #ifdef HAVE_CONFIG_H
24 #  include "config.h"
25 #include "claws-features.h"
26 #endif
27
28 #include <glib.h>
29 #include <glib/gi18n.h>
30
31 #include <gtk/gtk.h>
32
33 #include "folderview.h"
34 #include "alertpanel.h"
35 #include "gtk/inputdialog.h"
36 #include "prefs_common.h"
37 #include "filesel.h"
38 #include "inc.h"
39 #include "folder_item_prefs.h"
40
41 #include "feed.h"
42 #include "feedprops.h"
43 #include "opml.h"
44 #include "rssyl.h"
45 #include "rssyl_gtk.h"
46
47 void rssyl_new_feed_cb(GtkAction *action, gpointer data)
48 {
49         FolderView *folderview = (FolderView *)data;
50         GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
51         FolderItem *item;
52         gchar *new_feed;
53
54         debug_print("RSSyl: new_feed_cb\n");
55
56         g_return_if_fail(folderview->selected != NULL);
57
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);
61
62         new_feed = input_dialog(_("Subscribe feed"),
63                                          _("Input the URL of the news feed you wish to subscribe:"),
64                                          "");
65         g_return_if_fail(new_feed != NULL);
66
67         rssyl_subscribe_new_feed(item, new_feed, TRUE);
68
69         g_free(new_feed);
70 }
71
72 void rssyl_new_folder_cb(GtkAction *action, gpointer data)
73 {
74         FolderView *folderview = (FolderView *)data;
75         GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
76         FolderItem *item;
77         FolderItem *new_item;
78         gchar *new_folder;
79         gchar *name;
80         gchar *p;
81         RSSylFolderItem *ritem = NULL;
82
83         if (!folderview->selected) return;
84
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);
88
89         new_folder = input_dialog(_("New folder"),
90                                   _("Input the name of new folder:"),
91                                   _("NewFolder"));
92         if (!new_folder) return;
93         AUTORELEASE_STR(new_folder, {g_free(new_folder); return;});
94
95         p = strchr(new_folder, G_DIR_SEPARATOR);
96         if (p) {
97                 alertpanel_error(_("'%c' can't be included in folder name."),
98                                  G_DIR_SEPARATOR);
99                 return;
100         }
101
102         name = trim_string(new_folder, 32);
103         AUTORELEASE_STR(name, {g_free(name); return;});
104
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);
108                 return;
109         }
110
111         new_item = folder_create_folder(item, new_folder);
112         if (!new_item) {
113                 alertpanel_error(_("Can't create the folder '%s'."), name);
114                 return;
115         }
116
117         ritem = (RSSylFolderItem *)new_item;
118         ritem->url = NULL;
119
120         folder_write_list();
121 }
122
123 void rssyl_remove_rss_cb(GtkAction *action, gpointer data)
124 {
125         FolderView *folderview = (FolderView *)data;
126         FolderItem *item;
127         gchar *name, *message;
128         AlertValue aval;
129
130         debug_print("RSSyl: remove_rss_cb\n");
131
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) );
136
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);
142         g_free(message);
143         g_free(name);
144
145         if (aval != G_ALERTALTERNATE)
146                 return;
147
148         folderview_unselect(folderview);
149         summary_clear_all(folderview->summaryview);
150
151         folder_destroy(item->folder);
152 }
153
154 void rssyl_remove_feed_cb(GtkAction *action, gpointer data)
155 {
156         FolderView *folderview = (FolderView *)data;
157         GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
158         FolderItem *item;
159         gint response;
160         GtkWidget *dialog, *rmcache_widget = NULL;
161         gboolean rmcache = FALSE;
162         debug_print("RSSyl: remove_feed_cb\n");
163
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);
168
169         dialog = rssyl_feed_removal_dialog(item->name, &rmcache_widget);
170
171         g_return_if_fail(dialog != NULL);
172
173         gtk_widget_show_all(dialog);
174
175         response = gtk_dialog_run(GTK_DIALOG(dialog));
176
177         if( response != GTK_RESPONSE_YES ) {
178                 debug_print("'No' clicked, returning\n");
179                 gtk_widget_destroy(dialog);
180                 return;
181         }
182
183         g_return_if_fail(rmcache_widget != NULL);
184
185         rmcache = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(rmcache_widget) );
186
187         gtk_widget_destroy(dialog);
188
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;
195         }
196
197         rssyl_remove_feed_props((RSSylFolderItem *)item);
198
199         if( rmcache == TRUE )
200                 rssyl_remove_feed_cache(item);
201
202         if( item->folder->klass->remove_folder(item->folder, item) < 0 ) {
203                 gchar *tmp;
204                 tmp = g_markup_printf_escaped(_("Can't remove feed '%s'."), item->name);
205                 alertpanel_error("%s", tmp);
206                 g_free(tmp);
207                 if( folderview->opened == folderview->selected )
208                         summary_show(folderview->summaryview,
209                                         folderview->summaryview->folder_item);
210                 return;
211         }
212
213         folder_write_list();
214 }
215
216 void rssyl_remove_folder_cb(GtkAction *action, gpointer data)
217 {
218         FolderView *folderview = (FolderView *)data;
219         GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
220         FolderItem *item;
221         gchar *message, *name;
222         AlertValue avalue;
223         gchar *old_path;
224         gchar *old_id;
225
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);
230
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);
240         g_free(message);
241         if (avalue != G_ALERTALTERNATE) return;
242
243         Xstrdup_a(old_path, item->path, return);
244         old_id = folder_item_get_identifier(item);
245
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;
252         }
253
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);
257                 g_free(old_id);
258                 return;
259         }
260
261         folder_write_list();
262
263         prefs_filtering_delete_path(old_id);
264         g_free(old_id);
265
266 }
267
268 void rssyl_refresh_cb(GtkAction *action, gpointer data)
269 {
270         FolderView *folderview = (FolderView *)data;
271         FolderItem *item;
272         RSSylFolderItem *ritem;
273
274         item = folderview_get_selected_item(folderview);
275         g_return_if_fail(item != NULL);
276         g_return_if_fail(item->folder != NULL);
277
278         ritem = (RSSylFolderItem *)item;
279
280         if (prefs_common_get_prefs()->work_offline && 
281            !inc_offline_should_override(TRUE,
282                         ngettext(
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))) {
287                         return;
288         }
289
290         main_window_cursor_wait(mainwindow_get_mainwindow());
291         rssyl_update_feed(ritem);
292         main_window_cursor_normal(mainwindow_get_mainwindow());
293 }
294
295 void rssyl_refresh_all_cb(GtkAction *action, gpointer data)
296 {
297         main_window_cursor_wait(mainwindow_get_mainwindow());
298         rssyl_refresh_all_feeds();
299         main_window_cursor_normal(mainwindow_get_mainwindow());
300 }
301
302 void rssyl_prop_cb(GtkAction *action, gpointer data)
303 {
304         FolderView *folderview = (FolderView *)data;
305         FolderItem *item;
306         RSSylFolderItem *ritem;
307
308         item = folderview_get_selected_item(folderview);
309         g_return_if_fail(item != NULL);
310         g_return_if_fail(item->folder != NULL);
311
312         debug_print("RSSyl: rssyl_prop_cb() for '%s'\n", item->name);
313
314         ritem = (RSSylFolderItem *)item;
315         rssyl_get_feed_props(ritem);
316         rssyl_gtk_prop(ritem);
317 }
318
319 void rssyl_rename_cb(GtkAction *action, gpointer data)
320 {
321         FolderView *folderview = (FolderView *)data;
322         FolderItem *item;
323         gchar *new_folder;
324         gchar *name;
325         gchar *message;
326
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);
331
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);
335         g_free(message);
336         g_free(name);
337         if (!new_folder) return;
338         AUTORELEASE_STR(new_folder, {g_free(new_folder); return;});
339
340         if (strchr(new_folder, G_DIR_SEPARATOR) != NULL) {
341                 alertpanel_error(_("'%c' can't be included in folder name."),
342                                  G_DIR_SEPARATOR);
343                 return;
344         }
345
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);
349                 g_free(name);
350                 return;
351         }
352
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."));
356                 return;
357         }
358
359         folder_item_prefs_save_config_recursive(item);
360         folder_write_list();
361 }
362
363 void rssyl_import_feed_list_cb(GtkAction *action, gpointer data)
364 {
365         FolderView *folderview = (FolderView *)data;
366         debug_print("RSSyl: rssyl_import_feed_cb\n");
367
368         FolderItem *item;
369         gchar *opmlfile = NULL;
370
371         item = folderview_get_selected_item(folderview);
372         g_return_if_fail(item != NULL);
373         g_return_if_fail(item->folder != NULL);
374
375         opmlfile = filesel_select_file_open_with_filter(
376                         _("Select a .opml file"), NULL, "*.opml");
377         
378         if (!is_file_exist(opmlfile)) {
379                 g_free(opmlfile);
380                 return;
381         }
382
383         rssyl_opml_import(opmlfile, item);
384 }