1 /*
2  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2006 Hiroyuki Yamamoto
4  *
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 2 of the License, or
8  * (at your option) any later version.
9  *
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.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18  */
19 
20 #ifdef HAVE_CONFIG_H
21 #  include "config.h"
22 #endif
23 
24 #include "defs.h"
25 
26 #include <glib.h>
27 #include <glib/gi18n.h>
28 #include <gtk/gtk.h>
29 #include <gdk/gdkkeysyms.h>
30 
31 #include "folder.h"
32 #include "prefs.h"
33 #include "prefs_ui.h"
34 #include "prefs_folder_item.h"
35 #include "prefs_account.h"
36 #include "account.h"
37 #include "manage_window.h"
38 #include "folderview.h"
39 #include "mainwindow.h"
40 #include "inc.h"
41 #include "menu.h"
42 
43 typedef struct _PrefsFolderItemDialog	PrefsFolderItemDialog;
44 
45 struct _PrefsFolderItemDialog
46 {
47 	PrefsDialog *dialog;
48 	FolderItem *item;
49 
50 	/* General */
51 	GtkWidget *name_entry;
52 	GtkWidget *id_label;
53 	GtkWidget *path_label;
54 	GtkWidget *type_optmenu;
55 
56 	GtkWidget *trim_summary_subj_chkbtn;
57 	GtkWidget *trim_compose_subj_chkbtn;
58 
59 	/* Compose */
60 	GtkWidget *account_optmenu;
61 	GtkWidget *ac_apply_sub_chkbtn;
62 	GtkWidget *to_entry;
63 	GtkWidget *on_reply_chkbtn;
64 	GtkWidget *cc_entry;
65 	GtkWidget *bcc_entry;
66 	GtkWidget *replyto_entry;
67 };
68 
69 static PrefsFolderItemDialog *prefs_folder_item_create
70 					(FolderItem		*item);
71 static void prefs_folder_item_general_create
72 					(PrefsFolderItemDialog	*dialog);
73 static void prefs_folder_item_compose_create
74 					(PrefsFolderItemDialog	*dialog);
75 static void prefs_folder_item_set_dialog(PrefsFolderItemDialog	*dialog);
76 
77 static void prefs_folder_item_ok_cb	(GtkWidget		*widget,
78 					 PrefsFolderItemDialog	*dialog);
79 static void prefs_folder_item_apply_cb	(GtkWidget		*widget,
80 					 PrefsFolderItemDialog	*dialog);
81 static void prefs_folder_item_cancel_cb	(GtkWidget		*widget,
82 					 PrefsFolderItemDialog	*dialog);
83 static gint prefs_folder_item_delete_cb	(GtkWidget		*widget,
84 					 GdkEventAny		*event,
85 					 PrefsFolderItemDialog	*dialog);
86 static gboolean prefs_folder_item_key_press_cb
87 					(GtkWidget		*widget,
88 					 GdkEventKey		*event,
89 					 PrefsFolderItemDialog	*dialog);
90 
prefs_folder_item_open(FolderItem * item)91 void prefs_folder_item_open(FolderItem *item)
92 {
93 	PrefsFolderItemDialog *dialog;
94 
95 	g_return_if_fail(item != NULL);
96 
97 	inc_lock();
98 
99 	dialog = prefs_folder_item_create(item);
100 
101 	manage_window_set_transient(GTK_WINDOW(dialog->dialog->window));
102 
103 	prefs_folder_item_set_dialog(dialog);
104 
105 	gtk_widget_show_all(dialog->dialog->window);
106 }
107 
prefs_folder_item_create(FolderItem * item)108 PrefsFolderItemDialog *prefs_folder_item_create(FolderItem *item)
109 {
110 	PrefsFolderItemDialog *new_dialog;
111 	PrefsDialog *dialog;
112 
113 	new_dialog = g_new0(PrefsFolderItemDialog, 1);
114 
115 	dialog = g_new0(PrefsDialog, 1);
116 	prefs_dialog_create(dialog);
117 
118 	gtk_window_set_title(GTK_WINDOW(dialog->window), _("Folder properties"));
119 	gtk_widget_realize(dialog->window);
120 	g_signal_connect(G_OBJECT(dialog->window), "delete_event",
121 			 G_CALLBACK(prefs_folder_item_delete_cb), new_dialog);
122 	g_signal_connect(G_OBJECT(dialog->window), "key_press_event",
123 			 G_CALLBACK(prefs_folder_item_key_press_cb), new_dialog);
124 	MANAGE_WINDOW_SIGNALS_CONNECT(dialog->window);
125 
126 	g_signal_connect(G_OBJECT(dialog->ok_btn), "clicked",
127 			 G_CALLBACK(prefs_folder_item_ok_cb), new_dialog);
128 	g_signal_connect(G_OBJECT(dialog->apply_btn), "clicked",
129 			 G_CALLBACK(prefs_folder_item_apply_cb), new_dialog);
130 	g_signal_connect(G_OBJECT(dialog->cancel_btn), "clicked",
131 			 G_CALLBACK(prefs_folder_item_cancel_cb), new_dialog);
132 
133 	new_dialog->dialog = dialog;
134 	new_dialog->item = item;
135 
136 	prefs_folder_item_general_create(new_dialog);
137 	prefs_folder_item_compose_create(new_dialog);
138 
139 	SET_NOTEBOOK_LABEL(dialog->notebook, _("General"), 0);
140 	SET_NOTEBOOK_LABEL(dialog->notebook, _("Compose"), 1);
141 
142 	return new_dialog;
143 }
144 
prefs_folder_item_general_create(PrefsFolderItemDialog * dialog)145 static void prefs_folder_item_general_create(PrefsFolderItemDialog *dialog)
146 {
147 	GtkWidget *vbox;
148 	GtkWidget *table;
149 	GtkWidget *hbox;
150 	GtkWidget *label;
151 	GtkWidget *name_entry;
152 	GtkWidget *id_label;
153 	GtkWidget *path_label;
154 	GtkWidget *optmenu;
155 	GtkWidget *optmenu_menu;
156 	GtkWidget *menuitem;
157 	GtkWidget *vbox2;
158 	GtkWidget *trim_summary_subj_chkbtn;
159 	GtkWidget *trim_compose_subj_chkbtn;
160 	GtkStyle *style;
161 
162 	vbox = gtk_vbox_new(FALSE, VSPACING);
163 	gtk_container_add(GTK_CONTAINER(dialog->dialog->notebook), vbox);
164 	gtk_container_set_border_width(GTK_CONTAINER (vbox), VBOX_BORDER);
165 
166 	table = gtk_table_new(4, 2, FALSE);
167 	gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
168 	gtk_table_set_row_spacings(GTK_TABLE(table), 8);
169 	gtk_table_set_col_spacings(GTK_TABLE(table), 8);
170 
171 	label = gtk_label_new(_("Name"));
172 	gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1,
173 			 GTK_FILL, 0, 0, 0);
174 	gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
175 
176 	name_entry = gtk_entry_new();
177 	gtk_editable_set_editable(GTK_EDITABLE(name_entry), FALSE);
178 	gtk_widget_set_size_request(name_entry, 200, -1);
179 	style = gtk_widget_get_style(dialog->dialog->window);
180 	gtk_widget_modify_base(name_entry, GTK_STATE_NORMAL,
181 			       &style->bg[GTK_STATE_NORMAL]);
182 	gtk_table_attach(GTK_TABLE(table), name_entry, 1, 2, 0, 1,
183 			 GTK_EXPAND | GTK_SHRINK | GTK_FILL,
184 			 GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
185 
186 	label = gtk_label_new(_("Identifier"));
187 	gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2,
188 			 GTK_FILL, 0, 0, 0);
189 	gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
190 
191 	id_label = gtk_label_new("");
192 	gtk_label_set_selectable(GTK_LABEL(id_label), TRUE);
193 	gtk_misc_set_alignment(GTK_MISC(id_label), 0, 0.5);
194 	gtk_label_set_justify(GTK_LABEL(id_label), GTK_JUSTIFY_LEFT);
195 #if GTK_CHECK_VERSION(2, 6, 0)
196 	gtk_label_set_ellipsize(GTK_LABEL(id_label), PANGO_ELLIPSIZE_MIDDLE);
197 #endif
198 	gtk_table_attach(GTK_TABLE(table), id_label, 1, 2, 1, 2,
199 			 GTK_EXPAND | GTK_SHRINK | GTK_FILL,
200 			 GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
201 
202 	label = gtk_label_new(_("Path"));
203 	gtk_table_attach(GTK_TABLE(table), label, 0, 1, 2, 3,
204 			 GTK_FILL, 0, 0, 0);
205 	gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
206 
207 	path_label = gtk_label_new("");
208 	gtk_label_set_selectable(GTK_LABEL(path_label), TRUE);
209 	gtk_misc_set_alignment(GTK_MISC(path_label), 0, 0.5);
210 	gtk_label_set_justify(GTK_LABEL(path_label), GTK_JUSTIFY_LEFT);
211 #if GTK_CHECK_VERSION(2, 6, 0)
212 	gtk_label_set_ellipsize(GTK_LABEL(path_label), PANGO_ELLIPSIZE_MIDDLE);
213 #endif
214 	gtk_table_attach(GTK_TABLE(table), path_label, 1, 2, 2, 3,
215 			 GTK_EXPAND | GTK_SHRINK | GTK_FILL,
216 			 GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
217 
218 	label = gtk_label_new(_("Type"));
219 	gtk_table_attach(GTK_TABLE(table), label, 0, 1, 3, 4,
220 			 GTK_FILL, 0, 0, 0);
221 	gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
222 
223 	hbox = gtk_hbox_new(FALSE, 8);
224 	gtk_widget_show(hbox);
225 	gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, 3, 4,
226 			 GTK_EXPAND | GTK_SHRINK | GTK_FILL,
227 			 GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
228 
229 	optmenu = gtk_option_menu_new();
230 	gtk_box_pack_start(GTK_BOX(hbox), optmenu, FALSE, FALSE, 0);
231 
232 	optmenu_menu = gtk_menu_new();
233 
234 	MENUITEM_ADD(optmenu_menu, menuitem, _("Normal"), F_NORMAL);
235 	MENUITEM_ADD(optmenu_menu, menuitem, _("Inbox") , F_INBOX);
236 	MENUITEM_ADD(optmenu_menu, menuitem, _("Sent")  , F_OUTBOX);
237 	MENUITEM_ADD(optmenu_menu, menuitem, _("Drafts"), F_DRAFT);
238 	MENUITEM_ADD(optmenu_menu, menuitem, _("Queue") , F_QUEUE);
239 	MENUITEM_ADD(optmenu_menu, menuitem, _("Trash") , F_TRASH);
240 	MENUITEM_ADD(optmenu_menu, menuitem, _("Junk")  , F_JUNK);
241 
242 	gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), optmenu_menu);
243 
244 	vbox2 = gtk_vbox_new(FALSE, 0);
245 	gtk_box_pack_start(GTK_BOX(vbox), vbox2, FALSE, FALSE, 0);
246 
247 	PACK_CHECK_BUTTON(vbox2, trim_summary_subj_chkbtn,
248 			  _("Don't display [...] or (...) at the beginning of subject in summary"));
249 	PACK_CHECK_BUTTON(vbox2, trim_compose_subj_chkbtn,
250 			  _("Delete [...] or (...) at the beginning of subject on reply"));
251 
252 	if (!dialog->item->parent) {
253 		gtk_widget_set_sensitive(optmenu, FALSE);
254 		gtk_widget_set_sensitive(vbox2, FALSE);
255 	}
256 	if (dialog->item->stype == F_VIRTUAL)
257 		gtk_widget_set_sensitive(optmenu, FALSE);
258 
259 	dialog->name_entry = name_entry;
260 	dialog->id_label = id_label;
261 	dialog->path_label = path_label;
262 	dialog->type_optmenu = optmenu;
263 	dialog->trim_summary_subj_chkbtn = trim_summary_subj_chkbtn;
264 	dialog->trim_compose_subj_chkbtn = trim_compose_subj_chkbtn;
265 }
266 
prefs_folder_item_compose_create(PrefsFolderItemDialog * dialog)267 static void prefs_folder_item_compose_create(PrefsFolderItemDialog *dialog)
268 {
269 	GtkWidget *vbox;
270 	GtkWidget *frame;
271 	GtkWidget *account_vbox;
272 	GtkWidget *table;
273 	GtkWidget *hbox;
274 	GtkWidget *label;
275 	GtkWidget *optmenu;
276 	GtkWidget *optmenu_menu;
277 	GtkWidget *menuitem;
278 	GtkWidget *ac_apply_sub_chkbtn;
279 	GtkWidget *to_entry;
280 	GtkWidget *on_reply_chkbtn;
281 	GtkWidget *cc_entry;
282 	GtkWidget *bcc_entry;
283 	GtkWidget *replyto_entry;
284 	GList *list;
285 
286 	vbox = gtk_vbox_new(FALSE, VSPACING);
287 	gtk_container_add(GTK_CONTAINER(dialog->dialog->notebook), vbox);
288 	gtk_container_set_border_width(GTK_CONTAINER (vbox), VBOX_BORDER);
289 
290 	PACK_FRAME(vbox, frame, _("Account"));
291 
292 	account_vbox = gtk_vbox_new(FALSE, VSPACING_NARROW);
293 	gtk_container_add(GTK_CONTAINER(frame), account_vbox);
294 	gtk_container_set_border_width (GTK_CONTAINER (account_vbox), 8);
295 
296 	table = gtk_table_new(1, 2, FALSE);
297 	gtk_box_pack_start(GTK_BOX(account_vbox), table, FALSE, FALSE, 0);
298 	gtk_table_set_row_spacings(GTK_TABLE(table), VSPACING_NARROW);
299 	gtk_table_set_col_spacings(GTK_TABLE(table), 8);
300 
301 	label = gtk_label_new(_("Account"));
302 	gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1,
303 			 GTK_FILL, 0, 0, 0);
304 	gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
305 
306 	hbox = gtk_hbox_new(FALSE, 8);
307 	gtk_widget_show(hbox);
308 	gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, 0, 1,
309 			 GTK_EXPAND | GTK_SHRINK | GTK_FILL,
310 			 GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
311 
312 	optmenu = gtk_option_menu_new();
313 	gtk_box_pack_start(GTK_BOX(hbox), optmenu, FALSE, FALSE, 0);
314 
315 	optmenu_menu = gtk_menu_new();
316 
317 	MENUITEM_ADD(optmenu_menu, menuitem, _("None"), -1);
318 
319 	for (list = account_get_list(); list != NULL; list = list->next) {
320 		gchar *text;
321 		PrefsAccount *ac = list->data;
322 
323 		text = g_strdup_printf("%s: %s", ac->account_name, ac->address);
324 		MENUITEM_ADD(optmenu_menu, menuitem, text, ac->account_id);
325 	}
326 
327 	gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), optmenu_menu);
328 
329 	PACK_CHECK_BUTTON(account_vbox, ac_apply_sub_chkbtn,
330 			  _("Apply to subfolders"));
331 
332 	PACK_FRAME(vbox, frame, _("Automatically set the following addresses"));
333 
334 	table = gtk_table_new(4, 2, FALSE);
335 	gtk_container_add(GTK_CONTAINER(frame), table);
336 	gtk_container_set_border_width (GTK_CONTAINER (table), 8);
337 	gtk_table_set_row_spacings(GTK_TABLE(table), VSPACING_NARROW);
338 	gtk_table_set_col_spacings(GTK_TABLE(table), 8);
339 
340 	label = gtk_label_new(_("To:"));
341 	gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1,
342 			 GTK_FILL, 0, 0, 0);
343 	gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
344 
345 	hbox = gtk_hbox_new(FALSE, 8);
346 	gtk_widget_show(hbox);
347 	gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, 0, 1,
348 			 GTK_EXPAND | GTK_SHRINK | GTK_FILL,
349 			 GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
350 
351 	to_entry = gtk_entry_new();
352 	gtk_widget_set_size_request(to_entry, 200, -1);
353 	gtk_box_pack_start(GTK_BOX(hbox), to_entry, TRUE, TRUE, 0);
354 
355 	PACK_CHECK_BUTTON(hbox, on_reply_chkbtn, _("use also on reply"));
356 
357 	label = gtk_label_new(_("Cc:"));
358 	gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2,
359 			 GTK_FILL, 0, 0, 0);
360 	gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
361 
362 	cc_entry = gtk_entry_new();
363 	gtk_widget_set_size_request(cc_entry, 200, -1);
364 	gtk_table_attach(GTK_TABLE(table), cc_entry, 1, 2, 1, 2,
365 			 GTK_EXPAND | GTK_SHRINK | GTK_FILL,
366 			 GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
367 
368 	label = gtk_label_new(_("Bcc:"));
369 	gtk_table_attach(GTK_TABLE(table), label, 0, 1, 2, 3,
370 			 GTK_FILL, 0, 0, 0);
371 	gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
372 
373 	bcc_entry = gtk_entry_new();
374 	gtk_widget_set_size_request(bcc_entry, 200, -1);
375 	gtk_table_attach(GTK_TABLE(table), bcc_entry, 1, 2, 2, 3,
376 			 GTK_EXPAND | GTK_SHRINK | GTK_FILL,
377 			 GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
378 
379 	label = gtk_label_new(_("Reply-To:"));
380 	gtk_table_attach(GTK_TABLE(table), label, 0, 1, 3, 4,
381 			 GTK_FILL, 0, 0, 0);
382 	gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
383 
384 	replyto_entry = gtk_entry_new();
385 	gtk_widget_set_size_request(replyto_entry, 200, -1);
386 	gtk_table_attach(GTK_TABLE(table), replyto_entry, 1, 2, 3, 4,
387 			 GTK_EXPAND | GTK_SHRINK | GTK_FILL,
388 			 GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
389 
390 	if (!dialog->item->parent) {
391 		gtk_widget_set_sensitive(frame, FALSE);
392 		gtk_widget_set_sensitive(ac_apply_sub_chkbtn, FALSE);
393 	}
394 
395 	dialog->account_optmenu     = optmenu;
396 	dialog->ac_apply_sub_chkbtn = ac_apply_sub_chkbtn;
397 	dialog->to_entry            = to_entry;
398 	dialog->on_reply_chkbtn     = on_reply_chkbtn;
399 	dialog->cc_entry            = cc_entry;
400 	dialog->bcc_entry           = bcc_entry;
401 	dialog->replyto_entry       = replyto_entry;
402 }
403 
404 #define SET_ENTRY(entry, str) \
405 	gtk_entry_set_text(GTK_ENTRY(dialog->entry), \
406 			   dialog->item->str ? dialog->item->str : "")
407 
prefs_folder_item_set_dialog(PrefsFolderItemDialog * dialog)408 static void prefs_folder_item_set_dialog(PrefsFolderItemDialog *dialog)
409 {
410 	GtkWidget *menu;
411 	GtkWidget *menuitem;
412 	GtkOptionMenu *optmenu;
413 	gchar *id;
414 	gchar *path;
415 	gchar *utf8_path;
416 	GList *cur;
417 	SpecialFolderItemType type;
418 	gint n;
419 	guint index = 0;
420 
421 	/* General */
422 
423 	SET_ENTRY(name_entry, name);
424 
425 	id = folder_item_get_identifier(dialog->item);
426 	gtk_label_set_text(GTK_LABEL(dialog->id_label), id);
427 	g_free(id);
428 
429 	path = folder_item_get_path(dialog->item);
430 	utf8_path = conv_filename_to_utf8(path);
431 	gtk_label_set_text(GTK_LABEL(dialog->path_label), utf8_path);
432 	g_free(utf8_path);
433 	g_free(path);
434 
435 	optmenu = GTK_OPTION_MENU(dialog->type_optmenu);
436 	menu = gtk_option_menu_get_menu(optmenu);
437 	for (cur = GTK_MENU_SHELL(menu)->children, n = 0;
438 	     cur != NULL; cur = cur->next, n++) {
439 		menuitem = GTK_WIDGET(cur->data);
440 		type = (SpecialFolderItemType)
441 			g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID);
442 		if (type != F_NORMAL &&
443 		    FOLDER_TYPE(dialog->item->folder) == F_NEWS)
444 			gtk_widget_set_sensitive(menuitem, FALSE);
445 		if (dialog->item->stype == type)
446 			index = n;
447 	}
448 
449 	gtk_option_menu_set_history(optmenu, index);
450 
451 	gtk_toggle_button_set_active
452 		(GTK_TOGGLE_BUTTON(dialog->trim_summary_subj_chkbtn),
453 		 dialog->item->trim_summary_subject);
454 	gtk_toggle_button_set_active
455 		(GTK_TOGGLE_BUTTON(dialog->trim_compose_subj_chkbtn),
456 		 dialog->item->trim_compose_subject);
457 
458 	/* Compose */
459 
460 	index = 0;
461 	optmenu = GTK_OPTION_MENU(dialog->account_optmenu);
462 	if (dialog->item->account) {
463 		index = menu_find_option_menu_index
464 			(optmenu,
465 			 GINT_TO_POINTER(dialog->item->account->account_id),
466 			 NULL);
467 		if (index < 0)
468 			index = 0;
469 	}
470 
471 	gtk_option_menu_set_history(optmenu, index);
472 
473 	gtk_toggle_button_set_active
474 		(GTK_TOGGLE_BUTTON(dialog->ac_apply_sub_chkbtn),
475 		 dialog->item->ac_apply_sub);
476 
477 	SET_ENTRY(to_entry, auto_to);
478 	gtk_toggle_button_set_active
479 		(GTK_TOGGLE_BUTTON(dialog->on_reply_chkbtn),
480 		 dialog->item->use_auto_to_on_reply);
481 
482 	SET_ENTRY(cc_entry, auto_cc);
483 	SET_ENTRY(bcc_entry, auto_bcc);
484 	SET_ENTRY(replyto_entry, auto_replyto);
485 }
486 
487 #undef SET_ENTRY
488 
prefs_folder_item_destroy(PrefsFolderItemDialog * dialog)489 void prefs_folder_item_destroy(PrefsFolderItemDialog *dialog)
490 {
491 	prefs_dialog_destroy(dialog->dialog);
492 	g_free(dialog->dialog);
493 	g_free(dialog);
494 
495 	main_window_popup(main_window_get());
496 	inc_unlock();
497 }
498 
prefs_folder_item_ok_cb(GtkWidget * widget,PrefsFolderItemDialog * dialog)499 static void prefs_folder_item_ok_cb(GtkWidget *widget,
500 				    PrefsFolderItemDialog *dialog)
501 {
502 	prefs_folder_item_apply_cb(widget, dialog);
503 	prefs_folder_item_destroy(dialog);
504 }
505 
506 #define SET_DATA_FROM_ENTRY(entry, str) \
507 { \
508 	entry_str = gtk_entry_get_text(GTK_ENTRY(dialog->entry)); \
509 	g_free(item->str); \
510 	item->str = (entry_str && *entry_str) ? g_strdup(entry_str) : NULL; \
511 }
512 
prefs_folder_item_apply_cb(GtkWidget * widget,PrefsFolderItemDialog * dialog)513 static void prefs_folder_item_apply_cb(GtkWidget *widget,
514 				       PrefsFolderItemDialog *dialog)
515 {
516 	GtkWidget *menu;
517 	GtkWidget *menuitem;
518 	GtkOptionMenu *optmenu;
519 	SpecialFolderItemType type;
520 	FolderItem *item = dialog->item;
521 	Folder *folder = item->folder;
522 	FolderItem *prev_item = NULL;
523 	gint account_id;
524 	const gchar *entry_str;
525 
526 	optmenu = GTK_OPTION_MENU(dialog->type_optmenu);
527 	menu = gtk_option_menu_get_menu(optmenu);
528 	menuitem = gtk_menu_get_active(GTK_MENU(menu));
529 	type = (SpecialFolderItemType)
530 		g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID);
531 
532 	if (item->stype != type && item->stype != F_VIRTUAL) {
533 		switch (type) {
534 		case F_NORMAL:
535 			break;
536 		case F_INBOX:
537 			if (folder->inbox)
538 				folder->inbox->stype = F_NORMAL;
539 			prev_item = folder->inbox;
540 			folder->inbox = item;
541 			break;
542 		case F_OUTBOX:
543 			if (folder->outbox)
544 				folder->outbox->stype = F_NORMAL;
545 			prev_item = folder->outbox;
546 			folder->outbox = item;
547 			break;
548 		case F_DRAFT:
549 			if (folder->draft)
550 				folder->draft->stype = F_NORMAL;
551 			prev_item = folder->draft;
552 			folder->draft = item;
553 			break;
554 		case F_QUEUE:
555 			if (folder->queue)
556 				folder->queue->stype = F_NORMAL;
557 			prev_item = folder->queue;
558 			folder->queue = item;
559 			break;
560 		case F_TRASH:
561 			if (folder->trash)
562 				folder->trash->stype = F_NORMAL;
563 			prev_item = folder->trash;
564 			folder->trash = item;
565 			break;
566 		case F_JUNK:
567 			prev_item = folder_get_junk(folder);
568 			if (prev_item)
569 				prev_item->stype = F_NORMAL;
570 			folder_set_junk(folder, item);
571 			break;
572 		default:
573 			type = item->stype;
574 			break;
575 		}
576 
577 		item->stype = type;
578 
579 		if (prev_item)
580 			folderview_update_item(prev_item, FALSE);
581 		folderview_update_item(item, FALSE);
582 	}
583 
584 	item->trim_summary_subject = gtk_toggle_button_get_active
585 		(GTK_TOGGLE_BUTTON(dialog->trim_summary_subj_chkbtn));
586 	item->trim_compose_subject = gtk_toggle_button_get_active
587 		(GTK_TOGGLE_BUTTON(dialog->trim_compose_subj_chkbtn));
588 
589 	/* account menu */
590 	optmenu = GTK_OPTION_MENU(dialog->account_optmenu);
591 	menu = gtk_option_menu_get_menu(optmenu);
592 	menuitem = gtk_menu_get_active(GTK_MENU(menu));
593 	account_id = GPOINTER_TO_INT
594 		(g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID));
595 	if (account_id >= 0)
596 		item->account = account_find_from_id(account_id);
597 	else
598 		item->account = NULL;
599 
600 	if (!item->parent && item->account)
601 		item->ac_apply_sub = TRUE;
602 	else if (item->account)
603 		item->ac_apply_sub = gtk_toggle_button_get_active
604 			(GTK_TOGGLE_BUTTON(dialog->ac_apply_sub_chkbtn));
605 	else
606 		item->ac_apply_sub = FALSE;
607 
608 	SET_DATA_FROM_ENTRY(to_entry, auto_to);
609 	item->use_auto_to_on_reply = gtk_toggle_button_get_active
610 		(GTK_TOGGLE_BUTTON(dialog->on_reply_chkbtn));
611 
612 	SET_DATA_FROM_ENTRY(cc_entry, auto_cc);
613 	SET_DATA_FROM_ENTRY(bcc_entry, auto_bcc);
614 	SET_DATA_FROM_ENTRY(replyto_entry, auto_replyto);
615 }
616 
617 #undef SET_DATA_FROM_ENTRY
618 
prefs_folder_item_cancel_cb(GtkWidget * widget,PrefsFolderItemDialog * dialog)619 static void prefs_folder_item_cancel_cb(GtkWidget *widget,
620 					PrefsFolderItemDialog *dialog)
621 {
622 	prefs_folder_item_destroy(dialog);
623 }
624 
prefs_folder_item_delete_cb(GtkWidget * widget,GdkEventAny * event,PrefsFolderItemDialog * dialog)625 static gint prefs_folder_item_delete_cb(GtkWidget *widget, GdkEventAny *event,
626 					PrefsFolderItemDialog *dialog)
627 {
628 	prefs_folder_item_destroy(dialog);
629 	return TRUE;
630 }
631 
prefs_folder_item_key_press_cb(GtkWidget * widget,GdkEventKey * event,PrefsFolderItemDialog * dialog)632 static gboolean prefs_folder_item_key_press_cb(GtkWidget *widget,
633 					   GdkEventKey *event,
634 					   PrefsFolderItemDialog *dialog)
635 {
636 	if (event && event->keyval == GDK_Escape)
637 		prefs_folder_item_cancel_cb(widget, dialog);
638 	return FALSE;
639 }
640