2 * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2008 Michael Rasmussen and the Claws Mail Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include "claws-features.h"
26 #include <glib/gi18n.h>
35 #include "prefs_gtk.h"
36 #include "prefswindow.h"
37 #include "alertpanel.h"
41 #include "archiver_prefs.h"
43 #define PREFS_BLOCK_NAME "Archiver"
45 ArchiverPrefs archiver_prefs
;
47 struct ArchiverPrefsPage
{
49 GtkWidget
*save_folder
;
51 GtkWidget
*zip_radiobtn
;
52 GtkWidget
*bzip_radiobtn
;
53 GtkWidget
*compress_radiobtn
;
54 GtkWidget
*none_radiobtn
;
55 GtkWidget
*tar_radiobtn
;
56 GtkWidget
*shar_radiobtn
;
57 GtkWidget
*cpio_radiobtn
;
58 GtkWidget
*pax_radiobtn
;
59 GtkWidget
*recursive_chkbtn
;
60 GtkWidget
*md5sum_chkbtn
;
61 GtkWidget
*rename_chkbtn
;
62 GtkWidget
*unlink_chkbtn
;
65 struct ArchiverPrefsPage archiver_prefs_page
;
67 static void create_archiver_prefs_page (PrefsPage
*page
,
70 static void destroy_archiver_prefs_page (PrefsPage
*page
);
71 static void save_archiver_prefs (PrefsPage
*page
);
73 static PrefParam param
[] = {
74 {"save_folder", NULL
, &archiver_prefs
.save_folder
, P_STRING
, NULL
, NULL
, NULL
},
75 {"compression", "0", &archiver_prefs
.compression
, P_ENUM
, NULL
, NULL
, NULL
},
76 {"format", "0", &archiver_prefs
.format
, P_ENUM
, NULL
, NULL
, NULL
},
77 {"recursive", "TRUE", &archiver_prefs
.recursive
, P_BOOL
, NULL
, NULL
, NULL
},
78 {"md5sum", "FALSE", &archiver_prefs
.md5sum
, P_BOOL
, NULL
, NULL
, NULL
},
79 {"rename", "FALSE", &archiver_prefs
.rename
, P_BOOL
, NULL
, NULL
, NULL
},
80 {"unlink", "FALSE", &archiver_prefs
.unlink
, P_BOOL
, NULL
, NULL
, NULL
},
82 {NULL
, NULL
, NULL
, P_OTHER
, NULL
, NULL
, NULL
}
85 void archiver_prefs_init(void)
87 static gchar
*path
[3];
90 path
[0] = _("Plugins");
91 path
[1] = _("Mail Archiver");
94 prefs_set_default(param
);
95 rcpath
= g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S
, COMMON_RC
, NULL
);
96 prefs_read_config(param
, PREFS_BLOCK_NAME
, rcpath
, NULL
);
99 archiver_prefs_page
.page
.path
= path
;
100 archiver_prefs_page
.page
.create_widget
= create_archiver_prefs_page
;
101 archiver_prefs_page
.page
.destroy_widget
= destroy_archiver_prefs_page
;
102 archiver_prefs_page
.page
.save_page
= save_archiver_prefs
;
103 archiver_prefs_page
.page
.weight
= 30.0;
105 prefs_gtk_register_page((PrefsPage
*) &archiver_prefs_page
);
108 void archiver_prefs_done(void)
110 prefs_gtk_unregister_page((PrefsPage
*) &archiver_prefs_page
);
113 static void foldersel_cb(GtkWidget
*widget
, gpointer data
)
115 struct ArchiverPrefsPage
*page
= (struct ArchiverPrefsPage
*) data
;
116 gchar
*startdir
= NULL
;
120 if (archiver_prefs
.save_folder
&& *archiver_prefs
.save_folder
)
121 startdir
= g_strconcat(archiver_prefs
.save_folder
,
122 G_DIR_SEPARATOR_S
, NULL
);
124 startdir
= g_strdup(get_home_dir());
126 dirname
= filesel_select_file_save_folder(_("Select destination folder"), startdir
);
131 if (!is_dir_exist(dirname
)) {
132 alertpanel_error(_("'%s' is not a directory."),dirname
);
137 if (dirname
[strlen(dirname
)-1] == G_DIR_SEPARATOR
)
138 dirname
[strlen(dirname
)-1] = '\0';
141 tmp
= g_filename_to_utf8(dirname
,-1, NULL
, NULL
, NULL
);
142 gtk_entry_set_text(GTK_ENTRY(page
->save_folder
), tmp
);
148 static void create_archiver_prefs_page(PrefsPage
* _page
,
152 struct ArchiverPrefsPage
*page
= (struct ArchiverPrefsPage
*) _page
;
153 GtkWidget
*vbox1
, *vbox2
;
155 GtkWidget
*save_folder_label
;
156 GtkWidget
*save_folder
;
157 GtkWidget
*save_folder_select
;
159 GSList
*compression_group
= NULL
;
160 GtkWidget
*zip_radiobtn
;
161 GtkWidget
*bzip_radiobtn
;
162 GtkWidget
*compress_radiobtn
;
163 GtkWidget
*none_radiobtn
;
164 GSList
*format_group
= NULL
;
165 GtkWidget
*tar_radiobtn
;
166 GtkWidget
*shar_radiobtn
;
167 GtkWidget
*cpio_radiobtn
;
168 GtkWidget
*pax_radiobtn
;
169 GtkWidget
*recursive_chkbtn
;
170 GtkWidget
*md5sum_chkbtn
;
171 GtkWidget
*rename_chkbtn
;
172 GtkWidget
*unlink_chkbtn
;
174 vbox1
= gtk_vbox_new (FALSE
, VSPACING
);
175 gtk_widget_show (vbox1
);
176 gtk_container_set_border_width (GTK_CONTAINER (vbox1
), VBOX_BORDER
);
178 vbox2
= gtk_vbox_new (FALSE
, 4);
179 gtk_widget_show (vbox2
);
180 gtk_box_pack_start (GTK_BOX (vbox1
), vbox2
, FALSE
, FALSE
, 0);
182 hbox1
= gtk_hbox_new (FALSE
, 8);
183 gtk_widget_show (hbox1
);
184 gtk_box_pack_start (GTK_BOX (vbox2
), hbox1
, FALSE
, FALSE
, 0);
186 save_folder_label
= gtk_label_new(_("Default save folder"));
187 gtk_widget_show (save_folder_label
);
188 gtk_box_pack_start (GTK_BOX (hbox1
), save_folder_label
, FALSE
, FALSE
, 0);
190 save_folder
= gtk_entry_new ();
191 gtk_widget_show (save_folder
);
192 gtk_box_pack_start (GTK_BOX (hbox1
), save_folder
, TRUE
, TRUE
, 0);
194 save_folder_select
= gtkut_get_browse_directory_btn(_("_Select"));
195 gtk_widget_show (save_folder_select
);
196 gtk_box_pack_start (GTK_BOX (hbox1
), save_folder_select
, FALSE
, FALSE
, 0);
197 CLAWS_SET_TIP(save_folder_select
,
198 _("Click this button to select the default location for saving archives"));
200 g_signal_connect(G_OBJECT(save_folder_select
), "clicked",
201 G_CALLBACK(foldersel_cb
), page
);
203 if (archiver_prefs
.save_folder
!= NULL
)
204 gtk_entry_set_text(GTK_ENTRY(save_folder
),
205 archiver_prefs
.save_folder
);
207 PACK_FRAME (vbox1
, frame
, _("Default compression"));
209 hbox1
= gtk_hbox_new(FALSE
, 4);
210 gtk_widget_show(hbox1
);
211 gtk_container_set_border_width(GTK_CONTAINER(hbox1
), 4);
212 gtk_container_add(GTK_CONTAINER(frame
), hbox1
);
214 zip_radiobtn
= gtk_radio_button_new_with_label(compression_group
, "ZIP");
215 compression_group
= gtk_radio_button_get_group(GTK_RADIO_BUTTON(zip_radiobtn
));
216 gtk_widget_show(zip_radiobtn
);
217 gtk_box_pack_start(GTK_BOX (hbox1
), zip_radiobtn
, FALSE
, FALSE
, 0);
218 CLAWS_SET_TIP(zip_radiobtn
,
219 _("Choose this option to use ZIP compression by default"));
221 bzip_radiobtn
= gtk_radio_button_new_with_label(compression_group
, "BZIP2");
222 compression_group
= gtk_radio_button_get_group(GTK_RADIO_BUTTON(bzip_radiobtn
));
223 gtk_widget_show(bzip_radiobtn
);
224 gtk_box_pack_start(GTK_BOX (hbox1
), bzip_radiobtn
, FALSE
, FALSE
, 0);
225 CLAWS_SET_TIP(bzip_radiobtn
,
226 _("Choose this option to use BZIP2 compression by default"));
228 compress_radiobtn
= gtk_radio_button_new_with_label(compression_group
, "COMPRESS");
229 compression_group
= gtk_radio_button_get_group(GTK_RADIO_BUTTON(compress_radiobtn
));
230 gtk_widget_show(compress_radiobtn
);
231 gtk_box_pack_start(GTK_BOX (hbox1
), compress_radiobtn
, FALSE
, FALSE
, 0);
232 CLAWS_SET_TIP(compress_radiobtn
,
233 _("Choose this option to use COMPRESS compression by default"));
235 none_radiobtn
= gtk_radio_button_new_with_label(compression_group
, _("None"));
236 compression_group
= gtk_radio_button_get_group(GTK_RADIO_BUTTON(none_radiobtn
));
237 gtk_widget_show(none_radiobtn
);
238 gtk_box_pack_start(GTK_BOX (hbox1
), none_radiobtn
, FALSE
, FALSE
, 0);
239 CLAWS_SET_TIP(none_radiobtn
,
240 _("Choose this option to disable compression by default"));
242 switch (archiver_prefs
.compression
) {
243 case COMPRESSION_ZIP
:
244 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(zip_radiobtn
), TRUE
);
246 case COMPRESSION_BZIP
:
247 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bzip_radiobtn
), TRUE
);
249 case COMPRESSION_COMPRESS
:
250 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compress_radiobtn
), TRUE
);
252 case COMPRESSION_NONE
:
253 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(none_radiobtn
), TRUE
);
257 PACK_FRAME (vbox1
, frame
, _("Default format"));
259 hbox1
= gtk_hbox_new(FALSE
, 4);
260 gtk_widget_show(hbox1
);
261 gtk_container_set_border_width(GTK_CONTAINER(hbox1
), 4);
262 gtk_container_add(GTK_CONTAINER(frame
), hbox1
);
264 tar_radiobtn
= gtk_radio_button_new_with_label(format_group
, "TAR");
265 format_group
= gtk_radio_button_get_group(GTK_RADIO_BUTTON(tar_radiobtn
));
266 gtk_widget_show(tar_radiobtn
);
267 gtk_box_pack_start(GTK_BOX (hbox1
), tar_radiobtn
, FALSE
, FALSE
, 0);
268 CLAWS_SET_TIP(tar_radiobtn
,
269 _("Choose this option to use the TAR format by default"));
271 shar_radiobtn
= gtk_radio_button_new_with_label(format_group
, "SHAR");
272 format_group
= gtk_radio_button_get_group(GTK_RADIO_BUTTON(shar_radiobtn
));
273 gtk_widget_show(shar_radiobtn
);
274 gtk_box_pack_start(GTK_BOX (hbox1
), shar_radiobtn
, FALSE
, FALSE
, 0);
275 CLAWS_SET_TIP(shar_radiobtn
,
276 _("Choose this option to use the SHAR format by default"));
278 cpio_radiobtn
= gtk_radio_button_new_with_label(format_group
, "CPIO");
279 format_group
= gtk_radio_button_get_group(GTK_RADIO_BUTTON(cpio_radiobtn
));
280 gtk_widget_show(cpio_radiobtn
);
281 gtk_box_pack_start(GTK_BOX (hbox1
), cpio_radiobtn
, FALSE
, FALSE
, 0);
282 CLAWS_SET_TIP(cpio_radiobtn
,
283 _("Choose this option to use the CPIO format by default"));
285 pax_radiobtn
= gtk_radio_button_new_with_label(format_group
, "PAX");
286 format_group
= gtk_radio_button_get_group(GTK_RADIO_BUTTON(pax_radiobtn
));
287 gtk_widget_show(pax_radiobtn
);
288 gtk_box_pack_start(GTK_BOX (hbox1
), pax_radiobtn
, FALSE
, FALSE
, 0);
289 CLAWS_SET_TIP(pax_radiobtn
,
290 _("Choose this option to use the PAX format by default"));
292 switch (archiver_prefs
.format
) {
294 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tar_radiobtn
), TRUE
);
297 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(shar_radiobtn
), TRUE
);
300 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cpio_radiobtn
), TRUE
);
303 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pax_radiobtn
), TRUE
);
307 PACK_FRAME (vbox1
, frame
, _("Default miscellaneous options"));
309 hbox1
= gtk_hbox_new(FALSE
, 4);
310 gtk_widget_show(hbox1
);
311 gtk_container_set_border_width(GTK_CONTAINER(hbox1
), 4);
312 gtk_container_add(GTK_CONTAINER(frame
), hbox1
);
314 PACK_CHECK_BUTTON(hbox1
, recursive_chkbtn
, _("Recursive"));
315 CLAWS_SET_TIP(recursive_chkbtn
,
316 _("Choose this option to include subfolders in the archives by default"));
317 PACK_CHECK_BUTTON(hbox1
, md5sum_chkbtn
, _("MD5sum"));
318 CLAWS_SET_TIP(md5sum_chkbtn
,
319 _("Choose this option to add MD5 checksums for each file in the archives by default.\n"
320 "Be aware though, that this dramatically increases the time it\n"
321 "will take to create the archives"));
323 PACK_CHECK_BUTTON(hbox1
, rename_chkbtn
, _("Rename"));
324 CLAWS_SET_TIP(rename_chkbtn
,
325 _("Choose this option to use descriptive names for each file in the archive.\n"
326 "The naming scheme: date_from@to@subject.\n"
327 "Names will be truncated to max 96 characters"));
329 PACK_CHECK_BUTTON(hbox1
, unlink_chkbtn
, _("Delete"));
330 CLAWS_SET_TIP(unlink_chkbtn
,
331 _("Choose this option to delete mails after archiving"));
333 if (archiver_prefs
.recursive
)
334 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(recursive_chkbtn
), TRUE
);
335 if (archiver_prefs
.md5sum
)
336 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(md5sum_chkbtn
), TRUE
);
337 if (archiver_prefs
.rename
)
338 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rename_chkbtn
), TRUE
);
339 if (archiver_prefs
.unlink
)
340 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(unlink_chkbtn
), TRUE
);
343 page
->save_folder
= save_folder
;
344 page
->zip_radiobtn
= zip_radiobtn
;
345 page
->bzip_radiobtn
= bzip_radiobtn
;
346 page
->compress_radiobtn
= compress_radiobtn
;
347 page
->none_radiobtn
= none_radiobtn
;
348 page
->tar_radiobtn
= tar_radiobtn
;
349 page
->shar_radiobtn
= shar_radiobtn
;
350 page
->cpio_radiobtn
= cpio_radiobtn
;
351 page
->pax_radiobtn
= pax_radiobtn
;
352 page
->recursive_chkbtn
= recursive_chkbtn
;
353 page
->md5sum_chkbtn
= md5sum_chkbtn
;
354 page
->rename_chkbtn
= rename_chkbtn
;
355 page
->unlink_chkbtn
= unlink_chkbtn
;
357 page
->page
.widget
= vbox1
;
360 static void destroy_archiver_prefs_page(PrefsPage
*page
)
365 static void save_archiver_prefs(PrefsPage
* _page
)
367 struct ArchiverPrefsPage
*page
= (struct ArchiverPrefsPage
*) _page
;
369 gchar
*rc_file_path
= g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S
,
372 archiver_prefs
.save_folder
= gtk_editable_get_chars(GTK_EDITABLE(page
->save_folder
), 0, -1);
373 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->zip_radiobtn
)))
374 archiver_prefs
.compression
= COMPRESSION_ZIP
;
375 else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->bzip_radiobtn
)))
376 archiver_prefs
.compression
= COMPRESSION_BZIP
;
377 else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->compress_radiobtn
)))
378 archiver_prefs
.compression
= COMPRESSION_COMPRESS
;
379 else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->none_radiobtn
)))
380 archiver_prefs
.compression
= COMPRESSION_NONE
;
382 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->tar_radiobtn
)))
383 archiver_prefs
.format
= FORMAT_TAR
;
384 else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->shar_radiobtn
)))
385 archiver_prefs
.format
= FORMAT_SHAR
;
386 else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->cpio_radiobtn
)))
387 archiver_prefs
.format
= FORMAT_CPIO
;
388 else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->pax_radiobtn
)))
389 archiver_prefs
.format
= FORMAT_PAX
;
391 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->recursive_chkbtn
)))
392 archiver_prefs
.recursive
= TRUE
;
394 archiver_prefs
.recursive
= FALSE
;
395 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->md5sum_chkbtn
)))
396 archiver_prefs
.md5sum
= TRUE
;
398 archiver_prefs
.md5sum
= FALSE
;
399 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->rename_chkbtn
)))
400 archiver_prefs
.rename
= TRUE
;
402 archiver_prefs
.rename
= FALSE
;
403 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page
->unlink_chkbtn
)))
404 archiver_prefs
.unlink
= TRUE
;
406 archiver_prefs
.unlink
= FALSE
;
409 pref_file
= prefs_write_open(rc_file_path
);
410 g_free(rc_file_path
);
413 (prefs_set_block_label(pref_file
, PREFS_BLOCK_NAME
) < 0))
416 if (prefs_write_param(param
, pref_file
->fp
) < 0) {
417 g_warning("failed to write Archiver Plugin configuration");
418 prefs_file_close_revert(pref_file
);
421 if (fprintf(pref_file
->fp
, "\n") < 0) {
422 FILE_OP_ERROR(rc_file_path
, "fprintf");
423 prefs_file_close_revert(pref_file
);
425 prefs_file_close(pref_file
);