sync with cvs 4.64cvs4
[claws.git] / src / prefs_common.c
1 /*
2  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2001 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 <gtk/gtk.h>
28 #include <gdk/gdkkeysyms.h>
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <string.h>
32 #include <unistd.h>
33 #include <sys/types.h>
34 #include <sys/stat.h>
35
36 #include "intl.h"
37 #include "main.h"
38 #include "prefs.h"
39 #include "prefs_common.h"
40 #include "mainwindow.h"
41 #include "summaryview.h"
42 #include "messageview.h"
43 #include "manage_window.h"
44 #include "menu.h"
45 #include "codeconv.h"
46 #include "utils.h"
47 #include "gtkutils.h"
48 #include "alertpanel.h"
49 #include "folder.h"
50
51 PrefsCommon prefs_common;
52
53 static PrefsDialog dialog;
54
55 static struct Receive {
56         GtkWidget *checkbtn_incext;
57         GtkWidget *entry_incext;
58         GtkWidget *button_incext;
59
60         GtkWidget *checkbtn_local;
61         GtkWidget *checkbtn_filter_on_inc;
62         GtkWidget *entry_spool;
63
64         GtkWidget *checkbtn_autochk;
65         GtkWidget *spinbtn_autochk;
66         GtkObject *spinbtn_autochk_adj;
67
68         GtkWidget *checkbtn_chkonstartup;
69
70         GtkWidget *spinbtn_maxarticle;
71         GtkObject *spinbtn_maxarticle_adj;
72 } receive;
73
74 static struct Send {
75         GtkWidget *checkbtn_sendext;
76         GtkWidget *entry_sendext;
77         GtkWidget *button_sendext;
78
79         GtkWidget *checkbtn_savemsg;
80         GtkWidget *checkbtn_queuemsg;
81
82         GtkWidget *optmenu_charset;
83 } send;
84
85 static struct Compose {
86         GtkWidget *checkbtn_quote;
87         GtkWidget *entry_quotemark;
88         GtkWidget *text_quotefmt;
89         GtkWidget *checkbtn_autosig;
90         GtkWidget *entry_sigsep;
91
92         GtkWidget *spinbtn_linewrap;
93         GtkObject *spinbtn_linewrap_adj;
94         GtkWidget *checkbtn_wrapquote;
95         GtkWidget *checkbtn_wrapatsend;
96 } compose;
97
98 static struct Display {
99         GtkWidget *entry_textfont;
100         GtkWidget *button_textfont;
101
102         GtkWidget *chkbtn_folder_unread;
103
104         GtkWidget *chkbtn_transhdr;
105         GtkWidget *chkbtn_swapfrom;
106         GtkWidget *chkbtn_hscrollbar;
107 } display;
108
109 static struct Message {
110         GtkWidget *chkbtn_enablecol;
111         GtkWidget *button_edit_col;
112         GtkWidget *chkbtn_mbalnum;
113         GtkWidget *chkbtn_disphdrpane;
114         GtkWidget *chkbtn_disphdr;
115         GtkWidget *spinbtn_linespc;
116         GtkObject *spinbtn_linespc_adj;
117         GtkWidget *chkbtn_headspc;
118
119         GtkWidget *chkbtn_smoothscroll;
120         GtkWidget *spinbtn_scrollstep;
121         GtkObject *spinbtn_scrollstep_adj;
122         GtkWidget *chkbtn_halfpage;
123 } message;
124
125 #if USE_GPGME
126 static struct Privacy {
127         GtkWidget *checkbtn_default_encrypt;
128         GtkWidget *checkbtn_default_sign;
129         GtkWidget *checkbtn_auto_check_signatures;
130         GtkWidget *checkbtn_passphrase_grab;
131         GtkWidget *optmenu_default_signkey;
132 } privacy;
133 #endif
134
135 static struct Interface {
136         GtkWidget *checkbtn_emacs;
137         GtkWidget *checkbtn_openunread;
138         GtkWidget *checkbtn_openinbox;
139         GtkWidget *checkbtn_immedexec;
140         GtkWidget *checkbtn_confonexit;
141         GtkWidget *checkbtn_cleanonexit;
142         GtkWidget *checkbtn_askonclean;
143         GtkWidget *checkbtn_addaddrbyclick;
144 } interface;
145
146 static struct Other {
147         GtkWidget *uri_combo;
148         GtkWidget *uri_entry;
149         GtkWidget *printcmd_entry;
150         GtkWidget *exteditor_combo;
151         GtkWidget *exteditor_entry;
152 } other;
153
154 static struct MessageColorButtons {
155         GtkWidget *quote_level1_btn;
156         GtkWidget *quote_level2_btn;
157         GtkWidget *quote_level3_btn;
158         GtkWidget *uri_btn;
159 } color_buttons;
160
161 static GtkWidget *quote_desc_win;
162 static GtkWidget *font_sel_win;
163 static GtkWidget *quote_color_win;
164 static GtkWidget *color_dialog;
165
166 static void prefs_common_charset_set_data_from_optmenu(PrefParam *pparam);
167 static void prefs_common_charset_set_optmenu          (PrefParam *pparam);
168 #if USE_GPGME
169 static void prefs_common_default_signkey_set_data_from_optmenu
170                                                         (PrefParam *pparam);
171 static void prefs_common_default_signkey_set_optmenu    (PrefParam *pparam);
172 #endif
173
174 /*
175    parameter name, default value, pointer to the prefs variable, data type,
176    pointer to the widget pointer,
177    pointer to the function for data setting,
178    pointer to the function for widget setting
179  */
180
181 static PrefParam param[] = {
182         /* Receive */
183         {"use_ext_inc", "FALSE", &prefs_common.use_extinc, P_BOOL,
184          &receive.checkbtn_incext,
185          prefs_set_data_from_toggle, prefs_set_toggle},
186         {"ext_inc_path", DEFAULT_INC_PATH, &prefs_common.extinc_path, P_STRING,
187          &receive.entry_incext,
188          prefs_set_data_from_entry, prefs_set_entry},
189
190         {"inc_local", "TRUE", &prefs_common.inc_local, P_BOOL,
191          &receive.checkbtn_local,
192          prefs_set_data_from_toggle, prefs_set_toggle},
193         {"filter_on_inc_local", "FALSE", &prefs_common.filter_on_inc, P_BOOL,
194          &receive.checkbtn_filter_on_inc,
195          prefs_set_data_from_toggle, prefs_set_toggle},
196         {"spool_path", DEFAULT_SPOOL_PATH, &prefs_common.spool_path, P_STRING,
197          &receive.entry_spool,
198          prefs_set_data_from_entry, prefs_set_entry},
199
200         {"autochk_newmail", "FALSE", &prefs_common.autochk_newmail, P_BOOL,
201          &receive.checkbtn_autochk,
202          prefs_set_data_from_toggle, prefs_set_toggle},
203         {"autochk_interval", "10", &prefs_common.autochk_itv, P_INT,
204          &receive.spinbtn_autochk,
205          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
206         {"check_on_startup", "FALSE", &prefs_common.chk_on_startup, P_BOOL,
207          &receive.checkbtn_chkonstartup,
208          prefs_set_data_from_toggle, prefs_set_toggle},
209
210         {"max_news_articles", "300", &prefs_common.max_articles, P_INT,
211          &receive.spinbtn_maxarticle,
212          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
213
214         /* Send */
215         {"use_ext_send", "FALSE", &prefs_common.use_extsend, P_BOOL,
216          &send.checkbtn_sendext,
217          prefs_set_data_from_toggle, prefs_set_toggle},
218         {"ext_send_path", NULL, &prefs_common.extsend_path, P_STRING,
219          &send.entry_sendext, prefs_set_data_from_entry, prefs_set_entry},
220         {"save_message", "TRUE", &prefs_common.savemsg, P_BOOL,
221          &send.checkbtn_savemsg,
222          prefs_set_data_from_toggle, prefs_set_toggle},
223         {"queue_message", "FALSE", &prefs_common.queue_msg, P_BOOL,
224          &send.checkbtn_queuemsg,
225          prefs_set_data_from_toggle, prefs_set_toggle},
226
227         {"outgoing_charset", CS_AUTO, &prefs_common.outgoing_charset, P_STRING,
228          &send.optmenu_charset,
229          prefs_common_charset_set_data_from_optmenu,
230          prefs_common_charset_set_optmenu},
231
232         /* Compose */
233         {"reply_with_quote", "TRUE", &prefs_common.reply_with_quote, P_BOOL,
234          &compose.checkbtn_quote,
235          prefs_set_data_from_toggle, prefs_set_toggle},
236         {"quote_mark", "> ", &prefs_common.quotemark, P_STRING,
237          &compose.entry_quotemark, prefs_set_data_from_entry, prefs_set_entry},
238         {"quote_format", "On %d\\n%f wrote:\\n\\n",
239          &prefs_common.quotefmt, P_STRING, &compose.text_quotefmt,
240          prefs_set_data_from_text, prefs_set_text},
241
242         {"auto_signature", "TRUE", &prefs_common.auto_sig, P_BOOL,
243          &compose.checkbtn_autosig,
244          prefs_set_data_from_toggle, prefs_set_toggle},
245         {"signature_separator", "-- ", &prefs_common.sig_sep, P_STRING,
246          &compose.entry_sigsep, prefs_set_data_from_entry, prefs_set_entry},
247
248         {"linewrap_length", "74", &prefs_common.linewrap_len, P_INT,
249          &compose.spinbtn_linewrap,
250          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
251         {"linewrap_quotation", "FALSE", &prefs_common.linewrap_quote, P_BOOL,
252          &compose.checkbtn_wrapquote,
253          prefs_set_data_from_toggle, prefs_set_toggle},
254         {"linewrap_before_sending", "FALSE",
255          &prefs_common.linewrap_at_send, P_BOOL,
256          &compose.checkbtn_wrapatsend,
257          prefs_set_data_from_toggle, prefs_set_toggle},
258
259         {"show_ruler", "TRUE", &prefs_common.show_ruler, P_BOOL,
260          NULL, NULL, NULL},
261
262         /* Display */
263         {"widget_font", NULL, &prefs_common.widgetfont, P_STRING,
264          NULL, NULL, NULL},
265         {"message_font", "-misc-fixed-medium-r-normal--14-*-*-*-*-*-*-*",
266          &prefs_common.textfont, P_STRING,
267          &display.entry_textfont,
268          prefs_set_data_from_entry, prefs_set_entry},
269
270         {"display_folder_unread_num", "TRUE",
271          &prefs_common.display_folder_unread, P_BOOL,
272          &display.chkbtn_folder_unread,
273          prefs_set_data_from_toggle, prefs_set_toggle},
274
275         /* Display: Summary View */
276         {"translate_header", "TRUE", &prefs_common.trans_hdr, P_BOOL,
277          &display.chkbtn_transhdr,
278          prefs_set_data_from_toggle, prefs_set_toggle},
279         {"enable_swap_from", "TRUE", &prefs_common.swap_from, P_BOOL,
280          &display.chkbtn_swapfrom,
281          prefs_set_data_from_toggle, prefs_set_toggle},
282         {"enable_hscrollbar", "TRUE", &prefs_common.enable_hscrollbar, P_BOOL,
283          &display.chkbtn_hscrollbar,
284          prefs_set_data_from_toggle, prefs_set_toggle},
285
286         {"enable_thread", "TRUE", &prefs_common.enable_thread, P_BOOL,
287          NULL, NULL, NULL},
288         {"toolbar_style", "3", &prefs_common.toolbar_style, P_ENUM,
289          NULL, NULL, NULL},
290         {"show_statusbar", "TRUE", &prefs_common.show_statusbar, P_BOOL,
291          NULL, NULL, NULL},
292
293         {"show_mark", "TRUE", &prefs_common.show_mark, P_BOOL,
294          NULL, NULL, NULL},
295         {"show_unread", "TRUE", &prefs_common.show_unread, P_BOOL,
296          NULL, NULL, NULL},
297         {"show_mime", "TRUE", &prefs_common.show_mime, P_BOOL,
298          NULL, NULL, NULL},
299         {"show_number", "TRUE", &prefs_common.show_number, P_BOOL,
300          NULL, NULL, NULL},
301         {"show_size", "FALSE", &prefs_common.show_size, P_BOOL,
302          NULL, NULL, NULL},
303         {"show_date", "TRUE", &prefs_common.show_date, P_BOOL,
304          NULL, NULL, NULL},
305         {"show_from", "TRUE", &prefs_common.show_from, P_BOOL,
306          NULL, NULL, NULL},
307         {"show_subject", "TRUE", &prefs_common.show_subject, P_BOOL,
308          NULL, NULL, NULL},
309
310         /* Widget size */
311         {"folderview_width", "179", &prefs_common.folderview_width, P_INT,
312          NULL, NULL, NULL},
313         {"folderview_height", "600", &prefs_common.folderview_height, P_INT,
314          NULL, NULL, NULL},
315         {"folder_col_folder", "150", &prefs_common.folder_col_folder, P_INT,
316          NULL, NULL, NULL},
317         {"folder_col_new", "32", &prefs_common.folder_col_new, P_INT,
318          NULL, NULL, NULL},
319         {"folder_col_unread", "32", &prefs_common.folder_col_unread, P_INT,
320          NULL, NULL, NULL},
321         {"folder_col_total", "32", &prefs_common.folder_col_total, P_INT,
322          NULL, NULL, NULL},
323         {"summaryview_width", "600", &prefs_common.summaryview_width, P_INT,
324          NULL, NULL, NULL},
325         {"summaryview_height", "173", &prefs_common.summaryview_height, P_INT,
326          NULL, NULL, NULL},
327         {"summary_col_mark", "10", &prefs_common.summary_col_mark, P_INT,
328          NULL, NULL, NULL},
329         {"summary_col_unread", "13", &prefs_common.summary_col_unread, P_INT,
330          NULL, NULL, NULL},
331         {"summary_col_mime", "10", &prefs_common.summary_col_mime, P_INT,
332          NULL, NULL, NULL},
333         {"summary_col_number", "40", &prefs_common.summary_col_number, P_INT,
334          NULL, NULL, NULL},
335         {"summary_col_size", "48", &prefs_common.summary_col_size, P_INT,
336          NULL, NULL, NULL},
337         {"summary_col_date", "120", &prefs_common.summary_col_date, P_INT,
338          NULL, NULL, NULL},
339         {"summary_col_from", "140", &prefs_common.summary_col_from, P_INT,
340          NULL, NULL, NULL},
341         {"summary_col_subject", "200", &prefs_common.summary_col_subject,
342          P_INT, NULL, NULL, NULL},
343         {"mainview_x", "64", &prefs_common.mainview_x, P_INT,
344          NULL, NULL, NULL},
345         {"mainview_y", "64", &prefs_common.mainview_y, P_INT,
346          NULL, NULL, NULL},
347         {"mainview_width", "600", &prefs_common.mainview_width, P_INT,
348          NULL, NULL, NULL},
349         {"mainview_height", "600", &prefs_common.mainview_height, P_INT,
350          NULL, NULL, NULL},
351         {"mainwin_x", "64", &prefs_common.mainwin_x, P_INT,
352          NULL, NULL, NULL},
353         {"mainwin_y", "64", &prefs_common.mainwin_y, P_INT,
354          NULL, NULL, NULL},
355         {"mainwin_width", "800", &prefs_common.mainwin_width, P_INT,
356          NULL, NULL, NULL},
357         {"mainwin_height", "600", &prefs_common.mainwin_height, P_INT,
358          NULL, NULL, NULL},
359         {"messagewin_width", "600", &prefs_common.msgwin_width, P_INT,
360          NULL, NULL, NULL},
361         {"messagewin_height", "540", &prefs_common.msgwin_height, P_INT,
362          NULL, NULL, NULL},
363         {"compose_width", "600", &prefs_common.compose_width, P_INT,
364          NULL, NULL, NULL},
365         {"compose_height", "560", &prefs_common.compose_height, P_INT,
366          NULL, NULL, NULL},
367
368         /* Message */
369         {"enable_color", "TRUE", &prefs_common.enable_color, P_BOOL,
370          &message.chkbtn_enablecol,
371          prefs_set_data_from_toggle, prefs_set_toggle},
372
373         {"quote_level1_color", "179", &prefs_common.quote_level1_col, P_INT,
374          NULL, NULL, NULL},
375         {"quote_level2_color", "179", &prefs_common.quote_level2_col, P_INT,
376          NULL, NULL, NULL},
377         {"quote_level3_color", "179", &prefs_common.quote_level3_col, P_INT,
378          NULL, NULL, NULL},
379         {"uri_color", "32512", &prefs_common.uri_col, P_INT,
380          NULL, NULL, NULL},
381         {"signature_color", "0", &prefs_common.sig_col, P_USHORT,
382          NULL, NULL, NULL},
383         {"recycle_quote_colors", "FALSE", &prefs_common.recycle_quote_colors,
384          P_BOOL, NULL, NULL, NULL},
385
386         {"convert_mb_alnum", "FALSE", &prefs_common.conv_mb_alnum, P_BOOL,
387          &message.chkbtn_mbalnum,
388          prefs_set_data_from_toggle, prefs_set_toggle},
389         {"display_header_pane", "TRUE", &prefs_common.display_header_pane,
390          P_BOOL, &message.chkbtn_disphdrpane,
391          prefs_set_data_from_toggle, prefs_set_toggle},
392         {"display_header", "TRUE", &prefs_common.display_header, P_BOOL,
393          &message.chkbtn_disphdr,
394          prefs_set_data_from_toggle, prefs_set_toggle},
395         {"line_space", "2", &prefs_common.line_space, P_INT,
396          &message.spinbtn_linespc,
397          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
398         {"enable_head_space", "FALSE", &prefs_common.head_space, P_BOOL,
399          &message.chkbtn_headspc,
400          prefs_set_data_from_toggle, prefs_set_toggle},
401
402         {"enable_smooth_scroll", "FALSE",
403          &prefs_common.enable_smooth_scroll, P_BOOL,
404          &message.chkbtn_smoothscroll,
405          prefs_set_data_from_toggle, prefs_set_toggle},
406         {"scroll_step", "1", &prefs_common.scroll_step, P_INT,
407          &message.spinbtn_scrollstep,
408          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
409         {"scroll_half_page", "FALSE", &prefs_common.scroll_halfpage, P_BOOL,
410          &message.chkbtn_halfpage,
411          prefs_set_data_from_toggle, prefs_set_toggle},
412
413         /* MIME viewer */
414         {"mime_image_viewer", "display '%s'",
415          &prefs_common.mime_image_viewer, P_STRING, NULL, NULL, NULL},
416         {"mime_audio_player", "play '%s'",
417          &prefs_common.mime_audio_player, P_STRING, NULL, NULL, NULL},
418
419 #if USE_GPGME
420         /* Privacy */
421         {"default_encrypt", "FALSE", &prefs_common.default_encrypt, P_BOOL,
422          &privacy.checkbtn_default_encrypt,
423          prefs_set_data_from_toggle, prefs_set_toggle},
424         {"default_sign", "FALSE", &prefs_common.default_sign, P_BOOL,
425          &privacy.checkbtn_default_sign,
426          prefs_set_data_from_toggle, prefs_set_toggle},
427         {"auto_check_signatures", "TRUE",
428          &prefs_common.auto_check_signatures, P_BOOL,
429          &privacy.checkbtn_auto_check_signatures,
430          prefs_set_data_from_toggle, prefs_set_toggle},
431         {"passphrase_grab", "FALSE", &prefs_common.passphrase_grab, P_BOOL,
432          &privacy.checkbtn_passphrase_grab,
433          prefs_set_data_from_toggle, prefs_set_toggle},
434         {"default_signkey", CS_AUTO, &prefs_common.default_signkey, P_STRING,
435          &privacy.optmenu_default_signkey,
436          prefs_common_default_signkey_set_data_from_optmenu,
437          prefs_common_default_signkey_set_optmenu},
438 #endif /* USE_GPGME */
439
440         /* Interface */
441         {"separate_folder", "FALSE", &prefs_common.sep_folder, P_BOOL,
442          NULL, NULL, NULL},
443         {"separate_message", "FALSE", &prefs_common.sep_msg, P_BOOL,
444          NULL, NULL, NULL},
445
446         {"emulate_emacs", "FALSE", &prefs_common.emulate_emacs, P_BOOL,
447          &interface.checkbtn_emacs,
448          prefs_set_data_from_toggle, prefs_set_toggle},
449         {"open_unread_on_enter", "FALSE", &prefs_common.open_unread_on_enter,
450          P_BOOL, &interface.checkbtn_openunread,
451          prefs_set_data_from_toggle, prefs_set_toggle},
452         {"open_inbox_on_inc", "TRUE", &prefs_common.open_inbox_on_inc,
453          P_BOOL, &interface.checkbtn_openinbox,
454          prefs_set_data_from_toggle, prefs_set_toggle},
455         {"immediate_execution", "TRUE", &prefs_common.immediate_exec, P_BOOL,
456          &interface.checkbtn_immedexec,
457          prefs_set_data_from_toggle, prefs_set_toggle},
458         {"add_address_by_click", "FALSE", &prefs_common.add_address_by_click,
459          P_BOOL, &interface.checkbtn_addaddrbyclick,
460          prefs_set_data_from_toggle, prefs_set_toggle},
461
462         {"confirm_on_exit", "TRUE", &prefs_common.confirm_on_exit, P_BOOL,
463          &interface.checkbtn_confonexit,
464          prefs_set_data_from_toggle, prefs_set_toggle},
465         {"clean_trash_on_exit", "FALSE", &prefs_common.clean_on_exit, P_BOOL,
466          &interface.checkbtn_cleanonexit,
467          prefs_set_data_from_toggle, prefs_set_toggle},
468         {"ask_on_cleaning", "TRUE", &prefs_common.ask_on_clean, P_BOOL,
469          &interface.checkbtn_askonclean,
470          prefs_set_data_from_toggle, prefs_set_toggle},
471
472         /* Other */
473         {"uri_open_command", "netscape -remote 'openURL(%s,raise)'",
474          &prefs_common.uri_cmd, P_STRING,
475          &other.uri_entry, prefs_set_data_from_entry, prefs_set_entry},
476         {"print_command", "lpr %s", &prefs_common.print_cmd, P_STRING,
477          &other.printcmd_entry, prefs_set_data_from_entry, prefs_set_entry},
478         {"ext_editor_command", "gedit %s",
479          &prefs_common.ext_editor_cmd, P_STRING,
480          &other.exteditor_entry, prefs_set_data_from_entry, prefs_set_entry},
481
482         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
483 };
484
485 #define VSPACING                12
486 #define VSPACING_NARROW         4
487 #define VBOX_BORDER             16
488 #define DEFAULT_ENTRY_WIDTH     80
489 #define PREFSBUFSIZE            1024
490
491 /* widget creating functions */
492 static void prefs_common_create         (void);
493 static void prefs_receive_create        (void);
494 static void prefs_send_create           (void);
495 static void prefs_compose_create        (void);
496 static void prefs_display_create        (void);
497 static void prefs_message_create        (void);
498 #if USE_GPGME
499 static void prefs_privacy_create        (void);
500 #endif
501 static void prefs_interface_create      (void);
502 static void prefs_other_create          (void);
503
504 static void prefs_quote_description             (void);
505 static void prefs_quote_description_create      (void);
506 static void prefs_quote_colors_dialog           (void);
507 static void prefs_quote_colors_dialog_create    (void);
508 static void quote_color_set_dialog              (GtkWidget      *widget,
509                                                  gpointer        data);
510 static void quote_colors_set_dialog_ok          (GtkWidget      *widget,
511                                                  gpointer        data);
512 static void quote_colors_set_dialog_cancel      (GtkWidget      *widget,
513                                                  gpointer        data);
514 static void set_button_bg_color                 (GtkWidget      *widget,
515                                                  gint            color);
516 static void prefs_enable_message_color_toggled  (void);
517 static void prefs_recycle_colors_toggled        (GtkWidget      *widget);
518
519 /* functions for setting items of SummaryView */
520 static void prefs_summary_display_item_dialog_create
521                                         (gboolean       *cancelled);
522 static void display_item_ok             (GtkWidget      *widget,
523                                          gboolean       *cancelled);
524 static void display_item_cancel         (GtkWidget      *widget,
525                                          gboolean       *cancelled);
526 static gint display_item_delete_event   (GtkWidget      *widget,
527                                          GdkEventAny    *event,
528                                          gboolean       *cancelled);
529 static void display_item_key_pressed    (GtkWidget      *widget,
530                                          GdkEventKey    *event,
531                                          gboolean       *cancelled);
532
533 static void prefs_font_select                   (GtkButton      *button);
534 static void prefs_font_selection_key_pressed    (GtkWidget      *widget,
535                                                  GdkEventKey    *event,
536                                                  gpointer        data);
537 static void prefs_font_selection_ok             (GtkButton      *button);
538
539 static void prefs_common_key_pressed    (GtkWidget      *widget,
540                                          GdkEventKey    *event,
541                                          gpointer        data);
542 static void prefs_common_ok             (GtkButton      *button);
543 static void prefs_common_apply          (GtkButton      *button);
544
545 void prefs_common_read_config(void)
546 {
547         prefs_read_config(param, "Common", COMMON_RC);
548 }
549
550 void prefs_common_save_config(void)
551 {
552         prefs_save_config(param, "Common", COMMON_RC);
553 }
554
555 void prefs_common_open(void)
556 {
557         if (!dialog.window) {
558                 prefs_common_create();
559         }
560
561         manage_window_set_transient(GTK_WINDOW(dialog.window));
562         gtk_notebook_set_page(GTK_NOTEBOOK(dialog.notebook), 0);
563         gtk_widget_grab_focus(dialog.ok_btn);
564
565         prefs_set_dialog(param);
566
567         gtk_widget_show(dialog.window);
568 }
569
570 static void prefs_common_create(void)
571 {
572         gint page = 0;
573
574         debug_print(_("Creating common preferences window...\n"));
575
576         prefs_dialog_create(&dialog);
577         gtk_window_set_title (GTK_WINDOW(dialog.window),
578                               _("Common Preferences"));
579         gtk_signal_connect (GTK_OBJECT(dialog.window), "delete_event",
580                             GTK_SIGNAL_FUNC(gtk_widget_hide_on_delete), NULL);
581         gtk_signal_connect (GTK_OBJECT(dialog.window), "key_press_event",
582                             GTK_SIGNAL_FUNC(prefs_common_key_pressed), NULL);
583         gtk_signal_connect (GTK_OBJECT(dialog.window), "focus_in_event",
584                             GTK_SIGNAL_FUNC(manage_window_focus_in), NULL);
585         gtk_signal_connect (GTK_OBJECT(dialog.window), "focus_out_event",
586                             GTK_SIGNAL_FUNC(manage_window_focus_out), NULL);
587         gtk_signal_connect (GTK_OBJECT(dialog.ok_btn), "clicked",
588                             GTK_SIGNAL_FUNC(prefs_common_ok), NULL);
589         gtk_signal_connect (GTK_OBJECT(dialog.apply_btn), "clicked",
590                             GTK_SIGNAL_FUNC(prefs_common_apply), NULL);
591         gtk_signal_connect_object (GTK_OBJECT(dialog.cancel_btn), "clicked",
592                                    GTK_SIGNAL_FUNC(gtk_widget_hide_on_delete),
593                                    GTK_OBJECT(dialog.window));
594
595         /* create all widgets on notebook */
596         prefs_receive_create();
597         SET_NOTEBOOK_LABEL(dialog.notebook, _("Receive"),   page++);
598         prefs_send_create();
599         SET_NOTEBOOK_LABEL(dialog.notebook, _("Send"),      page++);
600         prefs_compose_create();
601         SET_NOTEBOOK_LABEL(dialog.notebook, _("Compose"),   page++);
602         prefs_display_create();
603         SET_NOTEBOOK_LABEL(dialog.notebook, _("Display"),   page++);
604         prefs_message_create();
605         SET_NOTEBOOK_LABEL(dialog.notebook, _("Message"),   page++);
606 #if USE_GPGME
607         prefs_privacy_create();
608         SET_NOTEBOOK_LABEL(dialog.notebook, _("Privacy"),   page++);
609 #endif
610         prefs_interface_create();
611         SET_NOTEBOOK_LABEL(dialog.notebook, _("Interface"), page++);
612         prefs_other_create();
613         SET_NOTEBOOK_LABEL(dialog.notebook, _("Other"),     page++);
614
615         gtk_widget_show_all(dialog.window);
616 }
617
618 static void prefs_receive_create(void)
619 {
620         GtkWidget *vbox1;
621         GtkWidget *vbox2;
622         GtkWidget *frame_incext;
623         GtkWidget *checkbtn_incext;
624         GtkWidget *hbox;
625         GtkWidget *label_incext;
626         GtkWidget *entry_incext;
627         GtkWidget *button_incext;
628
629         GtkWidget *frame_spool;
630         GtkWidget *checkbtn_local;
631         GtkWidget *checkbtn_filter_on_inc;
632         GtkWidget *label_spool;
633         GtkWidget *entry_spool;
634
635         GtkWidget *hbox_autochk;
636         GtkWidget *checkbtn_autochk;
637         GtkWidget *label_autochk1;
638         GtkObject *spinbtn_autochk_adj;
639         GtkWidget *spinbtn_autochk;
640         GtkWidget *label_autochk2;
641         GtkWidget *checkbtn_chkonstartup;
642
643         GtkWidget *frame_news;
644         GtkWidget *label_maxarticle;
645         GtkWidget *spinbtn_maxarticle;
646         GtkObject *spinbtn_maxarticle_adj;
647
648         vbox1 = gtk_vbox_new (FALSE, VSPACING);
649         gtk_widget_show (vbox1);
650         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
651         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
652
653         PACK_FRAME(vbox1, frame_incext, _("External program"));
654
655         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
656         gtk_widget_show (vbox2);
657         gtk_container_add (GTK_CONTAINER (frame_incext), vbox2);
658         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
659
660         /* Use of external incorporation program */
661         PACK_CHECK_BUTTON (vbox2, checkbtn_incext,
662                            _("Use external program for incorporation"));
663
664         hbox = gtk_hbox_new (FALSE, 8);
665         gtk_widget_show (hbox);
666         gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
667         SET_TOGGLE_SENSITIVITY (checkbtn_incext, hbox);
668
669         label_incext = gtk_label_new (_("Program path"));
670         gtk_widget_show (label_incext);
671         gtk_box_pack_start (GTK_BOX (hbox), label_incext, FALSE, FALSE, 0);
672
673         entry_incext = gtk_entry_new ();
674         gtk_widget_show (entry_incext);
675         gtk_box_pack_start (GTK_BOX (hbox), entry_incext, TRUE, TRUE, 0);
676
677         button_incext = gtk_button_new_with_label ("... ");
678         gtk_widget_show (button_incext);
679         gtk_box_pack_start (GTK_BOX (hbox), button_incext, FALSE, FALSE, 0);
680
681         PACK_FRAME(vbox1, frame_spool, _("Local spool"));
682
683         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
684         gtk_widget_show (vbox2);
685         gtk_container_add (GTK_CONTAINER (frame_spool), vbox2);
686         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
687
688         hbox = gtk_hbox_new (FALSE, 32);
689         gtk_widget_show (hbox);
690         gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
691
692         PACK_CHECK_BUTTON (hbox, checkbtn_local, _("Incorporate from spool"));
693         PACK_CHECK_BUTTON (hbox, checkbtn_filter_on_inc,
694                            _("Filter on incorporation"));
695         SET_TOGGLE_SENSITIVITY (checkbtn_local, checkbtn_filter_on_inc);
696
697         hbox = gtk_hbox_new (FALSE, 8);
698         gtk_widget_show (hbox);
699         gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
700         SET_TOGGLE_SENSITIVITY (checkbtn_local, hbox);
701
702         label_spool = gtk_label_new (_("Spool directory"));
703         gtk_widget_show (label_spool);
704         gtk_box_pack_start (GTK_BOX (hbox), label_spool, FALSE, FALSE, 0);
705
706         entry_spool = gtk_entry_new ();
707         gtk_widget_show (entry_spool);
708         gtk_box_pack_start (GTK_BOX (hbox), entry_spool, TRUE, TRUE, 0);
709
710         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
711         gtk_widget_show (vbox2);
712         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
713
714         /* Auto-checking */
715         hbox_autochk = gtk_hbox_new (FALSE, 8);
716         gtk_widget_show (hbox_autochk);
717         gtk_box_pack_start (GTK_BOX (vbox2), hbox_autochk, FALSE, FALSE, 0);
718
719         gtk_widget_set_sensitive(hbox_autochk, FALSE);
720
721         PACK_CHECK_BUTTON (hbox_autochk, checkbtn_autochk,
722                            _("Auto-check new mail"));
723
724         label_autochk1 = gtk_label_new (_("each"));
725         gtk_widget_show (label_autochk1);
726         gtk_box_pack_start (GTK_BOX (hbox_autochk), label_autochk1, FALSE, FALSE, 0);
727
728         spinbtn_autochk_adj = gtk_adjustment_new (5, 1, 100, 1, 10, 10);
729         spinbtn_autochk = gtk_spin_button_new
730                 (GTK_ADJUSTMENT (spinbtn_autochk_adj), 1, 0);
731         gtk_widget_show (spinbtn_autochk);
732         gtk_box_pack_start (GTK_BOX (hbox_autochk), spinbtn_autochk, FALSE, FALSE, 0);
733         gtk_widget_set_usize (spinbtn_autochk, 64, -1);
734         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_autochk), TRUE);
735
736         label_autochk2 = gtk_label_new (_("minute(s)"));
737         gtk_widget_show (label_autochk2);
738         gtk_box_pack_start (GTK_BOX (hbox_autochk), label_autochk2, FALSE, FALSE, 0);
739
740         SET_TOGGLE_SENSITIVITY(checkbtn_autochk, label_autochk1);
741         SET_TOGGLE_SENSITIVITY(checkbtn_autochk, spinbtn_autochk);
742         SET_TOGGLE_SENSITIVITY(checkbtn_autochk, label_autochk2);
743
744         PACK_CHECK_BUTTON (vbox2, checkbtn_chkonstartup,
745                            _("Check new mail on startup"));
746
747         PACK_FRAME(vbox1, frame_news, _("News"));
748
749         hbox = gtk_hbox_new (FALSE, 8);
750         gtk_widget_show (hbox);
751         gtk_container_add (GTK_CONTAINER (frame_news), hbox);
752         gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
753
754         label_maxarticle = gtk_label_new
755                 (_("Maximum article number to download\n"
756                    "(unlimited if 0 is specified)"));
757         gtk_widget_show (label_maxarticle);
758         gtk_box_pack_start (GTK_BOX (hbox), label_maxarticle, FALSE, FALSE, 0);
759         gtk_label_set_justify (GTK_LABEL (label_maxarticle), GTK_JUSTIFY_LEFT);
760
761         spinbtn_maxarticle_adj =
762                 gtk_adjustment_new (300, 0, 10000, 10, 100, 100);
763         spinbtn_maxarticle = gtk_spin_button_new
764                 (GTK_ADJUSTMENT (spinbtn_maxarticle_adj), 10, 0);
765         gtk_widget_show (spinbtn_maxarticle);
766         gtk_box_pack_start (GTK_BOX (hbox), spinbtn_maxarticle,
767                             FALSE, FALSE, 0);
768         gtk_widget_set_usize (spinbtn_maxarticle, 64, -1);
769         gtk_spin_button_set_numeric
770                 (GTK_SPIN_BUTTON (spinbtn_maxarticle), TRUE);
771
772         receive.checkbtn_incext = checkbtn_incext;
773         receive.entry_incext    = entry_incext;
774         receive.button_incext   = button_incext;
775
776         receive.checkbtn_local         = checkbtn_local;
777         receive.checkbtn_filter_on_inc = checkbtn_filter_on_inc;
778         receive.entry_spool            = entry_spool;
779
780         receive.checkbtn_autochk    = checkbtn_autochk;
781         receive.spinbtn_autochk     = spinbtn_autochk;
782         receive.spinbtn_autochk_adj = spinbtn_autochk_adj;
783
784         receive.checkbtn_chkonstartup = checkbtn_chkonstartup;
785
786         receive.spinbtn_maxarticle     = spinbtn_maxarticle;
787         receive.spinbtn_maxarticle_adj = spinbtn_maxarticle_adj;
788 }
789
790 static void prefs_send_create(void)
791 {
792         GtkWidget *vbox1;
793         GtkWidget *vbox2;
794         GtkWidget *frame_sendext;
795         GtkWidget *vbox_sendext;
796         GtkWidget *checkbtn_sendext;
797         GtkWidget *hbox1;
798         GtkWidget *label_sendext;
799         GtkWidget *entry_sendext;
800         GtkWidget *button_sendext;
801         GtkWidget *checkbtn_savemsg;
802         GtkWidget *checkbtn_queuemsg;
803         GtkWidget *label_outcharset;
804         GtkWidget *optmenu;
805         GtkWidget *optmenu_menu;
806         GtkWidget *menuitem;
807
808         vbox1 = gtk_vbox_new (FALSE, VSPACING);
809         gtk_widget_show (vbox1);
810         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
811         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
812
813         PACK_FRAME(vbox1, frame_sendext, _("External program"));
814
815         gtk_widget_set_sensitive(frame_sendext, FALSE);
816
817         vbox_sendext = gtk_vbox_new (FALSE, VSPACING_NARROW);
818         gtk_widget_show (vbox_sendext);
819         gtk_container_add (GTK_CONTAINER (frame_sendext), vbox_sendext);
820         gtk_container_set_border_width (GTK_CONTAINER (vbox_sendext), 8);
821
822         PACK_CHECK_BUTTON (vbox_sendext, checkbtn_sendext,
823                            _("Use external program for sending"));
824
825         hbox1 = gtk_hbox_new (FALSE, 8);
826         gtk_widget_show (hbox1);
827         gtk_box_pack_start (GTK_BOX (vbox_sendext), hbox1, FALSE, FALSE, 0);
828         SET_TOGGLE_SENSITIVITY(checkbtn_sendext, hbox1);
829
830         label_sendext = gtk_label_new (_("Program path"));
831         gtk_widget_show (label_sendext);
832         gtk_box_pack_start (GTK_BOX (hbox1), label_sendext, FALSE, FALSE, 0);
833
834         entry_sendext = gtk_entry_new ();
835         gtk_widget_show (entry_sendext);
836         gtk_box_pack_start (GTK_BOX (hbox1), entry_sendext, TRUE, TRUE, 0);
837
838         button_sendext = gtk_button_new_with_label ("... ");
839         gtk_widget_show (button_sendext);
840         gtk_box_pack_start (GTK_BOX (hbox1), button_sendext, FALSE, FALSE, 0);
841
842         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
843         gtk_widget_show (vbox2);
844         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
845
846         PACK_CHECK_BUTTON (vbox2, checkbtn_savemsg,
847                            _("Save sent message to outbox"));
848         PACK_CHECK_BUTTON (vbox2, checkbtn_queuemsg,
849                            _("Queue message that failed to send"));
850
851         hbox1 = gtk_hbox_new (FALSE, 8);
852         gtk_widget_show (hbox1);
853         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
854
855         label_outcharset = gtk_label_new (_("Outgoing codeset"));
856         gtk_widget_show (label_outcharset);
857         gtk_box_pack_start (GTK_BOX (hbox1), label_outcharset, FALSE, FALSE, 0);
858
859         optmenu = gtk_option_menu_new ();
860         gtk_widget_show (optmenu);
861         gtk_box_pack_start(GTK_BOX (hbox1), optmenu, FALSE, FALSE, 0);
862
863         optmenu_menu = gtk_menu_new ();
864
865 #define SET_MENUITEM(str, charset) \
866 { \
867         MENUITEM_ADD(optmenu_menu, menuitem, str, charset); \
868 }
869
870         SET_MENUITEM(_("Automatic"),                     CS_AUTO);
871         SET_MENUITEM(_("7bit ascii (US-ASCII)"),         CS_US_ASCII);
872 #if HAVE_LIBJCONV
873         SET_MENUITEM(_("Unicode (UTF-8)"),               CS_UTF_8);
874 #endif
875         SET_MENUITEM(_("Western European (ISO-8859-1)"), CS_ISO_8859_1);
876 #if HAVE_LIBJCONV
877         SET_MENUITEM(_("Central European (ISO-8859-2)"), CS_ISO_8859_2);
878         SET_MENUITEM(_("Baltic (ISO-8859-13)"),          CS_ISO_8859_13);
879         SET_MENUITEM(_("Baltic (ISO-8859-4)"),           CS_ISO_8859_4);
880         SET_MENUITEM(_("Greek (ISO-8859-7)"),            CS_ISO_8859_7);
881         SET_MENUITEM(_("Turkish (ISO-8859-9)"),          CS_ISO_8859_9);
882         SET_MENUITEM(_("Cyrillic (ISO-8859-5)"),         CS_ISO_8859_5);
883         SET_MENUITEM(_("Cyrillic (KOI8-R)"),             CS_KOI8_R);
884         SET_MENUITEM(_("Cyrillic (Windows-1251)"),       CS_CP1251);
885         SET_MENUITEM(_("Cyrillic (KOI8-U)"),             CS_KOI8_U);
886 #endif /* HAVE_LIBJCONV */
887         SET_MENUITEM(_("Japanese (ISO-2022-JP)"),        CS_ISO_2022_JP);
888 #if 0
889         SET_MENUITEM(_("Japanese (EUC-JP)"),             CS_EUC_JP);
890         SET_MENUITEM(_("Japanese (Shift_JIS)"),          CS_SHIFT_JIS);
891 #endif /* 0 */
892 #if HAVE_LIBJCONV
893         SET_MENUITEM(_("Simplified Chinese (GB2312)"),   CS_GB2312);
894         SET_MENUITEM(_("Traditional Chinese (Big5)"),    CS_BIG5);
895 #if 0
896         SET_MENUITEM(_("Traditional Chinese (EUC-TW)"),  CS_EUC_TW);
897         SET_MENUITEM(_("Chinese (ISO-2022-CN)"),         CS_ISO_2022_CN);
898 #endif /* 0 */
899         SET_MENUITEM(_("Korean (EUC-KR)"),               CS_EUC_KR);
900 #endif /* HAVE_LIBJCONV */
901
902         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu), optmenu_menu);
903
904         send.checkbtn_sendext = checkbtn_sendext;
905         send.entry_sendext    = entry_sendext;
906         send.button_sendext   = button_sendext;
907
908         send.checkbtn_savemsg  = checkbtn_savemsg;
909         send.checkbtn_queuemsg = checkbtn_queuemsg;
910
911         send.optmenu_charset = optmenu;
912 }
913
914 static void prefs_compose_create(void)
915 {
916         GtkWidget *vbox1;
917         GtkWidget *frame_quote;
918         GtkWidget *vbox_quote;
919         GtkWidget *checkbtn_quote;
920         GtkWidget *hbox1;
921         GtkWidget *label_quotemark;
922         GtkWidget *entry_quotemark;
923         GtkWidget *hbox2;
924         GtkWidget *label_quotefmt;
925         GtkWidget *btn_quotedesc;
926         GtkWidget *scrolledwin_quotefmt;
927         GtkWidget *text_quotefmt;
928
929         GtkWidget *frame_sig;
930         GtkWidget *vbox_sig;
931         GtkWidget *checkbtn_autosig;
932         GtkWidget *label_sigsep;
933         GtkWidget *entry_sigsep;
934
935         GtkWidget *vbox_linewrap;
936         GtkWidget *hbox3;
937         GtkWidget *hbox4;
938         GtkWidget *label_linewrap;
939         GtkObject *spinbtn_linewrap_adj;
940         GtkWidget *spinbtn_linewrap;
941         GtkWidget *checkbtn_wrapquote;
942         GtkWidget *checkbtn_wrapatsend;
943
944         vbox1 = gtk_vbox_new (FALSE, VSPACING);
945         gtk_widget_show (vbox1);
946         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
947         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
948
949         PACK_FRAME(vbox1, frame_quote, _("Quotation"));
950
951         vbox_quote = gtk_vbox_new (FALSE, VSPACING_NARROW);
952         gtk_widget_show (vbox_quote);
953         gtk_container_add (GTK_CONTAINER (frame_quote), vbox_quote);
954         gtk_container_set_border_width (GTK_CONTAINER (vbox_quote), 8);
955
956         PACK_CHECK_BUTTON (vbox_quote, checkbtn_quote,
957                            _("Quote message when replying"));
958
959         hbox1 = gtk_hbox_new (FALSE, 8);
960         gtk_widget_show (hbox1);
961         gtk_box_pack_start (GTK_BOX (vbox_quote), hbox1, TRUE, TRUE, 0);
962
963         label_quotemark = gtk_label_new (_("Quotation mark"));
964         gtk_widget_show (label_quotemark);
965         gtk_box_pack_start (GTK_BOX (hbox1), label_quotemark, FALSE, FALSE, 0);
966
967         entry_quotemark = gtk_entry_new ();
968         gtk_widget_show (entry_quotemark);
969         gtk_box_pack_start (GTK_BOX (hbox1), entry_quotemark, FALSE, FALSE, 0);
970         gtk_widget_set_usize (entry_quotemark, 64, -1);
971
972         hbox2 = gtk_hbox_new (FALSE, 0);
973         gtk_widget_show (hbox2);
974         gtk_box_pack_start (GTK_BOX (vbox_quote), hbox2, TRUE, TRUE, 0);
975
976         label_quotefmt = gtk_label_new (_("Quotation format:"));
977         gtk_widget_show (label_quotefmt);
978         gtk_box_pack_start (GTK_BOX (hbox2), label_quotefmt, FALSE, FALSE, 0);
979
980         btn_quotedesc =
981                 gtk_button_new_with_label (_(" Description of symbols "));
982         gtk_widget_show (btn_quotedesc);
983         gtk_box_pack_end (GTK_BOX (hbox2), btn_quotedesc, FALSE, FALSE, 0);
984         gtk_signal_connect(GTK_OBJECT(btn_quotedesc), "clicked",
985                            GTK_SIGNAL_FUNC(prefs_quote_description), NULL);
986
987         scrolledwin_quotefmt = gtk_scrolled_window_new (NULL, NULL);
988         gtk_widget_show (scrolledwin_quotefmt);
989         gtk_box_pack_start (GTK_BOX (vbox_quote), scrolledwin_quotefmt, TRUE, TRUE, 0);
990         gtk_scrolled_window_set_policy
991                 (GTK_SCROLLED_WINDOW (scrolledwin_quotefmt),
992                  GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
993
994         text_quotefmt = gtk_text_new (NULL, NULL);
995         gtk_widget_show (text_quotefmt);
996         gtk_container_add(GTK_CONTAINER(scrolledwin_quotefmt), text_quotefmt);
997         gtk_text_set_editable (GTK_TEXT (text_quotefmt), TRUE);
998         gtk_widget_set_usize(text_quotefmt, -1, 60);
999
1000         PACK_FRAME(vbox1, frame_sig, _("Signature"));
1001
1002         vbox_sig = gtk_vbox_new (FALSE, VSPACING_NARROW);
1003         gtk_widget_show (vbox_sig);
1004         gtk_container_add (GTK_CONTAINER (frame_sig), vbox_sig);
1005         gtk_container_set_border_width (GTK_CONTAINER (vbox_sig), 8);
1006
1007         PACK_CHECK_BUTTON (vbox_sig, checkbtn_autosig,
1008                            _("Insert signature automatically"));
1009
1010         hbox1 = gtk_hbox_new (FALSE, 8);
1011         gtk_widget_show (hbox1);
1012         gtk_box_pack_start (GTK_BOX (vbox_sig), hbox1, TRUE, TRUE, 0);
1013
1014         label_sigsep = gtk_label_new (_("Signature separator"));
1015         gtk_widget_show (label_sigsep);
1016         gtk_box_pack_start (GTK_BOX (hbox1), label_sigsep, FALSE, FALSE, 0);
1017
1018         entry_sigsep = gtk_entry_new ();
1019         gtk_widget_show (entry_sigsep);
1020         gtk_box_pack_start (GTK_BOX (hbox1), entry_sigsep, FALSE, FALSE, 0);
1021         gtk_widget_set_usize (entry_sigsep, 64, -1);
1022
1023         /* line-wrapping */
1024         vbox_linewrap = gtk_vbox_new (FALSE, VSPACING_NARROW);
1025         gtk_widget_show (vbox_linewrap);
1026         gtk_box_pack_start (GTK_BOX (vbox1), vbox_linewrap, FALSE, FALSE, 0);
1027
1028         hbox3 = gtk_hbox_new (FALSE, 8);
1029         gtk_widget_show (hbox3);
1030         gtk_box_pack_start (GTK_BOX (vbox_linewrap), hbox3, FALSE, FALSE, 0);
1031
1032         label_linewrap = gtk_label_new (_("Wrap messages at"));
1033         gtk_widget_show (label_linewrap);
1034         gtk_box_pack_start (GTK_BOX (hbox3), label_linewrap, FALSE, FALSE, 0);
1035
1036         spinbtn_linewrap_adj = gtk_adjustment_new (72, 20, 1024, 1, 10, 10);
1037         spinbtn_linewrap = gtk_spin_button_new
1038                 (GTK_ADJUSTMENT (spinbtn_linewrap_adj), 1, 0);
1039         gtk_widget_show (spinbtn_linewrap);
1040         gtk_box_pack_start (GTK_BOX (hbox3), spinbtn_linewrap, FALSE, FALSE, 0);
1041         gtk_widget_set_usize (spinbtn_linewrap, 64, -1);
1042         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_linewrap), TRUE);
1043
1044         label_linewrap = gtk_label_new (_("characters"));
1045         gtk_widget_show (label_linewrap);
1046         gtk_box_pack_start (GTK_BOX (hbox3), label_linewrap, FALSE, FALSE, 0);
1047
1048         hbox4 = gtk_hbox_new (FALSE, 32);
1049         gtk_widget_show (hbox4);
1050         gtk_box_pack_start (GTK_BOX (vbox_linewrap), hbox4, FALSE, FALSE, 0);
1051
1052         PACK_CHECK_BUTTON (hbox4, checkbtn_wrapquote, _("Wrap quotation"));
1053         PACK_CHECK_BUTTON
1054                 (hbox4, checkbtn_wrapatsend, _("Wrap before sending"));
1055
1056         compose.checkbtn_quote   = checkbtn_quote;
1057         compose.entry_quotemark  = entry_quotemark;
1058         compose.text_quotefmt    = text_quotefmt;
1059         compose.checkbtn_autosig = checkbtn_autosig;
1060         compose.entry_sigsep     = entry_sigsep;
1061
1062         compose.spinbtn_linewrap     = spinbtn_linewrap;
1063         compose.spinbtn_linewrap_adj = spinbtn_linewrap_adj;
1064         compose.checkbtn_wrapquote   = checkbtn_wrapquote;
1065         compose.checkbtn_wrapatsend  = checkbtn_wrapatsend;
1066 }
1067
1068 static void prefs_display_create(void)
1069 {
1070         GtkWidget *vbox1;
1071         GtkWidget *frame_font;
1072         GtkWidget *table1;
1073         GtkWidget *label_textfont;
1074         GtkWidget *entry_textfont;
1075         GtkWidget *button_textfont;
1076         GtkWidget *chkbtn_folder_unread;
1077         GtkWidget *chkbtn_transhdr;
1078         GtkWidget *frame_summary;
1079         GtkWidget *vbox2;
1080         GtkWidget *chkbtn_swapfrom;
1081         GtkWidget *chkbtn_hscrollbar;
1082         GtkWidget *hbox1;
1083         GtkWidget *button_dispitem;
1084
1085         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1086         gtk_widget_show (vbox1);
1087         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1088         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1089
1090         PACK_FRAME(vbox1, frame_font, _("Font"));
1091
1092         table1 = gtk_table_new (1, 3, FALSE);
1093         gtk_widget_show (table1);
1094         gtk_container_add (GTK_CONTAINER (frame_font), table1);
1095         gtk_container_set_border_width (GTK_CONTAINER (table1), 8);
1096         gtk_table_set_row_spacings (GTK_TABLE (table1), 8);
1097         gtk_table_set_col_spacings (GTK_TABLE (table1), 8);
1098
1099         label_textfont = gtk_label_new (_("Text"));
1100         gtk_widget_show (label_textfont);
1101         gtk_table_attach (GTK_TABLE (table1), label_textfont, 0, 1, 0, 1,
1102                           GTK_FILL, (GTK_EXPAND | GTK_FILL), 0, 0);
1103
1104         entry_textfont = gtk_entry_new ();
1105         gtk_widget_show (entry_textfont);
1106         gtk_table_attach (GTK_TABLE (table1), entry_textfont, 1, 2, 0, 1,
1107                           (GTK_EXPAND | GTK_FILL), 0, 0, 0);
1108
1109         button_textfont = gtk_button_new_with_label ("... ");
1110         gtk_widget_show (button_textfont);
1111         gtk_table_attach (GTK_TABLE (table1), button_textfont, 2, 3, 0, 1,
1112                           0, 0, 0, 0);
1113         gtk_signal_connect (GTK_OBJECT (button_textfont), "clicked",
1114                             GTK_SIGNAL_FUNC (prefs_font_select), NULL);
1115
1116         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1117         gtk_widget_show (vbox2);
1118         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, TRUE, 0);
1119
1120         PACK_CHECK_BUTTON
1121                 (vbox2, chkbtn_transhdr,
1122                  _("Translate header name (such as `From:', `Subject:')"));
1123
1124         PACK_CHECK_BUTTON (vbox2, chkbtn_folder_unread,
1125                            _("Display unread number next to folder name"));
1126
1127         /* ---- Summary ---- */
1128
1129         PACK_FRAME(vbox1, frame_summary, _("Summary View"));
1130
1131         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1132         gtk_widget_show (vbox2);
1133         gtk_container_add (GTK_CONTAINER (frame_summary), vbox2);
1134         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
1135
1136         PACK_CHECK_BUTTON
1137                 (vbox2, chkbtn_swapfrom,
1138                  _("Display recipient on `From' column if sender is yourself"));
1139         PACK_CHECK_BUTTON
1140                 (vbox2, chkbtn_hscrollbar, _("Enable horizontal scroll bar"));
1141
1142         hbox1 = gtk_hbox_new (FALSE, 8);
1143         gtk_widget_show (hbox1);
1144         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1145
1146         button_dispitem = gtk_button_new_with_label
1147                 (_(" Set display item of summary... "));
1148         gtk_widget_show (button_dispitem);
1149         gtk_box_pack_start (GTK_BOX (hbox1), button_dispitem, FALSE, TRUE, 0);
1150         gtk_signal_connect (GTK_OBJECT (button_dispitem), "clicked",
1151                             GTK_SIGNAL_FUNC (prefs_summary_display_item_set),
1152                             NULL);
1153
1154         display.entry_textfont  = entry_textfont;
1155         display.button_textfont = button_textfont;
1156
1157         display.chkbtn_folder_unread = chkbtn_folder_unread;
1158
1159         display.chkbtn_transhdr   = chkbtn_transhdr;
1160         display.chkbtn_swapfrom   = chkbtn_swapfrom;
1161         display.chkbtn_hscrollbar = chkbtn_hscrollbar;
1162 }
1163
1164 static void prefs_message_create(void)
1165 {
1166         GtkWidget *vbox1;
1167         GtkWidget *vbox2;
1168         GtkWidget *hbox1;
1169         GtkWidget *chkbtn_enablecol;
1170         GtkWidget *button_edit_col;
1171         GtkWidget *chkbtn_mbalnum;
1172         GtkWidget *chkbtn_disphdrpane;
1173         GtkWidget *chkbtn_disphdr;
1174         GtkWidget *hbox_linespc;
1175         GtkWidget *label_linespc;
1176         GtkObject *spinbtn_linespc_adj;
1177         GtkWidget *spinbtn_linespc;
1178         GtkWidget *chkbtn_headspc;
1179
1180         GtkWidget *frame_scr;
1181         GtkWidget *vbox_scr;
1182         GtkWidget *chkbtn_smoothscroll;
1183         GtkWidget *hbox_scr;
1184         GtkWidget *label_scr;
1185         GtkObject *spinbtn_scrollstep_adj;
1186         GtkWidget *spinbtn_scrollstep;
1187         GtkWidget *chkbtn_halfpage;
1188
1189         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1190         gtk_widget_show (vbox1);
1191         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1192         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1193
1194         hbox1 = gtk_hbox_new (FALSE, 8);
1195         gtk_widget_show (hbox1);
1196         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, TRUE, 0);
1197
1198         PACK_CHECK_BUTTON (hbox1, chkbtn_enablecol,
1199                            _("Enable coloration of message"));
1200         gtk_signal_connect (GTK_OBJECT (chkbtn_enablecol), "toggled",
1201                                                 GTK_SIGNAL_FUNC (prefs_enable_message_color_toggled),
1202                                                 NULL);
1203
1204         button_edit_col = gtk_button_new_with_label (_(" Edit... "));
1205         gtk_widget_show (button_edit_col);
1206         gtk_box_pack_end (GTK_BOX (hbox1), button_edit_col, FALSE, TRUE, 0);
1207         gtk_signal_connect (GTK_OBJECT (button_edit_col), "clicked",
1208                             GTK_SIGNAL_FUNC (prefs_quote_colors_dialog), NULL);
1209
1210         SET_TOGGLE_SENSITIVITY(chkbtn_enablecol, button_edit_col);
1211
1212         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1213         gtk_widget_show (vbox2);
1214         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1215
1216         PACK_CHECK_BUTTON
1217                 (vbox2, chkbtn_mbalnum,
1218                  _("Display 2-byte alphabet and numeric with 1-byte character"));
1219         PACK_CHECK_BUTTON(vbox2, chkbtn_disphdrpane,
1220                           _("Display header pane above message view"));
1221         PACK_CHECK_BUTTON(vbox2, chkbtn_disphdr,
1222                           _("Display short headers on message view"));
1223
1224         hbox1 = gtk_hbox_new (FALSE, 32);
1225         gtk_widget_show (hbox1);
1226         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1227
1228         hbox_linespc = gtk_hbox_new (FALSE, 8);
1229         gtk_widget_show (hbox1);
1230         gtk_box_pack_start (GTK_BOX (hbox1), hbox_linespc, FALSE, TRUE, 0);
1231
1232         label_linespc = gtk_label_new (_("Line space"));
1233         gtk_widget_show (label_linespc);
1234         gtk_box_pack_start (GTK_BOX (hbox_linespc), label_linespc,
1235                             FALSE, FALSE, 0);
1236
1237         spinbtn_linespc_adj = gtk_adjustment_new (2, 0, 16, 1, 1, 16);
1238         spinbtn_linespc = gtk_spin_button_new
1239                 (GTK_ADJUSTMENT (spinbtn_linespc_adj), 1, 0);
1240         gtk_widget_show (spinbtn_linespc);
1241         gtk_box_pack_start (GTK_BOX (hbox_linespc), spinbtn_linespc,
1242                             FALSE, FALSE, 0);
1243         gtk_widget_set_usize (spinbtn_linespc, 64, -1);
1244         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_linespc), TRUE);
1245
1246         label_linespc = gtk_label_new (_("pixel(s)"));
1247         gtk_widget_show (label_linespc);
1248         gtk_box_pack_start (GTK_BOX (hbox_linespc), label_linespc,
1249                             FALSE, FALSE, 0);
1250
1251         PACK_CHECK_BUTTON(hbox1, chkbtn_headspc, _("Leave space on head"));
1252
1253         PACK_FRAME(vbox1, frame_scr, _("Scroll"));
1254
1255         vbox_scr = gtk_vbox_new (FALSE, VSPACING_NARROW);
1256         gtk_widget_show (vbox_scr);
1257         gtk_container_add (GTK_CONTAINER (frame_scr), vbox_scr);
1258         gtk_container_set_border_width (GTK_CONTAINER (vbox_scr), 8);
1259
1260         PACK_CHECK_BUTTON(vbox_scr, chkbtn_halfpage, _("Half page"));
1261
1262         hbox1 = gtk_hbox_new (FALSE, 32);
1263         gtk_widget_show (hbox1);
1264         gtk_box_pack_start (GTK_BOX (vbox_scr), hbox1, FALSE, TRUE, 0);
1265
1266         PACK_CHECK_BUTTON(hbox1, chkbtn_smoothscroll, _("Smooth scroll"));
1267
1268         hbox_scr = gtk_hbox_new (FALSE, 8);
1269         gtk_widget_show (hbox_scr);
1270         gtk_box_pack_start (GTK_BOX (hbox1), hbox_scr, FALSE, FALSE, 0);
1271
1272         label_scr = gtk_label_new (_("Step"));
1273         gtk_widget_show (label_scr);
1274         gtk_box_pack_start (GTK_BOX (hbox_scr), label_scr, FALSE, FALSE, 0);
1275
1276         spinbtn_scrollstep_adj = gtk_adjustment_new (1, 1, 100, 1, 10, 10);
1277         spinbtn_scrollstep = gtk_spin_button_new
1278                 (GTK_ADJUSTMENT (spinbtn_scrollstep_adj), 1, 0);
1279         gtk_widget_show (spinbtn_scrollstep);
1280         gtk_box_pack_start (GTK_BOX (hbox_scr), spinbtn_scrollstep,
1281                             FALSE, FALSE, 0);
1282         gtk_widget_set_usize (spinbtn_scrollstep, 64, -1);
1283         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_scrollstep),
1284                                      TRUE);
1285
1286         label_scr = gtk_label_new (_("pixel(s)"));
1287         gtk_widget_show (label_scr);
1288         gtk_box_pack_start (GTK_BOX (hbox_scr), label_scr, FALSE, FALSE, 0);
1289
1290         SET_TOGGLE_SENSITIVITY (chkbtn_smoothscroll, hbox_scr)
1291
1292         message.chkbtn_enablecol   = chkbtn_enablecol;
1293         message.button_edit_col    = button_edit_col;
1294         message.chkbtn_mbalnum     = chkbtn_mbalnum;
1295         message.chkbtn_disphdrpane = chkbtn_disphdrpane;
1296         message.chkbtn_disphdr     = chkbtn_disphdr;
1297         message.spinbtn_linespc    = spinbtn_linespc;
1298         message.chkbtn_headspc     = chkbtn_headspc;
1299
1300         message.chkbtn_smoothscroll    = chkbtn_smoothscroll;
1301         message.spinbtn_scrollstep     = spinbtn_scrollstep;
1302         message.spinbtn_scrollstep_adj = spinbtn_scrollstep_adj;
1303         message.chkbtn_halfpage        = chkbtn_halfpage;
1304 }
1305
1306 #if USE_GPGME
1307 static void prefs_privacy_create(void)
1308 {
1309         GtkWidget *vbox1;
1310         GtkWidget *vbox2;
1311         GtkWidget *hbox1;
1312         GtkWidget *checkbtn_default_encrypt;
1313         GtkWidget *checkbtn_default_sign;
1314         GtkWidget *checkbtn_auto_check_signatures;
1315         GtkWidget *checkbtn_passphrase_grab;
1316         GtkWidget *label;
1317         GtkWidget *menuitem;
1318         GtkWidget *optmenu;
1319         GtkWidget *optmenu_menu;
1320
1321         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1322         gtk_widget_show (vbox1);
1323         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1324         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1325
1326         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1327         gtk_widget_show (vbox2);
1328         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1329
1330         PACK_CHECK_BUTTON (vbox2, checkbtn_default_encrypt,
1331                            _("Encrypt message by default"));
1332
1333         PACK_CHECK_BUTTON (vbox2, checkbtn_default_sign,
1334                            _("Sign message by default"));
1335
1336         PACK_CHECK_BUTTON (vbox2, checkbtn_auto_check_signatures,
1337                            _("Automatically check signatures"));
1338
1339         PACK_CHECK_BUTTON (vbox2, checkbtn_passphrase_grab,
1340                            _("Grab input while entering a passphrase"));
1341
1342         hbox1 = gtk_hbox_new (FALSE, 8);
1343         gtk_widget_show (hbox1);
1344         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1345
1346         /* create default signkey box */
1347         label = gtk_label_new (_("Default Sign Key"));
1348         gtk_widget_show (label);
1349         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
1350         optmenu = gtk_option_menu_new ();
1351         gtk_widget_show (optmenu);
1352         gtk_box_pack_start(GTK_BOX (hbox1), optmenu, FALSE, FALSE, 0);
1353         optmenu_menu = gtk_menu_new ();
1354
1355         MENUITEM_ADD(optmenu_menu, menuitem, "Default Key", "def_key");
1356         MENUITEM_ADD(optmenu_menu, menuitem, "Second Key", "2nd_key");
1357         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu), optmenu_menu);
1358         /* FIXME: disabled because not implemented */
1359         gtk_widget_set_sensitive(optmenu, FALSE);
1360
1361         privacy.checkbtn_default_encrypt = checkbtn_default_encrypt;
1362         privacy.checkbtn_default_sign    = checkbtn_default_sign;
1363         privacy.checkbtn_auto_check_signatures
1364                                          = checkbtn_auto_check_signatures;
1365         privacy.checkbtn_passphrase_grab = checkbtn_passphrase_grab;
1366         privacy.optmenu_default_signkey  = optmenu;
1367 }
1368
1369 static void
1370 prefs_common_default_signkey_set_data_from_optmenu(PrefParam *pparam)
1371 {
1372 #if 0
1373         GtkWidget *menu;
1374         GtkWidget *menuitem;
1375         gchar *charset;
1376
1377         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
1378         menuitem = gtk_menu_get_active(GTK_MENU(menu));
1379         charset = gtk_object_get_user_data(GTK_OBJECT(menuitem));
1380         g_free(*((gchar **)pparam->data));
1381         *((gchar **)pparam->data) = g_strdup(charset);
1382 #endif
1383 }
1384
1385 static void prefs_common_default_signkey_set_optmenu(PrefParam *pparam)
1386 {
1387 #if 0
1388         GList *cur;
1389         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
1390         GtkWidget *menu;
1391         GtkWidget *menuitem;
1392         gchar *charset;
1393         gint n = 0;
1394
1395         g_return_if_fail(optmenu != NULL);
1396         g_return_if_fail(*((gchar **)pparam->data) != NULL);
1397
1398         menu = gtk_option_menu_get_menu(optmenu);
1399         for (cur = GTK_MENU_SHELL(menu)->children;
1400              cur != NULL; cur = cur->next) {
1401                 menuitem = GTK_WIDGET(cur->data);
1402                 charset = gtk_object_get_user_data(GTK_OBJECT(menuitem));
1403                 if (!strcmp(charset, *((gchar **)pparam->data))) {
1404                         gtk_option_menu_set_history(optmenu, n);
1405                         return;
1406                 }
1407                 n++;
1408         }
1409
1410         gtk_option_menu_set_history(optmenu, 0);
1411         prefs_common_charset_set_data_from_optmenu(pparam);
1412 #endif
1413 }
1414 #endif /* USE_GPGME */
1415
1416 static void prefs_interface_create(void)
1417 {
1418         GtkWidget *vbox1;
1419         GtkWidget *vbox2;
1420         GtkWidget *vbox3;
1421         GtkWidget *checkbtn_emacs;
1422         GtkWidget *checkbtn_openunread;
1423         GtkWidget *checkbtn_openinbox;
1424         GtkWidget *checkbtn_immedexec;
1425         GtkWidget *checkbtn_addaddrbyclick;
1426         GtkWidget *label;
1427
1428         GtkWidget *frame_exit;
1429         GtkWidget *vbox_exit;
1430         GtkWidget *hbox1;
1431         GtkWidget *checkbtn_confonexit;
1432         GtkWidget *checkbtn_cleanonexit;
1433         GtkWidget *checkbtn_askonclean;
1434
1435         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1436         gtk_widget_show (vbox1);
1437         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1438         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1439
1440         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1441         gtk_widget_show (vbox2);
1442         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1443
1444         PACK_CHECK_BUTTON (vbox2, checkbtn_emacs,
1445                            _("Emulate the behavior of mouse operation of\n"
1446                              "Emacs-based mailer"));
1447         gtk_label_set_justify (GTK_LABEL (GTK_BIN (checkbtn_emacs)->child),
1448                                GTK_JUSTIFY_LEFT);
1449
1450         PACK_CHECK_BUTTON
1451                 (vbox2, checkbtn_openunread,
1452                  _("Open first unread message when entering a folder"));
1453
1454         PACK_CHECK_BUTTON
1455                 (vbox2, checkbtn_openinbox,
1456                  _("Go to inbox after receiving new mail"));
1457
1458         vbox3 = gtk_vbox_new (FALSE, 0);
1459         gtk_widget_show (vbox3);
1460         gtk_box_pack_start (GTK_BOX (vbox2), vbox3, FALSE, FALSE, 0);
1461
1462         PACK_CHECK_BUTTON
1463                 (vbox3, checkbtn_immedexec,
1464                  _("Execute immediately when moving or deleting messages"));
1465
1466         hbox1 = gtk_hbox_new (FALSE, 0);
1467         gtk_widget_show (hbox1);
1468         gtk_box_pack_start (GTK_BOX (vbox3), hbox1, FALSE, FALSE, 0);
1469
1470         label = gtk_label_new
1471                 (_("(Messages will be just marked till execution\n"
1472                    " if this is turned off)"));
1473         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 8);
1474         gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1475
1476         PACK_CHECK_BUTTON
1477                 (vbox2, checkbtn_addaddrbyclick,
1478                  _("Add address to destination when double-clicked"));
1479
1480         PACK_FRAME (vbox1, frame_exit, _("On exit"));
1481
1482         vbox_exit = gtk_vbox_new (FALSE, VSPACING_NARROW);
1483         gtk_widget_show (vbox_exit);
1484         gtk_container_add (GTK_CONTAINER (frame_exit), vbox_exit);
1485         gtk_container_set_border_width (GTK_CONTAINER (vbox_exit), 8);
1486
1487         PACK_CHECK_BUTTON (vbox_exit, checkbtn_confonexit,
1488                            _("Confirm on exit"));
1489
1490         hbox1 = gtk_hbox_new (FALSE, 32);
1491         gtk_widget_show (hbox1);
1492         gtk_box_pack_start (GTK_BOX (vbox_exit), hbox1, FALSE, FALSE, 0);
1493
1494         PACK_CHECK_BUTTON (hbox1, checkbtn_cleanonexit,
1495                            _("Empty trash on exit"));
1496         PACK_CHECK_BUTTON (hbox1, checkbtn_askonclean,
1497                            _("Ask before emptying"));
1498         SET_TOGGLE_SENSITIVITY (checkbtn_cleanonexit, checkbtn_askonclean);
1499
1500         interface.checkbtn_emacs          = checkbtn_emacs;
1501         interface.checkbtn_openunread     = checkbtn_openunread;
1502         interface.checkbtn_openinbox      = checkbtn_openinbox;
1503         interface.checkbtn_immedexec      = checkbtn_immedexec;
1504         interface.checkbtn_addaddrbyclick = checkbtn_addaddrbyclick;
1505         interface.checkbtn_confonexit     = checkbtn_confonexit;
1506         interface.checkbtn_cleanonexit    = checkbtn_cleanonexit;
1507         interface.checkbtn_askonclean     = checkbtn_askonclean;
1508 }
1509
1510 static void prefs_other_create(void)
1511 {
1512         GtkWidget *vbox1;
1513         GtkWidget *hbox1;
1514
1515         GtkWidget *uri_frame;
1516         GtkWidget *uri_label;
1517         GtkWidget *uri_combo;
1518         GtkWidget *uri_entry;
1519
1520         GtkWidget *print_frame;
1521         GtkWidget *printcmd_label;
1522         GtkWidget *printcmd_entry;
1523
1524         GtkWidget *exteditor_frame;
1525         GtkWidget *exteditor_label;
1526         GtkWidget *exteditor_combo;
1527         GtkWidget *exteditor_entry;
1528
1529         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1530         gtk_widget_show (vbox1);
1531         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1532         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1533
1534         PACK_FRAME(vbox1, uri_frame,
1535                    _("External Web browser (%s will be replaced with URI)"));
1536
1537         hbox1 = gtk_hbox_new (FALSE, 8);
1538         gtk_widget_show (hbox1);
1539         gtk_container_add (GTK_CONTAINER (uri_frame), hbox1);
1540         gtk_container_set_border_width (GTK_CONTAINER (hbox1), 8);
1541
1542         uri_label = gtk_label_new (_("Command"));
1543         gtk_widget_show(uri_label);
1544         gtk_box_pack_start (GTK_BOX (hbox1), uri_label, FALSE, TRUE, 0);
1545
1546         uri_combo = gtk_combo_new ();
1547         gtk_widget_show (uri_combo);
1548         gtk_box_pack_start (GTK_BOX (hbox1), uri_combo, TRUE, TRUE, 0);
1549         gtkut_combo_set_items (GTK_COMBO (uri_combo),
1550                                "netscape -remote 'openURL(%s,raise)'",
1551                                "gnome-moz-remote --raise --newwin '%s'",
1552                                "kterm -e w3m '%s'",
1553                                "kterm -e lynx '%s'",
1554                                NULL);
1555
1556         uri_entry = GTK_COMBO (uri_combo)->entry;
1557
1558         PACK_FRAME(vbox1, print_frame,
1559                    _("Printing (%s will be replaced with file name)"));
1560
1561         hbox1 = gtk_hbox_new (FALSE, 8);
1562         gtk_widget_show (hbox1);
1563         gtk_container_add (GTK_CONTAINER (print_frame), hbox1);
1564         gtk_container_set_border_width (GTK_CONTAINER (hbox1), 8);
1565
1566         printcmd_label = gtk_label_new (_("Command"));
1567         gtk_widget_show (printcmd_label);
1568         gtk_box_pack_start (GTK_BOX (hbox1), printcmd_label, FALSE, FALSE, 0);
1569
1570         printcmd_entry = gtk_entry_new ();
1571         gtk_widget_show (printcmd_entry);
1572         gtk_box_pack_start (GTK_BOX (hbox1), printcmd_entry, TRUE, TRUE, 0);
1573
1574         PACK_FRAME(vbox1, exteditor_frame,
1575                    _("External editor (%s will be replaced with file name)"));
1576
1577         hbox1 = gtk_hbox_new (FALSE, 8);
1578         gtk_widget_show (hbox1);
1579         gtk_container_add (GTK_CONTAINER (exteditor_frame), hbox1);
1580         gtk_container_set_border_width (GTK_CONTAINER (hbox1), 8);
1581
1582         exteditor_label = gtk_label_new (_("Command"));
1583         gtk_widget_show (exteditor_label);
1584         gtk_box_pack_start (GTK_BOX (hbox1), exteditor_label, FALSE, FALSE, 0);
1585
1586         exteditor_combo = gtk_combo_new ();
1587         gtk_widget_show (exteditor_combo);
1588         gtk_box_pack_start (GTK_BOX (hbox1), exteditor_combo, TRUE, TRUE, 0);
1589         gtkut_combo_set_items (GTK_COMBO (exteditor_combo),
1590                                "gedit %s",
1591                                "mgedit --no-fork %s",
1592                                "emacs %s",
1593                                "xemacs %s",
1594                                "kterm -e jed %s",
1595                                "kterm -e vi %s",
1596                                NULL);
1597         exteditor_entry = GTK_COMBO (exteditor_combo)->entry;
1598
1599         other.uri_combo = uri_combo;
1600         other.uri_entry = uri_entry;
1601         other.printcmd_entry = printcmd_entry;
1602
1603         other.exteditor_combo = exteditor_combo;
1604         other.exteditor_entry = exteditor_entry;
1605 }
1606
1607 void prefs_quote_colors_dialog(void)
1608 {
1609         if (!quote_color_win)
1610                 prefs_quote_colors_dialog_create();
1611         gtk_widget_show(quote_color_win);
1612
1613         gtk_main();
1614         gtk_widget_hide(quote_color_win);
1615
1616         textview_update_message_colors();
1617 }
1618
1619 static void prefs_quote_colors_dialog_create(void)
1620 {
1621         GtkWidget *window;
1622         GtkWidget *vbox;
1623         GtkWidget *table;
1624         GtkWidget *quotelevel1_label;
1625         GtkWidget *quotelevel2_label;
1626         GtkWidget *quotelevel3_label;
1627         GtkWidget *uri_label;
1628         GtkWidget *hbbox;
1629         GtkWidget *ok_btn;
1630         //GtkWidget *cancel_btn;
1631         GtkWidget *recycle_colors_btn;
1632         GtkWidget *frame_colors;
1633
1634         window = gtk_window_new(GTK_WINDOW_DIALOG);
1635         gtk_container_set_border_width(GTK_CONTAINER(window), 2);
1636         gtk_window_set_title(GTK_WINDOW(window), _("Set message colors"));
1637         gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
1638         gtk_window_set_modal(GTK_WINDOW(window), TRUE);
1639         gtk_window_set_policy(GTK_WINDOW(window), FALSE, TRUE, FALSE);
1640
1641         vbox = gtk_vbox_new (FALSE, VSPACING);
1642         gtk_container_add (GTK_CONTAINER (window), vbox);
1643         gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
1644         PACK_FRAME(vbox, frame_colors, _("Colors"));
1645
1646         table = gtk_table_new (4, 2, FALSE);
1647         gtk_container_add (GTK_CONTAINER (frame_colors), table);
1648         gtk_container_set_border_width (GTK_CONTAINER (table), 8);
1649         gtk_table_set_row_spacings (GTK_TABLE (table), 2);
1650         gtk_table_set_col_spacings (GTK_TABLE (table), 4);
1651
1652 /*      gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); */
1653
1654         color_buttons.quote_level1_btn = gtk_button_new();
1655         gtk_table_attach(GTK_TABLE (table), color_buttons.quote_level1_btn, 0, 1, 0, 1,
1656                                         (GtkAttachOptions) (0),
1657                                         (GtkAttachOptions) (0), 0, 0);
1658         gtk_widget_set_usize (color_buttons.quote_level1_btn, 40, 30);
1659         gtk_container_set_border_width (GTK_CONTAINER (color_buttons.quote_level1_btn), 5);
1660
1661         color_buttons.quote_level2_btn = gtk_button_new();
1662         gtk_table_attach(GTK_TABLE (table), color_buttons.quote_level2_btn, 0, 1, 1, 2,
1663                                         (GtkAttachOptions) (0),
1664                                         (GtkAttachOptions) (0), 0, 0);
1665         gtk_widget_set_usize (color_buttons.quote_level2_btn, 40, 30);
1666         gtk_container_set_border_width (GTK_CONTAINER (color_buttons.quote_level2_btn), 5);
1667
1668         color_buttons.quote_level3_btn = gtk_button_new_with_label ("");
1669         gtk_table_attach(GTK_TABLE (table), color_buttons.quote_level3_btn, 0, 1, 2, 3,
1670                                         (GtkAttachOptions) (0),
1671                                         (GtkAttachOptions) (0), 0, 0);
1672         gtk_widget_set_usize (color_buttons.quote_level3_btn, 40, 30);
1673         gtk_container_set_border_width (GTK_CONTAINER (color_buttons.quote_level3_btn), 5);
1674
1675         color_buttons.uri_btn = gtk_button_new_with_label ("");
1676         gtk_table_attach(GTK_TABLE (table), color_buttons.uri_btn, 0, 1, 3, 4,
1677                                         (GtkAttachOptions) (0),
1678                                         (GtkAttachOptions) (0), 0, 0);
1679         gtk_widget_set_usize (color_buttons.uri_btn, 40, 30);
1680         gtk_container_set_border_width (GTK_CONTAINER (color_buttons.uri_btn), 5);
1681
1682         quotelevel1_label = gtk_label_new (_("Quoted Text - First Level"));
1683         gtk_table_attach(GTK_TABLE (table), quotelevel1_label, 1, 2, 0, 1,
1684                                         (GTK_EXPAND | GTK_FILL), 0, 0, 0);
1685         gtk_label_set_justify (GTK_LABEL (quotelevel1_label), GTK_JUSTIFY_LEFT);
1686         gtk_misc_set_alignment (GTK_MISC (quotelevel1_label), 0, 0.5);
1687
1688         quotelevel2_label = gtk_label_new (_("Quoted Text - Second Level"));
1689         gtk_table_attach(GTK_TABLE (table), quotelevel2_label, 1, 2, 1, 2,
1690                                         (GTK_EXPAND | GTK_FILL), 0, 0, 0);
1691         gtk_label_set_justify (GTK_LABEL (quotelevel2_label), GTK_JUSTIFY_LEFT);
1692         gtk_misc_set_alignment (GTK_MISC (quotelevel2_label), 0, 0.5);
1693
1694         quotelevel3_label = gtk_label_new (_("Quoted Text - Third Level"));
1695         gtk_table_attach(GTK_TABLE (table), quotelevel3_label, 1, 2, 2, 3,
1696                                         (GTK_EXPAND | GTK_FILL), 0, 0, 0);
1697         gtk_label_set_justify (GTK_LABEL (quotelevel3_label), GTK_JUSTIFY_LEFT);
1698         gtk_misc_set_alignment (GTK_MISC (quotelevel3_label), 0, 0.5);
1699
1700         uri_label = gtk_label_new (_("URI link"));
1701         gtk_table_attach(GTK_TABLE (table), uri_label, 1, 2, 3, 4,
1702                                         (GTK_EXPAND | GTK_FILL), 0, 0, 0);
1703         gtk_label_set_justify (GTK_LABEL (uri_label), GTK_JUSTIFY_LEFT);
1704         gtk_misc_set_alignment (GTK_MISC (uri_label), 0, 0.5);
1705
1706         PACK_CHECK_BUTTON (vbox, recycle_colors_btn,
1707                            _("Recycle quote colors"));
1708
1709         gtkut_button_set_create(&hbbox, &ok_btn, _("OK"),
1710                                 NULL, NULL, NULL, NULL);
1711         gtk_box_pack_end(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0);
1712
1713         gtk_widget_grab_default(ok_btn);
1714         gtk_signal_connect(GTK_OBJECT(ok_btn), "clicked",
1715                                         GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
1716         gtk_signal_connect(GTK_OBJECT(window), "delete_event",
1717                                         GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
1718
1719         gtk_signal_connect(GTK_OBJECT(color_buttons.quote_level1_btn), "clicked",
1720                            GTK_SIGNAL_FUNC(quote_color_set_dialog), "LEVEL1");
1721         gtk_signal_connect(GTK_OBJECT(color_buttons.quote_level2_btn), "clicked",
1722                            GTK_SIGNAL_FUNC(quote_color_set_dialog), "LEVEL2");
1723         gtk_signal_connect(GTK_OBJECT(color_buttons.quote_level3_btn), "clicked",
1724                            GTK_SIGNAL_FUNC(quote_color_set_dialog), "LEVEL3");
1725         gtk_signal_connect(GTK_OBJECT(color_buttons.uri_btn), "clicked",
1726                            GTK_SIGNAL_FUNC(quote_color_set_dialog), "URI");
1727         gtk_signal_connect(GTK_OBJECT(recycle_colors_btn), "toggled",
1728                            GTK_SIGNAL_FUNC(prefs_recycle_colors_toggled), NULL);
1729
1730         /* show message button colors and recycle options */
1731         set_button_bg_color(color_buttons.quote_level1_btn,
1732                             prefs_common.quote_level1_col);
1733         set_button_bg_color(color_buttons.quote_level2_btn,
1734                             prefs_common.quote_level2_col);
1735         set_button_bg_color(color_buttons.quote_level3_btn,
1736                             prefs_common.quote_level3_col);
1737         set_button_bg_color(color_buttons.uri_btn,
1738                             prefs_common.uri_col);
1739         gtk_toggle_button_set_active((GtkToggleButton *)recycle_colors_btn,
1740                                      prefs_common.recycle_quote_colors);
1741
1742         gtk_widget_show_all(vbox);
1743         quote_color_win = window;
1744 }
1745
1746 static void quote_color_set_dialog(GtkWidget *widget, gpointer data)
1747 {
1748         gchar *type = (gchar *)data;
1749         gchar *title = NULL;
1750         gdouble color[4] = {0.0, 0.0, 0.0, 0.0};
1751         gint rgbvalue = 0;
1752         GtkColorSelectionDialog *dialog;
1753
1754         if(g_strcasecmp(type, "LEVEL1") == 0) {
1755                 title = _("Pick color for quotation level 1");
1756                 rgbvalue = prefs_common.quote_level1_col;
1757         } else if(g_strcasecmp(type, "LEVEL2") == 0) {
1758                 title = _("Pick color for quotation level 2");
1759                 rgbvalue = prefs_common.quote_level2_col;
1760         } else if(g_strcasecmp(type, "LEVEL3") == 0) {
1761                 title = _("Pick color for quotation level 3");
1762                 rgbvalue = prefs_common.quote_level3_col;
1763         } else if(g_strcasecmp(type, "URI") == 0) {
1764                 title = _("Pick color for URI");
1765                 rgbvalue = prefs_common.uri_col;
1766         } else {   /* Should never be called */
1767                 fprintf(stderr, "Unrecognized datatype '%s' in quote_color_set_dialog\n", type);
1768                 return;
1769         }
1770
1771         color_dialog = gtk_color_selection_dialog_new(title);
1772         gtk_window_set_position(GTK_WINDOW(color_dialog), GTK_WIN_POS_CENTER);
1773         gtk_window_set_modal(GTK_WINDOW(color_dialog), TRUE);
1774         gtk_window_set_policy(GTK_WINDOW(color_dialog), FALSE, FALSE, FALSE);
1775
1776         gtk_signal_connect(GTK_OBJECT(((GtkColorSelectionDialog *)color_dialog)->ok_button),
1777                            "clicked", GTK_SIGNAL_FUNC(quote_colors_set_dialog_ok), data);
1778         gtk_signal_connect(GTK_OBJECT(((GtkColorSelectionDialog *)color_dialog)->cancel_button),
1779                            "clicked", GTK_SIGNAL_FUNC(quote_colors_set_dialog_cancel), data);
1780
1781         /* preselect the previous color in the color selection dialog */
1782         color[0] = (gdouble) ((rgbvalue & 0xff0000) >> 16) / 255.0;
1783         color[1] = (gdouble) ((rgbvalue & 0x00ff00) >>  8) / 255.0;
1784         color[2] = (gdouble)  (rgbvalue & 0x0000ff)        / 255.0;
1785         dialog = (GtkColorSelectionDialog *)color_dialog;
1786         gtk_color_selection_set_color
1787                 ((GtkColorSelection *)dialog->colorsel, color);
1788
1789         gtk_widget_show(color_dialog);
1790 }
1791
1792 static void quote_colors_set_dialog_ok(GtkWidget *widget, gpointer data)
1793 {
1794         GtkColorSelection *colorsel = (GtkColorSelection *)
1795                                                 ((GtkColorSelectionDialog *)color_dialog)->colorsel;
1796         gdouble color[4];
1797         gint red, green, blue, rgbvalue;
1798         gchar *type = (gchar *)data;
1799
1800         gtk_color_selection_get_color(colorsel, color);
1801
1802         red      = (gint) (color[0] * 255.0);
1803         green    = (gint) (color[1] * 255.0);
1804         blue     = (gint) (color[2] * 255.0);
1805         rgbvalue = (gint) ((red * 0x10000) | (green * 0x100) | blue);
1806
1807 #if 0
1808         fprintf(stderr, "redc = %f, greenc = %f, bluec = %f\n", color[0], color[1], color[2]);
1809         fprintf(stderr, "red = %d, green = %d, blue = %d\n", red, green, blue);
1810         fprintf(stderr, "Color is %x\n", rgbvalue);
1811 #endif
1812
1813         if (g_strcasecmp(type, "LEVEL1") == 0) {
1814                 prefs_common.quote_level1_col = rgbvalue;
1815                 set_button_bg_color(color_buttons.quote_level1_btn, rgbvalue);
1816         } else if (g_strcasecmp(type, "LEVEL2") == 0) {
1817                 prefs_common.quote_level2_col = rgbvalue;
1818                 set_button_bg_color(color_buttons.quote_level2_btn, rgbvalue);
1819         } else if (g_strcasecmp(type, "LEVEL3") == 0) {
1820                 prefs_common.quote_level3_col = rgbvalue;
1821                 set_button_bg_color(color_buttons.quote_level3_btn, rgbvalue);
1822         } else if (g_strcasecmp(type, "URI") == 0) {
1823                 prefs_common.uri_col = rgbvalue;
1824                 set_button_bg_color(color_buttons.uri_btn, rgbvalue);
1825         } else
1826                 fprintf( stderr, "Unrecognized datatype '%s' in quote_color_set_dialog_ok\n", type );
1827
1828         gtk_widget_hide(color_dialog);
1829 }
1830
1831 static void quote_colors_set_dialog_cancel(GtkWidget *widget, gpointer data)
1832 {
1833         gtk_widget_hide(color_dialog);
1834 }
1835
1836 static void set_button_bg_color(GtkWidget *widget, gint rgbvalue)
1837 {
1838         GtkStyle *newstyle;
1839         GdkColor color;
1840
1841         gtkut_convert_int_to_gdk_color(rgbvalue, &color);
1842         newstyle = gtk_style_copy(gtk_widget_get_default_style());
1843         newstyle->bg[GTK_STATE_NORMAL]   = color;
1844         newstyle->bg[GTK_STATE_PRELIGHT] = color;
1845         newstyle->bg[GTK_STATE_ACTIVE]   = color;
1846
1847         gtk_widget_set_style(GTK_WIDGET(widget), newstyle);
1848 }
1849
1850 static void prefs_enable_message_color_toggled(void)
1851 {
1852         gboolean is_active;
1853
1854         is_active = gtk_toggle_button_get_active
1855                 (GTK_TOGGLE_BUTTON(message.chkbtn_enablecol));
1856         gtk_widget_set_sensitive(message.button_edit_col, is_active);
1857         prefs_common.enable_color = is_active;
1858 }
1859
1860 static void prefs_recycle_colors_toggled(GtkWidget *widget)
1861 {
1862         gboolean is_active;
1863
1864         is_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
1865         prefs_common.recycle_quote_colors = is_active;
1866 }
1867
1868 static void prefs_quote_description(void)
1869 {
1870         if (!quote_desc_win)
1871                 prefs_quote_description_create();
1872
1873         gtk_widget_show(quote_desc_win);
1874         gtk_main();
1875         gtk_widget_hide(quote_desc_win);
1876 }
1877
1878 static void prefs_quote_description_create(void)
1879 {
1880         GtkWidget *vbox;
1881         GtkWidget *hbox;
1882         GtkWidget *hbbox;
1883         GtkWidget *label;
1884         GtkWidget *ok_btn;
1885
1886         quote_desc_win = gtk_window_new(GTK_WINDOW_DIALOG);
1887         gtk_window_set_title(GTK_WINDOW(quote_desc_win),
1888                              _("Description of symbols"));
1889         gtk_container_set_border_width(GTK_CONTAINER(quote_desc_win), 8);
1890         gtk_window_set_position(GTK_WINDOW(quote_desc_win), GTK_WIN_POS_CENTER);
1891         gtk_window_set_modal(GTK_WINDOW(quote_desc_win), TRUE);
1892         gtk_window_set_policy(GTK_WINDOW(quote_desc_win), FALSE, TRUE, FALSE);
1893
1894         vbox = gtk_vbox_new(FALSE, 8);
1895         gtk_container_add(GTK_CONTAINER(quote_desc_win), vbox);
1896
1897         hbox = gtk_hbox_new(FALSE, 4);
1898         gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
1899
1900         label = gtk_label_new
1901                 ("%d:\n"
1902                  "%f:\n"
1903                  "%n:\n"
1904                  "%N:\n"
1905                  "%I:\n"
1906                  "%s:\n"
1907                  "%t:\n"
1908                  "%i:\n"
1909                  "%%:");
1910
1911         gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
1912         gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
1913
1914         label = gtk_label_new
1915                 (_("Date\n"
1916                    "From\n"
1917                    "Full Name of Sender\n"
1918                    "First Name of Sender\n"
1919                    "Initial of Sender\n"
1920                    "Subject\n"
1921                    "To\n"
1922                    "Message-ID\n"
1923                    "%"));
1924
1925         gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
1926         gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
1927
1928         gtkut_button_set_create(&hbbox, &ok_btn, _("OK"),
1929                                 NULL, NULL, NULL, NULL);
1930         gtk_box_pack_end(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0);
1931
1932         gtk_widget_grab_default(ok_btn);
1933         gtk_signal_connect(GTK_OBJECT(ok_btn), "clicked",
1934                                   GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
1935
1936         gtk_signal_connect(GTK_OBJECT(quote_desc_win), "delete_event",
1937                                           GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
1938
1939         gtk_widget_show_all(vbox);
1940 }
1941
1942 /* functions for setting items of SummaryView */
1943
1944 static struct _SummaryDisplayItem
1945 {
1946         GtkWidget *window;
1947
1948         GtkWidget *chkbtn[N_SUMMARY_COLS];
1949
1950         GtkWidget *ok_btn;
1951         GtkWidget *cancel_btn;
1952 } summarydispitem;
1953
1954 #define SET_ACTIVE(column, var) \
1955         gtk_toggle_button_set_active \
1956                 (GTK_TOGGLE_BUTTON(summarydispitem.chkbtn[column]), \
1957                  prefs_common.var)
1958 #define GET_ACTIVE(column, var) \
1959         prefs_common.var = gtk_toggle_button_get_active \
1960                 (GTK_TOGGLE_BUTTON(summarydispitem.chkbtn[column]))
1961
1962 void prefs_summary_display_item_set(void)
1963 {
1964         static gboolean cancelled;
1965
1966         if (!summarydispitem.window)
1967                 prefs_summary_display_item_dialog_create(&cancelled);
1968         gtk_widget_grab_focus(summarydispitem.ok_btn);
1969         gtk_widget_show(summarydispitem.window);
1970         manage_window_set_transient(GTK_WINDOW(summarydispitem.window));
1971
1972         SET_ACTIVE(S_COL_MARK, show_mark);
1973         SET_ACTIVE(S_COL_UNREAD, show_unread);
1974         SET_ACTIVE(S_COL_MIME, show_mime);
1975         SET_ACTIVE(S_COL_NUMBER, show_number);
1976         SET_ACTIVE(S_COL_SIZE, show_size);
1977         SET_ACTIVE(S_COL_DATE, show_date);
1978         SET_ACTIVE(S_COL_FROM, show_from);
1979         SET_ACTIVE(S_COL_SUBJECT, show_subject);
1980
1981         gtk_main();
1982         gtk_widget_hide(summarydispitem.window);
1983
1984         if (cancelled != TRUE) {
1985                 GET_ACTIVE(S_COL_MARK, show_mark);
1986                 GET_ACTIVE(S_COL_UNREAD, show_unread);
1987                 GET_ACTIVE(S_COL_MIME, show_mime);
1988                 GET_ACTIVE(S_COL_NUMBER, show_number);
1989                 GET_ACTIVE(S_COL_SIZE, show_size);
1990                 GET_ACTIVE(S_COL_DATE, show_date);
1991                 GET_ACTIVE(S_COL_FROM, show_from);
1992                 GET_ACTIVE(S_COL_SUBJECT, show_subject);
1993
1994                 main_window_reflect_prefs_all();
1995         }
1996 }
1997
1998 #define SET_CHECK_BUTTON(column, label) \
1999 { \
2000         summarydispitem.chkbtn[column] = \
2001                 gtk_check_button_new_with_label(label); \
2002         gtk_box_pack_start(GTK_BOX(chkbtn_vbox), \
2003                            summarydispitem.chkbtn[column], \
2004                            FALSE, FALSE, 0); \
2005 }
2006
2007 static void prefs_summary_display_item_dialog_create(gboolean *cancelled)
2008 {
2009         GtkWidget *window;
2010         GtkWidget *vbox;
2011         GtkWidget *chkbtn_vbox;
2012         GtkWidget *hbbox;
2013         GtkWidget *ok_btn;
2014         GtkWidget *cancel_btn;
2015
2016         window = gtk_window_new(GTK_WINDOW_DIALOG);
2017         gtk_container_set_border_width(GTK_CONTAINER(window), 8);
2018         gtk_window_set_title(GTK_WINDOW(window), _("Set display item"));
2019         gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
2020         gtk_window_set_modal(GTK_WINDOW(window), TRUE);
2021         gtk_window_set_policy(GTK_WINDOW(window), FALSE, FALSE, FALSE);
2022         gtk_signal_connect(GTK_OBJECT(window), "delete_event",
2023                            GTK_SIGNAL_FUNC(display_item_delete_event),
2024                            cancelled);
2025         gtk_signal_connect(GTK_OBJECT(window), "key_press_event",
2026                            GTK_SIGNAL_FUNC(display_item_key_pressed),
2027                            cancelled);
2028
2029         vbox = gtk_vbox_new(FALSE, 8);
2030         gtk_container_add(GTK_CONTAINER(window), vbox);
2031
2032         chkbtn_vbox = gtk_vbox_new(FALSE, 0);
2033         gtk_box_pack_start(GTK_BOX(vbox), chkbtn_vbox, FALSE, FALSE, 0);
2034
2035         SET_CHECK_BUTTON(S_COL_MARK, _("Mark"));
2036         SET_CHECK_BUTTON(S_COL_UNREAD, _("Unread"));
2037         SET_CHECK_BUTTON(S_COL_MIME, _("MIME"));
2038         SET_CHECK_BUTTON(S_COL_NUMBER, _("Number"));
2039         SET_CHECK_BUTTON(S_COL_SIZE, _("Size"));
2040         SET_CHECK_BUTTON(S_COL_DATE, _("Date"));
2041         SET_CHECK_BUTTON(S_COL_FROM, _("From"));
2042         SET_CHECK_BUTTON(S_COL_SUBJECT, _("Subject"));
2043
2044         gtkut_button_set_create(&hbbox, &ok_btn, _("OK"),
2045                                 &cancel_btn, _("Cancel"), NULL, NULL);
2046         gtk_box_pack_end(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0);
2047         gtk_widget_grab_default(ok_btn);
2048
2049         gtk_signal_connect(GTK_OBJECT(ok_btn), "clicked",
2050                            GTK_SIGNAL_FUNC(display_item_ok), cancelled);
2051         gtk_signal_connect(GTK_OBJECT(cancel_btn), "clicked",
2052                            GTK_SIGNAL_FUNC(display_item_cancel), cancelled);
2053
2054         gtk_widget_show_all(vbox);
2055
2056         summarydispitem.window = window;
2057         summarydispitem.ok_btn = ok_btn;
2058         summarydispitem.cancel_btn = cancel_btn;
2059 }
2060
2061 static void display_item_ok(GtkWidget *widget, gboolean *cancelled)
2062 {
2063         *cancelled = FALSE;
2064         gtk_main_quit();
2065 }
2066
2067 static void display_item_cancel(GtkWidget *widget, gboolean *cancelled)
2068 {
2069         *cancelled = TRUE;
2070         gtk_main_quit();
2071 }
2072
2073 static gint display_item_delete_event(GtkWidget *widget, GdkEventAny *event,
2074                                       gboolean *cancelled)
2075 {
2076         *cancelled = TRUE;
2077         gtk_main_quit();
2078
2079         return TRUE;
2080 }
2081
2082 static void display_item_key_pressed(GtkWidget *widget, GdkEventKey *event,
2083                                      gboolean *cancelled)
2084 {
2085         if (event && event->keyval == GDK_Escape) {
2086                 *cancelled = TRUE;
2087                 gtk_main_quit();
2088         }
2089 }
2090
2091 static void prefs_font_select(GtkButton *button)
2092 {
2093         if (!font_sel_win) {
2094                 font_sel_win = gtk_font_selection_dialog_new
2095                         (_("Font selection"));
2096                 gtk_window_position(GTK_WINDOW(font_sel_win),
2097                                     GTK_WIN_POS_CENTER);
2098                 gtk_signal_connect(GTK_OBJECT(font_sel_win), "delete_event",
2099                                    GTK_SIGNAL_FUNC(gtk_widget_hide_on_delete),
2100                                    NULL);
2101                 gtk_signal_connect
2102                         (GTK_OBJECT(font_sel_win), "key_press_event",
2103                          GTK_SIGNAL_FUNC(prefs_font_selection_key_pressed),
2104                          NULL);
2105                 gtk_signal_connect
2106                         (GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(font_sel_win)->ok_button),
2107                          "clicked",
2108                          GTK_SIGNAL_FUNC(prefs_font_selection_ok),
2109                          NULL);
2110                 gtk_signal_connect_object
2111                         (GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(font_sel_win)->cancel_button),
2112                          "clicked",
2113                          GTK_SIGNAL_FUNC(gtk_widget_hide_on_delete),
2114                          GTK_OBJECT(font_sel_win));
2115         }
2116
2117         manage_window_set_transient(GTK_WINDOW(font_sel_win));
2118         gtk_window_set_modal(GTK_WINDOW(font_sel_win), TRUE);
2119         gtk_widget_grab_focus
2120                 (GTK_FONT_SELECTION_DIALOG(font_sel_win)->ok_button);
2121         gtk_widget_show(font_sel_win);
2122 }
2123
2124 static void prefs_font_selection_key_pressed(GtkWidget *widget,
2125                                              GdkEventKey *event,
2126                                              gpointer data)
2127 {
2128         if (event && event->keyval == GDK_Escape)
2129                 gtk_widget_hide(font_sel_win);
2130 }
2131
2132 static void prefs_font_selection_ok(GtkButton *button)
2133 {
2134         gchar *fontname;
2135
2136         fontname = gtk_font_selection_dialog_get_font_name
2137                 (GTK_FONT_SELECTION_DIALOG(font_sel_win));
2138
2139         if (fontname) {
2140                 gtk_entry_set_text(GTK_ENTRY(display.entry_textfont), fontname);
2141                 g_free(fontname);
2142         }
2143
2144         gtk_widget_hide(font_sel_win);
2145 }
2146
2147 static void prefs_common_charset_set_data_from_optmenu(PrefParam *pparam)
2148 {
2149         GtkWidget *menu;
2150         GtkWidget *menuitem;
2151         gchar *charset;
2152
2153         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
2154         menuitem = gtk_menu_get_active(GTK_MENU(menu));
2155         charset = gtk_object_get_user_data(GTK_OBJECT(menuitem));
2156         g_free(*((gchar **)pparam->data));
2157         *((gchar **)pparam->data) = g_strdup(charset);
2158 }
2159
2160 static void prefs_common_charset_set_optmenu(PrefParam *pparam)
2161 {
2162         GList *cur;
2163         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
2164         GtkWidget *menu;
2165         GtkWidget *menuitem;
2166         gchar *charset;
2167         gint n = 0;
2168
2169         g_return_if_fail(optmenu != NULL);
2170         g_return_if_fail(*((gchar **)pparam->data) != NULL);
2171
2172         menu = gtk_option_menu_get_menu(optmenu);
2173         for (cur = GTK_MENU_SHELL(menu)->children;
2174              cur != NULL; cur = cur->next) {
2175                 menuitem = GTK_WIDGET(cur->data);
2176                 charset = gtk_object_get_user_data(GTK_OBJECT(menuitem));
2177                 if (!strcmp(charset, *((gchar **)pparam->data))) {
2178                         gtk_option_menu_set_history(optmenu, n);
2179                         return;
2180                 }
2181                 n++;
2182         }
2183
2184         gtk_option_menu_set_history(optmenu, 0);
2185         prefs_common_charset_set_data_from_optmenu(pparam);
2186 }
2187
2188 static void prefs_common_key_pressed(GtkWidget *widget, GdkEventKey *event,
2189                                      gpointer data)
2190 {
2191         if (event && event->keyval == GDK_Escape)
2192                 gtk_widget_hide(dialog.window);
2193 }
2194
2195 static void prefs_common_ok(GtkButton *button)
2196 {
2197         prefs_common_apply(button);
2198         gtk_widget_hide(dialog.window);
2199         if (quote_desc_win && GTK_WIDGET_VISIBLE(quote_desc_win))
2200                 gtk_widget_hide(quote_desc_win);
2201 }
2202
2203 static void prefs_common_apply(GtkButton *button)
2204 {
2205         prefs_set_data_from_dialog(param);
2206         main_window_reflect_prefs_all();
2207         prefs_common_save_config();
2208 }