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