Statistics
| Revision:

root / src / prefs_folder_item.c @ 836

History | View | Annotate | Download (18.7 kB)

1
/*
2
 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3
 * Copyright (C) 1999-2003 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
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
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
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
        style = gtk_style_copy(gtk_widget_get_style(dialog->dialog->window));
163
        style->base[GTK_STATE_NORMAL] = style->bg[GTK_STATE_NORMAL];
164
165
        vbox = gtk_vbox_new(FALSE, VSPACING);
166
        gtk_container_add(GTK_CONTAINER(dialog->dialog->notebook), vbox);
167
        gtk_container_set_border_width(GTK_CONTAINER (vbox), VBOX_BORDER);
168
169
        table = gtk_table_new(4, 2, FALSE);
170
        gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
171
        gtk_table_set_row_spacings(GTK_TABLE(table), 8);
172
        gtk_table_set_col_spacings(GTK_TABLE(table), 8);
173
174
        label = gtk_label_new(_("Name"));
175
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1,
176
                         GTK_FILL, 0, 0, 0);
177
        gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
178
179
        name_entry = gtk_entry_new();
180
        gtk_editable_set_editable(GTK_EDITABLE(name_entry), FALSE);
181
        gtk_widget_set_size_request(name_entry, 200, -1);
182
        gtk_widget_set_style(name_entry, style);
183
        gtk_table_attach(GTK_TABLE(table), name_entry, 1, 2, 0, 1,
184
                         GTK_EXPAND | GTK_SHRINK | GTK_FILL,
185
                         GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
186
187
        label = gtk_label_new(_("Identifier"));
188
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2,
189
                         GTK_FILL, 0, 0, 0);
190
        gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
191
192
        id_label = gtk_label_new("");
193
        gtk_label_set_selectable(GTK_LABEL(id_label), TRUE);
194
        gtk_misc_set_alignment(GTK_MISC(id_label), 0, 0.5);
195
        gtk_label_set_justify(GTK_LABEL(id_label), GTK_JUSTIFY_LEFT);
196
#if GTK_CHECK_VERSION(2, 6, 0)
197
        gtk_label_set_ellipsize(GTK_LABEL(id_label), PANGO_ELLIPSIZE_MIDDLE);
198
#endif
199
        gtk_table_attach(GTK_TABLE(table), id_label, 1, 2, 1, 2,
200
                         GTK_EXPAND | GTK_SHRINK | GTK_FILL,
201
                         GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
202
203
        label = gtk_label_new(_("Path"));
204
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, 2, 3,
205
                         GTK_FILL, 0, 0, 0);
206
        gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
207
208
        path_label = gtk_label_new("");
209
        gtk_label_set_selectable(GTK_LABEL(path_label), TRUE);
210
        gtk_misc_set_alignment(GTK_MISC(path_label), 0, 0.5);
211
        gtk_label_set_justify(GTK_LABEL(path_label), GTK_JUSTIFY_LEFT);
212
#if GTK_CHECK_VERSION(2, 6, 0)
213
        gtk_label_set_ellipsize(GTK_LABEL(path_label), PANGO_ELLIPSIZE_MIDDLE);
214
#endif
215
        gtk_table_attach(GTK_TABLE(table), path_label, 1, 2, 2, 3,
216
                         GTK_EXPAND | GTK_SHRINK | GTK_FILL,
217
                         GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
218
219
        label = gtk_label_new(_("Type"));
220
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, 3, 4,
221
                         GTK_FILL, 0, 0, 0);
222
        gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
223
224
        hbox = gtk_hbox_new(FALSE, 8);
225
        gtk_widget_show(hbox);
226
        gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, 3, 4,
227
                         GTK_EXPAND | GTK_SHRINK | GTK_FILL,
228
                         GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
229
230
        optmenu = gtk_option_menu_new();
231
        gtk_box_pack_start(GTK_BOX(hbox), optmenu, FALSE, FALSE, 0);
232
233
        optmenu_menu = gtk_menu_new();
234
235
        MENUITEM_ADD(optmenu_menu, menuitem, _("Normal"), F_NORMAL);
236
        MENUITEM_ADD(optmenu_menu, menuitem, _("Inbox") , F_INBOX);
237
        MENUITEM_ADD(optmenu_menu, menuitem, _("Sent")  , F_OUTBOX);
238
        MENUITEM_ADD(optmenu_menu, menuitem, _("Drafts"), F_DRAFT);
239
        MENUITEM_ADD(optmenu_menu, menuitem, _("Queue") , F_QUEUE);
240
        MENUITEM_ADD(optmenu_menu, menuitem, _("Trash") , F_TRASH);
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
257
        dialog->name_entry = name_entry;
258
        dialog->id_label = id_label;
259
        dialog->path_label = path_label;
260
        dialog->type_optmenu = optmenu;
261
        dialog->trim_summary_subj_chkbtn = trim_summary_subj_chkbtn;
262
        dialog->trim_compose_subj_chkbtn = trim_compose_subj_chkbtn;
263
}
264
265
static void prefs_folder_item_compose_create(PrefsFolderItemDialog *dialog)
266
{
267
        GtkWidget *vbox;
268
        GtkWidget *frame;
269
        GtkWidget *account_vbox;
270
        GtkWidget *table;
271
        GtkWidget *hbox;
272
        GtkWidget *label;
273
        GtkWidget *optmenu;
274
        GtkWidget *optmenu_menu;
275
        GtkWidget *menuitem;
276
        GtkWidget *ac_apply_sub_chkbtn;
277
        GtkWidget *to_entry;
278
        GtkWidget *on_reply_chkbtn;
279
        GtkWidget *cc_entry;
280
        GtkWidget *bcc_entry;
281
        GtkWidget *replyto_entry;
282
        GList *list;
283
284
        vbox = gtk_vbox_new(FALSE, VSPACING);
285
        gtk_container_add(GTK_CONTAINER(dialog->dialog->notebook), vbox);
286
        gtk_container_set_border_width(GTK_CONTAINER (vbox), VBOX_BORDER);
287
288
        PACK_FRAME(vbox, frame, _("Account"));
289
290
        account_vbox = gtk_vbox_new(FALSE, VSPACING_NARROW);
291
        gtk_container_add(GTK_CONTAINER(frame), account_vbox);
292
        gtk_container_set_border_width (GTK_CONTAINER (account_vbox), 8);
293
294
        table = gtk_table_new(1, 2, FALSE);
295
        gtk_box_pack_start(GTK_BOX(account_vbox), table, FALSE, FALSE, 0);
296
        gtk_table_set_row_spacings(GTK_TABLE(table), VSPACING_NARROW);
297
        gtk_table_set_col_spacings(GTK_TABLE(table), 8);
298
299
        label = gtk_label_new(_("Account"));
300
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1,
301
                         GTK_FILL, 0, 0, 0);
302
        gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
303
304
        hbox = gtk_hbox_new(FALSE, 8);
305
        gtk_widget_show(hbox);
306
        gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, 0, 1,
307
                         GTK_EXPAND | GTK_SHRINK | GTK_FILL,
308
                         GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
309
310
        optmenu = gtk_option_menu_new();
311
        gtk_box_pack_start(GTK_BOX(hbox), optmenu, FALSE, FALSE, 0);
312
313
        optmenu_menu = gtk_menu_new();
314
315
        MENUITEM_ADD(optmenu_menu, menuitem, _("None"), -1);
316
317
        for (list = account_get_list(); list != NULL; list = list->next) {
318
                gchar *text;
319
                PrefsAccount *ac = list->data;
320
321
                text = g_strdup_printf("%s: %s", ac->account_name, ac->address);
322
                MENUITEM_ADD(optmenu_menu, menuitem, text, ac->account_id);
323
        }
324
325
        gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), optmenu_menu);
326
327
        PACK_CHECK_BUTTON(account_vbox, ac_apply_sub_chkbtn,
328
                          _("Apply to subfolders"));
329
330
        PACK_FRAME(vbox, frame, _("Automatically set the following addresses"));
331
332
        table = gtk_table_new(4, 2, FALSE);
333
        gtk_container_add(GTK_CONTAINER(frame), table);
334
        gtk_container_set_border_width (GTK_CONTAINER (table), 8);
335
        gtk_table_set_row_spacings(GTK_TABLE(table), VSPACING_NARROW);
336
        gtk_table_set_col_spacings(GTK_TABLE(table), 8);
337
338
        label = gtk_label_new(_("To:"));
339
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1,
340
                         GTK_FILL, 0, 0, 0);
341
        gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
342
343
        hbox = gtk_hbox_new(FALSE, 8);
344
        gtk_widget_show(hbox);
345
        gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, 0, 1,
346
                         GTK_EXPAND | GTK_SHRINK | GTK_FILL,
347
                         GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
348
349
        to_entry = gtk_entry_new();
350
        gtk_widget_set_size_request(to_entry, 200, -1);
351
        gtk_box_pack_start(GTK_BOX(hbox), to_entry, TRUE, TRUE, 0);
352
353
        PACK_CHECK_BUTTON(hbox, on_reply_chkbtn, _("use also on reply"));
354
355
        label = gtk_label_new(_("Cc:"));
356
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2,
357
                         GTK_FILL, 0, 0, 0);
358
        gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
359
360
        cc_entry = gtk_entry_new();
361
        gtk_widget_set_size_request(cc_entry, 200, -1);
362
        gtk_table_attach(GTK_TABLE(table), cc_entry, 1, 2, 1, 2,
363
                         GTK_EXPAND | GTK_SHRINK | GTK_FILL,
364
                         GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
365
366
        label = gtk_label_new(_("Bcc:"));
367
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, 2, 3,
368
                         GTK_FILL, 0, 0, 0);
369
        gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
370
371
        bcc_entry = gtk_entry_new();
372
        gtk_widget_set_size_request(bcc_entry, 200, -1);
373
        gtk_table_attach(GTK_TABLE(table), bcc_entry, 1, 2, 2, 3,
374
                         GTK_EXPAND | GTK_SHRINK | GTK_FILL,
375
                         GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
376
377
        label = gtk_label_new(_("Reply-To:"));
378
        gtk_table_attach(GTK_TABLE(table), label, 0, 1, 3, 4,
379
                         GTK_FILL, 0, 0, 0);
380
        gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
381
382
        replyto_entry = gtk_entry_new();
383
        gtk_widget_set_size_request(replyto_entry, 200, -1);
384
        gtk_table_attach(GTK_TABLE(table), replyto_entry, 1, 2, 3, 4,
385
                         GTK_EXPAND | GTK_SHRINK | GTK_FILL,
386
                         GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
387
388
        if (!dialog->item->parent) {
389
                gtk_widget_set_sensitive(frame, FALSE);
390
                gtk_widget_set_sensitive(ac_apply_sub_chkbtn, FALSE);
391
        }
392
393
        dialog->account_optmenu     = optmenu;
394
        dialog->ac_apply_sub_chkbtn = ac_apply_sub_chkbtn;
395
        dialog->to_entry            = to_entry;
396
        dialog->on_reply_chkbtn     = on_reply_chkbtn;
397
        dialog->cc_entry            = cc_entry;
398
        dialog->bcc_entry           = bcc_entry;
399
        dialog->replyto_entry       = replyto_entry;
400
}
401
402
#define SET_ENTRY(entry, str) \
403
        gtk_entry_set_text(GTK_ENTRY(dialog->entry), \
404
                           dialog->item->str ? dialog->item->str : "")
405
406
static void prefs_folder_item_set_dialog(PrefsFolderItemDialog *dialog)
407
{
408
        GtkWidget *menu;
409
        GtkWidget *menuitem;
410
        GtkOptionMenu *optmenu;
411
        gchar *id;
412
        gchar *path;
413
        gchar *utf8_path;
414
        GList *cur;
415
        SpecialFolderItemType type;
416
        gint n;
417
        guint index = 0;
418
419
        /* General */
420
421
        SET_ENTRY(name_entry, name);
422
423
        id = folder_item_get_identifier(dialog->item);
424
        gtk_label_set_text(GTK_LABEL(dialog->id_label), id);
425
        g_free(id);
426
427
        path = folder_item_get_path(dialog->item);
428
        utf8_path = conv_filename_to_utf8(path);
429
        gtk_label_set_text(GTK_LABEL(dialog->path_label), utf8_path);
430
        g_free(utf8_path);
431
        g_free(path);
432
433
        optmenu = GTK_OPTION_MENU(dialog->type_optmenu);
434
        menu = gtk_option_menu_get_menu(optmenu);
435
        for (cur = GTK_MENU_SHELL(menu)->children, n = 0;
436
             cur != NULL; cur = cur->next, n++) {
437
                menuitem = GTK_WIDGET(cur->data);
438
                type = (SpecialFolderItemType)
439
                        g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID);
440
                if (type != F_NORMAL &&
441
                    FOLDER_TYPE(dialog->item->folder) == F_NEWS)
442
                        gtk_widget_set_sensitive(menuitem, FALSE);
443
                if (dialog->item->stype == type)
444
                        index = n;
445
        }
446
447
        gtk_option_menu_set_history(optmenu, index);
448
449
        gtk_toggle_button_set_active
450
                (GTK_TOGGLE_BUTTON(dialog->trim_summary_subj_chkbtn),
451
                 dialog->item->trim_summary_subject);
452
        gtk_toggle_button_set_active
453
                (GTK_TOGGLE_BUTTON(dialog->trim_compose_subj_chkbtn),
454
                 dialog->item->trim_compose_subject);
455
456
        /* Compose */
457
458
        index = 0;
459
        optmenu = GTK_OPTION_MENU(dialog->account_optmenu);
460
        if (dialog->item->account) {
461
                index = menu_find_option_menu_index
462
                        (optmenu,
463
                         GINT_TO_POINTER(dialog->item->account->account_id),
464
                         NULL);
465
                if (index < 0)
466
                        index = 0;
467
        }
468
469
        gtk_option_menu_set_history(optmenu, index);
470
471
        gtk_toggle_button_set_active
472
                (GTK_TOGGLE_BUTTON(dialog->ac_apply_sub_chkbtn),
473
                 dialog->item->ac_apply_sub);
474
475
        SET_ENTRY(to_entry, auto_to);
476
        gtk_toggle_button_set_active
477
                (GTK_TOGGLE_BUTTON(dialog->on_reply_chkbtn),
478
                 dialog->item->use_auto_to_on_reply);
479
480
        SET_ENTRY(cc_entry, auto_cc);
481
        SET_ENTRY(bcc_entry, auto_bcc);
482
        SET_ENTRY(replyto_entry, auto_replyto);
483
}
484
485
#undef SET_ENTRY
486
487
void prefs_folder_item_destroy(PrefsFolderItemDialog *dialog) 
488
{
489
        prefs_dialog_destroy(dialog->dialog);
490
        g_free(dialog->dialog);
491
        g_free(dialog);
492
493
        main_window_popup(main_window_get());
494
        inc_unlock();
495
}
496
497
static void prefs_folder_item_ok_cb(GtkWidget *widget,
498
                                    PrefsFolderItemDialog *dialog)
499
{
500
        prefs_folder_item_apply_cb(widget, dialog);
501
        prefs_folder_item_destroy(dialog);
502
}
503
504
#define SET_DATA_FROM_ENTRY(entry, str) \
505
{ \
506
        entry_str = gtk_entry_get_text(GTK_ENTRY(dialog->entry)); \
507
        g_free(item->str); \
508
        item->str = (entry_str && *entry_str) ? g_strdup(entry_str) : NULL; \
509
}
510
511
static void prefs_folder_item_apply_cb(GtkWidget *widget,
512
                                       PrefsFolderItemDialog *dialog)
513
{
514
        GtkWidget *menu;
515
        GtkWidget *menuitem;
516
        GtkOptionMenu *optmenu;
517
        SpecialFolderItemType type;
518
        FolderItem *item = dialog->item;
519
        Folder *folder = item->folder;
520
        FolderItem *prev_item = NULL;
521
        gint account_id;
522
        const gchar *entry_str;
523
524
        optmenu = GTK_OPTION_MENU(dialog->type_optmenu);
525
        menu = gtk_option_menu_get_menu(optmenu);
526
        menuitem = gtk_menu_get_active(GTK_MENU(menu));
527
        type = (SpecialFolderItemType)
528
                g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID);
529
530
        if (item->stype != type) {
531
                switch (type) {
532
                case F_NORMAL:
533
                        break;
534
                case F_INBOX:
535
                        if (folder->inbox)
536
                                folder->inbox->stype = F_NORMAL;
537
                        prev_item = folder->inbox;
538
                        folder->inbox = item;
539
                        break;
540
                case F_OUTBOX:
541
                        if (folder->outbox)
542
                                folder->outbox->stype = F_NORMAL;
543
                        prev_item = folder->outbox;
544
                        folder->outbox = item;
545
                        break;
546
                case F_DRAFT:
547
                        if (folder->draft)
548
                                folder->draft->stype = F_NORMAL;
549
                        prev_item = folder->draft;
550
                        folder->draft = item;
551
                        break;
552
                case F_QUEUE:
553
                        if (folder->queue)
554
                                folder->queue->stype = F_NORMAL;
555
                        prev_item = folder->queue;
556
                        folder->queue = item;
557
                        break;
558
                case F_TRASH:
559
                        if (folder->trash)
560
                                folder->trash->stype = F_NORMAL;
561
                        prev_item = folder->trash;
562
                        folder->trash = item;
563
                        break;
564
                default:
565
                        type = item->stype;
566
                        break;
567
                }
568
569
                item->stype = type;
570
571
                if (prev_item)
572
                        folderview_update_item(prev_item, FALSE);
573
                folderview_update_item(item, FALSE);
574
        }
575
576
        item->trim_summary_subject = gtk_toggle_button_get_active
577
                (GTK_TOGGLE_BUTTON(dialog->trim_summary_subj_chkbtn));
578
        item->trim_compose_subject = gtk_toggle_button_get_active
579
                (GTK_TOGGLE_BUTTON(dialog->trim_compose_subj_chkbtn));
580
581
        /* account menu */
582
        optmenu = GTK_OPTION_MENU(dialog->account_optmenu);
583
        menu = gtk_option_menu_get_menu(optmenu);
584
        menuitem = gtk_menu_get_active(GTK_MENU(menu));
585
        account_id = GPOINTER_TO_INT
586
                (g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID));
587
        if (account_id >= 0)
588
                item->account = account_find_from_id(account_id);
589
        else
590
                item->account = NULL;
591
592
        if (!item->parent && item->account)
593
                item->ac_apply_sub = TRUE;
594
        else if (item->account)
595
                item->ac_apply_sub = gtk_toggle_button_get_active
596
                        (GTK_TOGGLE_BUTTON(dialog->ac_apply_sub_chkbtn));
597
        else
598
                item->ac_apply_sub = FALSE;
599
600
        SET_DATA_FROM_ENTRY(to_entry, auto_to);
601
        item->use_auto_to_on_reply = gtk_toggle_button_get_active
602
                (GTK_TOGGLE_BUTTON(dialog->on_reply_chkbtn));
603
604
        SET_DATA_FROM_ENTRY(cc_entry, auto_cc);
605
        SET_DATA_FROM_ENTRY(bcc_entry, auto_bcc);
606
        SET_DATA_FROM_ENTRY(replyto_entry, auto_replyto);
607
}
608
609
#undef SET_DATA_FROM_ENTRY
610
611
static void prefs_folder_item_cancel_cb(GtkWidget *widget,
612
                                        PrefsFolderItemDialog *dialog)
613
{
614
        prefs_folder_item_destroy(dialog);
615
}
616
617
static gint prefs_folder_item_delete_cb(GtkWidget *widget, GdkEventAny *event,
618
                                        PrefsFolderItemDialog *dialog)
619
{
620
        prefs_folder_item_destroy(dialog);
621
        return TRUE;
622
}
623
624
static gboolean prefs_folder_item_key_press_cb(GtkWidget *widget,
625
                                           GdkEventKey *event,
626
                                           PrefsFolderItemDialog *dialog)
627
{
628
        if (event && event->keyval == GDK_Escape)
629
                prefs_folder_item_cancel_cb(widget, dialog);
630
        return FALSE;
631
}